Отримайте список усіх git-комісій, включаючи "втрачені"


139

Скажімо, у мене такий графік:

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

Якщо я це зроблю git log --all --oneline, я отримаю всі шість своїх комітетів.

Але якщо графік є

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

Я не побачу E та F. Чи можу я отримати git, щоб розповісти про всі документи, в тому числі про гілки, які не названі?

Дякую

Відповіді:


63

Не особливо легко - якщо ви втратили вказівник на кінчик гілки, це швидше як знайти голку в копиці сіна. Ви можете знайти всі коміти, на які більше не посилається посилання - git fsck --unreachableце зробить для вас, - але це буде включати коміти, які ви викинули після git commit --amend, старі коміти на гілки, які ви перезавантажили тощо тощо. Отже, бачачи всі ці коміти одразу, цілком ймовірно, занадто багато інформації, яку можна проникнути.

Тож легковажна відповідь: не забувайте про те, що вас цікавить. Більш серйозно, рефлоги будуть містити посилання на всі зобов’язання, які ви використовували за останні 60 днів або близько того. Що ще більш важливо, вони будуть давати деякий контекст про те, що ці коммітов є .


7
+1: Немає різниці між комітетом, який навмисно осиротів commit --amendабо rebaseвипадково осиротів, працюючи з відокремленою ГОЛОВОЮ, скажімо.
Каскабель

3
дійсно. Мабуть, найпростішим способом виходу з цієї ситуації буде перегляд рефлогу для самої HEAD.
araqnid

@Jefromi: Прекрасний наголос на git commit --amendт.п., залишаючи тупик, втрачені комісії. Я зробив деякі звільнення та що-небудь ще, і в кінцевому підсумку з деякими комісіями, недоступними з будь-яких гілок, і я відчув трохи брудним, залишаючи їх у репо. Тепер ця думка вже не така неспокійна. :)
Еміль Лундберг

2
@araqnid Я потрапив у той самий соління, що і оригінальний плакат, і ваша пропозиція подивитися на рефлог була лише справою.
Ігнаціо

7
Я погоджуюся з цією відповіддю, але у випадку, коли комусь потрібно побачити всі вчинки, в тому числі сироти, навмисні чи випадкові, git fsck --unreachableцього не передбачено. Я просто спробував це. Кращий підхід - це --reflogваріант для git log, як відповів kenorb . Що особливо приємно в тому, що в поєднанні з цим --graphви отримуєте легкий для розбору візуальний контекст, як це було показано в оригінальному запитанні. Наприклад, спробуйте:git log --graph --all --oneline --reflog
Ініго

111

Спробуйте:

git log --reflog

який перераховує всі git-комітети, роблячи вигляд, що всі об'єкти, згадані reflogs ( git reflog), вказані в командному рядку як <commit>.


1
Це те, що я шукав - функціональність аргументу --reflog.
Аномалія

3
Btw, gitk також підтримує це: gitk --reflog.
ald.li

50

Під час вирішення цього питання я використовую таку команду:

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

Це дозволяє мені уявити останні події, які стали безголовими.

У мене це загорнуте у помічник сценарію, який називається ~/bin/git-reflog-gitk.


1
Це просто Врятувало мене великий час ... ДЯКУЮ!
Брет Ройстер

Це круто! спасибі! він дійсно візуалізує важливі частини дерева.
Младен Б.

Тільки порада: це буде працювати лише для вашої місцевої роботи, як рефлекторні записи when the tips of branches and other references were updated in the *local repository*. Ви можете скористатися, git log --reflogякщо ви хочете зробити це для немісцевих змін змін
Крішна Гупта,

29

Що врятувало мені життя, була така команда:

git reflog

Там ви знайдете екран із зафіксованими історіями, виконаними для цього git:

введіть тут опис зображення

На даний момент вам залишається лише знайти те, HEAD@{X}що вам потрібно, створити тимчасову гілку і перейти до неї так:

git checkout -b temp_branch HEAD@{X}

Таким чином, у вас буде тимчасова гілка з втраченою комісією, не звільняючи і не порушуючи ще більше вашого сховища git.

Сподіваюся, це допомагає ...


26

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


Вам потрібно включити останню частину: $ (git reflog | awk '{print $ 1}')? Що це робить? Після випробування вашого рішення, здається, він дає такий же вихід навіть без останньої частини.
wmock

Якщо ви перемістите покажчик вашої гілки та залишите деякі комісії без посилання (як це зробив OP), вони більше не з’являться у git log --all. Короткий приклад: Після того, як git reset --hard @^ваш HEAD @ {0} фільтр буде лише у рефлозі, і оскільки git reflogвін не підтримує, --graphвам потрібно передати зобов’язання git log --graphдля отримання візуального зображення.
Флоріан Фіда

5
ви можете використовувати --reflogзамість $(git reflog | awk '{print $1}')
Sild

Я по порівнянні git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')з git log --oneline --all --graph --decorate --reflog, вони майже ідентичні , за винятком --reflog включені такі деталі, як записи НЗП.
Сценарій Вовк

@FlorianFida, замість того, reflogчому б не використовувати log --reflogзамість цього?
Pacerier

9

Як я вирішую цю проблему? Використання git fsckта ведення журналу!

Спочатку створіть файл, що містить втрачені (недоступні) коміти та краплі. (ПРИМІТКА. Якщо ви зробили щось подібне, git gcто сміття збиратиме всі вони, які вони здійснюють, і ви їх тут не знайдете!)

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

Це дає вам такий файл:

обірваний зробити dec2c5e72a81ef06963397a49c4b068540fc0dc3
обірваних БЛОБ f8c2579e6cbfe022f08345fa7553feb08d60a975
обірваних БЛОБ 0eb3e86dc112332ceadf9bc826c49bd371acc194
обірваних БЛОБ 11cbd8eba79e01f4fd7f496b1750953146a09502
обірваних зробити 18733e44097d2c7a800650cea442febc5344f9b3
обірваних блоб 1e53a5cdb3ecdde27081ec6e8b31e4070106ee05

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

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

У вашому випадку, якщо ви знайдете хеш для фіксації F, журнал покаже вам щось подібне,

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

Швидко і просто! Тепер ви можете знайти контекст, що стоїть за всіма цими звинуваченими зобов'язаннями.

PS Так, я знаю, пізній пост, але о ну, хтось може знайти його тут і вважати його корисним. (Найімовірніше, мені через 6 місяців, коли я знову переглядаю Google)


5

Мені пощастило відновити комісію, переглянувши рефлог, який знаходився в .git/logs/HEAD

Потім мені довелося скинутись до кінця файлу , і я знайшов зобов’язання, яке я просто втратив.


Це те, що щойно закінчилося, коли я щось накрутив. Спробував взяти на себе майстра, і Стейш приголомшив, коли я штовхнувся. Я скинув - твердий, потім зрозумів свою помилку. Фіксація була в рефлогу, тому я перевірив її, зробив з неї гілку, потім натиснув її. Все випрацювалося врешті-решт.
Девід

5

Ми git logіноді не дуже добре , щоб отримати всі коммітов деталі, так що для перегляду цього ...

Для Mac: Введіть у себе проект git та введіть:

$ nano .git/logs/HEAD

щоб переглянути всі зобов’язання з цього чи:

$ gedit .git/logs/HEAD

щоб переглянути всі зобов’язання в цьому,

то ви можете редагувати в будь-якому улюбленому браузері.


3

@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

Зараз багато інструментів покажуть вам графічну візуалізацію цих втрачених комісій.


2

Якщо ви користуєтеся графічним інтерфейсом Git Extensions, він може показати вам графічну візуалізацію звисаючих комітетів, якщо ви поставите галочку "Переглянути -> Показати посилання рефлогу". Це покаже звисаючі комірки на дереві, як і всі інші посилання. Таким чином простіше знайти те, що ви шукаєте.

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


2
git log --reflog

врятував мене! Я втратив свою роботу під час злиття HEAD і не міг знайти свою пізню фіксацію! Не відображається у вихідному дереві, але git log --reflogпоказує всі мої локальні завдання раніше

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.