Мне нужно увидеть git log --graph --decorate --oneline
, чтобы быть уверенным, но вот что, вероятно, произошло.
git pull upstream master
на самом деле git fetch upstream
и git merge upstream/master
. Как и в случае любого слияния, оно оставит коммиты слияния. Вот что вы видите.
Эти слияния не нужны. В отличие от слияния ветви функций, эти слияния обновлений не представляют интереса для будущих разработчиков этого проекта. И они мешают.
Вы можете избавиться от них, вместо того, чтобы сливаться поверх upstream / master, перебазировать поверх topstream / master. git rebase upstream/master
. Вместо слияния ваши локальные коммиты будут переписаны поверх последней версии upstream / master. Существующие ненужные слияния будут устранены.
Я рекомендую перебазировать для всех попыток. Вы можете настроить Git, чтобы сделать это с git config --global pull.rebase merges
. Это перебазирует, но сохраняет существующие слияния.
Наконец, чтобы избежать этой ситуации в будущем, не работайте над своей основной веткой. Держите мастера в чистоте. Сделайте всю свою работу в функциональных ветвях , используйте это в качестве пиара и удалите функциональную ветвь впоследствии. Это позволит избежать многих проблем.
Чтобы проиллюстрировать, вот как выглядит «расходятся X коммитов».
upstream
A - B - C - G - H - I [master]
origin
G - H - I [upstream/master]
/
A - B - C - D - E [master]
И после вас git pull upstream master
...
$ git pull upstream master
upstream
A - B - C - G - H - I [master]
origin
G - H - I [upstream/master]
/ \
A - B - C - D - E - M [master]
Обратите внимание на слияние. Чтобы устранить это, сделайте ребаз в верхней части upstream / master.
$ git rebase upstream/master
upstream
A - B - C - G - H - I [master]
origin
A - B - C - G - H - I [upstream/master]
\
D1 - E1 [master]
Теперь ваша история хороша и линейна, как будто вы все время работали над последним мастером.
Наконец эта работа должна быть сделана в функциональной ветке. Это будет выглядеть следующим образом.
upstream
A - B - C - G - H - I [master]
origin
G - H - I [upstream/master]
/
A - B - C [master]
\
D - E [feature]
Обновление мастера теперь просто перемотка вперед.
$ git checkout master
$ git pull upstream master
upstream
A - B - C - G - H - I [master]
origin
[upstream/master]
A - B - C - G - H - I [master]
\
D - E [feature]
И вы можете перебазировать свою ветвь функций поверх мастера (или пропустить шаг и перебазируем прямо сверху вверх / вверх по течению / master).
$ git checkout feature
$ git rebase master
upstream
A - B - C - G - H - I [master]
origin
[upstream/master]
A - B - C - G - H - I [master]
\
D1 - E1 [feature]