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:
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ę :)
git log -1
.Odpowiedzi:
Krótka odpowiedź
(z komentarza tiho . Jak zauważa Chris Johnsen ,
--max-parents
został 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.git
Repozytorium 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, żee83c516
prawdopodobnie 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 (inbar.git
), ale nie na tak długo libfoo (zatwierdzenie z najwcześniejszą datą wlibfoo.git
ma datę, która poprzedza zatwierdzenie z najwcześniejszą datą wbar.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 wbar.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:
Dla przypomnienia, jeśli
--max-parents
nie były dostępne, działa to również:Jeśli masz przydatne tagi,
git name-rev
możesz dać szybki przegląd historii:Premia
Używasz tego często? Trudno zapamiętać? Dodaj alias git, aby uzyskać szybki dostęp
Teraz możesz po prostu zrobić
źródło
git rev-list --max-parents=0 HEAD
że zrobi to samo i jest nieco prostsze.Znalazłem to:
pokazuje zatwierdzenia od początku.
źródło
git log --reverse -5
, z--reverse
jakiegoś powodu to ignorujeMożesz po prostu odwrócić swój dziennik i po prostu przejść do pierwszego wyniku.
źródło
git log --reverse
odwraca historię, więc musisz użyćhead -1
zamiasttail -1
pierwszego zatwierdzenia.-n
flagi, gdy--reverse
jest podana.źródło
git log $(git log --reverse --pretty=format:%H|head -1)
Chyba nie jest to najpiękniejszy sposób:
To daje ci liczbę
źródło
git log --format="%h" | tail -1
daje hash zatwierdzenia (tj.0dd89fb
), który możesz przekazać innym poleceniom, wykonując coś takiegogit diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
aby zobaczyć wszystkie zatwierdzenia z ostatniego dnia.źródło