W poniższym drzewie przykładowym:
A-B-C-D-E (master branch)
\
F-G-H (xxx branch)
Szukam F - pierwszego zatwierdzenia w gałęzi xxx. Myślę, że jest to możliwe dzięki:
git log xxx --not master
a ostatnim wymienionym zatwierdzeniem powinno być F. Czy jest to poprawne rozwiązanie, czy może ma jakieś wady?
Wiem, że były podobne pytania dotyczące stackoverflow, ale nikt nie zaproponował takiego rozwiązania i nie jestem pewien, czy zrobię to dobrze.
Odpowiedzi:
Gdzie „oddział” to nazwa Twojej gałęzi. Kropka-kropka daje ci wszystkie zatwierdzenia, których gałąź ma, której nie ma ten master.
tail -1
zwraca ostatnią linię z poprzedniego wyjścia.źródło
master
i, o ile twoja gałąź nie zostanie usunięta,git log <sha>..branch --oneline | tail -1
powinna nadal dawać wyniki, których szukasz.--reverse
do czytania logów od tyłu z kolorami itp.Powinieneś użyć
merge-base
funkcji, która jest przeznaczona do rozwiązania dokładnie tego problemu:źródło
źródło
Jeśli twoja gałąź (stara) ponownie scalona z powrotem do mastera nie daje oczekiwanego wyniku, używam skryptu Python, aby znaleźć początkowy identyfikator zatwierdzenia gałęzi.
git rev-list - zestaw zmian pierwszego rodzica
--first-parent podąża za zatwierdzeniem tylko pierwszego rodzica po zobaczeniu zatwierdzenia scalającego.
Iteruj zestaw zmian od powyższego polecenia, aż zostanie znaleziona gałąź nadrzędna.
źródło
jednakże da ci to tylko pierwsze zatwierdzenie w gałęzi xxx, która nie znajduje się w gałęzi master, a nie pierwsze zatwierdzenie w gałęzi xxx kiedykolwiek. to drugie byłoby trudne, gdyby gałąź xxx została usunięta i / lub ponownie utworzona jeden lub więcej razy. w takim przypadku możesz spróbować następujących rzeczy:
źródło
head -n 1
zamiast tego chciałeś pisaćtail -1
?tail -1
zwraca najnowsze zatwierdzenie zamiast pierwszego.Wypróbowałem to polecenie i zadziałało:
źródło
git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1
źródło