web-dev-qa-db-fra.com

Comment faire pour sélectionner tous les changements introduits dans une branche spécifique

Informations générales:

En raison de restrictions dans le flux de travail avec les systèmes existants, nous devons mettre en place un processus git quelque peu peu orthodoxe.

(patch)    A-B---F
             |   |
(hotfix)     C-D-E
                 |
(dev)      1-2-3-G

Sur la branche du patch, il y a quelques commits. Les fichiers ici sont similaires mais pas identiques à ceux de dev (les scripts de synchronisation changent l'ordre des paramètres dans de nombreux fichiers, les faisant apparaître modifiés alors qu'ils sont fonctionnellement les mêmes).

Un correctif est nécessaire sur cette branche afin qu'une branche de correctif soit créée et travaillée. Cette branche est ensuite fusionnée en patch, jusqu'à présent, tout va bien.

Ce même correctif doit être déployé sur la branche de développement afin qu'il reste relativement synchronisé avec le correctif, mais essayer de fusionner la branche du correctif conduit à git essayer de fusionner tous les fichiers non liés et `` inchangés '' de A et B, plutôt que seulement C, D et E.

Question:

Il semble que cherry-pick fasse ce que nous voulons en termes d'obtenir uniquement les modifications des validations sélectionnées, mais j'aimerais vraiment un moyen de sélectionner toutes les validations dans une branche donnée à la fois, sans avoir à rechercher les identifiants de validation à chaque fois .

21
Valyrion

Il paraît que cherry-pick fait ce que nous voulons pour obtenir uniquement les modifications des validations sélectionnées, mais j'aimerais vraiment pouvoir sélectionner toutes les validations dans une branche donnée à la fois, sans avoir à rechercher les identifiants de validation à chaque fois.


En utilisant cherry-pick

git cherry-pick vous permet de choisir les commits que vous avez effectués dans n'importe quelle branche vers n'importe quelle autre branche. Dans votre cas, vous pouvez simplement commander la branche principale, puis cherry-pick toutes les validations d'une branche que vous souhaitez (cherry-pick prend en charge les plages afin que vous puissiez spécifier le début et la fin de la validation au lieu de répertorier toutes les validations).

De cette façon, vous pouvez contrôler la façon dont vos validations apparaîtront dans la branche souhaitée.

Par exemple:

git cherry-pick ebe6942..905e279

# Find the range of commits you wish to re-add to your branch.
# then use cherry-pick to add them back to the branch
git cherry-pick start..end

# If you wish to include the start commit as well add the ^
# This will result in a cherry-pick of the start commit included as well 
git cherry-pick start^..end

Comment trouver le premier commit de branche?

git log

 # print out the latest commit (first one) of the given branch
 git log  --oneline | tail -1

merge-base

Utilisez le merge-base commande pour trouver où la branche a été séparée de la branche d'origine:

git merge-base A B
35
CodeWizard

checkout votre branche (branche cible) et faites

git cherry-pick -m 1 hashCode

1
Alwin

Si vous souhaitez sélectionner tous les commits de la branche dev.

Essayer:

git cherry-pick ..dev

1
Linji

une autre façon avec l'avance rapide.

L'affaire:

vous avez commencé newBranch, vous avez validé le premier commit et vous avez réinitialisé Hard.

En conséquence, vous avez obtenu vide newBranch , non cet arbre de validation et de git tardif est propre à la tête. Vous êtes à la succursale newBranch (peut vérifier avec la branche git).

Voici une action en deux étapes:

  • obtenir la liste des validations dans la "corbeille" par

git fsck --lost-found

  • validez la validation manquée dans votre branche avec:

git cherry-pick --ff 43a7a2d

0
AlexNikonov

Cela devrait également fonctionner. Nous appelons le point de divergence entre le HEAD (maître dans ce cas) et la branche et le passons au cerisier.

git merge-base Origin/dev_single_doc_fit HEAD | xargs git cherry-pick {}..HEAD^
0