Итак, я расскажу вам, как я это сделаю. Операция, которую вы хотите выполнить, называется перебазированием, и она очень полезна в ситуациях, когда вам нужно переписать историю, особенно когда вы хотите, чтобы ветка изменила свое происхождение.
Для вашей операции я дам у вас есть способ сделать это, но имейте в виду, что конфликты могут возникать по пути. Подробнее об этом в конце.
Я также предполагаю, что вы не загрузите новые состояния этих веток до конца. Это полезно, потому что гораздо проще выполнить сброс git и начать заново, чем исправлять исходное репо.
- Во-первых, понимание состояния. Ваше исходное состояние:
master
указывает на f3d7b51
origin/master
указывает на d829803
d829803
служит root, где оба разошлись. При перемещении веток туда и сюда важно знать новый root.
Вы должны sh, как я понял, объединить f3d7b51
и 12778e1
, чтобы они отображались как одна фиксация. Эта операция внутри rebase называется squa sh. Мы расскажем об этом чуть позже.
Чтобы сделать перебаз, я рекомендую его интерактивную версию. В терминале выполните:
git checkout master
git rebase -i origin/master #this is commit d829803
Ваш терминал откроет текстовый редактор или спросит вас, какой из них вы хотите использовать. Это простое редактирование текста, которое мы будем выполнять, поэтому выберите то, что вам удобно.
После открытия редактора он должен показать вам последовательность коммитов. предложенный операцией rebase. Если ничего не изменилось, он применит изменения поверх d829803
, выполняя новую фиксацию для каждого из них. Вы действительно перемещаете коммиты, изменяя их родительский коммит с помощью этого.
Помните squa sh? Если мое предположение верно, вам нужно изменить «команду» рядом с фиксацией ha sh в этой операции редактирования, заменив «pick» на «squa sh». Это объединяет оба коммита, как если бы они были одним. Также соблюдается порядок изменений (если вы не перемещаете строки вверх и вниз).
Итак, ваша перебазировка должна изначально выглядеть так:
pick 12778e1 feeder test
pick f3d7b51 feeder
# operation hash commit message
Вы можете, затем объедините фиксирует и даже изменяет сообщение:
pick 12778e1 implement feeder
squash f3d7b51 feeder
Вот что произойдет, когда вы сохраните файл и выйдете из редактирования:
- git перемотает и go в origin / master (aka d829803)
- различие будет представлено в редакторе, чтобы вы могли редактировать последовательность, изменять сообщение, изменять sh или даже удалять коммиты из истории.
- при сохранении и выходе git применит
12778e1
, а затем f3d7b51
, в этом порядке, создавая одну фиксацию с другим ha sh и сообщением implement feeder
- Ваше дерево будет выглядит так:
* ab46d2a 65 minutes ago (Mike) (HEAD -> master) implement feeder
|
* d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
|
* 7365aca 5 days ago (Mike) restore snapshot image
Если вы wi sh удаляете 12778e1
, просто удалите эту строку при редактировании.
Конфликты
Если вы есть конфликт, операции будут приостановлены, git предупредит вас о конфликтующих файлах.
В этом sc enario вы можете разрешить их или отменить. Для отмены просто используйте git rebase --abord
.
Решение просто переходит к этим файлам, объединяя их, чтобы получить необходимые изменения из конфликтующих коммитов, выполняя git add и git commit. Чтобы продолжить перебазирование, используйте git rebase --continue
Ссылки