Як показати першу фіксацію за допомогою "git log"?


Відповіді:


299

Коротка відповідь

git rev-list --max-parents=0 HEAD

коментаря tiho . Як зауважує Кріс Джонсен , його --max-parentsбуло представлено після опублікування цієї відповіді.)

Пояснення

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

У git.gitсховищі є шість кореневих комірок у своєму графіку історії (по одному для початкового комітету Лінуса, gitk , деякі спочатку окремі інструменти, git-gui , gitweb та git-p4 ). У цьому випадку ми знаємо, що e83c516нас це, ймовірно, цікавить. Це і найдавніша фіксація, і коренева.

У загальному випадку це не так просто.

Уявіть, що libfoo деякий час розробляється і зберігає свою історію у сховищі Git ( libfoo.git). Незалежно, проект «бар» також розроблявся (не bar.git), але не настільки довго, коли комісія з найдавнішою датою libfoo.gitмає дату, яка передує комісії з найбільш ранньою датою в bar.git). У якийсь момент розробники “bar” вирішують включити libfoo у свій проект, використовуючи підлиття підкресленого дерева . До цього злиття, можливо, було б тривіально визначити "перше" введення bar.git(мабуть, було лише одне кореневе зобов'язання). Після злиття, однак, є кілька кореневих комітів, і найдавніша коренева фіксація насправді походить з історії libfoo, а не "бар".

Ви можете знайти всі кореневі комісії історії DAG так:

git rev-list --max-parents=0 HEAD

Для запису, якщо він --max-parentsбув недоступний, це також працює:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

Якщо у вас є корисні теги, то вони git name-revможуть дати вам короткий огляд історії:

git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin

Бонус

Використовуйте це часто? Важко запам'ятати? Додайте псевдонім git для швидкого доступу

git config --global alias.first "rev-list --max-parents=0 HEAD"

Тепер ви можете просто зробити

git first

49
Я вважаю git rev-list --max-parents=0 HEAD, що зробимо те саме, і трохи простіше.
tiho

3
@tiho: Так, це робить те саме, і простіше; хоча цей варіант був не зовсім «винайдений» під час цього питання / відповіді.
Кріс Джонсен

Це відбувається зі мною , що перша фіксація буде більше листя зробити ніж корінь фіксації
tiwo

@tiho Я думаю, що ваша відповідь повинна бути власною відповіддю, а не просто коментарем. Таким чином вона стане більш помітною, і ви отримаєте заслужені бали.
Рассел Сілва

@RussellSilva Мені не цікаво балів, але я вважаю, що можна відредагувати відповіді інших людей, що, мабуть, було б краще, ніж додавати новий. Мені не дуже зручно робити це сам, хоча
сміливо

416

Я виявив, що:

git log --reverse

показує коміти з початку.


19
що цікаво git log --reverse -5змушує ігнорувати --reverseчомусь
Dan2552

6
@ Dan2552 Виглядає як помилка, про що потрібно повідомити?
saeedgnu

23
виглядає так, що спочатку обмежує результати на 5 записів, а потім на зворотній
неополярність

3
@ 太極 者 無極 而 生 вірно, це задокументоване поведінка.
серйозний

44

Ви можете просто змінити свій журнал і просто очолити його для першого результату.

git log --pretty=oneline --reverse | head -1

7
git log --reverseобертає історію, тож вам доведеться використовувати head -1замість того, tail -1щоб отримати першу комісію.
rubiii

4
було б найкраще, якби git не ігнорував -nпрапор, коли --reverseйого дано.
Фредерік Норд


6

Мабуть, не найкрасивіший спосіб зробити це:

git log --pretty=oneline | wc -l

Це дає тобі число

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1дає вам хеш фіксування (тобто 0dd89fb), який ви можете вводити в інші команди, виконуючи щось подібне

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD щоб переглянути всі зобов’язання за останній день.

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