Получите список всех 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 68

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 и регистрации!

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

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

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

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

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

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

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

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

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

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

мы 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 на изображении висят, но все еще видны.