Jak pokazać pierwsze zatwierdzenie przez „git log”?

Odpowiedzi:

299

Krótka odpowiedź

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

(z komentarza tiho . Jak zauważa Chris Johnsen , --max-parentszostał wprowadzony po opublikowaniu tej odpowiedzi).

Wyjaśnienie

Technicznie może być więcej niż jeden główny zatwierdzenie. Dzieje się tak, gdy wiele wcześniej niezależnych historii jest połączonych ze sobą. Jest to powszechne, gdy projekt jest zintegrowany poprzez scalanie poddrzewa .

git.gitRepozytorium ma sześć zobowiązuje korzenie w jej wykresie historii (po jednym dla Linus na początkowy popełnienia, gitk niektórzy początkowo osobne narzędzia, git-gui , gitweb i git-p4 ). W tym przypadku wiemy, że e83c516prawdopodobnie tym jesteśmy zainteresowani. Jest to zarówno pierwszy zatwierdzenie, jak i zatwierdzenie główne.

W ogólnym przypadku nie jest to takie proste.

Wyobraź sobie, że libfoo rozwija się od jakiegoś czasu i zachowuje swoją historię w repozytorium Git ( libfoo.git). Niezależnie, projekt „bar” również był w fazie rozwoju (in bar.git), ale nie na tak długo libfoo (zatwierdzenie z najwcześniejszą datą w libfoo.gitma datę, która poprzedza zatwierdzenie z najwcześniejszą datą w bar.git). W pewnym momencie twórcy „bar” decydują się na włączenie libfoo do swojego projektu za pomocą scalania poddrzewa. Przed tym połączeniem może być trywialne określenie „pierwszego” zatwierdzenia w bar.git(prawdopodobnie był tylko jeden główny zatwierdzenie). Jednak po scaleniu istnieje wiele zatwierdzeń roota, a najwcześniejsze zatwierdzenie roota pochodzi z historii libfoo, nie „bar”.

Możesz znaleźć wszystkie główne zatwierdzenia historii DAG w następujący sposób:

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

Dla przypomnienia, jeśli --max-parentsnie były dostępne, działa to również:

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

Jeśli masz przydatne tagi, git name-revmożesz dać szybki przegląd historii:

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

Premia

Używasz tego często? Trudno zapamiętać? Dodaj alias git, aby uzyskać szybki dostęp

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

Teraz możesz po prostu zrobić

git first
Chris Johnsen
źródło
49
Wierzę, git rev-list --max-parents=0 HEADże zrobi to samo i jest nieco prostsze.
tiho
3
@tiho: Tak, robi to samo i jest prostsze; chociaż ta opcja nie została jeszcze „wymyślona” w czasie tego pytania / odpowiedzi.
Chris Johnsen
Przyszło mi do głowy, że pierwsze zatwierdzenie jest bardziej zatwierdzeniem liścia niż zatwierdzeniem głównym
tiwo
@tiho Myślę, że twoja odpowiedź powinna być własną odpowiedzią, a nie tylko komentarzem. W ten sposób będzie bardziej widoczna, a ty zdobędziesz zasłużone punkty.
Russell Silva
@ RussellSilva Nie dbam o punkty, ale wierzę, że można edytować odpowiedzi innych ludzi, co prawdopodobnie byłoby lepsze niż dodanie nowej. Sam nie czuję się komfortowo, nie krępuj się :)
tiho,
416

Znalazłem to:

git log --reverse

pokazuje zatwierdzenia od początku.

Nyambaa
źródło
19
co ciekawe git log --reverse -5, z --reversejakiegoś powodu to ignoruje
Dan2552
6
@ Dan2552 Wygląda na błąd, należy zgłosić?
saeedgnu
23
wygląda na to, że najpierw ogranicza wyniki do 5 pozycji, a następnie odwraca
nonpolarity
3
@ 太極 者 無極 而 生 ma rację, to jest udokumentowane zachowanie.
poważnedev
44

Możesz po prostu odwrócić swój dziennik i po prostu przejść do pierwszego wyniku.

git log --pretty=oneline --reverse | head -1
Mohamed Mansour
źródło
7
git log --reverseodwraca historię, więc musisz użyć head -1zamiast tail -1pierwszego zatwierdzenia.
rubiii
4
najlepiej byłoby, gdyby git nie ignorował -nflagi, gdy --reversejest podana.
Frederick Nord
12
git log $(git log --pretty=format:%H|tail -1)
Matthew Flaschen
źródło
1
lubgit log $(git log --reverse --pretty=format:%H|head -1)
polarności
pomoc dla mnie. prawdziwe „pierwsze zatwierdzenie”
kangear
6

Chyba nie jest to najpiękniejszy sposób:

git log --pretty=oneline | wc -l

To daje ci liczbę

git log HEAD~<The number minus one>
MHC
źródło
1

git log --format="%h" | tail -1daje hash zatwierdzenia (tj. 0dd89fb), który możesz przekazać innym poleceniom, wykonując coś takiego

git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD aby zobaczyć wszystkie zatwierdzenia z ostatniego dnia.

TankorSmash
źródło