Étant donné un changement qui a été commit
validé à l'aide revert
, puis annulé à l' aide , quelle est la meilleure façon d'annuler cette annulation?
Idéalement, cela devrait être fait avec un nouveau commit, afin de ne pas réécrire l'historique.
Étant donné un changement qui a été commit
validé à l'aide revert
, puis annulé à l' aide , quelle est la meilleure façon d'annuler cette annulation?
Idéalement, cela devrait être fait avec un nouveau commit, afin de ne pas réécrire l'historique.
Réponses:
Si vous n'avez pas encore poussé ce changement, git reset --hard HEAD^
Sinon, annuler le retour est parfaitement correct.
Une autre façon consiste à git checkout HEAD^^ -- .
et ensuite git add -A && git commit
.
git cherry-pick
ou alternativement, ce git revert
soient les moyens les plus simples de revenir sur un retour.
Otherwise, reverting the revert is perfectly fine.
puis aussi d'expliquer ce qui git checkout HEAD^^ -- .
se passe.
git add -A
... sauf si vous voulez ajouter chaque fichier au contrôle de version, ce qui n'est probablement pas ce que vous voulez.
git cherry-pick <original commit sha>
Fera une copie du commit d'origine, réappliquant essentiellement le commit
La restauration de la restauration fera la même chose, avec un message de validation plus compliqué:
git revert <commit sha of the revert>
L'une ou l'autre de ces façons vous permettra de ne git push
pas écraser l'historique, car elle crée un nouveau commit après le retour.
Lorsque vous tapez le commit sha, vous n'avez généralement besoin que des 5 ou 6 premiers caractères:
git cherry-pick 6bfabc
Un commit de retour est comme n'importe quel autre commit dans git. Cela signifie que vous pouvez le rétablir, comme dans:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
Cela n'a de sens que de toute évidence une fois que les changements ont été poussés, et surtout quand vous ne pouvez pas forcer pousser sur la branche de destination ( ce qui est une bonne idée pour votre maître branche). Si le changement n'a pas été poussé, faites simplement le choix, annulez ou supprimez simplement la validation de retour selon les autres articles.
Dans notre équipe, nous avons une règle pour utiliser un retour sur les validations Revert qui ont été validées dans la branche principale, principalement pour garder l'historique propre, afin que vous puissiez voir quel commit rétablit quoi:
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
De cette façon, vous pouvez retracer l'histoire et comprendre toute l'histoire, et même ceux qui ne connaissent pas l'héritage pourraient le découvrir par eux-mêmes. Alors que si vous choisissez ou rebasez des éléments, ces précieuses informations sont perdues (sauf si vous les incluez dans le commentaire).
De toute évidence, si un commit est revenu et est revenu plus d'une fois, cela devient assez compliqué.
Inverser le retour fera l'affaire
Par exemple,
Si abcdef
c'est votre commit et ghijkl
est le commit que vous avez lorsque vous avez annulé le commit abcdef
, exécutez:
git revert ghijkl
Cela reviendra le retour
C'est stupide pour moi. Mais j'étais dans la même situation et je suis revenu pour des commits annulés. J'ai effectué des restaurations de numéros, j'ai donc dû effectuer une restauration pour chaque «validation de restauration».
Maintenant, mon histoire de commits est un peu bizarre.
C'est un projet pour animaux de compagnie donc c'est OK. Mais pour un projet réel, je préférerais aller au dernier commit avant de rétablir restaurer tout le code retourné ensemble dans un commit et un commentaire plus raisonnable.
Voici comment je l'ai fait:
si la branche a my_branchname
été incluse dans une fusion qui a été annulée. Et je voulais annuler my_branchname
:
Je fais d'abord un git checkout -b my_new_branchname
de my_branchname
.
Ensuite, je fais un git reset --soft $COMMIT_HASH
où $COMMIT_HASH
est le hachage de validation du commit juste avant le premier commit de my_branchname
(voir git log
)
Ensuite, je fais un nouveau commit git commit -m "Add back reverted changes"
Puis je pousse la nouvelle branche git push origin new_branchname
Puis j'ai fait une pull request pour la nouvelle branche.
Si vous n'aimez pas l'idée de "annuler une annulation" (en particulier lorsque cela signifie perdre des informations d'historique pour de nombreuses validations), vous pouvez toujours consulter la documentation de git sur "Annulation d'une fusion défectueuse" .
Étant donné la situation de départ suivante
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(W est votre retour initial de la fusion M; D et E sont des correctifs pour votre branche / commit de fonctionnalité initialement cassée)
Vous pouvez maintenant simplement rejouer les commits A à E, de sorte qu'aucun d'entre eux "n'appartienne" à la fusion annulée:
$ git checkout E
$ git rebase --no-ff P
La nouvelle copie de votre branche peut maintenant être fusionnée à master
nouveau:
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
Pour récupérer les modifications non et échelonnées qui ont été annulées après une validation:
git reset HEAD@{1}
Pour récupérer toutes les suppressions non organisées:
git ls-files -d | xargs git checkout --