J'ai lu que faire git reset commitBeforeDoingMerge --hard n'annulerait pas la fusion:
1pm-3pm This is my branch and I need to merge master into it 1pm-2pm This was master 1pm-2pm-3pm-4pm Merging ended up doing this, 4pm being the merge commit 1pm-2pm-3pm if This is the result if you do git reset 3pm --hard, because it does not undo the merge, it just goes back to that commit in the branch that was merged.
Maintenant, une autre proposition est de faire git revert 4pm -m 1, mais cela pose un problème selon le manuel :
En général, vous ne pouvez pas annuler une fusion car vous ne savez pas quel côté de la fusion doit être considéré comme la ligne principale. Cette option spécifie le numéro du parent (à partir de 1) de la ligne principale et permet de revenir en arrière pour inverser le changement par rapport au parent spécifié.
La restauration d'une validation de fusion déclare que vous ne voudrez jamais que les modifications d'arborescence soient apportées par la fusion. Par conséquent, les fusions ultérieures n'apporteront que des modifications d'arborescence introduites par des validations qui ne sont pas des ancêtres de la fusion précédemment rétablie. Cela peut ou non être ce que vous voulez.
Alors, y a-t-il un moyen d'annuler proprement et facilement une fusion git?
3 Réponses :
La réinitialisation aurait dû fonctionner, mais sur le maître, la réinitialisation à e:
Après la fusion:
a-b---d (mybranch, master) \ \ c-e-f
Une fusion de myBranch
vers master devrait donner:
a-b---d (mybranch) \ \ c-e-f (master)
Il n'y a pas de branche qui listerait abcdef, seulement abcef (master)
Si vous reset --hard e
pendant que vous êtes sur le master
vous récupérerez l'historique d'origine (premier ci-dessus)
Si vous reset --hard d
alors que vous êtes sur le maître, vous avez le déplacement du maître HEAD mais la fusion existe toujours:
a-b-d (mybranch) \ c-e (master)
Je fusionnais le maître dans ma branche. Je ne comprends pas votre réponse, alors j'ai mis à jour la question, c'est peut-être plus clair.
J'ai lu que faire git reset commitBeforeDoingMerge --hard n'annulerait pas la fusion
Partout où vous lisez cela, c'est faux. C'est exactement comment annuler une fusion.
Disons que vous fusionnez la
branch
dans lemaster
. Nous avons donc ceci avant la fusion:A -- B -- C (master) \ X -- Y (branch)D'accord, nous
git checkout master
etgit merge branch
. Le résultat est:A -- B -- C -- D (master) \ | X -- Y (branch)... où D est le commit de fusion, avec C et Y comme parents.
Si vous dites maintenant
git reset --hard <SHA-of-C>
, vous revenez à ceci:A -- B -- C (master) \ X -- Y (branch)C'est une annulation parfaite.
Je ne suis toujours pas sûr de ce que vous faites, mais ce n'est pas ainsi que fonctionne git merge
. Je vais essayer de recréer ce que vous avez fait et peut-être que vous pourrez repérer la différence.
J'ai d'abord créé vos deux branches de départ:
git log --oneline 0593ba1 (HEAD -> test) 3pm 7f9a804 1pm
Fusion du maître dans le test. git merge master -m "4pm"
git log --oneline --graph --all * 0593ba1 (HEAD -> test) 3pm | * eba415c (master) 2pm |/ * 7f9a804 1pm
maintenant nous réinitialisons le test à 15 heures
git reset --hard 0593ba1 HEAD is now at 0593ba1 3pm
git log --oneline --graph --all * 6be609f (HEAD -> test) 4pm |\ | * eba415c (master) 2pm * | 0593ba1 3pm |/ * 7f9a804 1pm
maintenant, nous voyons que le commit de 14 heures n'est que dans le maître, pour confirmer le journal du seul test
git log --oneline --graph --all * 0593ba1 (HEAD -> test) 3pm | * eba415c (master) 2pm |/ * 7f9a804 1pm
c'est ainsi que je fusionne et annule la fusion, n'hésitez pas à me faire savoir ce que vous faites différemment ou où je ne vous ai pas recréé par exemple comment vous en avez besoin.
Je pense que la confusion m'est venue lorsque j'ai mélangé dans ma tête l'annulation d'une fusion qui a été poussée. J'ai donc essayé de trouver un moyen propre d'annuler cela sans réécrire l'historique.
pas de souci, heureux de vous aider. Si vous voulez vraiment annuler une fusion sans réécrire l'historique, vous pouvez le faire avec git revert -m <#parent> <sha>
, mais git revert -m <#parent> <sha>
attention à lire ceci, car il a ses propres pièges et je ne suis pas sûr est une meilleure solution pour réécrire l'histoire.
git reset --hard
une fusion. (toujours et proprement) mais je pense que vous devriez clarifier comment vous avez obtenu votre "fusion" car une fusion devrait avoir au moins deux branches parallèles et non votre seule ligne.@ian J'ai mis à jour la question, peut-être que maintenant c'est plus clair. Git reset --hard vous amènera à cet instantané mais n'annulera pas les modifications apportées à l'historique.