2015-03-27 10 views
6

Zum Beispiel habe ich die folgende Datei:
können zwei Dateien git fusionieren ihre gemeinsamen Vorfahren ignorieren

// first part 
function() { 
    var timer = 1; 
} 

// second part 
function() { 
    var timer = 2; 
} 

// third part 
function() { 
    var timer = 3; 
} 

nun zwei verschiedene Zweige zu verändern. Ich habe Änderungen:
in branch1:

// first part 
function() { 
    var timer = "changed in branch1"; 
} 

// second part 
function() { 
    var timer = 2; 
} 

// third part 
function() { 
    var timer = 3; 
} 

in branch2:

// first part 
function() { 
    var timer = 1; 
} 

// second part 
function() { 
    var timer = "changed in branch2"; 
} 

// third part 
function() { 
    var timer = 3; 
} 

Mit 3-Wege, diese Änderungen fusionieren sauber fusionieren, weil jeder Zweig ein Stück Code unterscheidet sich von den anderen geändert . Wenn jedoch fusionierte möchte ich folgendes:

// first part 
function() { 
<<<<<<< branch1 
    var timer = "changed in branch1"; 
======= 
    var timer = 1; 
>>>>>>> branch2 
} 

// second part 
function() { 
<<<<<<< branch1 
    var timer = 2; 
======= 
    var timer = "changed in branch2"; 
>>>>>>> branch2 
} 

// third part 
function() { 
    var timer = 3; 
} 

Gibt es eine Möglichkeit, diese Art von merge in git zu erreichen? Ich gehe davon aus, basierend auf den Kommentaren diese Art von Merge etwas so sein würde:

  1. make diff eine Datei
  2. Einsatz in der Endfassung Chunks nicht in einem diff
  3. Zeichen Brocken, die mit Konfliktmarken unterscheiden
+0

Nur neugierig, warum möchten Sie das tun? –

+0

@mu 無, naja meistens auch aus Neugier :). Außerdem haben wir ein Teammitglied, das manchmal meinen Code von 'featureA' in' master' ändert, während ich an der anderen Funktion arbeite und 'featureA' nicht bearbeite, so dass bei der Zusammenführung kein Konflikt entsteht. Und nach einiger Zeit in der Zukunft entdecke ich, dass 'featureA' gebrochen ist. Vielleicht möchte ich einige Dateien ohne gemeinsamen Vorfahren zusammenführen, um zu sehen, ob sich der Code von 'featureA' im Master vom selben Code in meiner Version in verschiedenen Zweigen unterscheidet. –

+0

Wenn der Grund die Änderungen eines anderen Entwicklers sind, denke ich, dass sie besser durch einen geeigneten Code-Review-Prozess behandelt werden könnten. Das heißt, Sie können immer das diff überprüfen, wie Antworten unten vorschlagen :) –

Antwort

1

Git bietet den Befehl plumbing git merge-file, mit dem Sie zwei Dateien ohne Basis zusammenführen können, es gibt jedoch keine einfache Möglichkeit, dies aufzurufen. Wenn Sie branch in master verschmelzen und wollen eine unbegründete merge irgendeine Datei tun foo.txt:

git show master:foo.txt > /tmp/master.foo.txt 
git show branch:foo.txt > /tmp/branch.foo.txt 
echo -n > /tmp/empty.txt 
git merge-file -p -L master -L base -L branch /tmp/master.foo.txt /tmp/empty.txt /tmp/branch.foo.txt > foo.txt 

In dem obigen Beispiel erzeugt dies:

// first part 
function() { 
<<<<<<< master 
    var timer = 1; 
======= 
    var timer = "changed in branch1"; 
>>>>>>> branch 
} 

// second part 
function() { 
<<<<<<< master 
    var timer = "changed in branch2"; 
======= 
    var timer = 2; 
>>>>>>> branch 
} 

// third part 
function() { 
    var timer = 3; 
} 

(Scripting dies als Übung für der Leser.)

+0

danke, wird es die Datei in meiner Frage so zusammenführen, wie es dort beschrieben ist? –

+0

@Maximus Ja, genau wie du vorgeschlagen hast. Meine Antwort wurde aktualisiert. –

+0

Ich sehe, danke, ich werde später versuchen und zurückkommen mit Fragen, wenn überhaupt :) –

1

Wenn Sie nur die Unterschiede zwischen Ihrem Code sehen wollen, und einem gewissen begehen, tun gerade:

git diff HEAD..<sha-commit2> 

oder wenn Sie wollen mit der Spitze eines anderen Zweigstrom verpflichten vergleichen:

git diff HEAD..other_branch 

EDIT Wie @Maximus im Kommentar gefragt: wenn Sie die Änderungen von jemandem gemacht, um sehen möchten

  • auf dem Master-Zweig
  • insbesondere Dateien
  • Sie seit der Zeit
  • verzweigten

Also müssen wir zuerst den gemeinsamen Vorfahren finden: (Ich nehme an, Sie sind auf Ihrem Zweig; woher ich HEAD verwende. Kann von Ihrem Zweignamen ersetzt werden)

git merge-base HEAD master 

dann können Sie die Änderungen seit dem gemeinsamen Vorfahren insbesondere Dateien (git log -p oder git diff sehen, ist abhängig von der Ausgabe, die Sie mögen):

git log -p <sha-common-ancestor>..master -- <the files and dirs you want> 
git diff <sha-common-ancestor>..master -- <the files and dirs you want> 
+0

Nein, ich möchte eigentlich zusammenführen. Ich würde git diff job für mich machen und gleichen Code zusammenführen und Konflikte in Dateien einfügen. Bitte beachten Sie meinen Kommentar zu der Antwort für den Grund warum. –

+0

Ich verstehe dein Problem; Sie möchten vor dem Zusammenführen die Arbeit eines anderen Entwicklers überprüfen. deshalb schlage ich vor, dass Sie zuerst die Unterschiede prüfen, bevor Sie sich zusammenschließen. Eine Alternative ist, seinen Zweig zu überprüfen (wenn er irgendwelche hat); und sehen, was er gemacht hat ... –

+0

Ja, aber das ist Code-Review-Prozess und ich spreche über das Zusammenführen hier. Also vielleicht um es anders auszudrücken, ich möchte benachrichtigt werden, wenn sich in dem Code in bestimmten Dateien seit dem Zeitpunkt, an dem ich verzweigt habe, etwas geändert hat, anstatt es jedes Mal manuell zu überprüfen. –

1

Verwenden git merge--no-commit, dann reparieren Sie es nach der Tat, bevor Sie das Zusammenführungsergebnis festsetzen. Das ist die einfachste Methode für Unikate.

Wenn Sie eine wiederholbare Methode zum automatischen Ausführen benötigen, können Sie einen benutzerdefinierten Zusammenführungstreiber definieren (siehe z. B. this nabble thread). Sie müssen dann jedoch einige systematische Regeln für die Kombination von scheinbar nicht widersprüchlichen Änderungen finden.

+0

'- no-commit' überspringt einfach das Erstellen von Commits nach der Zusammenführung, aber die Zusammenführung erfolgt immer noch mithilfe der '3-way merge' Strategie, sodass das Beispiel in meiner Frage sauber zusammengeführt wird. –

+2

Genau. Sie bearbeiten dann die Datei und 'git add' das Ergebnis, um die Zusammenführung, die git erzeugt hat, außer Kraft zu setzen, bevor Sie das Commit durchführen. ... Oh, ich sehe, Sie interessieren sich nicht für das * Ergebnis * an diesem Punkt, Sie wollen die * Konfliktmarker *. Dafür ist, soweit ich weiß, nichts eingebaut. – torek

+0

Yeah, 'Konfliktmarker' sind ein Nebenprodukt der Zusammenführung, die den gemeinsamen Vorfahren ignoriert, die Zusammenführung, die so etwas macht, macht Diff einer Datei, fügt in der endgültigen Version Chunks nicht in ein diff ein und markiert Chunks, die sich durch Konflikt unterscheiden Markierungen. –

Verwandte Themen