Git cofnij usunięcie lokalnego oddziału

375

Właśnie usunąłem niewłaściwą gałąź z kilkoma eksperymentalnymi zmianami, których potrzebuję git branch -D branchName.

Jak mogę odzyskać oddział?

Stefan Kendall
źródło
7
Cieszę się, że nie jestem jedynym kulawcem, który to zrobił (i zapomniałem regularnie naciskać na zdalną kopię)
Ray

Odpowiedzi:

717

Możesz użyć git reflog, aby znaleźć SHA1 ostatniego zatwierdzenia oddziału. Od tego momentu możesz odtworzyć gałąź za pomocą

git branch branchName <sha1>

Edycja: Jak mówi @seagullJS, branch -Dpolecenie powie ci sha1, więc jeśli nie zamknąłeś jeszcze terminala, stanie się to naprawdę łatwe. Na przykład to usuwa, a następnie natychmiast przywraca gałąź o nazwie master2:

user@MY-PC /C/MyRepo (master)
$ git branch -D master2
Deleted branch master2 (was 130d7ba).    <-- This is the SHA1 we need to restore it!

user@MY-PC /C/MyRepo (master)
$ git branch master2 130d7ba
bobDevil
źródło
71
Git mówi ci, czym był SHA1, gdy gałąź jest usuwana, więc jeśli ją po prostu usuniesz, może to być tylko kilka linii w linii poleceń.
seagullJS
jeśli ta gałąź istnieje na serwerze, alternatywnie możesz użyćgit branch branchName origin/branchName
Florian Castellane
ponadto skończyłem z użyciem git cherry-pick <sha1>, aby przenieść zatwierdzenie do gałęzi
Akin Okegbile
54

Jeśli znasz ostatni SHA1 oddziału, możesz spróbować

git branch branchName <SHA1>

Możesz znaleźć SHA1 za pomocą git reflog, opisanego w rozwiązaniu tutaj .

Chetan
źródło
34

Jeśli nie nacisnąłeś jeszcze usunięcia, możesz po prostu zrobić:

$ git checkout deletedBranchName
amichaud
źródło
Ta odpowiedź powoduje, że rozszerzenia Git zamykają się na temat „gałąź, którą próbujesz wypchnąć, wydaje się nową gałęzią tego pilota”. Wielkie dzięki.
Omer
28

Jeśli właśnie usunąłeś gałąź, zobaczysz coś takiego w swoim terminalu:

Deleted branch branch_name(was e562d13)
  • gdzie e562d13 jest unikalnym identyfikatorem (inaczej „SHA” lub „hash”), dzięki czemu możesz przywrócić usuniętą gałąź.

Aby przywrócić gałąź, użyj:

git checkout -b <branch_name> <sha>

na przykład :

git checkout -b branch_name e562d13 
Wolny strzelec
źródło
4

Po pierwsze: wykonaj kopię zapasową całego katalogu, w tym katalogu .git.

Po drugie: możesz użyć git fsck --lost-found aby uzyskać identyfikator utraconych zatwierdzeń.

Po trzecie: bazuj lub łącz zgubione zatwierdzenie.

Po czwarte: Zawsze myśl dwa razy przed użyciem -D lub --force z git :)

Możesz także przeczytać tę dobrą dyskusję o tym, jak wyjść z tego rodzaju błędu.

EDYCJA: Nawiasem mówiąc, nie uruchamiaj git gc(lub nie pozwól, aby uruchomił się sam - tj. Nie uruchamiaj git fetchani nic podobnego), bo możesz stracić swoje zobowiązania na zawsze.

Cameron Skinner
źródło
1
1 i 4 to przesada IMO.
jwg
tak, dlatego używamy git, aby uniknąć konieczności noszenia tego wszystkiego przy sobie. Każde popełnione działanie jest nadal dostępne.
współtwórca
4

Dzięki, działało.

gałąź git nowa_nazwa_gałęzi sha1

git kasa nowa_nazwa_gałęzi

// widzę moje stare zarejestrowane pliki w mojej starej gałęzi

Rajeev Jayaswal
źródło
3

Wykonaj następujące kroki:

1: Wprowadź:

git reflog show 

Spowoduje to wyświetlenie całej historii zatwierdzeń, musisz wybrać sha-1, który ma ostatnie zatwierdzenie, które chcesz odzyskać

2: utwórz nazwę oddziału z wybranym identyfikatorem Sha-1 , np .: 8c87714

git branch your-branch-name 8c87714
zielenina
źródło
0

To działało dla mnie:

git fsck --full --no-reflogs --unreachable --lost-found
git show d6e883ff45be514397dcb641c5a914f40b938c86
git branch helpme 15e521b0f716269718bb4e4edc81442a6c11c139
Alej priv
źródło