So erhalten Sie die Änderungen für einen Zweig in Git

264

Was ist der beste Weg, um ein Protokoll der Commits für einen Zweig zu erhalten, seit dieser von dem aktuellen Zweig verzweigt wurde? Meine bisherige Lösung lautet:

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

Die Dokumentation für git-diff gibt an, dass dies git diff A...Bäquivalent zu ist git diff $(git-merge-base A B) B. Andererseits gibt die Dokumentation für git-rev-parse an, dass r1...r2definiert ist als r1 r2 --not $(git merge-base --all r1 r2).

Warum sind diese unterschiedlich? Beachten Sie, dass git diff HEAD...branchich die gewünschten Unterschiede habe, aber der entsprechende Befehl git log gibt mir mehr als das, was ich will.

Nehmen wir in Bildern Folgendes an:

         x --- y --- z --- Zweig
        /.
--- a --- b --- c --- d --- e --- KOPF

Ich möchte ein Protokoll mit den Commits x, y, z erhalten.

  • git diff HEAD...branch gibt diese Commits
  • Jedoch git log HEAD...branchgibt x, y, z, c, d, e.
Greg Hewgill
quelle
Sie verwenden "Git Log" falsch für Ihre Zwecke, soweit ich sehen kann. Ich habe meine Antwort unten hinzugefügt.
PlagueHammer

Antworten:

186

Im Rahmen einer Revisionsliste A...B wird diese git-rev-parsedefiniert. git-log erstellt eine Revisionsliste. git-diffnimmt keine Liste von Revisionen entgegen - es dauert eine oder zwei Revisionen und hat die A...BSyntax so definiert, dass sie bedeutet, wie sie in der git-diffManpage definiert ist . Wenn git-diffdies nicht explizit definiert wird A...B, ist diese Syntax ungültig. Beachten Sie, dass die git-rev-parseManpage A...Bim Abschnitt "Festlegen von Bereichen" beschrieben wird und alles in diesem Abschnitt nur in Situationen gültig ist, in denen ein Revisionsbereich gültig ist (dh wenn eine Revisionsliste gewünscht wird).

Versuchen Sie git log HEAD..branch(zwei Punkte, nicht drei), um ein Protokoll zu erhalten, das nur x, y und z enthält . Dies ist identisch mit git log branch --not HEADund bedeutet, dass alle Commits in Zweigen ausgeführt werden, die nicht in HEAD enthalten sind.

Lily Ballard
quelle
31
Wow, das ist verwirrend. Es stellt sich heraus, dass die Verwendung von "git diff HEAD..branch" alle Commits (x, y, z, c, d, e) anzeigt, aber "git log HEAD..branch" genau das tut, was ich will und nur x, y anzeigt , z! Dies ist das genaue Gegenteil von "...".
Greg Hewgill
22
git diff HEAD..branchist identisch mit git diff HEAD branch. Das Wichtigste dabei ist, dass das Protokoll eine Liste / einen Bereich von Revisionen enthält, während dies bei diff nicht der Fall ist. Deshalb behandeln sie ihre Argumente anders.
Lily Ballard
4
Scheint, dass git diff HEAD...branch(drei Punkte) der Ausgabe vongit log HEAD..branch
jchook
72
git cherry branch [newbranch]

macht genau das, was Sie fragen, wenn Sie in der sind master Branche sind.

Ich mag auch sehr:

git diff --name-status branch [newbranch]

Was nicht genau das ist, was Sie fragen, aber im selben Kontext immer noch sehr nützlich ist.

Skiphoppy
quelle
8
'git cherry' gibt eine Liste von Commit-IDs aus. Kann ich diese in ein einziges Diff konvertieren, das alle Änderungen in jedem Commit kombiniert?
Jonathan Hartley
1
git cherryist in der Tat sehr nützlich. Danke :)
jkp
2
@JonathanHartley das Nehmen erste und die letzte , wie der Commit - IDs und ihnen die geworfen gif-diff: git diff x..zoder für mein eigenes Beispiel ist git diff 13bc4d..8eda3a.
Towi
3
Es ist schwer zu verstehen, welcher Code in Ihrem Befehl ersetzt werden muss, wie in welchem ​​Zweig oder in welcher Branche ein Schlüsselwort ist und welcher durch einen benutzerdefinierten
Zweignamen
37

Was Sie sehen möchten, ist die Liste der ausgehenden Commits. Sie können dies mit tun

git log master..branchName 

oder

git log master..branchName --oneline

Wobei ich annehme, dass "branchName" als Tracking-Zweig von "master" erstellt wurde.

Um die eingehenden Änderungen anzuzeigen, können Sie Folgendes verwenden:

git log branchName..master
PlagueHammer
quelle
1
@ABB, wenn branchName weggelassen wird, wird standardmäßig "head" verwendet, was im obigen Beispiel effektiv branchName ist.
PlagueHammer
25

Dies ähnelt der Antwort, die ich auf gepostet habe: Vorschau eines Git-Pushs

Fügen Sie diese Funktionen in Ihr Bash-Profil ein:

  • gbout - Git-Zweig ausgehend
  • gbin - git branch eingehend

Sie können dies wie folgt verwenden:

  • Wenn auf master: gbin branch1 <- dies zeigt Ihnen, was in branch1 und nicht in master ist
  • Wenn auf Master: gbout branch1 <- Dies zeigt Ihnen, was sich in Master befindet, das sich nicht in Zweig 1 befindet

Dies funktioniert mit jedem Zweig.

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
}
Clintm
quelle
16

Ähnlich wie bei einigen Antworten wie Alex Vs und NDavis, aber keine davon ist ganz gleich.

Wenn bereits in der betreffenden Branche

Verwenden von:

git diff master...

Welches kombiniert mehrere Funktionen:

  • es ist super kurz
  • zeigt die tatsächlichen Änderungen

Aktualisieren:

Dies sollte wahrscheinlich sein git diff master, aber auch dies zeigt den Unterschied, nicht die Commits als die angegebene Frage.

Michael Durrant
quelle
1
Wenn Sie git co master; git pullden Zweig seit dem Erstellen erstellt haben, ist git diff masteres nicht sinnvoll, die Unterschiede NUR durch Commits in dem angegebenen Zweig einzuführen.
Guival
1
Oder um Zweige explizit anzugeben: git diff <branch1>...<branch2>Zeigt die Änderungen an, die von eingeführt wurden branch2.
Alex
10

Wirf ein -p hinein, um einige DATEIÄNDERUNGEN zu sehen

git log -p master..branch

Machen Sie einige Aliase:

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

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

Sehen Sie sich die eindeutigen Commits einer Niederlassung an:

gbl
Alex V.
quelle
6

So zeigen Sie das Protokoll der aktuellen Verzweigung seit der Verzweigung vom Master an:

git log master...

Wenn Sie sich derzeit auf dem Master befinden, können Sie das Protokoll eines anderen Zweigs anzeigen, seit dieser vom Master abgezweigt wurde:

git log ...other-branch

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

(3dots) aber manchmal zeigt es '+' anstelle von '='

Nopsoft
quelle
3 Punkte zeigen das erste Commit auf dem Zweig zweimal an, während zwei dies nicht tun.
TJ Biddle
2

ich fand

git diff <branch_with_changes> <branch_to_compare_to>

Nützlicher, da Sie nicht nur die Commit-Nachrichten erhalten, sondern den gesamten Unterschied. Wenn Sie sich bereits in der Verzweigung befinden, in der Sie die Änderungen von sehen möchten und (zum Beispiel) sehen möchten, was sich am Master geändert hat, können Sie Folgendes verwenden:

git diff HEAD master
Dominik Ehrenberg
quelle