GitHub продолжает говорить: "Эта ветка Х совершает вперед, Y совершает за собой"

Я знаю, что есть несколько похожих вопросов, но я думаю, что моя ситуация немного отличается.

Скажем, есть репозиторий GitHub, в который я хочу внести свой вклад. Я переделаю этот репозиторий в свою учетную запись GitHub, и я клонирую вилку из своей учетной записи на своем ПК. Хорошо.

Прежде чем приступить к работе над проблемой, я сначала хочу синхронизировать свою вилку с "оригинальным" репозиторием. Я перехожу к своей учетной записи, нажимаю "Новый запрос Pull", убедитесь, что я выбрал мой как базу, а оригинальный мастер - как вилку, я вижу различия (все, что делали люди в исходном репозитории, которые не находятся на моем), Затем я создаю запрос на растяжение на своей вилке, и я объединю эти изменения в своей вилке. Я перехожу на свое местное репо и делаю git pull, и у меня все синхронизировано. Хорошо.

Теперь проблема в моей учетной записи GitHub заключается в том, что она всегда говорит: "Эта ветка Х совершает вперед", где "Х" - это количество раз, которое я выполнил описанный выше процесс синхронизации. Таким образом, каждый раз, когда я делаю запрос на перенос в исходный репозиторий (не мой вилок), показывается, что я выполняю свой код плюс. Больше коммитов, это слияния, которые я сделал на своей вилке, синхронизировать с исходным репозиторием.

Конечно, я не хочу вносить эти изменения в исходный репозиторий, так как у них уже есть эти изменения, поэтому я не понимаю, почему GitHub продолжает говорить мне, что у меня есть изменения для фиксации.

Я думаю, что это то, что нужно решить на моей учетной записи GitHub, потому что в моем локальном репозитории нет никаких изменений или проблем, на самом деле я даже удалил его и снова клонировал.

Есть ли у вас идеи?

Ответ 1

Как вы уже догадались, эти дополнительные коммиты, скорее всего, являются коммитами слияния из созданных вами запросов на вытягивание.

В будущем появится намного более простой способ синхронизации вашего форка с исходным репозиторием. В вашем локальном репо после первоначального клона выполните:

git remote add upstream https://github.com/upstream/repo.git

Затем, когда вы захотите синхронизировать изменения из апстрима, выполните:

git pull --rebase upstream master
git push --force-with-lease origin master

(--rebase и --rebase --force-with-lease будут необходимы только в том случае, если у вас есть коммиты, которые не были объединены с вышестоящим репо.)

Обязательное предупреждение: поскольку перебазирование переписывает историю, это может быть опасно/разрушительно для всех, кто работает над этой веткой.Убедитесь, что четко сообщаете о том, что вы сделали, с кем-либо, с кем вы сотрудничаете.Так как это личная вилка, я предполагаю, что это не будет проблемой для вас.


Теперь, чтобы исправить вашу текущую проблему после факта.

  1. Добавьте вышестоящий пульт, как описано выше.
  2. Сбросьте вашу местную ветку, чтобы соответствовать upstream:

    git checkout master
    git reset --hard upstream/master
    
  3. Если вы создали какие-либо коммиты на своей вилке, вы можете cherry-pick их в обновленной версии master. Если вы не можете вспомнить или вам нужна помощь в их поиске, что-то вроде

    git log --oneline master origin/master
    

    должен показать вам любые коммиты не в апстриме.


Выше я предположил, что вы используете только одну ветку, master. Если вы этого еще не сделали, я настоятельно рекомендую вам создать новую ветку для каждой функции/исправления ошибки, над которым вы работаете. Среди других преимуществ это позволяет вам начать работу над другой функцией/исправлением ошибки, когда вы все еще ожидаете объединения более раннего PR. Если вы никогда не передадите напрямую master, вы можете --rebase синхронизацию без --rebase или --rebase --force-with-lease:

git checkout master
git pull upstream master
git push origin master

Чтобы обновить ветвь компонента после обновления master, выполните:

git checkout myfeature
git rebase master
git push --force-with-lease origin myfeature # if you have already pushed

Ответ 2

Просто дополнение к ответу выше,

Если вы используете bit-bucket вместо Github, то при создании fork вы получите флажок для sync fork.

Это встроенная функциональность, при которой все разветвленные ветки постоянно обновляются по битам из исходного репозитория. Не нужно обновлять ветки веток самостоятельно. Просто используйте локальный подход и не путайтесь с ветвями ветвления.

Надеюсь, это добавляет ценность.

Ответ 3

У меня та же проблема с тобой и только что решил эту проблему.

Чтобы решить это:

1) "Сброс" локального репо до момента, когда обильные коммиты

2) Создайте новую ветку, используя этот исправленный локальный репо

3) "Опубликовать" это исправленное локальное репо в вашем репозитории github

4) Внесите изменения, которые вы хотите PR в github в исправленном локальном репо

5) "Совершить" это локальное репо

6) "Потяните" коммит на репозиторий github

7) В вашей новой ветке github repo отправьте запрос на загрузку в репозиторий upstream.

Надеюсь, что этот ответ может помочь.