Quelqu'un sait-il comment annuler facilement un rebasement git ?
La seule façon qui me vient à l'esprit est de le faire manuellement :
Dans ma situation actuelle, cela va fonctionner car je peux facilement repérer les commits des deux branches (l'une était mon travail, l'autre celui de mon collègue).
Cependant, mon approche me semble sous-optimale et sujette aux erreurs (disons que je viens de rebaser avec deux de mes propres branches).
Avez-vous des idées ?
Clarification : Je parle d'un rebasement au cours duquel un certain nombre de commits ont été rejoués. Pas seulement un.
Le plus simple serait de trouver le head commit de la branche tel qu'il était juste avant le début de la rebase dans le [reflog][1]....
git reflog
et de réinitialiser la branche actuelle à cet emplacement (avec les précautions habituelles pour être absolument sûr avant de réinitialiser avec l'option --hard
).
Supposons que l'ancien commit soit HEAD@{5}
dans le journal des références :
git reset --hard HEAD@{5}
Sous Windows, vous pouvez avoir besoin de citer la référence:
git reset --hard "HEAD@{5}"
Vous pouvez vérifier l'historique de l'ancienne tête candidate en faisant simplement un git log HEAD@{5}
(Windows: git log "HEAD@{5}"
).
Si vous n'avez pas désactivé les reflogs par branche, vous devriez pouvoir faire simplement git reflog branchname@{1}
car un rebasement détache la tête de la branche avant de la rattacher à la tête finale. Je vérifierais cela, cependant, car je ne l'ai pas vérifié récemment.
Par défaut, tous les reflogs sont activés pour les dépôts non dénudés :
[core]
logAllRefUpdates = true
La réinitialisation de la branche sur l'objet committant de son ancienne pointe est bien sûr la meilleure solution, car elle restaure l'état précédent sans dépenser le moindre effort. Mais si vous avez perdu ces commits (par exemple parce que vous avez collecté votre dépôt entre temps, ou parce que c'est un clone récent), vous pouvez toujours rebaser la branche à nouveau. La clé est le commutateur --onto
.
Disons que vous avez une branche topic appelée de façon fantaisiste topic
, que vous avez branchée à partir de master
quand le bout de master
était le commit 0deadbeef
. À un moment donné, alors que vous étiez sur la branche topic
, vous avez fait git rebase master
. Maintenant vous voulez annuler cela. Voici comment faire :
git rebase --onto 0deadbeef master topic
Ceci va prendre tous les commits sur topic
qui ne sont pas sur master
et les rejouer au dessus de 0deadbeef
.
Avec --onto
, vous pouvez réarranger votre historique dans à peu près toute forme que ce soit.
Amusez-vous bien. :-)
Pour les commits multiples, rappelez-vous que tout commit fait référence à tout l'historique qui précède ce commit. Ainsi, dans la réponse de Charles, lisez "l'ancien commit" comme "le plus récent des anciens commits". Si vous réinitialisez à ce commit, alors tout l'historique menant à ce commit réapparaîtra. Cela devrait faire ce que vous voulez.