Подтвердить что ты не робот

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

Скажем, что у меня есть такой граф:

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

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

Но если граф

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

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

Спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

Try:

git log --reflog

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Это даст вам такой файл:

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

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

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

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

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

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

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

Ответ 6

Мне посчастливилось восстановить фиксацию, посмотрев на reflog, который находился в .git/logs/HEAD

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

Ответ 7

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

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

$ nano .git/logs/HEAD

чтобы просмотреть, что вы все совершили это, или:

$ gedit .git/logs/HEAD

чтобы просмотреть, что вы все совершили это,

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

Ответ 8

@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

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

Ответ 9

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

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

Ответ 10

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

git reflog

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

enter image description here

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

git checkout -b temp_branch [email protected]{X}

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

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