git revert <commit_hash>
seul ne fonctionnera pas. -m
doit être spécifié, et je suis assez confus à ce sujet.
Quelqu'un a déjà vécu cela?
L'option -m
spécifie le numéro parent . En effet, une validation de fusion a plusieurs parents et Git ne sait pas automatiquement quel parent était la ligne principale et quel parent était la branche que vous souhaitez annuler la fusion.
Lorsque vous affichez un commit de fusion dans la sortie de git log
, ses parents sont répertoriés sur la ligne commençant par Merge
:
commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <[email protected]>
Date: Wed Aug 17 22:49:41 2011 +0100
Merge branch 'gh-pages'
Conflicts:
README
Dans ce cas, git revert 8f937c6 -m 1
vous donnera l'arborescence telle qu'elle était dans 8989ee0
et git revert -m 2
la rétablira telle qu'elle était dans 7c6b236
.
Pour mieux comprendre les ID parents, vous pouvez exécuter:
git log 8989ee0
et
git log 7c6b236
Voici un exemple complet dans l'espoir que cela aide quelqu'un:
git revert -m 1 <commit-hash>
git commit -m "Reverting the last commit which messed the repo."
git Push -u Origin master
Où <commit-hash>
est la valeur de validation de la fusion que vous souhaitez rétablir, et comme indiqué dans l'explication de cette réponse , -m 1
indique que vous souhaitez revenir à l'arborescence du premier parent avant la fusion. .
La ligne git commit ...
valide essentiellement vos modifications tandis que la troisième ligne les rend publiques en les transmettant à la branche distante.
Ben vous a dit comment annuler un commit de fusion, mais il est très important de vous rendre compte que cela "déclare que vous ne voudrez jamais que les modifications de l'arborescence soient importées" Par conséquent, les fusions ultérieures n'entraîneront que les modifications d'arborescence introduites par des commits qui ne sont pas des ancêtres de la fusion précédemment annulée. Cela peut être ou ne pas être ce que vous voulez. " (page de manuel de git-merge) .
Un article/message de liste de diffusion lié à la page de manuel détaille les mécanismes et les considérations qui sont impliqués. Assurez-vous simplement que vous comprenez que si vous annulez le commit de fusion, vous ne pouvez pas simplement fusionner la branche à nouveau plus tard et attendre les mêmes changements.
git revert -m 1 <merge-commit>
Pour garder le journal propre car rien ne s'est passé (avec quelques inconvénients avec cette approche (due à Push -f)):
git checkout <branch>
git reset --hard <commit-hash-before-merge>
git Push -f Origin HEAD:<remote-branch>
'commit-hash-before-merge' provient du journal (git log) après la fusion.
Parfois, le moyen le plus efficace de revenir en arrière est de prendre du recul et de remplacer.
git log
Utilisez le hash 2nd commit (le hash complet, celui auquel vous voulez revenir, avant que l'erreur ne soit listée), puis reconnectez-le à partir de là.
git checkout -b newbranch <HASH>
Supprimez ensuite l'ancienne branche, copiez la nouvelle filiale à sa place et redémarrez à partir de là.
git branch -D oldbranch
git checkout -b oldbranch newbranch
Si elle a été diffusée, supprimez l’ancienne branche de tous les référentiels, poussez la branche refaite au plus central, puis ramenez-la à tous.
Si vous voulez annuler un commit merge
, voici ce que vous devez faire.
git log
pour trouver l’id de votre commit de fusion. Vous trouverez également plusieurs identifiants de parents associés à la fusion (voir image ci-dessous).Notez le numéro de validation de fusion affiché en jaune. Les ID parents sont ceux écrits dans la ligne suivante sous la forme Merge: parent1 parent2
. À présent...
Histoire courte:
git revert <merge commit id> -m 1
qui ouvrira une console vi
pour la saisie du message de validation. Ecrivez, enregistrez, quittez, faites!Longue histoire:
Basculer vers la branche sur laquelle la fusion a été effectuée. Dans mon cas, il s’agit de la branche test
et j’essaie d’enlever la branche feature/analytics-v3
.
git revert
est la commande qui annule toute validation. Mais il y a un truc désagréable quand annuler un commit merge
. Vous devez entrer le drapeau -m
sinon il échouera. À partir de là, vous devez décider si vous souhaitez rétablir votre branche et lui donner l’impression qu’elle était exactement telle qu’elle était sur parent1
ou parent2
via:
git revert <merge commit id> -m 1
(retourne à parent2
)
git revert <merge commit id> -m 2
(retourne à parent1
)
Vous pouvez vous connecter à ces parents pour déterminer le chemin que vous souhaitez emprunter et c'est la source de toute confusion.
La réponse correctement marquée a fonctionné pour moi, mais j'ai dû prendre un peu de temps pour déterminer ce qui se passait. J'ai donc décidé d'ajouter une réponse en procédant par étapes simples et directes pour des cas comme le mien ..
Disons que nous avons les branches A et B .. Vous avez fusionné la branche A dans la branche B et poussé la branche B sur elle-même. La fusion en fait maintenant partie intégrante. Mais vous voulez revenir au dernier commit avant la fusion .. Que faire?
git log
Vous verrez l'historique des validations récentes - les validations ont des propriétés commit/author/date, tandis que les fusions ont également une propriété de fusion - vous les voyez ainsi:
commit: <commitHash>
Merge: <parentHashA> <parentHashB>
Author: <author>
Date: <date>
Utilisez git log <parentHashA>
et git log <parentHashB>
- vous verrez les historiques de validation de ces branches parentes - les premiers validés de la liste sont les derniers
<commitHash>
du commit que vous voulez, allez dans votre dossier racine git et utilisez git checkout -b <newBranchName> <commitHash>
- cela créera une nouvelle branche à partir du dernier commit que vous avez choisi avant la fusion .. Voila, prêt!J'ai trouvé la création d'un patch inversé entre deux points de terminaison connus et l'application de ce patch fonctionnerait. Cela suppose que vous avez créé des instantanés (tags) à partir de votre branche maître ou même une sauvegarde de votre branche maître, par exemple, master_bk_01012017.
Supposons que la branche de code que vous avez fusionnée en maître était mycodebranch.
git diff --binary master..master_bk_01012017 > ~/myrevert.patch
git apply --check myrevert.patch
git am --signoff < myrevert.patch
git branch mycodebranch_fix
git checkout mycodebranch_fix
git revert [SHA]
Toutes les réponses couvraient déjà la plupart des choses, mais je vais ajouter mes 5 centimes. En bref, révoquer un commit de fusion est assez simple:
git revert -m 1 <commit-hash>
Si vous en avez l'autorisation, vous pouvez le placer directement dans la branche "maître", sinon, il vous suffit de le placer dans votre branche "revenir" et de créer une demande d'extraction.
Vous trouverez peut-être d'autres informations utiles à ce sujet ici: https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html
git doc à propos de git revert -m fournit un lien expliquant exactement ceci: https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt