Cofanie rebase ' u git

Czy ktoś wie jak łatwo cofnąć rebase git?

Jedyny sposób, który przychodzi na myśl, to zrobić to ręcznie:

  • git checkout rodzica commit do obu gałęzi
  • następnie utwórz stamtąd gałąź temp
  • cherry-wybierz wszystkie commity ręcznie
  • zastąp gałąź, w której rebasowałem przez ręcznie utworzoną gałąź

W mojej obecnej sytuacji to będzie działać, ponieważ mogę łatwo wykryć commity z obu gałęzi (jeden był moim rzeczy, drugi był rzeczy mojego kolegi).

Jednak moje podejście wydaje mi się nieoptymalne i podatne na błędy (powiedzmy, że właśnie zrebasowałem z 2 własnymi gałęziami).

Jakieś pomysły?

Wyjaśnienie: mówię o rebase, podczas którego powtórzono kilka commitów. Nie tylko jeden.

Author: webmat, 2008-09-25

15 answers

Najłatwiej byłoby znaleźć commit główny gałęzi, jak to było bezpośrednio przed rozpoczęciem rebase w reflog ...

git reflog

I aby zresetować bieżącą gałąź do niej (ze zwykłymi zastrzeżeniami o byciu absolutnie pewnym przed zresetowaniem za pomocą opcji --hard).

Załóżmy, że stary commit był HEAD@{5} w logu ref:

git reset --hard HEAD@{5}

w systemie Windows może być konieczne zacytowanie odniesienia:

git reset --hard "HEAD@{5}"

Możesz sprawdzić historię kandydata old head by just doing a git log HEAD@{5} (okna: git log "HEAD@{5}").

Jeśli nie wyłączyłeś reflogów gałęzi, powinieneś być w stanie po prostu zrobić git reflog branchname@{1}, ponieważ rebase odłącza głowicę gałęzi przed ponownym przymocowaniem do ostatecznej głowicy. Sprawdziłbym to jeszcze raz, choć ostatnio tego nie zweryfikowałem.

Domyślnie wszystkie reflogy są aktywowane dla repozytoriów innych niż nagie:

[core]
    logAllRefUpdates = true
 3449
Author: CB Bailey,
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
2016-10-20 03:32:48

Właściwie, rebase zapisuje twój punkt wyjścia do {[1] } więc zwykle jest to tak proste, jak:

git reset --hard ORIG_HEAD

Jednak reset, rebase i merge Wszystkie Zapisz swój oryginalny wskaźnik HEAD do ORIG_HEAD więc jeśli wykonałeś którąś z tych komend od rebase, którą próbujesz cofnąć, będziesz musiał użyć reflog.

 1216
Author: Pat Notz,
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
2009-03-28 13:24:50

Odpowiedź Karola działa, ale możesz chcieć to zrobić:

git rebase --abort

Aby posprzątać po reset.

W przeciwnym razie możesz otrzymać wiadomość " Interactive rebase already started".

 321
Author: Allan,
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-01-10 03:12:43

Resetowanie gałęzi do zwisającego obiektu commit jego starej końcówki jest oczywiście najlepszym rozwiązaniem, ponieważ przywraca poprzedni stan bez wysiłku. Ale jeśli zdarzy ci się stracić te commity (np. ponieważ w międzyczasie zebrałeś śmieci w swoim repozytorium, lub jest to świeży klon), zawsze możesz ponownie przerobić gałąź. Kluczem do tego jest przełącznik --onto.

Załóżmy, że masz gałąź tematyczną nazwaną topic, którą rozgałęziłeś master kiedy końcówką master był 0deadbeef commit. W pewnym momencie, będąc na gałęzi topic, zrobiłeś git rebase master. Teraz chcesz to cofnąć. Oto jak:

git rebase --onto 0deadbeef master topic

Pobierze wszystkie commity na topic, których nie ma na master i odtworzy je na 0deadbeef.

Za pomocą --onto możesz zmienić swoją historię na praktycznie dowolny kształt.

Baw się dobrze. :-)
 77
Author: Aristotle Pagaltzis,
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
2008-09-26 02:47:34

Przed wykonaniem jakiejkolwiek nietrywialnej operacji (większość rebases jest trywialna, ale zrobiłbym to, jeśli wygląda na skomplikowaną).

Następnie Przywracanie jest tak proste, jak git reset --hard BACKUP.

 63
Author: Alex Gontmakher,
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-05-24 05:08:16

W przypadku, gdy przepchnąłeś swoją gałąź do zdalnego repozytorium (zwykle jest to origin), a następnie wykonałeś udaną rebase (bez scalania) (git rebase --abort daje "No rebase in progress") możesz łatwo zresetować gałąź używając polecenie:

Git reset --hard origin/{branchName}

Przykład:

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".

$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.

nothing to commit, working directory clean
 53
Author: Maksym,
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
2016-02-05 10:12:49

W przypadku, gdy nie ukończyłeś rebase i w jego środku, następujące działania:

git rebase --abort
 50
Author: Alex,
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
2014-10-15 20:20:39

Dziwię się, że nikt jeszcze o tym nie wspomniał. Rebase pozostawia stary stan jako ORIG_HEAD, więc możesz przywrócić ostatnią rebase, uruchamiając:

git reset --hard ORIG_HEAD
 22
Author: Meligy,
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-08-02 12:56:51

Używanie reflog nie zadziałało na mnie.

To, co u mnie działało, było podobne do opisanego tutaj . Otwórz plik .git / logs / refs nazwany od gałęzi, która została zrebasowana i znajduje linię zawierającą "rebase finsihed", coś w stylu:

5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

Sprawdź drugi commit wymieniony w wierszu.

git checkout 88552c8f
Po potwierdzeniu, że to zawierało moje utracone zmiany, rozgałęziłem się i odetchnąłem z ulgą.
git log
git checkout -b lost_changes
 15
Author: Kris,
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
2012-02-20 13:59:06

Dla wielu commitów, pamiętaj, że każdy commit odwołuje się do całej historii poprzedzającej ten commit. Więc w odpowiedzi Charlesa, przeczytaj "Stary commit" jako "najnowszy ze starych commitów". Jeśli zresetujesz ten commit, cała historia prowadząca do tego commita pojawi się ponownie. To powinno robić, co chcesz.

 14
Author: Greg Hewgill,
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
2008-09-25 21:36:50

Podążając za rozwiązaniem @Allan i @Zearin, chciałbym po prostu zrobić komentarz, ale nie mam wystarczającej reputacji, więc użyłem następującego polecenia:

Zamiast robić git rebase -i --abort (zwróć uwagę na -i ) musiałem po prostu zrobić git rebase --abort (bez -i ).

Używanie obu -i i --abort w tym samym czasie powoduje, że Git pokazuje mi listę użycia / opcji.

Więc mój poprzedni i obecny status gałęzi z tym rozwiązaniem to:

matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

matbhz@myPc /my/project/environment (branch-123)
$
 11
Author: Matheus Felipe,
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-03-11 21:26:47

Jeśli udało Ci się przerobić na zdalną gałąź i nie możesz git rebase --abort nadal możesz wykonać kilka sztuczek, aby zapisać swoją pracę i nie mieć wymuszonych wypychań. Załóżmy, że Twoja bieżąca gałąź, która została przez pomyłkę zmieniona, nazywa się your-branch i śledzi origin/your-branch

  • git branch -m your-branch-rebased # Zmień nazwę bieżącej gałęzi
  • git checkout origin/your-branch # checkout to latest state that is known to origin
  • git checkout -b your-branch
  • sprawdź git log your-branch-rebased, porównaj z git log your-branch i zdefiniuj commity, których brakuje w your-branch
  • git cherry-pick COMMIT_HASH dla każdy commit w your-branch-rebased
  • Przesuń swoje zmiany. Należy pamiętać, że dwa lokalne oddziały są powiązane z remote/your-branch i należy nacisnąć tylko your-branch
 9
Author: Sergey P. aka azure,
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
2016-06-23 09:23:45

Powiedzmy, że rebase master do mojej gałęzi feature i otrzymuję 30 nowych commitów, które coś psują. Zauważyłem, że często najłatwiej jest po prostu usunąć złe commity.

git rebase -i HEAD~31

Interaktywny rebase dla ostatnich 31 commitów (nie zaszkodzi, jeśli wybierzesz zbyt wiele).

Po prostu weź commity, których chcesz się pozbyć i oznacz je "d "zamiast"pick". Teraz zmiany są usuwane skutecznie cofając rebase (jeśli usuniesz tylko zmiany, które otrzymałeś, gdy rebasing).

 4
Author: Hardev,
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-02-09 12:25:35

Jeśli coś zepsujesz w rebase git, np. git rebase --abort, gdy masz niezatwierdzone pliki, zostaną one utracone i git reflog nie pomogą. To mi się przydarzyło i musisz myśleć nieszablonowo. Jeśli masz szczęście tak jak ja i używasz IntelliJ Webstorm, Możesz right-click->local history i możesz powrócić do poprzedniego stanu plików / folderów bez względu na to, jakie błędy popełniłeś z oprogramowaniem do wersjonowania. Zawsze dobrze jest mieć uruchomiony kolejny failsafe.

 -2
Author: nottinhill,
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-18 12:25:18

Aby anulować, możesz wprowadzić następujące polecenie:

git -c core.quotepath=false rebase --abort
 -8
Author: Kostya Andreev,
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
2016-03-15 05:31:43