2010-09-14 7 views
30

Je suis sûr que c'est une chose simple qui a été posée et répondue, mais je ne sais pas quels termes rechercher. J'ai ceci:Comment déplacer un commit entre branches dans Git?

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

Là où je Commited C, D et E (localement seulement) sur une branche, mais je réalisais que D et E sont vraiment indépendants de C. Je veux déplacer C à sa propre branchez, et gardez D et E pour plus tard. Autrement dit, je veux ceci:

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

Comment puis-je Yank C de sous D et E?

Répondre

42

Vous pouvez utiliser git cherry-pick pour saisir C, et le mettre sur Y. En supposant Y existe comme la pointe d'une branche appelée branch-Y:

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

Alors maintenant C est au-dessus de Y. Mais D et E aussi contient toujours C (la sélection de cerise ne déplace pas un commit, elle n'en fait qu'une copie). Vous devrez rebasage D et E sur le dessus de B. En supposant E est la pointe de branch-E et B est branch-B, vous pouvez:

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

Cela ouvrira une session de rebasage interactif. Supprimez entièrement le commit C et laissez D et E intacts. Vous aurez alors D et E rebasé sur B sans C.

+4

Notez que 'cherry-pick', dès la version 1.7.1, peut sélectionner plusieurs commits, vous pouvez donc l'utiliser pour" yank "plus que l'on s'engage. Vous pouvez également le faire en créant une branche temporaire en E et en la réattribuant de manière interactive sur Y, en conservant uniquement les validations que vous voulez, puis en les fusionnant (ce sera un rapide) dans la branche de Y. (Cela fonctionne toujours, et peut-être plus facile de toute façon, donc vous n'avez pas besoin de coller autant de SHA1.) – Cascabel