2016-04-27 13 views
1

Sagen wir, ich habe Zweig und Zweig. In habe ich einige Änderungen in file1, file2 gemacht. Aber, ich habe auch getan, Refactoring auf Dinge, die anscheinend behoben wurden, sagen in FileA, FileB.Wie cherry holen nicht erzwungene Änderungen in einigen Dateien in einen neuen Zweig?

Jetzt möchte ich einen anderen Zweig erstellen, der diese Änderungen in <my_feature> isoliert, um <my_updates> mit commits zu nur fileA, fileB zu haben.

Zur Zeit habe ich Änderungen nicht für die Festschreibung in Datei1, Datei2, DateiA und DateiB inszeniert.

Ich habe über git cherry-pick and git apply gelesen, aber es beinhaltet Dinge, die bereits begangen werden.

Nun, da keine dieser Änderungen vorgenommen wird, weiß ich nicht, ob ich dies tun und Rosinen pflücken sollte oder ob es einen besseren Weg gibt, damit umzugehen.

Um sicherzustellen, dass das Bild klar ist, lassen Sie uns einige visuelle draus machen:

ich tun wollte:

master ------------------ 
    \--- my_feature ----/ 
      file1 
      file2 

Aber ich habe jetzt

master ------------------ 
     my_feature ----/ 
      file1 
      file2 
      fileA 
      fileB 

und ich möchte Um dies zusammenzufassen (Änderungen in DateiA, DateiB), bevor Sie mit <my_feature> fortfahren:

master ------------------ 
    \--- my_updates ----/ 
      fileA 
      fileB 

So dass <my_feature> nur die Änderungen in Datei1, Datei2 enthält.

+2

Commit 'file1 'und' file2' in Ihrem Zweig, und checken Sie dann 'master' aus. Die nicht festgeschriebenen Änderungen werden übernommen. – poke

+1

Verwenden Sie Poke-Methode hier, wie es am einfachsten ist. Beachten Sie, dass die Verwendung von "Git Stash" auch funktioniert, aber dies geschieht durch Commits. Sie können selbst Commits machen und die Dinge nach Bedarf kopieren und dann die ursprünglichen Commits "un-make" machen. Das macht im Grunde die gleiche Menge an Arbeit innerhalb von git wie die Verwendung von 'git stash' (da es Commits macht), es ist nur eine Frage dessen, womit du dich persönlich wohlfühlst. – torek

Antwort

2

Sie könnten git stash, in einen neuen Zweig verschieben und dann git stash pop. Dann können Sie weiterarbeiten oder das Ergebnis festschreiben.

Sie könnten auch einen Patch erstellen, indem Ausgabe von git diff in eine Datei (git diff > changes.patch) oder die Zwischenablage (git diff | pbcopy für OS X oder git diff | xclip -selection clipboard in Ubuntu) zu lenken. Dann können Sie diesen Patch mit git apply auf jeden anderen Zweig anwenden.

+0

Vielen Dank! 'git diff DateiA DateiB>/tmp/changes.patch' und dann' git checkout master; git checkout -b meine_funktion; git patch/tmp/changes.patch' hat es geschafft. – fedorqui

0

Für das Protokoll, das ist der volle Satz von Befehlen, die ich es funktioniert verwendet:

Während in der Branche <my_feature>, in einem Patch das Diff speichern:

git diff fileA fileB > /tmp/changes.patch 

Stash die Änderungen sie später wieder zu verwenden:

git stash -u 

erstellen sie einen neuen Zweig von master mit diesem Patch:

git checkout master 
git checkout -b my_updates 
git patch /tmp/changes.patch 
git add fileA fileB 
git commit -m "Updated fileA, fileB because blabla" 
git push 

zur Zweig Zurück <my_feature> und die verstaute Änderungen wiederherzustellen:

git checkout my_feature 
git stash pop 

Lassen Sie sich in dateiA und fileB der Änderungen zu befreien, da sie bereits vorhanden sind:

git checkout fileA fileB