2010-10-26 31 views
247

Właśnie usunąłem niewłaściwą gałąź z pewnymi zmianami eksperymentalnymi, których potrzebuję z git branch -D branchName.Git cofnąć lokalny oddział usunąć

Jak mogę odzyskać oddział?

+2

Dobrze jest wiedzieć, że nie jestem jedynym lame- o kto to zrobił (i zapomniał regularnie przesuwać do odległej kopii) – Ray

+0

, który sprawia, że ​​3 z nas teraz –

Odpowiedz

504

Możesz użyć numeru git reflog, aby znaleźć SHA1 ostatniego zatwierdzenia oddziału. Od tego momentu można odtworzyć oddział używając

git branch branchName <sha1> 

Edycja: Jak mówi @seagullJS, komenda branch -D mówi ci SHA1, więc jeśli nie zostały jeszcze zamknięte terminal staje się naprawdę proste. Na przykład ta kasuje i natychmiast przywraca oddział nazwany master2:

[email protected] /C/MyRepo (master) 
$ git branch -D master2 
Deleted branch master2 (was 130d7ba). <-- This is the SHA1 we need to restore it! 

[email protected] /C/MyRepo (master) 
$ git branch master2 130d7ba 
+52

Git mówi, co było SHA1, gdy gałąź została usunięta, więc jeśli ją po prostu usuniesz, może to być kilka wierszy w linii poleceń. – seagullJS

+1

Dzięki temu zaoszczędziłem mi godzin pracy! FYI użyć git reflog, aby uzyskać albertski

+0

Dziękuję bardzo, znalazłem moje "zagubione" pliki! – inix

34

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

git branch branchName <SHA1> 

można znaleźć SHA1 używając git reflog, opisaną w roztworze here.

+1

Jak znaleźć sha1? –

+1

Zaktualizowałem swoją odpowiedź na temat wyszukiwania SHA1. – Chetan

+0

Wielkie dzięki !!! –

2

pierwsze: z powrotem cała katalogu, w tym katalogu .git.

Po drugie: Można użyć numeru git fsck --lost-found, aby uzyskać identyfikator utraconego zatwierdzenia.

Po trzecie: rebase lub scalenie na utracone zatwierdzenie.

czwarte: Zawsze zastanów się dwa razy przed użyciem -D lub --force z git :)

Można również read this good discussion w jaki sposób odzyskać z tego rodzaju błędu.

EDYCJA: Nawiasem mówiąc, nie uruchamiaj git gc (lub pozwól, aby działał sam - tzn. Nie uruchamiaj git fetch lub czegoś podobnego) lub możesz utracić swoje zobowiązanie na zawsze.

+1

1 i 4 to przesadny IMO. – jwg

+0

tak, dlatego używamy gita, aby uniknąć noszenia tego wszystkiego. Każda akcja, którą popełniłeś, jest nadal dostępna. – mateor

18

Jeśli nie naciskać jeszcze usunięcie, można po prostu zrobić:

$ git checkout deletedBranchName 
+0

Ta odpowiedź powoduje, że rozszerzenia Git są zamknięte, ponieważ "gałąź, którą próbujesz przesłać, wydaje się być nowym oddziałem dla tego pilota". Wielkie dzięki. – Omer

10

Jeśli po prostu usunięte gałąź, widać coś takiego w swoim terminalu:

Deleted branch branch_name(was e562d13) 
  • gdzie e562d13 jest unikalnym identyfikatorem (zwanym również "SHA" lub "hash"), dzięki czemu można przywrócić usuniętą gałąź.

Aby przywrócić oddziału, zastosowanie:

git checkout -b <branch_name> <sha> 

np:

git checkout -b branch_name e562d13 
3

Dzięki, to działało.

git branch new_branch_name sha1

git checkout new_branch_name

// widzę stare sprawdzone w plikach na moim starym oddziale