Czy mogę odzyskać gałąź po jej usunięciu w Git?

Jeśli uruchomię git branch -d XYZ, czy jest jakiś sposób na odzyskanie gałęzi? Czy istnieje sposób, aby wrócić tak, jakbym nie uruchomił polecenia delete branch?

Author: Peter Mortensen, 2010-09-04

14 answers

Tak, powinieneś być w stanie zrobić git reflog i znaleźć SHA1 dla commita na końcu usuniętej gałęzi, a następnie po prostu git checkout [sha]. A kiedy już będziesz przy tym commicie, możesz po prostu odtworzyć gałąź stamtąd.

 1440
Author: tfe,
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-25 18:52:10

Większość nieosiągalnych commitów znajduje się w reflogu. Tak więc, pierwszą rzeczą, którą należy spróbować, jest spojrzenie na reflog za pomocą polecenia git reflog (które wyświetla reflog dla HEAD).

Być może czymś łatwiejszym, jeśli commit był częścią konkretnej gałęzi wciąż istniejącej jest użycie polecenia git reflog name-of-my-branch. Działa również z pilotem, na przykład jeśli wymuszone push.


Jeśli Twoje commity nie znajdują się w Twoim reflogu (być może dlatego, że usunięte przez narzędzie 3rd party, które nie pisz w reflogu), udało mi się odzyskać gałąź przez zresetowanie mojej gałęzi do sha commita znalezionego za pomocą takiego polecenia (tworzy plik ze wszystkimi zwisającymi commitami):

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

Jeśli powinieneś użyć go więcej niż jeden raz (lub chcesz go gdzieś zapisać), Możesz również utworzyć alias za pomocą tego polecenia...

git config --global alias.rescue '!git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\  -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt'

I użyj go z git rescue

Aby zbadać znalezione commity, możesz wyświetlić każdy commit za pomocą niektórych poleceń, aby sprawdzić oni.

Aby wyświetlić metadane zmian (autor, data utworzenia i komunikat zmian):

git cat-file -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

Aby zobaczyć również diffs:

git log -p 48540dfa438ad8e442b18e57a5a255c0ecad0560

Gdy znajdziesz swój commit, Utwórz gałąź na tym commicie za pomocą:

git branch commit_rescued 48540dfa438ad8e442b18e57a5a255c0ecad0560
 105
Author: Philippe,
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-10-07 07:53:02

Jeśli lubisz używać GUI, możesz wykonać całą operację za pomocą gitk.

gitk --reflog

To pozwoli Ci zobaczyć historię zatwierdzeń gałęzi tak, jakby gałąź nie została usunięta. Teraz wystarczy kliknąć prawym przyciskiem myszy na najnowszym zatwierdzeniu do gałęzi i wybrać opcję menu Create new branch.

 32
Author: nobar,
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-06-02 14:28:53

Najlepsze rozwiązanie robi właściwie więcej niż żądano:

git checkout <sha>
git checkout -b <branch>

Lub

git checkout -b <branch> <sha>

Przenieś Cię do nowej gałęzi wraz ze wszystkimi ostatnimi zmianami, których mogłeś Nie zatwierdzić. Może to nie być twoja intencja, zwłaszcza w "trybie paniki" po utracie gałęzi.

Aczystsze (i prostsze) rozwiązanie wydaje się być jednoliniowe (po znalezieniu <sha> z git reflog):

git branch <branch> <sha>

Teraz ani Twoja bieżąca gałąź, ani niezatwierdzone zmiany nie są dotknięte. Zamiast tego tylko nowa gałąź zostanie utworzona aż do <sha>.

Jeśli nie jest to wskazówka, nadal będzie działać i otrzymasz krótszą gałąź, możesz spróbować ponownie z nową <sha> i nową nazwą gałęzi, dopóki nie zrobisz tego dobrze.

W końcu możesz zmienić nazwę pomyślnie przywróconej gałęzi na taką, jak została nazwana lub cokolwiek innego:

git branch -m <restored branch> <final branch>
Nie trzeba dodawać, że kluczem do sukcesu było znalezienie odpowiedniego commita <sha>, więc nazywaj swoje commity mądrze:)
 18
Author: Dmitri Zaitsev,
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-28 12:15:13

Dodawanie do TFE odpowiedź : jest też git-resurrect.sh skrypt w obszarze contrib/ źródeł Git (w git.repozytorium git), które może Ci pomóc.

git-resurrect <name> próby odnalezienia śladów końcówki gałęzi nazywa się <name> i próbuje go wskrzesić. Obecnie reflog jest wyszukano wiadomości kasowe, a z -r również wiadomości scalające. Z -m i -t, historia wszystkich refów jest skanowana dla Merge <name> into other/Merge <other> into <name> (odpowiednio) commit subjects, które jest dość powolny, ale pozwala wskrzesić temat innych ludzi gałęzie.

 14
Author: Jakub Narębski,
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-07-20 08:54:31

Jeśli nie masz reflogu, np. ponieważ pracujesz w otwartym repozytorium, które nie ma włączonego reflogu, a commit, który chcesz odzyskać, został utworzony niedawno, inną opcją jest znalezienie ostatnio utworzonych obiektów commitów i przeglądanie ich.

Z katalogu .git/objects Uruchom:

find . -ctime -12h -type f | sed 's/[./]//g' | git cat-file --batch-check | grep commit

Znajduje wszystkie obiekty (commity, pliki, znaczniki itp.) utworzony w ciągu ostatnich 12 godzin i filtruje je tak, aby pokazywały tylko commity. Sprawdzanie tych jest wtedy szybkie proces.

Spróbowałbym git-ressurect.sh skrypt wymieniony w odpowiedzi Jakuba jako pierwszy.

 9
Author: Robert Knight,
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-05-23 11:54:59

Użyłem następujących poleceń, aby znaleźć i odzyskać usuniętą gałąź. Pierwsze kroki pochodzą z opisu gcb.

$ git fsck --full --no-reflogs --unreachable --lost-found > lost
$ cat lost | cut -d\  -f3 > commits
$ cat commits | xargs -n 1 git log -n 1 --pretty=oneline

Teraz poszukaj identyfikatora git commit (GIT-SHA) na podstawie komentarzy commit i użyj go w Komendzie poniżej. Sprawdź nową gałąź o nazwie NEW-BRANCH z wcześniej znalezionym GIT-SHA:

$ git checkout -b NEW-BRANCH GIT-SHA
 7
Author: Patrick Koorevaar,
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-11-14 13:28:22

Z mojego zrozumienia, jeśli gałąź do usunięcia może zostać osiągnięta przez inną gałąź, możesz ją bezpiecznie usunąć za pomocą

git branch -d [branch]
I Twoja praca nie jest stracona. Pamiętaj, że gałąź nie jest migawką, ale wskaźnikiem do niej. Więc kiedy usuniesz gałąź, usuniesz wskaźnik.

Nie stracisz nawet pracy, jeśli usuniesz gałąź, do której nie może dotrzeć inny. Oczywiście nie będzie to tak proste, jak sprawdzenie hasha commit, ale nadal możesz to zrobić. Dlatego Git nie jest w stanie usuwa gałąź, do której nie można dotrzeć używając -d. Zamiast tego musisz użyć

git branch -D [branch]
To część filmu Scotta Chacona o Git. Sprawdź minute 58: 00, kiedy mówi o gałęziach i jak je usunąć.

Wprowadzenie do Gita ze Scottem Chaconem z GitHub

 6
Author: fabiopagoti,
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-07-20 08:57:50

Dla użytkowników GitHub bez zainstalowanego Git:

Jeśli chcesz przywrócić go ze strony GitHub , możesz zhakować ich stronę;)

• przede wszystkim znajdź te SHAs (commit hashes):

curl -i https://api.github.com/repos/PublicUser/PublicRepo/events

... lub dla transakcji prywatnych:

curl -su YourUserName https://api.github.com/repos/YourUserName/YourProject/events

... (hasło zostanie wyświetlone)

• Następnie przejdź do GitHub i utwórz nową tymczasową gałąź, która zostanie usunięta na zawsze (preferowany jest Chrome).

   •  Przejdź do gałęzi i usuń to.

na tej samej stronie, bez przeładowywania, otwórz DevTools, panel sieci. Przygotuj się...

• kliknij Przywróć. Zauważysz nową "linię". Kliknij prawym przyciskiem myszy na nim i wybierz "Kopiuj jako cURL" i zapisz ten tekst w jakimś edytorze.

• dołącza do końca skopiowanego wiersza kodu ten: -H "Cookie=".

Powinieneś dostać teraz coś takiego:

curl 'https://github.com/UserName/ProjectName/branches?branch=BranchSHA&name=BranchName' -H 'Cookie:' -H 'Origin: https://github.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US' -H 'User-Agent: User-Agent' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'Accept: */*' -H 'Referer: https://github.com/UserName/ProjectName/branches' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' --data 'utf8=%E2%9C%93&authenticity_token=token' --compressed

• ostatni krok: zamień "BranchSHA" na swój SHA-hash i BranchName z żądaną nazwą(BTW, to świetny hack, aby zmienić nazwę gałęzi z sieci). Jeśli nie byłeś zbyt wolny, Musisz i tak złożyć tę prośbę. Na przykład wystarczy skopiować i wkleić do terminala.

P. s.

Wiem, że to nie jest proste rozwiązanie czy właściwe rozwiązanie, ale na wypadek gdyby ktoś, bez hasła roota i maszyny wirtualnej, podczas hackathonu będzie musiał zrobić coś dziwnego?.. To jest całkowicie prawdziwe, więc dziękuję za poświęcony czas i powodzenia :)

UPDATE

Ahaha, jestem tak podekscytowany faktem, że ktoś w World Wide Web znalazł moją odpowiedź i po jej przeczytaniu, uznał ją za zabawną lub przydatną i podniósł moją oszałamiającą, szaloną i tak złą odpowiedź:) to wspaniały świat wokół, a my, programiści i koderzy, jesteśmy jednym z najbardziej szalonych jego części

 6
Author: Maxim Mazurok,
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-07-28 22:01:21

Zrebasowałem gałąź z remote, aby spróbować wyczyścić kilka commitów, których nie chciałem i zamierzałem cherrypickować te właściwe, które chciałem. Oczywiście, że źle napisałem SHAs...

Oto jak je znalazłem (głównie łatwiejszy interfejs / interakcja z rzeczy na odpowiedzi tutaj):

Najpierw Wygeneruj listę luźnych commitów w swoim dzienniku. Zrób to jak najszybciej i przestań działać, ponieważ mogą one zostać wyrzucone przez śmieciarza.

git fsck --full --no-reflogs --unreachable --lost-found > lost

Tworzy plik lost z wszystkimi / align = "left" / Aby uprościć nasze życie, odetnijmy z niego tylko SHA:

cat lost | cut -d\  -f3 > commits

Teraz masz commits Plik ze wszystkimi commitami, które musisz sprawdzić.

Zakładając, że używasz Basha, ostatni krok:

for c in `cat commits`; do  git show $c; read; done

Wyświetli Ci informacje o różnicy i zatwierdzeniu dla każdego z nich. I poczekaj, aż naciśniesz Enter . Teraz zapisz wszystkie, które chcesz, a następnie cherry-wybierz je. Po zakończeniu, po prostu Ctrl-C to.

 4
Author: gcb,
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-07-20 09:01:04

Aby odzyskać usuniętą gałąź, najpierw Przejrzyj historię reflogu,

git reflog -n 60

Gdzie n odnosi się do ostatnich n commitów. Następnie znajdź właściwą głowę i stwórz z nią gałąź.

git branch testbranch HEAD@{30}
 2
Author: sajin tm,
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-23 13:57:14

Najpierw przejdź do git batch aby przejść do twojego projektu:

cd android studio project
cd Myproject
then type :
git reflog

Wszyscy macie listę zmian i numer referencyjny weź Numer ref a następnie checkout
z android studio lub z git betcha. inne rozwiązanie weź Numer ref i przejdź do android studio kliknij na gałęzie git w dół, a następnie kliknij na znacznik checkout lub rewizję obok numeru referencyjnego, a następnie lol masz gałęzie.

 1
Author: FAHAD HAMMAD ALOTAIBI,
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-08-31 22:09:41

Dodając do odpowiedzi tfe, możesz odzyskać ten proces, chyba że commity nie są zbieranymi śmieciami. Git branch jest po prostu wskaźnikiem do określonego commita w drzewie commitów. Ale jeśli usuniesz wskaźnik, a commity z tej gałęzi nie zostaną scalone z inną istniejącą gałęzią, to git traktuje je jako zwisające commity i usuwa je podczas zbierania śmieci, które może uruchamiać automatycznie okresowo.

Jeśli twoja gałąź nie została połączona z istniejącą gałąź, a jeśli to były śmieci zebrane, wtedy stracisz wszystkie commity aż do punktu, z którego branch został rozwidlony z istniejącej gałęzi.

 1
Author: Rajeshwar Agrawal,
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-19 12:49:05

A related issue: Wszedłem na tę stronę po wyszukaniu "jak wiedzieć, co są usuwane gałęzie".

Podczas usuwania wielu starych gałęzi, czułem, że omyłkowo usunąłem jedną z nowszych gałęzi, ale nie znałem nazwy, aby ją odzyskać.

Aby dowiedzieć się, które gałęzie są ostatnio usuwane, wykonaj poniższe czynności:

Jeśli wejdziesz na swój adres URL Git, który będzie wyglądał mniej więcej tak:

https://your-website-name/orgs/your-org-name/dashboard

Następnie możesz zobaczyć kanał, co zostało usunięte, przez kogo, w niedawnej przeszłości.

 1
Author: Manohar Reddy Poreddy,
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-07-21 18:36:46