web-dev-qa-db-fra.com

Comment "annuler l'annulation" d'un commit Git annulé?

Étant donné un changement qui a été validé avec commit, puis annulé avec revert, quel est le meilleur moyen d'annuler cette annulation?

Idéalement, cela devrait être fait avec un nouveau commit, afin de ne pas réécrire l'histoire.

381
JimmidyJoo

Si vous n'avez pas encore poussé ce changement, git reset --hard HEAD^

Sinon, inverser le retour est parfaitement correct.

Une autre façon consiste à git checkout HEAD^^ -- . puis à git add -A && git commit.

313
Adam Dymitruk

git cherry-pick <original commit sha>
Fera une copie du commit original, en réappliquant essentiellement le commit

Rétablir le retour fera la même chose, avec un message de commit plus compliqué:
git revert <commit sha of the revert>

L'une ou l'autre de ces manières vous permettra de git Push sans écraser l'historique, car cela crée un nouveau commit après la restauration.
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

376
Stephan

Un commit de retour est comme n'importe quel autre commit en git. Sens, vous pouvez le retourner, comme dans:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

Cela n’a évidemment de sens que lorsque les modifications ont été poussées, et en particulier lorsque vous ne pouvez pas forcer Push sur la branche de destination (ce qui est une bonne idée pour votre branche master). Si le changement n'a pas été poussé, il suffit de sélectionner, de restaurer ou de supprimer simplement la validation de la récupération, comme indiqué dans les autres publications.

Dans notre équipe, nous avons pour règle d'utiliser un invertir sur les commits annulés qui ont été commis dans la branche principale, principalement pour garder l'historique propre, afin que vous puissiez voir quel commet annule ce qui:

      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 peuvent le résoudre eux-mêmes. Alors que, si vous cherry-pick ou rebase, cette information précieuse est perdue (à moins que vous ne l'incluiez dans le commentaire).

Évidemment, si un commit est annulé et ré-annulé plusieurs fois, cela devient assez compliqué.

18
Nestor Milyaev

Revenir en arrière fera l'affaire

Par exemple,

Si abcdef 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 revert

6
Rafeeque KP

Voici comment je l'ai fait:
Si la branche my_branchname a été incluse dans une fusion qui a été annulée. Et je voulais annuler la restitution de my_branchname:

Je fais d’abord un git checkout -b my_new_branchname à partir de my_branchname.
Puis je fais un git reset --soft $COMMIT_HASH$COMMIT_HASH est la valeur de validation du droit de validation avant le premier commit de my_branchname (voir git log)
Puis je fais un nouveau commit git commit -m "Add back reverted changes"
Puis je relève la nouvelle branche git Push Origin new_branchname
J'ai ensuite fait une demande de tirage pour la nouvelle succursale.

2
Drew LeSueur

Vous pouvez aussi git checkout -b <new-branch> et git cherry-pick <commit> le précédent à et git rebase pour supprimer revert commit. envoyer la demande de tir comme avant.

2
Ryan Chou

C'est stupide pour moi. Mais j'étais dans la même situation et je suis revenu pour les commits annulés. J'ai fait le nombre de retours, donc je devais faire le retour pour chaque "retour de validation".

Maintenant, mon histoire de commits est un peu bizarre.

weird history

C'est un projet pour animaux de compagnie, donc ça va. Mais pour un projet réel, je préférerais aller au dernier commit avant de revenir en arrière, restaurer tous les codes restitués ensemble dans un commit et un commentaire plus raisonnable.

2
RredCat

Si vous n'aimez pas l'idée de "revenir à un retour" (en particulier lorsque cela implique de perdre des informations d'historique pour de nombreux commits), vous pouvez toujours consulter la documentation de git à propos de "Annulation d'une fusion erronée" .

Compte tenu de 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 corrigent la branche/validation de fonctionnalité initialement cassée)

Vous pouvez maintenant simplement rejouer les commits de A à E, de sorte qu'aucun d'entre eux "n'appartient" à la fusion annulée:

$ git checkout E
$ git rebase --no-ff P

La nouvelle copie de votre branche peut maintenant être fusionnée avec master:

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E
1
NobodysNightmare

Pour récupérer les modifications non mises en scène et mises en scène qui ont été annulées après un commit:

git reset HEAD@{1}

Pour récupérer toutes les suppressions non mises en scène:

git ls-files -d | xargs git checkout --
0
Richa Goyal