Получить список всех коммитов git, включая «потерянные» - PullRequest
95 голосов
/ 24 января 2011

Допустим, у меня есть такой график:

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

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

Но если график

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

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

Спасибо

Ответы [ 10 ]

63 голосов
/ 31 декабря 2015

Попробуйте:

git log --reflog

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

48 голосов
/ 24 января 2011

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

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

44 голосов
/ 21 мая 2014

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

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

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

Я завернул это в вспомогательный скрипт~/bin/git-reflog-gitk.

22 голосов
/ 29 мая 2015

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

6 голосов
/ 10 декабря 2014

Как мне решить эту проблему? Используйте git fsck и войдите в систему!

Сначала создайте файл, содержащий потерянные (недоступные) коммиты и BLOB-объекты. (ПРИМЕЧАНИЕ: если вы сделали что-то вроде 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 это)

5 голосов
/ 22 марта 2014

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

Для Mac: зайдите в свой git-проект и введите:

$ nano .git/logs/HEAD

для просмотра всех ваших коммитов в этом, или:

$ gedit .git/logs/HEAD

для просмотра всех ваших коммитов в этом,

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

5 голосов
/ 18 декабря 2013

Мне повезло восстановить коммит, посмотрев на reflog, который был расположен в .git/logs/HEAD

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

4 голосов
/ 16 мая 2019

То, что спасло мне жизнь, было следующей командой:

git reflog

Там вы найдете экран с историческими коммитами, сделанными для git, как этот:

enter image description here

На данный момент вам нужно только найти HEAD@{X}, который вам нужен, создать временную ветку и перейти к ней следующим образом:

git checkout -b temp_branch HEAD@{X}

Таким образом, у вас будет временная ветка с потерянным коммитом, без перебазирования или еще большего разрушения вашего git-репозитория.

Надеюсь, это поможет ...

2 голосов
/ 11 июля 2018

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

См. это изображение для демонстрации.Фиксаторы C2, C3, C4 и C5 на изображении висят, но все еще видны.

2 голосов
/ 17 июля 2017

@ 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...