Jak uzyskać historię zmian tylko dla jednej gałęzi?

128

Powiedzmy, że utworzyłem nową gałąź my_experimentz masteri wykonałem kilka zatwierdzeń my_experiment. Jeśli zrobię, git loggdy włączona my_experiment, zobaczę zatwierdzenia dokonane w tej gałęzi, ale także zatwierdzenia dokonane masterprzed utworzeniem my_experimentsgałęzi.

Uważam, że bardzo przydatne byłoby zobaczenie historii wszystkich zatwierdzeń my_experimentsgałęzi, dopóki nie pojawi się ona podczas tworzenia tej gałęzi - w rzeczywistości prawdziwą historię tylko tej gałęzi. W przeciwnym razie nie jest dla mnie jasne, gdy przeglądam dziennik, czy zatwierdzenia znajdowały się w my_experimentsgałęzi, czy nie.

Czy można to zrobić za pomocą Gita?

Marplesoft
źródło

Odpowiedzi:

139

Aby to zrobić, możesz użyć zakresu .

git log master..

Jeśli sprawdziłeś swój my_experimentoddział. Pozwoli to porównać, gdzie masterjest to HEAD(końcówka my_experiment).

Alex
źródło
3
Ok odezwał się za wcześnie. Zrobiło to na moim prostym przykładzie. Ale teraz patrzę na prawdziwe repozytorium innej osoby i przychodzi mi do głowy, że aby poprawnie użyć tego polecenia, musiałbym wiedzieć, z jakiej gałęzi została utworzona moja obecna gałąź. Może powinienem to powiedzieć gitk, ale nie jest to dla mnie oczywiste. jakieś pomysły?
Marplesoft,
@Marplesoft Rozgryzienie tego może być skomplikowane. Zobacz to pytanie .
Alex
Czy mógłbyś pokrótce wyjaśnić, jak to działa? Co git log master..mówi Gitowi?
tonix
2
@tonix Kliknij łącze w odpowiedzi, aby uzyskać więcej informacji na temat działania zakresu (tej master..) części.
Alex
7

git merge-basePolecenie może być użyte do znalezienia wspólnego przodka. Więc jeśli my_experiment nie został jeszcze scalony z master, a my_experiment został utworzony z mastera, można:

git log --oneline `git merge-base my_experiment master`..my_experiment
cforbish
źródło
Jeśli chcesz dołączyć rodzica swojego pierwszego zatwierdzenia, dodaj ^ i --first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Eric Lavoie
7

Uwaga: jeśli ograniczysz ten dziennik do ostatniego n zatwierdzenia (na przykład ostatnich 3 zatwierdzeń, git log -3), pamiętaj, aby wstawić spację między 'n' a twoją gałęzią:

git log -3 master..

Przed Git 2.1 (sierpień 2014) ten błąd: git log -3master..faktycznie pokazywał ostatnie 3 zatwierdzenia bieżącej gałęzi (tutaj my_experiment), ignorując masterlimit (co oznacza, że ​​jeśli my_experimentzawiera tylko jedno zatwierdzenie, 3 nadal byłyby wymienione, 2 z nich master)

Zobacz commit e3fa568 autorstwa Junio ​​C Hamano ( gitster) :

rewizja: git log -<count>dokładniej przeanalizuj " "

Ta błędnie wpisana linia poleceń po prostu ignoruje " master" i kończy się pokazaniem dwóch zatwierdzeń z bieżącego HEAD:

$ git log -2master

ponieważ podajemy „ 2master” do atoi()bez upewnienia się, że cały ciąg jest przetwarzany jako liczba całkowita.

strtol_i()Zamiast tego użyj funkcji pomocnika.

VonC
źródło
1

Możesz użyć tylko git log --oneline

Manoj Rana
źródło
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
DebanjanB
1

Myślę, że opcją do twoich celów jest git log --online --decorate. Pozwala to poznać zaznaczone zatwierdzenie i najważniejsze zatwierdzenia dla każdej gałęzi, którą masz w swojej historii. Robiąc to, masz ładny widok na strukturę swojego repozytorium i zatwierdzeń powiązanych z określoną gałęzią. Myślę, że przeczytanie tego może pomóc.

Daniel Casas
źródło
0

Wiem, że na ten jest już bardzo późno ... Ale oto (nie taki prosty) oneliner, aby uzyskać to, czego szukałeś:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Przedstawiamy zatwierdzenia z nazwą oddziału i względnymi pozycjami do rzeczywistych stanów gałęzi z git show-branch(wysyłając ostrzeżenia do /dev/null).
  • Wtedy zachowujemy tylko te z nazwą naszej gałęzi w nawiasie za pomocą grep -E "\[$BRANCH_NAME".
  • Gdzie rzeczywistość $BRANCH_NAMEuzyskuje się z git branch | grep -E '^\*' | awk '{ printf $2 }'(gałąź z gwiazdą, echo bez tej gwiazdy).
  • Z naszych wyników usuwamy zbędną linię na początku z tail -n+2.
  • A potem my fianlly oczyścić wyjście poprzez usunięcie wszystkiego poprzedzający [$BRANCH_NAME]ze sed -E "s/^[^\[]*?\[/[/".
menssana
źródło