Подтвердить что ты не робот

Git rebase после предыдущего git слияния

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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