Git: wydawało się, że jestem w „(bez oddziału)”, a potem straciłem zmiany


11

Próbowałem przesłać z obszaru roboczego Git do Github, ale moje dodane i zatwierdzone zmiany nie zostały przesłane.

Następnie, robiąc „gałąź git”, otrzymałem coś, co wyglądało tak:

git branch
* (no branch)
  master

Głupio myślałem, że mogę wrócić do mistrza

git checkout master

a teraz wydaje się, że moje zmiany minęły. Mój główny oddział ma około jednego dnia. I wydaje się, że nie ma możliwości powrotu do tego (brak oddziału).

Czy moje zmiany zostały utracone? Czy istnieje sposób na ich odzyskanie?

Odpowiedzi:


13

Dopóki tego nie zrobiłeś git gc, nic nie straciłeś. Wszystko, co musisz zrobić, to znaleźć go ponownie :) Co otrzymujesz:

git reflog show

To powinno pokazać ci, co się stało, i identyfikator brakujących węzłów.


2
Zrobiłbym git reflog bez podawania wzorca. Możliwe są zatwierdzenia niepowiązane z odgałęzieniem, w tym przypadku prawdopodobnie tak się stało. Możesz pobrać zatwierdzenie do nowego oddziału, aby miał do niego ścieżkę.
Jeff Ferland,

Masz rację, prawdopodobnie lepiej w ten sposób. Moje przypuszczenie z tego pytania było takie, że był on nadrzędny dla zatwierdzenia. Zaktualizowałem swoją odpowiedź.
CK.

Uff, dzięki! Poddałem się ogromnej skrytce do żadnej gałęzi, a następnie przerzuciłem się na mistrza, aby połączyć ją ... i zniknąłem moją referencję.
Pascal

Minęło sporo lat, ale ja też w to wskoczyłem. Wróciłem do gałęzi głównej i nagle kupa. Minęły wszystkie moje 2 dni pracy (czyli 8 godzin). Dziękuję bardzo!
Falgantil,

5

Powyższa odpowiedź jest poprawna. Oto co zrobiłem:

$ git reflog
5b35f6d HEAD@{1}: pull github master: Fast forward
ca92d15 HEAD@{2}: checkout: moving from 759dab1b15731ce7680c26839ca470d20e709e36 to master
759dab1 HEAD@{3}: commit (merge): Merge branch 'master' of github.com:gonzojive/IODB-ui into HEAD
065e269 HEAD@{4}: commit: added fieldsets to snazzy form
f357606 HEAD@{5}: commit: preliminary support for google maps.
ca92d15 HEAD@{6}: checkout: moving from master to ca92d15d272867b63d54f96d4aa57f8ecc479cd0

$ git checkout ca92d15d272867b63d54f96d4aa57f8ecc479cd0

„Och nie!” chwila jest następująca:

checkout: moving from master to ca92d15d272867b63d54f96d4aa57f8ecc479cd0

ca92d15d272867b63d54f96d4aa57f8ecc479cd0 to anonimowa gałąź, która pojawia się jako (brak gałęzi). Aby wrócić do tego, po prostu zrób kasę, a stary pseudobranch zostanie przywrócony.

Zalecam wykonanie kopii zapasowej repozytorium git, zanim przypadkowo go wykonasz, tylko dla spokoju ducha.


Samo sprawdzenie oddziału nie działało dla mnie. Moje zmiany zostały poprawnie wprowadzone w mojej gałęzi funkcji. Nadal nie widziałem ich w moim obszarze roboczym. Musiałem zgubić moje zmiany w jakiś inny sposób. Jednak mogłem odzyskać moje zmiany, wykonując git reset --hard <commit-id>. Identyfikator zatwierdzenia to kod alfanumeryczny w pierwszej kolumnie git reflog. Zobacz Effectif.com/git/recovering-lost-git-commits .
Torsten

2
# if you have already checked out to master, 
# you won't know the commit-ish of your "no branch":

git fsck --lost-found # (to find your <commit-ish>)
git merge <commit-ish>

# if you are still on your "no branch" commit:

git log # (the commit-ish will be on the first line)
git checkout master
git merge <commit-ish>

# or

git log | head -n 1 | cut -d ' ' -f 2 | pbcopy
git checkout master
git merge <commit-ish>

Na wiele sposobów, w tym rev-list, tylko fsck pomógł znaleźć zatwierdzenie bez rozgałęzień. Dziękuję Ci bardzo.
temoto
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.