Comment puis-je" désactiver " une commit git reversée?

compte tenu d'un changement qui a été effectué à l'aide de commit , puis inversé à l'aide de revert , Quelle est la meilleure façon d'annuler ensuite ce retour?

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

289
demandé sur JimmidyJoo 2012-01-04 17:59:25

8 réponses

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

sinon, revenir en arrière est parfaitement bien.

une autre façon est de git checkout HEAD^^ -- . et ensuite git add -A && git commit .

236
répondu Adam Dymitruk 2013-09-05 10:07:34

git cherry-pick <original commit sha>

Fera une copie de l'original commit, en ré-appliquant essentiellement le commit

inverser le retour fera la même chose, avec un message de commit messier:

git revert <commit sha of the revert>

L'une ou l'autre de ces façons vous permettra de git push sans histoire d'écrasement, parce qu'il crée un nouveau commit après le revert.

Lors de la saisie de la commit sha, vous typiquement ne nécessite que les 5 ou 6 premiers caractères:

git cherry-pick 6bfabc

273
répondu Stephan 2015-04-30 18:46:53

ça a l'air stupide pour moi. Mais j'avais été dans la même situation et je suis retourné pour les commit. J'ai fait des inversions de nombre donc j'ai dû faire des inversions pour chaque 'commit de revert'.

maintenant mon histoire de commits semble un peu bizarre.

weird history

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 engagement avant de tout remettre en état. code inversé en un seul commit et commentaire plus raisonnable.

2
répondu RredCat 2015-09-23 20:00:51

Ou git checkout -b <new-branch> et git cherry-pick <commit> la avant de à la et de git rebase laisser tomber revert s'engager. envoyer la demande de pull comme avant.

2
répondu Ryan Chou 2018-03-23 09:09:29

une commit revert est comme n'importe quelle autre commit en git. C'est-à-dire que vous pouvez l'Inverser, comme dans:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

cela n'a évidemment de sens qu'une fois que les changements ont été poussés, et surtout quand vous ne pouvez pas forcer la poussée 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 choisir, de revenir en arrière ou simplement de supprimer la propagation de retour en arrière comme pour les autres messages.

In notre équipe, nous avons une règle pour utiliser un revert sur les commentaires Revert qui ont été engagés dans la branche principale, principalement pour garder l'histoire propre, de sorte que vous pouvez voir qui commit reverts 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 de comprendre toute l'histoire, et même ceux qui, à l'insu de l'héritage pourrait travailler pour eux-mêmes. Alors que, si vous cherry-pick ou rebase stuff, cette information précieuse est perdue (sauf si vous l'incluez dans le commentaire).

évidemment, si un commit est inversé et reversé plus d'une fois, cela devient assez désordonné.

1
répondu Nestor Milyaev 2018-06-29 09:25:35

si vous n'aimez pas l'idée de" revenir en arrière "(surtout quand cela signifie perdre des informations sur l'histoire pour beaucoup de propagations), vous pouvez toujours vous diriger vers la documentation git sur " Inverser 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 corrections à votre branche/commit de caractéristique initialement cassée)

vous pouvez maintenant simplement relecture s'engage A à E, de sorte qu'aucun d'entre eux "appartient" à l'est revenue de fusion:

$ 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
0
répondu NobodysNightmare 2017-11-14 09:03:04

Voici comment je l'ai fait:

Si la branche my_branchname a été incluse dans une fusion qui a été inversée. Et je voulais annuler my_branchname :

j'ai d'abord faire un git checkout -b my_new_branchname à partir de my_branchname .

Puis je fais un git reset --soft $COMMIT_HASH$COMMIT_HASH est le hachage de commit du droit de commit avant le premier commit de my_branchname (voir git log )

Puis-je faire un nouvelle Commission git commit -m "Add back reverted changes"

Puis je pousse vers le haut de la nouvelle branche git push origin new_branchname

Puis j'ai fait une demande pour la nouvelle branche.

0
répondu Drew LeSueur 2018-07-25 01:52:25

revenir en arrière fera l'affaire

par exemple,

If abcdef is your commit and ghijkl is the commit you have when you reverted the commit abcdef,

puis type,

git revert ghijkl

cela va inverser le retour

0
répondu Rafeeque KP 2018-09-18 07:15:53