Git-Unterschied zwischen aktuellem Zweig und Master, jedoch ohne nicht zusammengeführte Master-Commits

170

Ich möchte einen Unterschied aller Änderungen in einem Zweig, der noch nicht zum Master zusammengeführt wurde.

Ich habe es versucht:

git diff master
git diff branch..master
git diff branch...master

In jedem dieser Fälle enthält der Diff jedoch Inhalte im Master, die noch nicht in meinem Zweig zusammengeführt wurden.

Gibt es eine Möglichkeit, einen Unterschied zwischen meinem Zweig und dem Master zu machen, der Änderungen im Master ausschließt, die noch nicht in meinem Zweig zusammengeführt wurden?

pillarOfLight
quelle
9
Wenn Sie die zweite Version umdrehen, erhalten Sie, was Sie wollen : git diff master..branch. Sie können es verkürzen, git diff master..wenn Sie auf Zweig sind. Die r1..r2Syntax ist kurz, ^r1 r2was bedeutet "zeig mir alles, von dem abstammt r2und von dem nicht erreichbar ist r1". git help gitrevisionsenthält Informationen zu den verschiedenen Syntaxen, die Sie verwenden können.
John Szakmeister
1
Ich habe meine Antwort erweitert, nachdem ich mehr über die ...Syntax von gelesen habe git diff. Ihr Kommentar ist falsch, @jszakmeister, weil die in beschriebenen Revisionsbereiche gitrevisionsnichts damit zu tun haben git diff. Diff vergleicht zwei Punkte in der Geschichte und kann nicht mit einem Bereich arbeiten.
Palec
Du hast Recht. Ich vergesse immer, dass git diffdas anders funktioniert als die anderen Befehle ... eine Tatsache, die ich frustrierend finde. :-(
John Szakmeister
Stellen Sie sicher, dass Sie die lokale Kopie des Masters aktualisieren, bevor Sie vergleichen
Joe

Antworten:

231
git diff `git merge-base master branch`..branch

Die Zusammenführungsbasis ist der Punkt, von dem branchabgewichen wird master.

Git diff unterstützt hierfür eine spezielle Syntax:

git diff master...branch

Sie dürfen die Seiten nicht tauschen, da Sie dann den anderen Zweig erhalten würden. Sie möchten wissen, was sich geändert hat, branchseit es davon abweicht master, und nicht umgekehrt.

Locker verwandt:


Beachten Sie, dass .. und ...Syntax nicht dieselbe Semantik wie in anderen Git-Tools haben. Es unterscheidet sich von der in angegebenen Bedeutung man gitrevisions.

Zitat man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Hiermit werden die Änderungen zwischen zwei beliebigen angezeigt <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Dies ist auch das vorherige Formular. Wenn <commit>auf einer Seite weggelassen wird, hat dies den gleichen Effekt wie HEADstattdessen.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    In diesem Formular werden die Änderungen in dem Zweig angezeigt, der bis zur Sekunde enthält <commit>, beginnend mit einem gemeinsamen Vorfahren von beiden <commit>. " git diff A...B" entspricht " git diff $(git-merge-base A B) B". Sie können jedes von weglassen<commit> , was den gleichen Effekt hat wie HEADstattdessen.

Nur für den Fall, dass Sie etwas Exotisches tun, sollte beachtet werden, dass alle <commit> in der obigen Beschreibung, außer in den letzten beiden Formen, die ".." - Notationen verwenden, beliebig sein können <tree>.

Eine vollständigere Liste der Schreibweisen <commit>finden Sie im Abschnitt "ÜBERARBEITUNGEN SPEZIFIZIEREN" in gitrevisions[7]. Bei "diff" geht es jedoch darum, zwei Endpunkte und keine Bereiche zu vergleichen, und die Bereichsnotationen (" <commit>..<commit>" und " <commit>...<commit>") bedeuten keinen Bereich, wie im Abschnitt "SPEZIFIZIEREN VON BEREICHEN" in definiert gitrevisions[7].

Palec
quelle
Für mich $ git diff master...branchproduziert fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- ist das ein versionabhängiger Befehl?
Joel Peltonen
Eigentlich habe ich gerade festgestellt, dass "Zweig" der Name Ihres Zweigs sein muss. Ich dachte, es wäre ein Verweis auf den aktuellen Zweig
Joel Peltonen
4
Sie haben Recht, meine Antwort hängt davon ab, dass der Zweig angerufen wird branch. Ich entschied mich, bei dem Namen zu bleiben, den das OP in der Frage gewählt hatte. Wenn Sie den aktuellen Zweig verwenden möchten, ersetzen Sie ihn branchdurch HEAD.
Palec
14
Beachten Sie, dass Sie git diff master...damit vermeiden können, den Zweig anzugeben (der aktuelle wird verwendet).
VasiliNovikov
1
Funktioniert der ursprüngliche Befehl nach dem develAuschecken @ChrisGuest? Wahrscheinlich hat Git den Zweig beim Auschecken als lokale Kopie eines Remote-Zweigs (normalerweise origin/devel) für Sie erstellt. Wenn das der Fall git diff origin/devel...bugfix/API-353-api-allows-database-access-whenwäre , hätte es schon vor dem Auschecken funktioniert.
Palec
44

Folgendes hat bei mir funktioniert:

git diff origin/master...

Dies zeigt nur die Änderungen zwischen meinem aktuell ausgewählten lokalen Zweig und dem Remote-Hauptzweig an und ignoriert alle Änderungen in meinem lokalen Zweig, die durch Zusammenführungs-Commits entstanden sind.

Jeshurun
quelle
Verwenden Sie als Referenz, wenn Sie die Festschreibungsreferenzen von Festschreibungen benötigen, die diese Änderungen enthalten git cherry origin/master.
Jaytibann
Wenn dies eine Menge Müll masteranzeigt, den Sie nicht erwartet haben, haben Sie möglicherweise eine Reihe von Commits unter Ihnen neu erstellt.
Michael - Wo ist Clay Shirky
21

Wie auch von John Szakmeister und VasiliNovikov bemerkt, ist der kürzeste Befehl, um den vollen Unterschied aus der Sicht des Meisters auf Ihren Zweig zu bekommen ,:

git diff master...

Dies verwendet Ihre lokale Kopie des Masters.

So vergleichen Sie eine bestimmte Datei:

git diff master... filepath

Ausgabebeispiel:

Anwendungsbeispiel

Andrew Schreiber
quelle