Git rebase после предыдущего git слияния
У меня следующая ситуация:
- Я создал
clone
(Y) из основного репозитория (X), потому что было много людей, работающих на Y, мы не делали никаких rebase
, а только merge
s. Когда мы хотим доставить (push
) от Y до X, мы хотели бы сделать rebase
, чтобы все было хорошо и чисто.
Проблема заключается в том, что при выполнении rebase
нам предлагается выполнить все слияния, которые мы уже делали в предыдущих шагах merge
. Есть ли решение для этого, помимо того, что означает фактическое повторное выполнение слияний?
Я ожидал, что это будет довольно просто, поскольку мы уже решили конфликтующие слияния.
Ответы
Ответ 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
, что сделано для такого рода ситуаций.
Подробнее см. git rerere
.
Ответ 4
Вы можете взять все изменения в своей ветке и поместить их в новую фиксацию в master
со следующим:
git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch
Затем создайте свои файлы и зафиксируйте.