У меня такая ситуация:
- Я создал
clone
(Y) из основного репозитория (X), потому что над Y работало много людей, мы не делали ничего,rebase
а толькоmerge
s. Когда мы хотим доставить (push
) Y в X, мы хотели бы сделатьrebase
, чтобы все было красиво и чисто
Проблема в том, что при выполнении rebase
нас просят выполнить все слияния, которые мы уже сделали на предыдущих merge
шагах. Есть ли решение этой проблемы, кроме того, которое означает повторное слияние?
Я ожидал, что это будет довольно просто, поскольку мы уже решили конфликтующие слияния.
git
merge
rebase
git-rebase
INS
источник
источник
Ответы:
Ребазинг для получения "чистой" истории переоценен. Лучший способ сохранить историю - это просто выполнить слияние, а не перебазирование. Таким образом, если вам когда-нибудь понадобится вернуться к ревизии, она будет такой же, как и та, которую вы тестировали во время разработки. Это также решает вашу проблему с ранее решенными конфликтами слияния.
Если вы не заботитесь о сохранении истории, вы можете создать новую ветку от мастера, проверить ее, а затем выполнить a,
git read-tree -u -m dev
чтобы обновить рабочее дерево в соответствии сdev
веткой. Затем вы можете зафиксировать все в одном большом коммите и как обычно слить его с мастером.источник
--squash
. Обычное слияние добавит N или N + 1 коммитов к мастеру, если в ветке было N коммитов. Приведенное выше предложение илиmerge --squash
всегда будет добавлять в мастер только один коммит.git merge --squash
теперь мой предпочтительный способ перебазирования после большого объема работы и множества слияний ( см. этот ответ ). Если ветка, над которой вы работаете, вызываетсяmy-branch
и вы хотите выполнить перебазирование,master
просто выполните следующие действия:источник
Два замечания:
git rerere
, что и делается для такого рода ситуаций.Смотрите больше на
git rerere
.источник
Вы можете взять все изменения в своей ветке и поместить их в новую фиксацию
master
следующим образом:Затем подготовьте свои файлы и выполните фиксацию.
источник
Что касается воспроизведения конфликтов слияния, вы можете использовать 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
источник