Git: казалось, был в «(без ветки)», а затем потерял мои изменения


11

Я пытался перейти из своего рабочего пространства Git в Github, но мои добавленные и зафиксированные изменения, похоже, не были загружены.

Затем, делая «git branch», я получил что-то похожее на это:

git branch
* (no branch)
  master

Глупо, я думал, что смогу вернуться в мастер с

git checkout master

и теперь мои изменения, кажется, прошли. Моему основному филиалу около дня. И, кажется, нет способа вернуться к этому (нет ветки).

Мои изменения потеряны? Или есть способ их восстановить?

Ответы:


13

Пока вы не сделали git gc, то вы ничего не потеряли. Все, что вам нужно сделать, это найти его снова :) Что вы получаете с:

git reflog show

Это должно показать вам, что произошло, и идентификатор отсутствующего узла (ов).


2
Я бы сделал git reflog без указания мастера. Возможно иметь коммиты, которые не привязаны к ветке, и в этом случае, скорее всего, так и произошло. Вы можете оформить коммит в новую ветку, чтобы он имел путь к нему.
Джефф Ферланд

Вы правы, наверное, лучше так. Мое предположение из вопроса состояло в том, что это было на мастере для фиксации. Я обновил свой ответ.
СК.

Вот так, спасибо! Я вложил огромный тайник в ни одну ветку, затем переключился на мастера, чтобы объединить его ... и моя рекомендация исчезла.
Паскаль

Прошло довольно много лет, но я тоже прыгнул в это. Я переключился обратно на мастер ветку, и вдруг, пуф. Все мои 2 дня работы (то есть 8 часов в день) прошли. Спасибо огромное!
Falgantil

5

Приведенный выше ответ является правильным. Вот что я сделал:

$ 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

"О, нет!" момент это:

checkout: moving from master to ca92d15d272867b63d54f96d4aa57f8ecc479cd0

ca92d15d272867b63d54f96d4aa57f8ecc479cd0 - это анонимная ветвь, которая отображается как (без ветки). Чтобы вернуться к нему, просто сделайте git checkout, и ваш старый псевдодиспетчер восстановится.

Я рекомендую сделать резервную копию вашего git-репозитория до того, как вы случайно загрузите его, просто для спокойствия.


Просто проверить ветку у меня не получилось. Мои изменения были правильно сделаны в моей ветке функций. Тем не менее я не мог видеть их в своем рабочем пространстве. Должно быть, я потерял свои изменения каким-то другим способом. Тем не менее, я мог восстановить свои изменения, выполнив git reset --hard <commit-id>. Код фиксации - это буквенно-цифровой код в первом столбце git reflog. См. Effectif.com/git/recovering-lost-git-commits .
Торстен

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>

Из многих способов, включая rev-list, только fsck помог найти коммит без веток. Большое спасибо.
Темото
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.