Я хотел иметь простое решение для сквоша двух слияний, совершаемых вместе во время интерактивной перезагрузки.git rebase interactive: squash merge commites together
Мой репозиторий выглядит следующим образом:
X --- Y --------- M1 -------- M2 (my-feature)
/ / /
/ / /
a --- b --- c --- d --- e --- f (stable)
То есть, у меня есть my-feature
ветвь, которая была объединена дважды в последнее время, с никакой реальной не совершает между ними. Я не просто хочу, чтобы перебазироваться в my-feature
ветви, так как это изданная филиал своей собственной, я просто хочу, чтобы раздавить вместе последние два слияния совершает в один (не опубликованы эти коммиты еще)
X --- Y ---- M (my-feature)
/ /
/ /
a --- ... -- f (stable)
Я пробовал:
git rebase -p -i M1^
Но я получил:
Refusing to squash a merge: M2
То, что я, наконец, сделал это:
git checkout my-feature
git reset --soft HEAD^ # remove the last commit (M2) but keep the changes in the index
git commit -m toto # redo the commit M2, this time it is not a merge commit
git rebase -p -i M1^ # do the rebase and squash the last commit
git diff M2 HEAD # test the commits are the same
Теперь новое комманда слияния больше не считается фиксацией слияния (в ней хранится только первый родитель). Итак:
git reset --soft HEAD^ # get ready to modify the commit
git stash # put away the index
git merge -s ours --no-commit stable # regenerate merge information (the second parent)
git stash apply # get the index back with the real merge in it
git commit -a # commit your merge
git diff M2 HEAD # test that you have the same commit again
Но это может усложниться, если у меня много коммитов, есть ли у вас лучшее решение? Спасибо.
Милдред
Ну, когда вы сделайте свое второе слияние, вы всегда можете использовать '--squash', чтобы избежать создания фиксации, а затем использовать' git commit -amend' для изменения предыдущего слияния. – Mildred
Это не сработает, он не сохранит новую версию ветки, с которой вы слились, в commit – Mildred