Я использовал локальную ветвь 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 не будет синхронизироваться с восходящим репо, поэтому было бы бессмысленно.