web-dev-qa-db-fra.com

Comment copier des commits d'une branche à une autre?

J'ai deux branches de mon maître:

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

Existe-t-il un moyen de copier les commits d'hier de wss vers la v2.1?

575
Bob Walsh

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 que vous ne pouvez pas utiliser git rebase pour déplacer votre branche wss au bon endroit, la commande permettant d’extraire un seul commit et de l’appliquer ailleurs est git cherry-pick . Il suffit de vérifier la branche sur laquelle vous souhaitez l'appliquer et d'exécuter git cherry-pick <SHA of commit to cherry-pick>.

Certains des moyens de 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 déplacer wss directement sur la v2:

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

Ensuite, vous pouvez fusionner! Si vraiment, vraiment, vraiment ne peut pas arriver au point de pouvoir fusionner, vous pouvez toujours utiliser rebase pour effectuer efficacement plusieurs sélections à 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

Remarque: la raison pour laquelle cela nécessite un travail supplémentaire est que cela crée des validations en double dans votre référentiel. Ce n'est pas vraiment une bonne chose - le point essentiel de la création de branches faciles et de la fusion est de pouvoir tout faire en faisant d'un commit une place et en les fusionnant là où ils sont nécessaires. Les doubles commises signifient une intention de ne jamais fusionner ces deux branches (si vous décidez de le faire plus tard, vous aurez des conflits).

474
Cascabel

Utilisation 

git cherry-pick <commit>

appliquer <commit> à votre branche actuelle

Je recouperais probablement moi-même les commits choisis dans gitk et les sélectionnerais avec un clic droit sur l'entrée de validation correspondante.


Si vous voulez aller plus automatiquement (avec tous ses dangers) et en supposant que tous les commits depuis hier se soient produits 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 en supposant que vous utilisez bash

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

Si quelque chose ne va pas ici (il y a beaucoup de potentiel), vous rencontrez des problèmes, car cela fonctionne sur la caisse en direct. Vous pouvez donc choisir une sélection manuelle ou utiliser un rebase comme suggéré par Jefromi.

750
Benjamin Bannier

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

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

Lorsque nous utilisons cherry-pick, nous devrions ajouter des commissions sur la branche B dans le même ordre chronologique que celui où elles apparaissent dans la branche A.

cherry-pick prend en charge une gamme de commits, mais si vous avez des commits de fusion dans cette plage, cela 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 de travail:

 enter image description here

Nous pouvons utiliser cherry-pick avec options

-e ou --edit: Avec cette option, git cherry-pick vous permettra de modifier le message de validation avant de la valider.

-n ou --no-commit: généralement, la commande crée automatiquement une séquence de validations. Cet indicateur applique les modifications nécessaires pour sélectionner chaque validation nommée dans votre arbre de travail et l'index, sans effectuer de validation. De plus, lorsque cette option est utilisée, votre index ne doit pas nécessairement correspondre au commit HEAD. La sélection se fait par rapport au début de votre index.

Voici un intéressant article concernant cherry-pick.

27
Lyes CHIOUKH

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

15
Charles Ma

Ou si vous êtes un peu moins du côté de l'évangéliste, vous pouvez faire un peu laide que j'utilise. Deploy_template contient des commits que je veux copier sur mon maître en tant que branche de déploiement 

git branch deploy deploy_template
git checkout deploy
git rebase master

Cela créera un nouveau déploiement de branche (j'utilise -f pour écraser la branche de déploiement existante) sur deploy_template, puis rebasonnera cette nouvelle branche sur le maître, laissant deploy_template intacte.

9
Petr Sykora

Pour le cas simple de simplement copier le dernier commit depuis la branche wss vers la v2.1, vous pouvez simplement récupérer l'ID de commit (git log --oneline | head -n 1) et faire:

git checkout v2.1
git merge <commit>
0
zeroimpl