Я использовал свою локальную ветку 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
не будет синхронизироваться с вышестоящим репо, поэтому это будет бессмысленно.
upstream
remote задан правильный URL-адрес? Проверить сgit remote -v
- person jakub.g   schedule 21.04.2017master
. Несмотря на то, что этот коммит соответствует (сжатой) версии моих локальных коммитов вfeature
, их история не связывает. - person max   schedule 21.04.2017master
коммит, созданный PR, имеет только одного родителя. - person max   schedule 21.04.2017