Wie sehe ich die Commit-Unterschiede zwischen Zweigen in Git?

341

Ich bin auf Branch-X und habe noch ein paar Commits hinzugefügt. Ich möchte alle Unterschiede zwischen MASTER und dem Zweig sehen, in dem ich mich in Bezug auf Commits befinde. Ich könnte einfach eine machen

git checkout master
git log

und dann a

git checkout branch-X
git log

und visuell unterscheiden diese, aber ich hoffe auf eine einfachere, weniger fehleranfällige Methode.

Avery
quelle

Antworten:

324

Sie können eine wirklich schöne, visuelle Ausgabe davon erhalten, wie sich Ihre Zweige dadurch unterscheiden

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative master..branch-X
Tom
quelle
13
Das zeigt Ihnen jedoch keine Unterschiede zwischen den Zweigen, was gefragt wird.
Pablo Fernandez Fersenhaken
47
git log --oneline --graph --all --decorate --abbrev-commitwird Ihnen eine ähnliche Ausgabe in einem kürzeren / besser lesbaren Befehl geben
Pablo Fernandez Heelhook
4
Ich mag das:git log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'
Avery
6
Extrem überkompliziert.
Shawn Erquhart
12
git log --oneline --graph --all --decorateist genug, --abbrev-commitist nicht erforderlich, --onelineist kurz für--pretty=oneline --abbrev-commit
avmohan
719

Sie können das leicht mit tun

git log master..branch-X

Das zeigt Ihnen, dass Branch-X Commits hat, Master jedoch nicht.

Pablo Fernandez Fersenhaken
quelle
9
Gibt es eine Option, wenn beide Zweige Commits enthalten, die der andere nicht enthält? Im Moment müssen Sie die Argumente umdrehen und in beide Richtungen ausführen, um Commits zu sehen, die der andere Zweig nicht enthält.
Elliott Slaughter
38
Wenn Sie bereits zu gewechselt haben, können branch-XSie verwendengit log master..
Dave
8
@ElliottSlaughter: Wenn Sie ein Commit suchen möchten, das sich entweder in Master oder Branch-X befindet, aber nicht in beiden, können Sie git log master...branch-X(drei statt zwei Punkte) verwenden. Siehe man gitrevisionsfür weitere Informationen.
Xavier T.
3
Es ist wirklich nur die halbe Antwort. Alle Commits im Master, die dazu führen, dass die Zweige auseinander gehen, werden nicht
angezeigt
9
Wenn Commits aus Branch-X ausgewählt wurden, um sie zu meistern, werden sie dadurch nicht herausgefiltert. Sie werden weiterhin auf der Liste der Commits "In Branch-X, aber nicht auf Master" stehen, obwohl sie tatsächlich in beiden enthalten sind.
Tuffwer
87

Ich denke, es ist eine Frage der Wahl und des Kontexts. Ich bevorzuge es zu verwenden

git log origin/master..origin/develop --oneline --no-merges

Es werden Commits in der Entwicklung angezeigt, die sich nicht im Hauptzweig befinden.

Wenn Sie sehen möchten, welche Dateien tatsächlich geändert werden, verwenden Sie

git diff --stat origin/master..origin/develop --no-merges

Wenn Sie keine Argumente angeben, wird der vollständige Unterschied angezeigt. Wenn Sie Visual Diff sehen möchten, installieren Sie es meldunter Linux oder WinMergeunter Windows. Stellen Sie sicher, dass es sich um die Standard-Difftools handelt. Verwenden Sie dann so etwas wie

git difftool -y origin/master..origin/develop --no-merges

Falls Sie es mit dem aktuellen Zweig vergleichen möchten. Es ist bequemer, HEAD anstelle des Zweignamens wie use zu verwenden:

git fetch
git log origin/master..HEAD --oneline --no-merges

Es zeigt Ihnen alle Commits, die zusammengeführt werden sollen

Zainengineer
quelle
1
Wenn Sie einen Release-Zweig vergleichen, der möglicherweise Zusammenführungen aufweist. Sie können die Zusammenführungs-Commits (die keinen Wert hinzufügen) mit Hilfe des Parameters --no-mergeswie git log origin/master..HEAD --oneline --no-merges
folgt
15

Wenn Sie unter Linux arbeiten, gitgkönnen Sie dies sehr schnell und grafisch tun.

Wenn Sie auf der Befehlszeile bestehen, können Sie Folgendes verwenden:

git log --oneline --decorate

Um es git logstandardmäßig schöner zu machen, lege ich normalerweise die folgenden globalen Einstellungen fest:

git config --global log.decorate true
git config --global log.abbrevCommit true
mvp
quelle
14

Ich würde Folgendes vorschlagen, um den Unterschied "in Commits" zu sehen. Wiederholen Sie den Befehl für symmetrische Unterschiede mit invertierten Argumenten:

git cherry -v master [your branch, or HEAD as default]
mmaruska
quelle
Unterscheidet sich das von git master..branch-X?
Ilmirons
2
Sicher, "Git Cherry" ist klug: Es übersetzt von "Commits" in "Patches / Diffs" und kann vermeiden, einen "Patch" zu melden, der sich auf beiden Zweigen befindet, aber in unterschiedlicher Reihenfolge angewendet wird.
mmaruska
8

Wenn Sie Gitk verwenden möchten:

gitk master..branch-X

Es hat eine schöne GUi der alten Schule

Schneekamell
quelle
4

Nicht die perfekte Antwort, aber besser für Leute, die Github verwenden:

Geben Sie hier die Bildbeschreibung ein

Gehe zu deinem Repo: Insights -> Network

AIon
quelle
Wenn Sie eine Pull-Anforderung erstellen, werden auch die Verzweigungsunterschiede angezeigt.
pkamb
OMG Ich möchte dich umarmen.
Esseara
@esseara Ich bin auch eine große Umarmung :))
Gern geschehen
2

Wenn Sie anhand der Festschreibungsnachrichten vergleichen möchten, können Sie Folgendes tun:

git fetch
git log --oneline origin/master | cut -d' ' -f2- > master_log
git log --oneline origin/branch-X | cut -d' ' -f2- > branchx_log
diff <(sort master_log) <(sort branchx_log)
Maroun
quelle
1
Anstatt zu verwenden --onelineund zu cutgit log --format='%s'
leiten,
0
#! /bin/bash
if ((2==$#)); then
  a=$1
  b=$2
  alog=$(echo $a | tr '/' '-').log
  blog=$(echo $b | tr '/' '-').log
  git log --oneline $a > $alog
  git log --oneline $b > $blog
  diff $alog $blog
fi

Dies trägt dazu bei, dass a- und b-Protokolle visuell nebeneinander angezeigt werden können, wenn Sie über ein visuelles Diff-Tool verfügen. Ersetzen Sie den Befehl diff am Ende durch den Befehl zum Starten des visuellen Diff-Werkzeugs.

Kim Briggs
quelle
0

Ich habe einige der Antworten verwendet und eine gefunden, die zu meinem Fall passt (stellen Sie sicher, dass sich alle Aufgaben im Release-Zweig befinden).

Andere Methoden funktionieren ebenfalls, aber ich habe festgestellt, dass sie möglicherweise Zeilen hinzufügen, die ich nicht benötige, z. B. Merge-Commits, die keinen Wert hinzufügen.

git fetch
git log origin/master..origin/release-1.1 --oneline --no-merges

oder Sie können Ihren Strom mit dem Master vergleichen

git fetch
git log origin/master..HEAD --oneline --no-merges

git fetch ist da, um sicherzustellen, dass Sie aktualisierte Informationen verwenden.

Auf diese Weise befindet sich jedes Commit in einer Zeile, und Sie können es in einen Texteditor kopieren / einfügen und die Aufgaben mit den Commits vergleichen, die zusammengeführt werden.

claudiu.f.marginean
quelle