GIT przywraca ostatnio odłączony HEAD

85

Proszę, mam duży problem w moim projekcie: taki jest scenariusz. Mam projekt Xcode w ramach GIT. Dzisiaj zdałem sobie sprawę, że ostatnie zatwierdzenie zepsuło niektóre testy, więc sprawdziłem poprzednie zatwierdzenie. Użyłem SourceTree i to jest ostrzeżenie

Spowoduje to, że kopia robocza stanie się „odłączoną GŁOWĄ”, co oznacza, że ​​nie będziesz już na gałęzi. Jeśli po tym chcesz zatwierdzić, prawdopodobnie będziesz chciał ponownie wyrejestrować gałąź lub utworzyć nową gałąź. Czy to jest ok?

Pracowałem cały dzień i na koniec wszystko zobowiązałem. Musiałem więc scalić moją pracę na gałęzi develop, więc wyewidencjonowałem gałąź develop i ... moja praca natychmiast zniknęła :(

Wiem, że odłączenie HEAD było niewłaściwe, a Sourcetree ostrzegło mnie ... ale czy jest sposób, aby przywrócić moją pracę?

IgnazioC
źródło
Powiązany wątek dotyczący tego samego problemu tutaj i szczegółów technicznych dotyczących tego, jak to się dzieje tutaj .
RBT,

Odpowiedzi:

254

Jeśli wpiszesz git reflog, pokaże Ci historię HEADwskazanych wersji . Twoja odłączona głowa powinna tam być. Gdy go znajdziesz, zrób git checkout -b my-new-branch abc123lub git branch my-new-branch abc123(gdzie abc123jest SHA-1 odłączonej HEAD), aby utworzyć nową gałąź, która wskazuje na twoją odłączoną głowę. Teraz możesz w wolnym czasie scalić tę gałąź.

Generalnie, jeśli sprawdzasz gałąź po pracy z odłączoną głowicą, Git powinien poinformować cię o zatwierdzeniu z odłączonej głowy, na którym byłeś, abyś mógł ją odzyskać, jeśli potrzebujesz. Nigdy nie korzystałem z SourceTree, więc nie wiem, czy przekazuje tę wiadomość. Ale jeśli wyświetlił ten komunikat, powinieneś być w stanie go użyć do znalezienia zatwierdzenia i ponownie użyć git checkout -blub git branchdo utworzenia gałęzi z tego zatwierdzenia.

Brian Campbell
źródło
4
Dziękuję Brian. Uratowałeś mój dzień.
Muzammil
Brian, uratowałeś mi życie! Dzięki!!
cldrr
Jestem nowy w git .. otrzymuję fatal: A branch named 'mybranch' already exists.Jak dodać istniejącą gałąź?
Ramesh Murugesan
1
Jako PSA dla wszystkich tych, którzy dziękują Brianowi: jeśli wykonujesz pracę, której nie chcesz stracić, wysyłaj ją na pilota (np. Github) co kilka godzin. Kiedy meteor spadnie na twój komputer, będziesz zadowolony, że to zrobiłeś. Jeśli nie jesteś jeszcze gotowy, aby udostępnić go współpracownikom, po prostu umieść go w gałęzi, o której nikt na razie nie wie, a następnie przekształć go w master później.
MatrixManAtYrService,
1
Ponadto, jeśli jest to pojedynczy zagubiony commit, który właśnie zniknął i tam go znalazłeś, możesz go przywrócić z git cherry-pick e5b2f7b, gdzie e5b2f7bjest SHA-1 tego zatwierdzenia.
Aidin
10

W Sourcetree możesz to zrobić za pomocą GUI.

Najpierw znajdź „utracone” zatwierdzenie, szukając wiadomości w historii poleceń (widok: Pokaż wynik polecenia). Prawdopodobnie będzie w poleceniu "Switching Branch" po zatwierdzeniu, które straciłeś. Miejmy nadzieję, że w tej wiadomości zobaczysz komentarz dotyczący zmiany z identyfikatorem zatwierdzenia 1234567.

Przejdź do następnego kroku w tym dokumencie.

Wciśnij przycisk „Rozgałęzienie” na górnym pasku narzędzi, a powinieneś otrzymać okno dialogowe „Nowa gałąź”, w którym możesz określić pewne zatwierdzenie. Umieść tam ten identyfikator zatwierdzenia, podaj nazwę nowej gałęzi, naciśnij Utwórz gałąź, a powinieneś otrzymać nową gałąź z utraconym zatwierdzeniem!

wprowadź opis obrazu tutaj

blalond
źródło
faktycznie działa. Upewnij się, że widzisz poprawny komentarz z identyfikatorem zatwierdzenia.
Hammad Khan
@blalond Witam, po przeczytaniu twojej odpowiedzi mam małe pytanie: kiedy w SourceTree klikam dwukrotnie na poprzedni commit (aby to sprawdzić) otrzymuję ten sam komunikat, że spowodowałoby to odłączenie głowy, więc zastanawiam się co to znaczy, gdy ludzie mówią, że możesz po prostu przywrócić jakąkolwiek poprzednią wersję za pomocą git? Jak w takim razie cofnąć się do konkretnego zatwierdzenia? Dzięki
5

Jeśli nie chcesz zachować zmian w odłączonym HEAD i chcesz przejść do zatwierdzenia najnowszej gałęzi, użyj bezpośrednio poniższego polecenia.

git checkout - 

Uwaga: usunę wszystkie twoje zmiany w odłączonym HEAD.

Kwiat pustyni
źródło
PO poprosił o kontynuowanie swojej pracy. To nie odpowiada na pierwotne pytanie. Po prostu dodanie opcji, aby zachować to w gałęzi, sprawiłoby, że ta odpowiedź byłaby użyteczna.
manuelvigarcia
1

Mój kolega właśnie miał taką sytuację. W jego przypadku były zmiany w osobnej głowie - pracują w R-Studio - i narzędzie ostrzegło ich, że mogą stworzyć gałąź z tym i tamtym odwołaniem do SHA ... ale ponieważ jedyną opcją było "Zamknij" - duh !! to była skrzynka informacyjna - zamknęli dialog i stracili informacje na zawsze ...

Dzięki reflogpoleceniu mogliśmy zobaczyć, że zmiany nie zostały utracone. Ale w naszym przypadku git branchnie zadziałało zgodnie z oczekiwaniami ... lub przychodzące git pullw jakiś sposób zepsuły. Musieliśmy wyłowić zmiany z refloga na nowo utworzoną gałąź:

 git cherry-pick 0b823d42..3cce27fc

który umieścił wszystkie zmiany, które chcieliśmy w gałęzi. Wtedy moglibyśmy developbezproblemowo połączyć oddział w .

Tylko w przypadku, gdy ma charakter informacyjny dla każdego, my zidentyfikować rewizje na oderwane głowy w reflogpatrząc na tych, w między oznaczeniem „kasie” (które identyfikują oddział przerzutki):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

Ci, chcieliśmy były HEAD@{8}do HEAD@{6}(włącznie). Więc mamy je przez:

git cherry-pick 0b823d42..3cce27fc

Następnie zwykłe rozwiązywanie scalania i ostateczne zatwierdzanie pozostawiło nam gałąź lost_changes, w której znajduje się praca z odłączoną głowicą, którą uważaliśmy za utraconą. Łączenie tego w program development było tym razem szybkie.

manuelvigarcia
źródło
0

Wypróbowałem ten scenariusz i stwierdziłem, że git mówi mi SHA-1 o ostatnim zatwierdzeniu:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

Widziałeś tę wiadomość?

xvorsx
źródło
Nie. a może nie zwracam uwagi. Szukam kopii zapasowej na timemachine; (
IgnazioC,
1
@IgnazioC Nie musisz patrzeć na kopię zapasową. Czy spojrzałeś na moją odpowiedź? git reflogpowinien pokazać ci, czego potrzebujesz.
Brian Campbell
0

odłączona głowa jest w porządku, o ile chcesz dokonać Bez zmian.

Jeśli chcesz cofnąć zatwierdzenie, możesz użyć git revert na określonej gałęzi

Jeśli chcesz pozbyć się oderwanej głowy i wykonać commity; utwórz nową gałąź (a później połącz ją);

forvaidya
źródło
Tak! znamy zasady. Ale kiedy koledzy odpracowują oderwaną głowę, a potem odchodzą od tych zatwierdzeń, proszą o odpowiedzi, a nie o zasady.
manuelvigarcia
0
  1. Najpierw biegnij, git reflogaby wyświetlić historię.
  2. Najstarsza wersja będzie ostatnią na liście.
  3. Przełącz się na żądane zatwierdzenie, używając git checkout -b temp e35d2b3tutaj e35dd23 to wartość skrótu twojego zatwierdzenia.
  4. Otóż ​​to. Teraz po prostu dodaj git. itp....

Zaakceptuj to jako odpowiedź, jeśli to rozwiąże Twój problem. W przeciwnym razie udostępnij komentarz.

sohaib
źródło