2012-12-04 9 views
38

zusammenführen Ich habe 2 Zweige in einem Git Repo, können wir sie nennen, dev und test. Ich habe Änderungen in einer einzigen Datei, somecode.js. Beide Zweige haben Änderungen an einigen code.js. Die 2 Zweige haben sich signifikant (aber überschaubar) auseinander bewegt, so dass ein gerades "Zusammenführen" nicht ausreicht.Wie kann ich eine bestimmte Datei von einem Zweig in einen anderen Zweig in Git

Ich habe versucht http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/, aber es verbindet nicht den Inhalt beider Dateien. Sie schreiben im Grunde nur über die Datei, anstatt den Inhalt der Datei tatsächlich zusammenzuführen.

Ich habe auch versucht:

git checkout -b newbranch 
git checkout test somecode.js 
git commit -m "somecode changes from newbranch" 
git checkout dev 
git merge newbranch 

Und

git checkout -m test somecode.js 

(ich mit der -m für merge wirklich hoffnungsvoll war, aber es schien nicht zu funktionieren für mich ...)

Ich dachte, dass ich nah an dem war, was ich brauchte, aber dann erkannte ich, dass es nur das Commit-Signal fesselte, was bedeutete, dass es nicht verschmelzen konnte, schrieb es über die ursprüngliche Datei im Test.

Also, um noch einmal zu wiederholen, wie kann ich eine bestimmte Datei von einem Zweig in einen anderen Zweig zusammenführen, ohne nur über die Datei in dem Zweig zu schreiben, den ich mit git zusammenführe.

+0

Mögliche Duplikate: http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – rlegendi

+0

Cherry-Pick löst das Problem nicht, weil das vollständige Commits beinhaltet . Also wird es mehrere Dateien holen und ich werde durch alle Commits schauen müssen, um zu sehen, welche relevant sind – jeremy

+0

mögliche Duplikate von [Wie füge ich Änderungen in eine einzelne Datei zusammen, anstatt Commits zu verschmelzen?] (Http: // stackoverflow .com/questions/10784523/how-do-i-merge-ändert-zu-eine-Datei-eher-als-merge-commits) –

Antwort

40

Ich glaube, Sie

git checkout -p 

In Ihrem Fall

git checkout dev 
git checkout -p test somecode.js 

nutzen möchten Und Sie können die diffs interaktiv anwenden.

+0

Perfekt !! Vielen Dank!! – jeremy

+1

Aber du lässt nicht zu, dass Git irgendwelche merge .. Sie manuell die ganze Arbeit machen. –

+1

@ the.malkolm Bei der ersten Frage antworten Sie mit "a" und das war's. (a - wenden Sie dieses Hunk und alle späteren Hunks in der Datei an) –

1

Ich denke, Git Merge-Datei ist, was Sie suchen. Aus der Manpage:

git merge-file incorporates all changes that lead from the <base-file> to 
<other-file> into <current-file>. The result ordinarily goes into <current-file>. 
git merge-file is useful for combining separate changes to an original. Suppose 
<base-file> is the original, and both <current-file> and <other-file> are 
modifications of <base-file>, then git merge-file combines both changes. 
+0

Ich sehe keine Möglichkeit, die Datei aus dem anderen Zweig anzugeben. Das sieht so aus, als ob es für den internen Gebrauch vielleicht ist? Kannst du Gebrauch zeigen? – jeremy

+0

'git merge-file' ist nur der 3-Wege-Merge-Treiber für Dateien. Diese Beschreibung ist ein bisschen irreführend; es schaut nicht auf alle Zwischentöne dazwischen, es macht nur einen klassischen 3-Weg-Merge. –

5
git checkout dev 
git show test:somecode.js > somecode.js.theirs 
git show $(git merge-base dev test):somecode.js > somecode.js.base 
git merge-file somecode.js somecode.js.base somecode.js.theirs 

Auf diese Weise werden Sie manuell ein Drei-Wege von somecode.js auf Testzweig in somecode.js auf dev Zweig verschmelzen machen.

Oder .. Sie können einen temporären Zweig mit den gewünschten Änderungen erstellen und daraus einen Squash erstellen. Ist es 'git Weg' genug? :)

git checkout -b test/filtered $(git merge-base dev test) 
git diff ..test -- somecode.js | git apply 
git add -- somecode.js 
git commit -m "Updated somecode.js" 
git checkout dev 
git merge --squash test/filtered 
git branch -D test/filtered 
+0

Ich nehme an, das funktioniert, aber ich hoffe auf einen "git-way", es zu tun. Ich warte auf ein paar weitere Antworten und genehmige dies, wenn ich mir keinen Weg durch den Kopf gehen kann. – jeremy

+0

Ist das ein 'Git Weg' genug? :) –

+3

Ich hoffte auf etwas wie "git checkout -m test somecode.js" – jeremy

Verwandte Themen