git rebase после предыдущего слияния - PullRequest
71 голосов
/ 06 июня 2011

У меня следующая ситуация:

  • Я создал clone (Y) из основного репозитория (X), потому что над Y работало много людей, мы не делали никаких rebase, а только merge с. Когда мы хотим доставить (push) Y к X, мы хотели бы сделать rebase, чтобы все было красиво и чисто

Проблема в том, что при выполнении rebase нас просят выполнить все слияния, которые мы уже делали в предыдущих merge шагах. Есть ли решение этого, кроме того, которое означает повторное слияние?

Я ожидал, что это будет довольно просто, так как мы уже решили конфликтующие слияния.

Ответы [ 5 ]

102 голосов
/ 17 июня 2013

git merge --squash - теперь мой любимый способ перебазирования после большого объема работы и множества слияний ( см. Этот ответ )Если ветка, над которой вы работаете, называется my-branch и вы хотите сделать ребаз с master, просто выполните следующее:

git checkout my-branch
git branch -m my-branch-old
git checkout master
git checkout -b my-branch
git merge --squash my-branch-old
git commit
79 голосов
/ 07 июня 2011

Перебазирование для получения «чистой» истории переоценено.Лучший способ сохранить историю - просто выполнить слияние, а не перебазирование.Таким образом, если вам когда-либо понадобится вернуться к ревизии, она будет точно такой же, как та, которую вы тестировали во время разработки.Это также решает вашу проблему с ранее разрешенными конфликтами слияния.

Если вы не заботитесь о сохранении истории, вы можете создать новую ветвь без master, проверить ее, а затем выполнить git read-tree -u -m dev для обновленияВаше рабочее дерево должно соответствовать ветке dev.Затем вы можете зафиксировать все в один большой коммит и объединить его в мастер как обычно.

10 голосов
/ 06 июня 2011

Два замечания:

  • вы можете перебазировать свою собственную (еще не отправленную) работу столько раз, сколько захотите, поверх вновь полученных коммитов.
  • Вы можете избежать слиянияконфликты (во время перебазирования), если у вас активировано git rerere, что делается для такого рода ситуаций.
    http://git-scm.com/images/rerere2.png Подробнее см. git rerere.
4 голосов
/ 28 апреля 2017

Вы можете взять все изменения в своей ветке и поместить их в новый коммит в master со следующим:

git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch

Затем подготовить файлы и зафиксировать.

1 голос
/ 06 марта 2019

Что касается воспроизведения конфликтов слияния, вы можете использовать git rerere для ведения базы данных о том, как конфликты слияния уже были решены, так что выполнение повторной обработки, приводящей к тем же конфликтам, будет выполнять трудоемкие части автоматически.

https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67

git config --global rerere.enabled true

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

Более формальная документация здесь: https://git -scm.com / docs / git-rerere

...