2010-09-14 9 views
30

Ich bin sicher, das ist eine einfache Sache, die gefragt und beantwortet wurde, aber ich weiß nicht, nach welchen Begriffen gesucht werden soll. Ich habe dies:Wie verschiebe ich ein Commit zwischen Zweigen in Git?

/--master--X--Y 
A--B 
    \--C--D--E 

Wo ich commited C, D und E (nur lokal) auf einem Zweig, aber dann merkte ich, dass D und E sind wirklich unabhängig von C I C auf seinen eigenen zu verschiebe Verzweigen, und behalten Sie D und E für später. Das heißt, ich möchte das:

    /--C 
    /--master--X--Y 
A--B 
    \--D--E 

Wie ziehe ich C aus unter D und E?

Antwort

42

Sie können git cherry-pick verwenden C zu packen, und legen sie auf Y. Y Unter der Annahme besteht, wenn die Spitze ein Zweig branch-Y genannt:

$ git checkout branch-Y 
$ git cherry-pick C 

So, jetzt C ist oben auf Y. Aber D und E auch enthält immer noch C (Cherry Picking verschiebt kein Commit, es erstellt nur eine Kopie davon). Sie werden D und E an der Spitze von B. Unter der Annahme, E rebase haben, ist die Spitze des branch-E und B ist branch-B können Sie:

$ git checkout branch-E 
$ git rebase --interactive branch-B 

Dies wird eine interaktive rebase Sitzung eröffnen. Entfernen Sie Commit C vollständig und lassen Sie D und E intakt. Dann werden D und E auf B ohne C rebasiert.

+4

Beachten Sie, dass 'cherry-pick', ab v1.7.1, mehrere Commits per Mausklick auswählen kann, so dass Sie mehr" ziehen "können als man ausgibt. Sie können dies auch tun, indem Sie einen temporären Zweig bei E erstellen und ihn interaktiv auf Y umlenken, wobei Sie nur die gewünschten Commits beibehalten und diese dann (es handelt sich um einen Schnellvorlauf) in Ys Zweig verzweigen. (Das hat immer funktioniert, und könnte sowieso einfacher sein, also müssen Sie nicht so viele SHA1s einfügen.) – Cascabel

Verwandte Themen