Эта ветвь x фиксирует перед xy: master - PullRequest
0 голосов
/ 10 апреля 2020

I разветвил проект на GitHub, начал выдвигать PR (каждый в своей ветке). Все было хорошо. Затем я увидел, что мой: master is X фиксирует позади, поэтому я хотел обновить текущее состояние апстрима.

Я попытался:

git remote add upstream https://github.com/home-assistant/brands.git
git pull upstream master
git push --force-with-lease origin master

enter image description here

Я получаю:

Эта ветвь на 4 коммита впереди домашнего помощника: мастер.

Теперь каждый раз, когда я создаю новый PR, добавляются дополнительные коммиты:

enter image description here

Отлично. Я нашел много похожих вопросов и ответов здесь, но, похоже, ни один из них не работает (fetch, reset --hard origin / master).

Есть ли способ исправить это, или я должен удалить форк и начать заново

1 Ответ

1 голос
/ 10 апреля 2020

Мне нужно увидеть 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...