2016-09-18 1 views
2

Zwei Zweige master und foo zeigen auf denselben Root-Commit A. Der Arbeitsbaum hat nur eine Datei bar.txt.Wie man einen Konflikt für dieses git cherry-pick verursacht?

$cat bar.txt 
11111 
22222 
33333 
44444 
55555 

Make B master Commit, eine Linie in bar.txt hinzufügen.

$cat bar.txt 
11111 
22222 
33333 
aaaaa 
44444 
55555 

machen Dann C master Commit, Löschen und Hinzufügen von aaaaabbbbb an anderer Stelle in bar.txt.

$cat bar.txt 
11111 
bbbbb 
22222 
33333 
44444 
55555 

Run git format-patch -1 C den Patch zu generieren C für Commit, seinen Namen unter der Annahme, 0001-bbbbb.patch zu sein.

Jetzt Kasse foo. git am 00001-bbbbb.patch oder git apply 00001-bbbbb.patch wird wie erwartet aufgrund von Konflikten fehlschlagen. git cherry-pick C wird jedoch problemlos gelingen.

Von diesem question ich erfahren, dass git am oder git apply gelingen wird, auch mit dem Argument -3 oder --3way in diesem Fall. Allerdings kann ich keine Config oder Argument über Three Way Merge für git cherry-pick finden.

Frage:

Wie die Drei-Wege-Merge Sache für git cherry-pick in diesem Fall deaktivieren, so dass die Rosinen herauspicken wird fehlschlagen?

Vielen Dank.

+1

Für den Patch könnten Sie versuchen, die Anzahl der Kontextzeilen anzupassen. Das Gehör ist 3, also würden Sie Überschneidungen der Änderungen über die Kontextlinien erhalten. Das Ablegen auf 2 Kontextlinien würde dem 22222 \ n33333-Paar ermöglichen, einen klaren Kontext bereitzustellen. In der Zwischenzeit weiß der Cherry-Pick bereits viel mehr über Ihr Repo, so dass er vernünftige Entscheidungen über die Merge-Basis und die Kontextzeilen treffen kann (die verschiedenen Teile der Merge-Taktiken können ziemlich detailliert sein, um den Erfolg wenn möglich zu gewährleisten, und Berichte von Konflikten, wenn nicht) –

+0

Ergänzend: Warum sollte der Kirschpflock ausfallen? (anstatt einen Patch, der richtig gelingt?) –

+0

@PhilipOakley nach dem Lesen Ihrer Kommentare Ich fühle meine Erwartung ist irgendwie unvernünftig. Stimmt es, dass ein Patch nicht ohne 3-Weg-Merge angewendet werden kann, wenn sich der aktuelle Kontext von dem unterscheidet, mit dem der Patch verknüpft ist? Ich denke, ohne 3way Merge werden die meisten Cherry-Picks überhaupt nicht erfolgreich sein. – ElpieKay

Antwort

1

Sie können die Zusammenführungsstrategie angeben, wenn Sie git cherry-pick verwenden. Die verfügbaren Strategien sind hier aufgelistet: https://git-scm.com/docs/merge-strategies.

EDIT: octopus ist eigentlich nicht die richtige Merge-Strategie in diesem Fall, da es auch mit einem gültigen cherry-pick nicht

mir eine der anderen gültigen Kirsch- nicht sicher bin (wie @Elpiekay darauf hingewiesen) Wählen Sie Merge-Strategien (und Optionen) führt zu dem gleichen Verhalten wie die git apply oben. Ich würde mich freuen, falsch bewiesen zu werden!

I think you probably want octopus , so your command would be:

git cherry-pick --strategy=octopus C

When I tested it, it gave me this error:

error: could not apply 62f20c5... C

+1

Vielen Dank für Ihre Antwort. Aber "Oktopus" scheint in diesem Fall nicht geeignet. Es handelt sich um mehr als zwei Köpfe. 'git cherry-pick --strategy = Oktopus B' versagt auch. Dies könnte also keine generische Lösung sein. – ElpieKay

+0

Nun, das ist bedauerlich! Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, wie man es sich wünscht, ohne es mit 'git diff' oder' git format-patch' zu exportieren und das Ergebnis zu übernehmen. – alexbclay

Verwandte Themen