2016-08-08 12 views
1

Es gibt einen Zweig topic1, der ursprünglich von master abzweigte. Lassen Sie uns sagen, dass der ursprüngliche Besitzer von topic1 keine ordnungsgemäße Zusammenführung dieses Zweiges wieder in master gemacht hat, und stattdessen eine Cherry-Pick-Operation, aber ein paar Commits verpasst.Wie kann ich sehen, welche physischen Hunks nicht in einem Zweig von einem anderen sind?

Monate vergehen, und schließlich merke ich topic1 ist immer noch da. An diesem Punkt ist es so lange her, dass ich keine zuverlässige Möglichkeit habe zu bestimmen, ob der kumulative Patch, den topic1 darstellt, auf master vorhanden ist.

Was ich wollen in der Lage sein git diff topic1..master aber verstecken alle große Stücke auf master zu tun, die in topic1 nicht existieren. Im Grunde möchte ich nur einen Teil des Diff sehen, der Änderungen in topic1 zeigt, die in master nicht vorhanden sind. Ist das möglich? Und wenn ja, wie kann ich es tun?

Ich verwende Git 2.8+

Antwort

1

Sie mithilfe der --cherry-pick Option von git log beginnen die Liste der Festschreibungen von topic1 die nicht Kirsche gepflückt waren in master zu bekommen.

Vom documenation von git-log:

--cherry-Pick
Auslassen jeder begehen, dass die gleiche Änderung führt wie ein anderer auf der „anderen Seite“ commit wenn der Satz von Festschreibungen begrenzt mit symmetrischer Differenz.

Was hier interessant ist, dass die --cherry-pick Option des diff des Commit verwendet - die SHA-1-Hash des nicht begehen -, um zu bestimmen, ob ein Commit, dass der gleiche Satz von Änderungen führt in einem anderen Zweig vorhanden ist.

Aus der Dokumentation von git-cherry, die verwandt ist:

Die Äquivalenzprüfung auf dem diff basiert, nach Leerzeichen und Zeilennummern zu entfernen. git-cherry erkennt daher, wenn Commits mit Hilfe von git-cherry-pick, git-am oder git-rebase "kopiert" wurden.

Solche Commits sollen Patch-Äquivalent sein.

So git log --cherry-pick master...topic1 wird ausschließen Commits von topic1 dass haben gewesen handverlesene in master, nur diejenigen verlassen, die es nicht sind. Wir fügen die Option --right-only hinzu, um anzuzeigen, dass wir nur an Commits von der rechten Seite des Bereichs interessiert sind, d. H.topic1:

git log --cherry-pick --right-only master...topic1 

Wir auch merge verpflichtet von der Auswahl ausschließen wollen könnte, also fügen wir die --no-merges Option:

git log --no-merges --cherry-pick --right-only master...topic1 

Schließlich fügen wir die --patch Option, um die diff für diejenigen zu erhalten verpflichtet. Der letzte Befehl lautet dann:

+1

Dies ist eine ausgezeichnete Antwort, aber ich möchte immer noch eine Diff-Lösung dafür sehen. Es werden Szenarien behandelt, in denen: Ein Cherry-Commit am Ziel geändert wurde oder Änderungen von Hand bearbeitet wurden (dh jemand hat einen Fehler doppelt behoben, ohne zu merken, dass er bereits in einem anderen Zweig ausgeführt wurde) oder Commits waren nicht richtig strukturiert und nur Commits teilweise vorhanden auf "Master". –

+0

In diesem Fall denke ich, dass 'git diff master..topic1' Ihnen die Antwort geben soll, nach der Sie suchen - es zeigt Ihnen die Änderungen, die in' topic1' existieren, aber nicht in 'master'. –

+0

nicht ganz, weil das auch alle Änderungen auf 'Master' zeigt, die in' topic1' nicht vorhanden sind, auch wenn 'topic1' an diesem Code keine Änderungen vorgenommen hat. Ich möchte das diff nur von der rechten Seite sehen, basierend auf changeset statt commit. Die nächste Sache, die ich mir vorstellen kann, bringt mich dazu, was ich will: '$ git merge topic1 --no-commit', dann mache' git diff'. Dies wird mir zumindest die Änderungen zeigen, die nicht auf dem Master vorhanden sind, aber ich muss eine Zusammenführung machen, um es zu tun. –