Jak uzyskać zmiany w oddziale w Git


264

Jaki jest najlepszy sposób na uzyskanie dziennika zatwierdzeń w oddziale od czasu, gdy został on rozgałęziony z bieżącego oddziału? Moje dotychczasowe rozwiązanie to:

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

Dokumentacja git-diff wskazuje, że git diff A...Bjest to równoważne z git diff $(git-merge-base A B) B. Z drugiej strony dokumentacja git-rev-parsuje , że r1...r2jest zdefiniowany jako r1 r2 --not $(git merge-base --all r1 r2).

Dlaczego się różnią? Zauważ, że git diff HEAD...branchdaje mi to różnice, których chcę, ale odpowiednie polecenie git log daje mi więcej niż to, czego chcę.

Załóżmy na zdjęciach:

         x --- y --- z --- gałąź
        /
--- a --- b --- c --- d --- e --- HEAD

Chciałbym uzyskać dziennik zawierający zatwierdzenia x, y, z.

  • git diff HEAD...branch daje te zobowiązania
  • git log HEAD...branchdaje jednak x, y, z, c, d, e.

Z tego, co widzę, używasz niepoprawnie „git log” do swoich celów. Dodałem swoją odpowiedź poniżej.
PlagueHammer

Odpowiedzi:


186

W kontekście listy wersji A...Bjest to, jak git-rev-parseją definiuje. git-log pobiera listę zmian. git-diffnie przyjmuje listy poprawek - wymaga jednej lub dwóch wersji i zdefiniował A...Bskładnię, aby oznaczać, jak jest zdefiniowana na stronie git-diffpodręcznika. Jeśli git-diffnie zdefiniowano wyraźnie A...B, wówczas składnia byłaby niepoprawna. Zauważ, że strona git-rev-parseman opisuje A...Bw sekcji „Określanie zakresów”, a wszystko w tej sekcji jest ważne tylko w sytuacjach, w których zakres wersji jest prawidłowy (tj. Gdy pożądana jest lista wersji).

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


31
Wow, to mylące. Okazuje się, że użycie „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 „...”.
Greg Hewgill,

22
git diff HEAD..branchjest identyczny z git diff HEAD branch. Kluczową rzeczą do zapamiętania tutaj jest to, że log przyjmuje listę / zakres zmian, podczas gdy diff nie. Dlatego traktują swoje argumenty inaczej.
Lily Ballard,

4
Wydaje się, że git diff HEAD...branch(trzy kropki) odpowiada git log HEAD..branch
wynikowi

72
git cherry branch [newbranch]

robi dokładnie to, o co prosisz, gdy jesteś w masteroddziale.

Lubię też:

git diff --name-status branch [newbranch]

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


8
„git cherry” wyświetla listę identyfikatorów zatwierdzeń. Czy mogę przekonwertować je na pojedynczy plik różnicowy łączący wszystkie zmiany w każdym zatwierdzeniu?
Jonathan Hartley,

1
git cherryjest naprawdę bardzo przydatny. Dzięki :)
jkp

2
@JathanathanHartley Weź pierwszy i ostatni jak z identyfikatora zatwierdzenia i wyrzuć je do gif-diff: git diff x..zlub na mój własny przykład git diff 13bc4d..8eda3a.
towi

3
Trudno zrozumieć, który kod należy zastąpić w poleceniu, ponieważ w którym z gałęzi lub newbranch jest słowem kluczowym, a które należy zastąpić niestandardową nazwą gałęzi
pal4life

37

To, co chcesz zobaczyć, to lista wychodzących zatwierdzeń. Możesz to zrobić za pomocą

git log master..branchName 

lub

git log master..branchName --oneline

Gdzie zakładam, że „branchName” został utworzony jako gałąź śledzenia „master”.

Podobnie, aby zobaczyć nadchodzące zmiany, których możesz użyć:

git log branchName..master

1
@ABB, jeśli pominięto gałąźNazwa, domyślnie jest to „głowa”, co w rzeczywistości oznacza gałąźNazwa w powyższym przykładzie.
PlagueHammer

25

Jest to podobne do odpowiedzi, którą zamieściłem na: Podgląd wypychania Git

Upuść te funkcje w swoim profilu Bash:

  • gbout - wychodzący oddział git
  • gbin - przychodząca gałąź git

Możesz użyć tego w następujący sposób:

  • If on master: gbin branch1 <- pokaże ci, co jest w branch1, a nie w master
  • If on master: gbout branch1 <- pokaże ci, co jest w master, a nie w oddziale 1

Będzie to działać z dowolnym 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
}

16

Podobne do kilku odpowiedzi, takich jak Alex V i NDavis, ale żadna z nich nie jest taka sama.

Będąc już w danym oddziale

Za pomocą:

git diff master...

Który łączy kilka funkcji:

  • jest super krótki
  • pokazuje rzeczywiste zmiany

Aktualizacja:

Prawdopodobnie tak powinno być git diff master, ale także pokazuje różnicę, a nie zatwierdzenia, jak podano w pytaniu.


1
Jeśli git co master; git pullod tego czasu utworzyłeś gałąź, git diff masternie będzie wiele pożytku z różnic wprowadzonych TYLKO przez zatwierdzenia w określonej gałęzi.
gitarzysta

1
Lub wyraźne określenie gałęzi: git diff <branch1>...<branch2>pokaże zmiany wprowadzone przez branch2.
Alex

10

Dodaj tam -p, żeby zobaczyć ZMIANY PLIKÓW

git log -p master..branch

Zrób kilka aliasów:

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

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

Zobacz unikalne zobowiązania oddziału:

gbl

6

Aby wyświetlić dziennik bieżącego oddziału od czasu rozgałęzienia master:

git log master...

Jeśli jesteś obecnie w trybie głównym, aby wyświetlić dziennik innej gałęzi, ponieważ rozgałęziono gałąź główną:

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3dots), ale czasami wyświetla się „+” zamiast „=”


3 kropki wskazują dwa razy pierwszy zatwierdzenie na gałęzi, a dwa nie.
TJ Biddle

2

znalazłem

git diff <branch_with_changes> <branch_to_compare_to>

bardziej przydatne, ponieważ otrzymujesz nie tylko komunikaty zatwierdzeń, ale całą różnicę. Jeśli jesteś już w gałęzi, którą chcesz zobaczyć zmiany i (na przykład) chcesz zobaczyć, co zmieniło się w master, możesz użyć:

git diff HEAD master
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.