2013-06-18 3 views
6

Я случайно начал работу над новой функцией посредине другой. Мой репозиторий просто выглядит следующим образом:Перемещение старого сообщения в новый филиал

A - B - C - D - E master 

Но я надеюсь сделать это выглядеть следующим образом:

A - B - D - E  master 
     \ 
     C   new-feature 

Похоже, простой вопрос, но я до сих пор не нашли ответа на это путем поиска. Кажется, что выбор вишни близок к тому, что я хочу, а также, может быть, к некоторому подбадриванию, но я новичок в Git, и какая-то помощь будет оценена.

ответ

4

Во-первых, чтобы сделать новую ветвь:

git branch new-feature C 

Далее, чтобы исправить хозяину

git checkout master 
git rebase -i B 

Когда редактор приходит, удалить C из списка. Сохранить и выйти.

+0

Большое спасибо! Ища подобное объяснение. – bbill

+0

После перезагрузки 'git push' откажется нажать мастер из-за конфликтов с пультом. Я использовал 'git push origin + master', чтобы получить его, но я не уверен, что он правильный выбор. – Guss

2

Здесь я буду использовать некоторые довольно опасные операции, поэтому просто обратите внимание.

Этот ответ делает несколько предположений:

  1. Ваш окончательный master филиал должен выглядеть следующим образом: A - B - D - E

  2. Ваш окончательный new-feature филиал должен выглядеть следующим образом: A - B - C

  3. Отсутствие of commit C не повлияет на применение коммитов D и E поверх обязательства B.

Если это не так, пожалуйста, обновите здесь.

Во-первых, на мастер ветка, мы создаем новую ветку в качестве резервной копии. Давайте просто назовите это «backup».

git branch backup 

Это позволит нам легко восстановить основную ветвь, если в противном случае произойдет что-то не так. Конечно, мы могли бы использовать git reflog, но это намного удобнее.

Далее на главной ветви, сделать:

git rebase -i HEAD~3 

Это должно запустить текстовый редактор для git rebase (интерактивного режима). Найдите строку для фиксации C и удалите ее.

Теперь, ваш мастер филиал должен выглядеть следующим образом:

A - B - D' - E'

Dont беспокоиться обо мне писать A - B - D' - E' вместо A - B - D - E. D и D' по существу эквивалентны с точки зрения наборов изменений.То же самое для E и E'.

Мы добираемся туда. Я предполагаю, что фиксация C на ветке new-feature должна быть разветвлена ​​с фиксации B. Найти совершить SHA1 для фиксации B, затем (опустить угловые скобки ниже):

git checkout -b new-feature <SHA1 of commit B>

Это создаст филиал под названием new-feature, который начинается на совершение B, и проверяет его для вас. Сейчас мы находимся на new-feature ветви, и это выглядит следующим образом:

A - B

Последний шаг, чтобы выяснить совершить SHA1 коммиттерских C. У нас есть это в ветке backup. Используя git log backup (или какой-либо другой метод), найдите фиксацию SHA1 фиксации C на резервной ветке. После этого, на new-feature ветви, сделайте следующее:

git cherry-pick <SHA1 of commit C>

Конечно, пожалуйста, опустить угловые скобки.

Теперь new-feature филиал должен выглядеть следующим образом:

A - B - C'

+0

Родитель 'C' уже' B'. Если вы просто сделаете эту ветку до перезагрузки, вам не нужно делать какую-либо гимнастику. –

+0

Да, вы правы, ваш ответ намного лучше – yanhan

+0

Ничего себе, оцените углубленный код. Я думаю, это помогает моему пониманию, если не на практике. – bbill

1

Предположим, вы в настоящее время на ветке master

  1. git branch new-feature master~2 Теперь ответвляются new-feature создается и указывает на C фиксации. (Вы все еще работают по отрасли master однажды законченный)
  2. git rebase --onto master~3 master~2 Это пересаживает все коммиты из master~2 главы master на фиксации B (т.е. master~3).

ОК, все готово!

Для получения дополнительной информации всегда используйте git help <cmd>.

+0

Спасибо, Фрэнк. Однако я тоже хотел избавиться от фиксации. – bbill

+1

Конечно, C _deleted_ из ветки 'master' (теперь C доступен только из ветки' new-feature'). Насколько я понимаю, «git rebase -onto» - лучший способ для вашей проблемы. –

+0

Хорошо. Спасибо, не понимал этого. – bbill

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