2010-10-06 6 views
6

Nehmen wir an, Sie haben einen Zweig master und einen anderen Zweig production, beide enthalten eine Version der Datei prog.py, sowie viele andere Dateien. Stellen Sie sich vor, Sie ändern viele Dateien im Produktionszweig, einschließlich prog.py. Nun, was ist der beste Weg, nur einige Änderungen, die auf prog.py in der production Zweig gemacht werden, auf seine Version in der master Zweig angewendet werden?Git: Der beste Weg, um nur einige Teile einer Datei aus einem anderen Zweig hinzuzufügen?

Ich begann mit dem master Zweig bewegen und die Datei aus dem production Zweig importieren:

git checkout master 
git checkout production -- prog.py 

, weil ich hatte gehofft, der Lage sein, git add -p zu tun, und die Änderungen von Hand auswählen. Das Problem ist, dass prog.py sowohl im Arbeitsbaum als auch im Index ist. Wie kann ich es aus dem Index entfernen, ohne den Arbeitsbaum zu berühren?

Oder gibt es eine bessere Möglichkeit zu wählen, welche Änderungen in prog.py aus dem Zweig production in den Zweig master importiert werden sollen?

Antwort

17

Ich bin mir nicht sicher, ob dies wahr ist, wenn diese Frage gestellt wurde, aber mit einer aktuellen Version von git können Sie folgendes tun:

git checkout -p production -- prog.py 

und Sie werden den gleichen interaktiven Hunk-Picker erhalten Sie tun für die meisten -p Befehle.

+0

Danke! Ich habe die akzeptierte Antwort von meiner zu deiner geändert, da dies eine effizientere Methode ist. – EOL

4

Kleine und granulare Commits machen, die nur eine Sache machen, und dann später die gewünschten Änderungen in der anderen Verzweigung mit git cherry-pick $commit_id herauspicken, wäre ein vernünftiger Ansatz.

+0

Danke. Ermöglicht Cherry-Pick es Ihnen, Änderungen in * einer Datei * auszuwählen? – EOL

+1

Es cherry-Picks commits, die Sie sicherlich später ändern können, wenn sich herausstellt, dass Sie Ihre Commits nicht so granular gemacht haben, wie Sie vielleicht gewollt haben. z.B. 'git reset HEAD ~ 1' und' git add -p' und 'git commit -c $ commit_id', – rafl

1

In Ordnung, ich habe gerade versucht git reset, und es löschte die Änderungen im Index gespeichert. git add -p funktioniert dann wie erwartet, was es einem ermöglicht, die einzelnen Änderungen auszuwählen, die angewendet werden sollen (d.h. im Index gespeichert sind). Die nicht gewünschten Änderungen können dann mit git commit und dann git reset --hard verworfen werden.

Hoffentlich ist die Frage und diese Antwort von Interesse für jemand anderen! :)

PS: Ich markierte diese Antwort als die akzeptierte, weil es eine einzelne Datei überprüft, wie in der ursprünglichen Frage gefragt.