Исходя из предыдущих предложений, это решение, которое я придумал:
Раствор 1 с вишней
Просто внесите одно изменение в саму ветку:
git add --patch <files> # record every change to move to master
git commit
Перейти к мастеру, и вишня
git stash
git checkout master
git cherry-pick <commitid>
Вернувшись в ветку, его можно перебазировать.
git checkout <branch>
git rebase master
Для каждого дублированного коммита вам будет предложено ввести:
git rebase --skip
Двойные коммиты отфильтровываются из набора патчей в ветке, и история чиста. Финал git merge
все равно может быть ускоренным.
Решение 2 без предварительной фиксации в ветке
Сначала извлеките все, чтобы перейти к мастеру:
git add --patch <files> # record every change to move to master
Затем переключитесь на master для фиксации:
git stash --keep-index # clear the working copy only
git checkout master -m # merge the index.
git commit
И обратно в ветку, его можно напрямую переназначить на кончик мастера:
git checkout <branchname>
git rebase master # move to branch start to the tip of master.
git stash apply # restore working copy, auto merges the changes
Решение 3, сделать клон текущей ветки master
Если вы не против иметь несколько рабочих копий (я всегда делал это с SVN), существует третье решение:
mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master # fetch remote master to local remotes/origin/master
git checkout -t origin/master # make new "master" branch, link to remote, checkout.
git commit
git push origin master # inject the change in the original repository.
Настройка клонирования выполняется здесь вручную, поскольку git clone
всегда клонирует текущую активную ветвь.
Для более сложных ситуаций всегда есть дополнительная безопасная охрана с git diff > to-master.patch
и git apply to-master.patch
. Это дает вам больше свободы для сброса настроек и повторения попыток, пока все не будет правильно.
В этой ситуации мы имеем дело с однострочным исправлением в файле, который существует в обеих ветвях. Это не приведет к конфликтам при слиянии и позволит использовать некоторые ярлыки, такие как checkout -m
.