web-dev-qa-db-fra.com

Comment arrêter de fusionner dans git?

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)

  • _ {Les commits des deux branches fusionnées seront-ils triés par ordre chronologique}? Ou d’abord (dans le git log) verrai-je la validation de la BranchA, suivie de la validation de la BranchB?

MODIFIER

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!

7
Kamafeather

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.

18
jthill

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.

2
torek

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).

0
Srdjan Grubor