Получите список всех коммитов git, включая "потерянные"

предположим, что у меня есть такой график:

A---B---C---D (master)
     
      -E---F (HEAD)

Если я делаю git log --all --oneline, я получу все шесть моих коммитов.

но если граф

A---B---C---D (master, HEAD)
     
      -E---F

Я не увижу E и F. могу ли я получить git, чтобы рассказать мне все коммиты, в том числе на ветвях, которые не названы?

спасибо

9 ответов


не особенно легко - если вы потеряли указатель на кончик ветки, это скорее похоже на поиск иглы в стоге сена. Вы можете найти все коммиты, на которые больше не ссылаются -git fsck --unreachable будет делать это за вас - но это будет включать в себя коммиты, которые вы выбросили после git commit --amend, старые коммиты на ветвях, которые вы перебазировали и т. д. Поэтому видеть все эти коммиты сразу, скорее всего, слишком много информации, чтобы пробираться.

таким образом, легкомысленный ответ, не теряйте из виду то, что вас интересует. Более серьезно, reflogs будет содержать ссылки на все коммиты, которые вы использовали в течение последних 60 дней или около того по умолчанию. Что еще более важно, они дадут некоторый контекст о том, что эти коммиты are.


когда я решаю эту проблему, я использую следующую команду:

git reflog |  awk '{ print  }' | xargs gitk

Это позволяет мне визуализировать последние коммиты, которые стали безголовыми.

у меня это завернуто в Помощник скрипта под названием ~/bin/git-reflog-gitk.


попробуй:

git log --reflog

в котором перечислены все git-коммиты, делая вид, что все объекты, упомянутые reflogs (git reflog) перечислены в командной строке как <commit>.


как ответ @Kieran, но для консоли: git log --oneline --all --graph --decorate $(git reflog | awk '{print }')


Мне повезло восстановления совершают, глядя на reflog, который был расположен в .git/logs/HEAD

мне тогда пришлось ругаться до конца файла, и я нашел фиксацию, которую я только что потерял.


как я решаю эту проблему? Использовать git fsck и регистрации!

сначала создайте файл, содержащий потерянные (недостижимые) коммиты и blobs. (Примечание: Если вы сделали что-то вроде git gc тогда он будет собирать мусор все они совершают, и вы не найдете их здесь!)

$git fsck --lost-found > lost_found.commits

это дает вам такой файл:

болтается совершить dec2c5e72a81ef06963397a49c4b068540fc0dc3
болтающийся шарик f8c2579e6cbfe022f08345fa7553feb08d60a975
висячие 0eb3e86dc112332ceadf9bc826c49bd371acc194 блоб
болтающийся шарик 11cbd8eba79e01f4fd7f496b1750953146a09502
болтающийся совершить 18733e44097d2c7a800650cea442febc5344f9b3
болтающийся шарик 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

затем вы можете открыть этот файл с помощью любимого текстового редактора, чтобы скопировать хэши фиксации / блога оттуда. (*кашель* Vim макросы отлично работает для этого *кашель*)

теперь вы может вернуться из этой фиксации с чем-то вроде git log --oneline <commit hash>. Кроме того, gitk, tig или любой другой git viewer должны работать.

в вашем случае, если вы найдете хэш для фиксации F, журнал покажет вам что-то вроде этого,

A---B---E---F

быстро и легко! Теперь вы можете найти контекст за всеми этими болтающимися фиксациями.

P.S. Да, я знаю, поздняя почта, но кто-то может найти ее здесь и найти ее полезной. (Скорее всего, мне через 6 месяцев, когда я google это опять)


мы git log иногда не хорошо, чтобы получить все детали коммитов, поэтому для просмотра этого...

для Mac: войдите в проект git и введите:

$ nano .git/logs/HEAD

просмотреть все коммиты в этом, или:

$ gedit .git/logs/HEAD

просмотреть все коммиты в том,

затем вы можете редактировать в вашем любимом браузере.


@bsimmons

git fsck --lost-found | grep commit

затем создайте ветку для каждого из них:

$ git fsck --lost-found | grep commit
Checking object directories: 100% (256/256), done.
dangling commit 2806a32af04d1bbd7803fb899071fcf247a2b9b0
dangling commit 6d0e49efd0c1a4b5bea1235c6286f0b64c4c8de1
dangling commit 91ca9b2482a96b20dc31d2af4818d69606a229d4

$ git branch  branch_2806a3 2806a3
$ git branch  branch_6d0e49 6d0e49
$ git branch  branch_91ca9b 91ca9b

теперь многие инструменты покажут вам графическую визуализацию этих потерянных коммитов.


Если вы используете Git Extensions GUI, он может показать вам графическую визуализацию висячих коммитов, если вы проверите "View - > Show reflog references". Это покажет висячие коммиты в дереве, как и все другие ссылки. Таким образом, легче найти то, что вы ищете.

посмотреть этот образ для демонстрации. Коммиты C2, C3, C4 и C5 на изображении болтаются, но все еще видны.