Возьмите следующий случай:
У меня есть работа в ветке тем, и теперь я готов вернуться к мастеру:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Я выполняю слияние с мастером, разрешаю конфликты и теперь у меня есть:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
Теперь слияние заняло у меня некоторое время, поэтому я сделал еще одну выборку и заметил, что в удаленной главной ветке появились новые изменения:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Если я пытаюсь «git rebase origin / master» от master, я вынужден снова разрешать все конфликты и также теряю коммит слияния:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
Есть ли чистый способ перебазировать коммит слияния, чтобы я получил историю, подобную той, что я показываю ниже?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
git
merge
rebase
git-rebase
git-rewrite-history
jipumarino
источник
источник
git rebase --preserve-merges origin/master
git config --global pull.rebase preserve
всегда сохранять коммиты слияния во времяgit --rebase-merges
конечном итоге заменит старыйgit --preserve-merges
. Посмотрите, что именно Git's «rebase --preserve-merges
» делает (и почему?)--preserve-merges
устарела. Использованиеgit rebase --rebase-merges origin/master
Ответы:
Здесь есть два варианта.
Одним из них является интерактивная перебазировка и редактирование коммита слияния, повторное слияние вручную и продолжение перебазирования.
Другим вариантом является использование
--rebase-merges
опции ongit rebase
, которая описана в руководстве следующим образом: «По умолчанию, rebase просто удалит коммиты слияния из списка задач и поместит перебазированные коммиты в одну линейную ветвь. С --rebase- слияния, вместо этого ребаз будет пытаться сохранить структуру ветвления внутри коммитов, которые должны быть перебазированы, путем воссоздания коммитов слияния. Любые разрешенные конфликты слияния или ручные поправки в этих коммитах слияния должны быть разрешены / повторно применены вручную. "источник
Хорошо, это старый вопрос, и он уже принял ответ
@siride
, но в моем случае этого ответа было недостаточно, поскольку--preserve-merges
вы заставляете разрешать все конфликты во второй раз. Мое решение основано на идее,@Tobi B
но с точными пошаговыми командамиИтак, мы начнем с такого состояния на основе примера в вопросе:
Обратите внимание, что у нас есть 2 коммитов впереди, мастер, поэтому вишневый пик не сработает.
Прежде всего, давайте создадим правильную историю, которую мы хотим:
Мы используем,
--preserve-merges
чтобы сохранить наш коммит слияния в истории. Мы используем--strategy=ours
для игнорирования всех конфликтов слияния, так как нам не важно, какое содержимое будет в этом коммите слияния, нам нужна только хорошая история.История будет выглядеть так (без учета мастера):
Давайте получим правильный индекс сейчас.
Мы можем получить некоторые дополнительные конфликты слияния здесь, но это будет только конфликты из файлов, измененных между
8101fe3
иf5a7ca8
, но не включает уже разрешенные конфликты изtopic
История будет выглядеть так (без учета правильной истории):
Последний этап - объединить нашу ветку с правильной историей и ветку с правильным индексом.
Мы используем,
reset --soft
чтобы сбросить нашу ветку (и историю), чтобы исправить историю, но оставить индекс и рабочее дерево как есть. Затем мы используем,commit --amend
чтобы переписать наш коммит слияния, который раньше имел неправильный индекс, с нашим хорошим индексом от master.В конце у нас будет такое состояние (обратите внимание на другой идентификатор top commit):
источник
git commit --amend
добавляет изменения в последний коммит (HEAD, в данном случае коммит слияния). Поскольку содержимое фиксации изменяется, хэш обновляется.Учитывая, что я просто потерял день, пытаясь выяснить это, и на самом деле нашел решение с помощью коллеги, я подумал, что должен вмешаться.
У нас большая база кода, и нам приходится иметь дело с двумя ветвями, которые сильно изменяются одновременно. Существует основной филиал и дополнительный филиал, если вы, который.
Пока я объединяю вторичную ветвь с основной ветвью, работа в основной ветке продолжается, и к тому времени, когда я это сделаю, я не могу отложить свои изменения, потому что они несовместимы.
Поэтому мне нужно «перебазировать» мое «слияние».
Вот как мы наконец сделали это:
1) запишите SHA. Пример: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
2) Создайте правильную историю, но это нарушит слияние.
3) запишите SHA. пример: 29dd8101d78
4) Теперь сбросьте, где вы были раньше
5) Теперь объедините текущий мастер в вашу рабочую ветку
6) Теперь, когда у вас есть правильные файлы, но неправильная история, добавьте правильную историю поверх ваших изменений с помощью:
7) А затем - изменить результаты в исходном коммите слияния
Вуаля!
источник
Похоже, что вы хотите сделать, это удалить ваше первое слияние. Вы можете выполнить следующую процедуру:
Это даст вам то, что вы хотите.
источник
источник