2010-09-14 4 views
30

Я уверен, что это простая вещь, на которую были заданы вопросы и ответы, но я не знаю, какие условия искать. У меня есть это:Как переместить фиксацию между ветвями в Git?

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

Где я совершил C, D и E (только локально) на ветке, но потом я понял, что D и Е являются действительно независимыми от C. Я хочу, чтобы переместить С его собственному и сохраните D и E позже. То есть, я хочу этого:

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

Как вытащить C из под D и E?

ответ

42

Вы можете использовать git cherry-pick захватить C, и положить его на Y. Предполагая, что Y существует как кончике ветвь под названием branch-Y:

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

Так что теперь C находится на вершине Y. Но D и Е также все еще содержат C (выбор вишни не перемещает фиксацию, он просто копирует ее). Вам придется перебазироваться D и Е на вершине B. Если предположить, что Е является кончик branch-E и В branch-B, вы можете:

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

Это откроет интерактивный сеанс перебазироваться. Просто удалите commit C целиком и оставьте D и E неповрежденными. Затем вы получите D и E, которые были перевыполнены поверх B без C.

+4

Обратите внимание, что 'cherry-pick', начиная с версии 1.1.1, может чередовать несколько коммитов, поэтому вы можете использовать это для« yank »more чем один совершить. Вы также можете сделать это, создав временную ветвь в E и интерактивно переустановив ее на Y, сохранив только те коммиты, которые вы хотите, а затем слейте ее (она будет быстрой перемоткой вперед) в ветвь Y. (Это всегда сработало и может быть проще, так что вам не нужно вставлять столько SHA1.) – Cascabel

Смежные вопросы