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?

interstar
źródło

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.

CK
źródło
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.


źródło
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>
Sebastian Castro
źródło
Na wiele sposobów, w tym rev-list, tylko fsck pomógł znaleźć zatwierdzenie bez rozgałęzień. Dziękuję Ci bardzo.
temoto