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.


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

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.


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


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

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]

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


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


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)

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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.