Question

J'ai deux branches de mon maître:

  • v2.1 : (version 2) Je travaille depuis plusieurs mois
  • WSS : que j'ai créé hier pour ajouter une caractéristique spécifique à mon maître (en production)

Est-il possible de copier les commits d'hier de WSS à V2.1?

Était-ce utile?

La solution

Vous devriez vraiment avoir un flux de travail qui vous permet de faire tout cela en fusionnant:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

Donc tout ce que vous avez à faire est git checkout v2.1 et git merge wss. Si pour une raison quelconque, vous ne pouvez vraiment pas faire cela, et vous ne pouvez pas utiliser git rebasage pour déplacer votre branche WSS au bon endroit, la commande de saisir une seule commettras de quelque part et l'appliquer est ailleurs git écrémer . Il suffit de consulter la branche que vous souhaitez appliquer sur, et exécutez git cherry-pick <SHA of commit to cherry-pick>.

Certaines des façons rebase pourraient vous sauver:

Si votre histoire ressemble à ceci:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

Vous pouvez utiliser git rebase --onto v2 v2-only wss pour se déplacer WSS v2 directement sur:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

Ensuite, vous pouvez fusionner! Si vous avez vraiment, vraiment, vraiment ne peut pas arriver au point où vous pouvez fusionner, vous pouvez toujours utiliser rebasage pour faire efficacement plusieurs cerises choix à la fois:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

Note: la raison pour laquelle il faut un certain travail supplémentaire afin de le faire est que cela crée double engage dans votre référentiel. Ce n'est pas vraiment une bonne chose - le point entier de ramification facile et la fusion est de pouvoir tout faire en faisant engager (s) un seul endroit et en les fusionnant en où ils sont nécessaires. Duplicate engage signifie une intention de ne jamais fusionner ces deux branches (si vous décidez que vous voulez plus tard, vous aurez des conflits).

Autres conseils

Utilisez

git cherry-pick <commit>

pour appliquer <commit> à votre branche courante .

Je me serais probablement recouper les commits je prends en gitk et les écrémer avec droit-clique sur l'entrée il commit à la place.


Si vous voulez aller plus automatique (avec tous ses dangers) et en supposant que tous les commits depuis hier est arrivé sur WSS vous pouvez générer la liste des commits en utilisant git log avec (--pretty suggéré par Jefromi)

git log --reverse --since=yesterday --pretty=%H

donc tout ensemble, vous utilisez en supposant bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

Si quelque chose se passe mal (il y a beaucoup de potentiel), vous êtes en difficulté car cela fonctionne sur la caisse en direct, donc soit faire cerises choix manuel ou utiliser rebasage comme suggéré par Jefromi.

git cherry-pick: Appliquer les modifications introduites par certains commits existants

Supposons que nous ayons branche (X, Y, Z) engage. Nous devons ajouter ces commits à la branche B . Nous allons utiliser les opérations cherry-pick.

Lorsque nous utilisons cherry-pick, il faut ajouter commits sur la branche B dans le même ordre chronologique que les commits apparaissent dans Branch .

écrémer prend en charge une gamme de commits, mais si vous avez la fusion commits dans cette gamme, il devient vraiment compliqué

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

Exemple de flux:

 ici

Nous pouvons utiliser cherry-pick avec rel="noreferrer">

-e ou --edit . Avec cette option, écrémer git vous permettra de modifier le message de validation avant de commettre

-n ou --no-commit : En général, la commande crée automatiquement une séquence de commits. Ce drapeau applique les changements nécessaires pour écrémer le nom de chaque engage à votre arbre de travail et l'index, sans aucune validation. De plus, lorsque cette option est utilisée, votre index ne doit pas correspondre à la HEAD commettre. La écrémer se fait contre l'Etat au début de l'index.

Voici un article concernant cherry-pick.

Vous pouvez créer un correctif à partir commits que vous souhaitez copier et appliquer le patch à la branche de destination.

Ou si vous êtes peu moins du côté de l'évangéliste Vous pouvez faire un peu laid chemin que je utilise. En deploy_template il y a commits je veux copier sur mon maître comme deploy branche

git branch deploy deploy_template
git checkout deploy
git rebase master

Cela va créer une nouvelle branche deploy (j'utiliser -f pour écraser la branche existante déploiement) sur deploy_template, rebasage alors cette nouvelle branche sur maître, laissant intacte deploy_template.

Pour le cas simple de copier juste la dernière livraison de la branche WSS à v2.1, vous pouvez simplement saisir l'identifiant valider (git log --oneline | head -n 1) et faites:

git checkout v2.1
git merge <commit>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top