Jak mogę "cofnąć" Cofnięty commit Git?

Biorąc pod uwagę zmianę, która została zatwierdzona za pomocą commit, a następnie cofnięta za pomocą revert, Jaki jest najlepszy sposób, aby cofnąć to cofnięcie?

Najlepiej, Aby to zrobić z nowym commitem, aby nie zapisywać historii od nowa.

Author: JimmidyJoo, 2012-01-04

8 answers

Jeśli jeszcze nie przesunąłeś tej zmiany, git reset --hard HEAD^

W przeciwnym razie, odwrócenie odwrócenia jest w porządku.

Innym sposobem jest git checkout HEAD^^ -- ., a następnie git add -A && git commit.

 236
Author: Adam Dymitruk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-05 10:07:34

git cherry-pick <original commit sha>
Tworzy kopię oryginalnego commita, zasadniczo ponownie stosując commit

Odwrócenie odwrócenia zrobi to samo, z Messier commit Messier:
git revert <commit sha of the revert>

Jeden z tych sposobów pozwoli Ci git push bez nadpisywania historii, ponieważ tworzy nowy commit po przywróceniu.
Wpisując commit sha, zazwyczaj potrzebujesz tylko pierwszych 5 lub 6 znaków:
git cherry-pick 6bfabc

 273
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 18:46:53

Dla mnie wygląda głupio. Ale byłem w tej samej sytuacji i cofnąłem się dla cofniętych commitów. Wykonałem cofnięcia numerów, więc musiałem wykonać cofnięcie dla każdego 'cofnięcia commit'.

Teraz moja historia commitów wygląda trochę dziwnie.

dziwna historia

Jest to projekt pet więc jest OK. Ale w przypadku prawdziwego projektu dałbym pierwszeństwo przejść do ostatniego commita przed przywróceniem Przywróć cały przywrócony kod razem w jednym commicie i bardziej rozsądnym komentarzu.

 2
Author: RredCat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 20:00:51

Lub możesz git checkout -b <new-branch> i git cherry-pick <commit> przed i git rebase zrzucić revert commit. wyślij pull request jak wcześniej.

 2
Author: Ryan Chou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 09:09:29

Revert commit jest jak każdy inny commit w git. Oznacza to, że można go przywrócić, jak w:

git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746

To oczywiście ma sens tylko wtedy, gdy zmiany zostały popchnięte, a zwłaszcza, gdy nie możesz wymusić wciśnięcia gałęzi docelowej (co jest dobrym pomysłem dla Twojej gałęzi master ). Jeśli zmiana nie została wypchnięta, po prostu zrób cherry-pick, revert lub po prostu usuń commit revert jak w przypadku innych postów.

W naszym zespole, mamy zasadę, aby używać revert na Revert komentarze, które zostały popełnione w głównej gałęzi, głównie po to, aby zachować czystą historię, abyś mógł zobaczyć, który commit odwraca co:

      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'
W ten sposób możesz prześledzić historię i dowiedzieć się całą historię, a nawet ci, którzy nie znają Dziedzictwa, mogą sami to wypracować. Natomiast jeśli wybierzecie lub rebase rzeczy, ta cenna informacja zostanie utracona (chyba że zamieścicie ją w komentarzu).

Oczywiście, jeśli commit został przywrócony i re-reverted więcej niż raz, że staje się dość niechlujny.

 1
Author: Nestor Milyaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-29 09:25:35

Jeśli nie podoba ci się pomysł "przywracania przywracania" (szczególnie gdy oznacza to utratę informacji o historii dla wielu commitów), zawsze możesz przejść do dokumentacji Gita o "przywracaniu błędnego scalania".

Biorąc pod uwagę następującą sytuację wyjściową

 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E   <-- fixed-up topic branch

(W jest początkowym przywróceniem merge M; D i E są poprawkami do pierwotnie zepsutej gałęzi/commita funkcji)

Możesz teraz po prostu odtworzyć commity od A do E, aby żaden z nich nie "należał" do cofniętego merge:

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

Nowa kopia Twojej gałęzi może być teraz ponownie scalona do master:

   A'---B'---C'------------D'---E'  <-- recreated topic branch
  /
 P---o---o---M---x---x---W---x
  \         /
   A---B---C----------------D---E
 0
Author: NobodysNightmare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 09:03:04

Oto Jak to zrobiłem:
Jeśli gałąź my_branchname została włączona do połączenia, które zostało przywrócone. A ja chcialem odreagowac my_branchname:

Najpierw robię git checkout -b my_new_branchname z my_branchname.
Następnie wykonuję git reset --soft $COMMIT_HASH Gdzie $COMMIT_HASH jest hash commit prawa przed pierwszym commit my_branchname (zobacz git log)
Następnie wykonuję nowy commit git commit -m "Add back reverted changes"
Następnie wciskam nową gałąź git push origin new_branchname
Potem złożyłem prośbę o nową gałąź.

 0
Author: Drew LeSueur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 01:52:25

Odwrócenie odwrócenia da radę

Na przykład,

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

Następnie wpisz,

git revert ghijkl

Spowoduje to odwrócenie

 0
Author: Rafeeque KP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 07:15:53