Понимание «git pull --rebase» против «git rebase»
Согласно моему пониманиюgit pull --rebase origin master
, это должно быть эквивалентно выполнению следующих команд:
(from branch master): $ git fetch origin
(from branch master): $ git rebase origin/master
Кажется, я нашел случай, когда это работает не так, как ожидалось. В моей рабочей области у меня есть следующие настройки:
веткаorigin/master
справочная веткаmaster
на удаленномorigin
веткаmaster
настроен на отслеживаниеorigin/master
, и являетсяпозади мастер по нескольким коммитам.веткаfeature
настроен для отслеживания местного отделенияmaster
, а такжевпереди изmaster
несколькими коммитами.Иногда я теряю коммиты, выполняя следующую последовательность шагов
(from branch master): $ git pull --rebase
(from branch master): $ git checkout feature
(from branch feature): $ git pull --rebase
На данный момент, несколько коммитов впереди я был наfeature
теперь были потеряны. Теперь, если я сброслю свою позицию и вместо этого сделаю следующее:
(from branch feature): $ git reset --hard HEAD@{2} # rewind to before second git pull
(from branch feature): $ git rebase master
Коммиты были применены правильно, и мои новые коммиты наfeature
все еще присутствуют. Это, кажется, прямо противоречит моему пониманию того, какgit pull
работает, еслиgit fetch .
делает что-то незнакомое, чем я ожидал.
К сожалению, это не на 100% воспроизводимо для всех коммитов. Когда он работает для коммита, он работает каждый раз.
Замечания: мойgit pull --rebase
здесь на самом деле следует читать как--rebase=preserve
, если это имеет значение. У меня есть следующее в моем~/.gitconfig
:
[pull]
rebase = preserve