Я использовал локальную ветвь feature
для создания PR для репликации github (у меня нет доступа на запись к нему). Позже я решил, что хочу отделить его последний коммит в автономном PR, поэтому я переместил feature
один фиксатор назад:
git checkout feature
git branch feature2
git reset --hard @~
git push -f
Первый PR объединяется вверх по течению, поэтому теперь я хочу создать второй PR:
git checkout master
git pull upstream master
git push origin
git checkout feature2
git rebase master
К сожалению, оказывается, что git
не хватает информации о том, что feature
был объединен с master
. Поэтому он не понимает, что ближайшая общая база feature2
и master
очень близка: это просто feature
. Вместо этого rebase
возвращается к общей базе feature
и master
, как если бы они никогда не сливались. В результате git rebase master
становится излишне беспорядочным.
Почему Github
потеряла информацию о том, что feature
была объединена в master
через восходящий PR? Есть ли способ предоставить Github
эту информацию?
В конце концов, мне пришлось прибегать к:
git checkout master
git checkout -b feature2_new
git cherry-pick feature2
К счастью, мне нужно было только позаботиться о одной фиксации. И даже с одной фиксацией, я думаю, что слияние с истинной базой (если бы git знал об этом) было бы лучше, чем cherry-pick
, потому что git
сможет использовать свои знания истории, чтобы разрешить больше конфликтов автоматически.
Обратите внимание, что если бы я должен был объединить feature
в master
локально вместо того, чтобы делать PR для github, никакая информация не была бы потеряна. Конечно, тогда мой master
не будет синхронизироваться с восходящим репо, поэтому было бы бессмысленно.