ГИТ перебазирования после предыдущего слияния в Git


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

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

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

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

4 62

4 ответа:

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

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

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

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

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

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

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

затем поместите свои файлы и зафиксируйте.