J'ai eu une fusion de branche à trois voies:
git checkout master
git merge BranchA
>> Fast-forward merge
git merge BranchB
>> Three-way-merge (prompts for a merge commit message)
Mes questions sont deux:
_ {Comment puis-je annuler la fusion?} Avec la fusion à trois voies, je montre à l'éditeur où écrire le message de fusion-validation. Mais si je sors sans sauvegarder, git poursuivra malgré tout la fusion (seul le message de fusion-commit sera celui par défaut à la place de celui que j’aurais pu écrire mais abandonné)
commit 11111233
Merge 'BranchB' into master
alors que, de toute évidence, n'ayant pas confirmé le message de validation, je m'attendrais à ce que la fusion ne se produise pas (le même comportement que lorsque je ne confirme PAS un message de validation normal)
git log
) verrai-je la validation de la BranchA, suivie de la validation de la BranchB?Pour mieux expliquer la deuxième question, j’ai fait un test: 2 branches (A et B) à partir de la branche master . J'ai fait une validation sur B, puis sur A, puis à nouveau sur B et enfin sur A. Ensuite, j'ai fusionné BranchA dans master . Et ensuite BranchB into master .
Mais quand je git log
sur master , voici ce qui est sorti et pourquoi j'ai posé la deuxième question:
commit 730fdd4d328999c86fa4d3b6120ac856ecaccab1
Merge: 7eb581b cc1085a
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:24:27 2015 +0100
Merge branch 'BranchB' into master_COPY
commit 7eb581b39a8402e1694cc4bf4eab4a3feb1143f8
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:23:18 2015 +0100
BranchA) - This should be the (second) last change of the branch, and be the
most recent into the git log, even if I merge another branch into master,
AFTER the one where we are committing this.
commit cc1085a6aaa2ee4b26d3c3fbb93bee863d9e7c28
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:20:29 2015 +0100
(BranchB) - Add settings to the last new features
commit 5f5b846a2f89886d01244ba77af941f554233b51
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:18:54 2015 +0100
(BranchA) - Add some changes
commit 92a57a56b6b7c9694fbedda71b8070fc58683dde
Author: Arthur Conandoyle <[email protected]>
Date: Mon Feb 9 21:18:17 2015 +0100
(BranchB) - Some changes
commit 221765476e348833cf8da73b1bf5239f3d4240e8
Author: Arthur Conandoyle <[email protected]>
Date: Tue Feb 3 12:12:19 2015 +0100
Change (this is the last commit of the parent 'master' branch)
(Comme Srdjan Grubor écrit) J'aurais attendu en premier (chronologiquement) tous les commit de la fusion BranchA et ALORS tous les commits de la fusion BranchB , en suivant l'ordre de fusion ... .. mais il est amusant de voir comment le git log
les affiche à la place dans l'ordre chronologique et les commits ne sont pas affichés comme étant groupés dans des branches!
La fusion de brancheB est parfaitement ordinaire, demandant un message de validation ordinaire. Il y a un défaut, si vous quittez sans le changer, la fusion se terminera. Puisque la fusion elle-même a réussi, le seul moyen de l'arrêter maintenant est de fournir un message de fusion incorrect (un message vide le fera sans crochets).
Lorsqu'une fusion est arrêtée, vous pouvez l'abandonner avec
git merge --abort
# or
git reset --merge
La sauvegarde de tout ce que vous venez de commettre par erreur est
git reset --hard @{1}
Il n'y a pas de concept de "propriété" de branche dans git, toutes les façons dont vous pouvez vous référer à un commit sont des pairs.
Vous pouvez avoir une meilleure idée de la structure git log vous montre
git log --graph --decorate --oneline
Essayez-le avec --date-order
et --topo-order
et --all
.
En ce qui concerne votre édition, git log
sort sa sortie. Cela peut être surprenant même dans une histoire linéaire. Il existe des indicateurs pour modifier la méthode de tri , et l'ajout de --graph
modifie le tri par défaut en --topo-order
.
L'autre élément à noter est que lorsque git effectue une avance rapide de la branche, il n'y a pas de validation de fusion:
C---D <-- branch
/
A---B <-- mainline
Permettre à mainline
d’acquérir branch
via des résultats rapides dans le graphique simple:
C---D <-- mainline, branch
/
A---B
qui est trivialement tracé comme une simple ligne droite, mais le forçage d'une validation de fusion (avec git merge --no-ff
) produit une validation de fusion à deux parents:
C---D <-- branch
/ \
A---B-------M <-- mainline
qui (une fois généralisé pour avoir plus de commits) présente des options plus intéressantes pour le processus de tri des commissions.
Vous pouvez "annuler" la fusion après vous avoir fini et utilisé
git reflog
pour revenir à l'état précédent de votre arbre. Généralement, les fusions ne sont pas triées par ordre chronologique, mais par ordre de validation de branche, qui est ensuite trié séparément. Cela signifie que vous verriez votre validation de fusion suivie par toutes les validations de branche source (par ordre chronologique), suivies de vos validations de branche principale (par ordre chronologique).