2008-09-10 29 views
225

Jaki jest najlepszy sposób na uzyskanie logu commitów w oddziale od czasu rozgałęzienia z bieżącego oddziału? Moje rozwiązanie jakim jest:Jak uzyskać zmiany w oddziale w Git

git log $(git merge-base HEAD branch)..branch 

Dokumentacja git-diff wskazuje git diff A...B jest równoważna git diff $(git-merge-base A B) B. Z drugiej strony dokumentacja dla git-rev-parse wskazuje, że r1...r2 jest zdefiniowany jako r1 r2 --not $(git merge-base --all r1 r2).

Dlaczego te są różne? Zauważ, że git diff HEAD...branch daje mi potrzebne różnice, ale odpowiednie polecenie rejestru Git daje mi więcej niż to, co chcę.

Na zdjęciach, załóżmy to:

 
     x---y---z---branch 
     /
---a---b---c---d---e---HEAD 

chciałbym uzyskać dziennik zawierający zobowiązuje X, Y, Z.

  • git diff HEAD...branch daje te przesyła potwierdzenie
  • jednak git log HEAD...branch daje X, Y, Z, C, D, E.
+0

Używasz "git log" niepoprawnie do swoich celów z tego, co widzę. Dodałem swoją odpowiedź poniżej. – PlagueHammer

Odpowiedz

161

W kontekście wykazu zmian,definiuje to jako git-rev-parse. git-log pobiera listę zmian. git-diff nie pobiera listy wersji - wymaga jednej lub dwóch wersji i zdefiniowała składnię A...B, aby określić, jak jest ona zdefiniowana na stronie podręcznika git-diff. Jeśli git-diff nie zdefiniował jawnie A...B, składnia ta byłaby nieprawidłowa. Zwróć uwagę, że strona git-rev-parse opisuje A...B w sekcji "Określanie zasięgów", a wszystko w tej sekcji jest poprawne tylko w sytuacjach, w których zakres rewizji jest prawidłowy (tj. Gdy pożądana jest lista rewizji).

Aby uzyskać dziennik zawierający tylko x, yi z, spróbuj git log HEAD..branch (dwie kropki, a nie trzy). Jest to identyczne z git log branch --not HEAD i oznacza wszystkie zatwierdzenia w oddziale, które nie są w HEAD.

+26

Wow, to jest mylące. Okazuje się, że używając "git diff HEAD..branch" pokazuje wszystkie zatwierdzenia (x, y, z, c, d, e), ale "git log HEAD..branch" robi dokładnie to, co chcę i pokazuje tylko x, y , z! Jest to dokładne przeciwieństwo używania "...". –

+20

'git diff HEAD..branch' jest identyczny z' git diff HEAD branch'. Kluczową rzeczą do zapamiętania tutaj jest to, że log przyjmuje listę/zakres zmian, a diff nie. Dlatego inaczej traktują swoje argumenty. –

60
git cherry branch [newbranch] 

wykonuje dokładnie to, o co prosisz, będąc w gałęzi master.

Jestem również bardzo lubi:

git diff --name-status branch [newbranch] 

który nie jest dokładnie to, o co prosisz, ale nadal jest bardzo przydatne w tym samym kontekście.

+0

Ah, to też fajne! –

+7

'git cherry' wyświetla listę identyfikatorów commitów. Czy mogę przekonwertować je na jedną różnicę, łącząc wszystkie zmiany w każdym zatwierdzeniu? –

+1

'git cherry' jest bardzo przydatna. Dzięki :) – jkp

22

ta jest podobna do odpowiedzi napisałem na: Preview a Git push

Rzuć te funkcje do swojego profilu Bash:

  • gbout - git branch towarzyski
  • gbin - git oddziału przychodzące

Możesz użyć tego:

  • Jeśli na Master: gbin branch1 < - to pokaże, co jest w branch1 i nie master
  • Jeśli na mistrza: gbout branch1 < - to pokaże, co w pana, że ​​nie jest w branży 1

To będzie działać z każdym oddziałem.

function parse_git_branch { 
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' 
} 

function gbin { 
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not 
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local 
} 

function gbout { 
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not 
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local 
} 
4
git log --cherry-mark --oneline from_branch...to_branch 

(3dots), ale czasami pokazuje '+' zamiast '='

+0

Trzy kropki pokazują pierwsze zatwierdzenie w gałęzi dwa razy, podczas gdy dwa nie. –

30

Co chcesz zobaczyć lista wychodzących zobowiązuje. Można to zrobić za pomocą

git log master..branchName 

lub

git log master..branchName --oneline 

Gdzie mogę założyć, że „BRANCHNAME” został stworzony jako oddział śledzenia z „master”.

Podobnie, aby zobaczyć nadchodzące zmiany można użyć:

git log branchName..master 
+1

@ A-B-B, jeśli parametr branchName jest pominięty, domyślnie jest to "head", co w przykładzie jest efektywnie branchName. – PlagueHammer

7

Rzut -pw tam zobaczyć kilka zmian plików

git log -p master..branch 

Dodać kilka aliasów:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'" 

alias gbl='git log -p master..\`gbc\`' 

Zobacz listę unikalnych zobowiązań:

gbl 
+0

Uwielbiam proste niesamowite alias dzięki! –

2

znalazłem

git diff <branch_with_changes> <branch_to_compare_to> 

bardziej użyteczne, ponieważ nie tylko uzyskać zatwierdzenie wiadomości, ale z całą diff.Jeśli jesteś już na gałęzi chcesz zobaczyć zmiany i (na przykład), aby zobaczyć, co się zmieniło w pana, można użyć:

git diff HEAD master 
6

Aby zobaczyć dziennik bieżącej gałęzi od rozgałęzienia off Master:

git log master...

Jeśli obecnie na pana, aby zobaczyć dziennik innej gałęzi ponieważ odgałęziana Master:

git log ...other-branch

8

Podobny do kilku odpowiedzi, takich jak Alex V i NDavis, ale żaden z nich nie jest taki sam.

Kiedy już w branży w kwestii

Zastosowanie:

git diff master... 

który łączy w sobie kilka funkcji:

  • To super krótki
  • pokazuje rzeczywiste zmiany

Aktualizacja:

Powinno to być prawdopodobnie git diff master, ale także pokazuje różnicę, a nie zatwierdzenie jako pytanie.

+0

Jeśli masz 'git co master; git pull' od momentu utworzenia gałęzi, 'git diff master' nie będzie zbytnio używał, aby różnice zostały wprowadzone TYLKO przez zatwierdzenia w określonej gałęzi. – guival