Извлекать новые обновления из исходного репозитория GitHub в разветвленный репозиторий GitHub.


615

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

Как я могу вытащить изменения, которые были сделаны в источнике, и включить их в мой репозиторий?


1
Возможно дублирование, или, может быть, просто связано: слияние между вилками в GitHub .

Если есть дополнительные теги, которые вы можете синхронизировать, сделайте git push --force origin --tagsпосле предложенных решений!
MediaVince

Ответы:


716

Вы должны добавить исходный репозиторий (тот, который вы разветвляли) в качестве удаленного.

Со страницы руководства по вилке GitHub :

вилка

Как только клон будет завершен, у вашего репо будет дистанционное имя « origin», указывающее на ваш форк на GitHub.
Не позволяйте названию сбить вас с толку, это не указывает на исходный репо, с которого вы ответили. Чтобы помочь вам следить за этим репо, мы добавим еще один пульт с именем «upstream»:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

У вас также есть рубиновый драгоценный камень, который может облегчить эти операции GitHub .

раздвоенный

Смотрите также « Git fork - это git clone? ».


14
См. Также bassistance.de/2010/06/25/git-fu-updating-your-github-fork для хорошего резюме.
VonC

2
@syedrakib Я предпочитаю git rebase upstream/master, но я добавил две возможности в ответе.
VonC

1
@PaBLoX, если вы разветвляли репо, вы работаете над своим репо, в своей ветке: перебазируйте и форсируйте пуш: без проблем. Даже текущий запрос будет корректно обновлен.
VonC

2
@PaBLoX вы не создаете беспорядок: вы git push --force, заменив историю своей ветки на GitHub своей локальной веткой, которую вы только что перебазировали. Так как только вы используете грустную ветку, никакой путаницы не возникает.
VonC

2
Я понимаю. Я все еще думаю, что это сложно, нетривиально и не интуитивно понятно. Тем не менее, странно, что мои изменения всегда будут сверху (последними), хотя на самом деле они были сделаны раньше. Решение, которое я выложил ранее, выглядит лучше (все еще нетривиально). Проблема в том, что коммит хэширует изменения (очевидно, поскольку есть новый родитель) и генерирует много шума внутри github при вызове проблем. Тем не менее меня удивляет, что нет способа оставаться в курсе апстрима и управлять своим собственным форком, не создавая бессмысленных коммитов слияния или «лжи» об истории.
Пабло Олмос де Агилера К.

99

В дополнение к ответу VonC, вы можете настроить его по своему вкусу.

После извлечения из удаленной ветви вам все равно придется объединить коммиты. Я бы заменил

$ git fetch upstream

с

$ git pull upstream master

поскольку git pull по сути является git fetch + git merge.


Что если я знаю, что в ветке upstream нет никаких изменений в существующих файлах, а добавлено лишь несколько файлов ресурсов - нужно ли мне объединять?
azec-pdx

4
Конечно, в этом случае он просто сделает перемотку вперед
Домнесс

как сделать так, чтобы основной мастер верхнего уровня перезаписывал все локальные файлы (чтобы не возникало конфликтов слияния). В этом случае
главный

1
@snh_nl git rebase upstream masterОбратите внимание, что это не является бесконфликтным, если вы достаточно отклонились от upstream/master. См. Git-scm.com/docs/git-rebase (tl; dr: этот жесткий сбрасывает ваш локальный мастер на тот, что был в восходящем потоке, а затем пытается объединить все локальные коммиты с точки расхождения вперед)
cowbert

68

В этом видео показано, как обновить форк напрямую с GitHub.

шаги:

  1. Откройте вилку на GitHub.
  2. Нажмите на Pull Requests.
  3. Нажмите на New Pull Request. По умолчанию GitHub сравнивает оригинал с вашим форком, и не должно быть ничего для сравнения, если вы не внесли никаких изменений.
  4. Нажмите на switching the base. Теперь GitHub будет сравнивать ваш форк с оригиналом, и вы должны увидеть все последние изменения.
  5. Нажмите Create a pull requestдля сравнения и назначьте предсказуемое имя для вашего запроса извлечения (например, Обновить с оригинала).
  6. Нажмите на Create pull request.
  7. Прокрутите вниз и нажмите Merge pull requestи, наконец, Confirmобъедините. Если на вашем форке не было никаких изменений, вы сможете объединить его автоматически.

3
К сожалению, этот хороший графический метод создает дополнительный шум в вашей вилке, как указано выше в комментариях к принятому ответу. Поэтому рекомендуется метод командной строки: help.github.com/articles/syncing-a-fork
Джонатан Кросс

Я не мог найти switching the baseвариант
Альпер

64

Использование:

git remote add upstream ORIGINAL_REPOSITORY_URL

Это установит ваш апстрим в репозиторий, из которого вы разветвлены. Тогда сделайте это:

git fetch upstream      

Это приведет к извлечению всех веток, включая master, из исходного хранилища.

Объедините эти данные в вашей локальной ветке master:

git merge upstream/master

Перенесите изменения в ваш разветвленный репозиторий, т.е. в источник:

git push origin master

Вуаля! Вы закончили синхронизацию с исходным хранилищем.


как сделать так, чтобы основной мастер верхнего уровня перезаписывал все локальные файлы (чтобы не возникало конфликтов слияния). В этом случае
главный

Один из способов - просто удалить локальную копию и выполнить новое клонирование :)
ARK

1

Если вы используете настольное приложение GitHub, в правом верхнем углу есть кнопка синхронизации. Нажмите на это тогда Update from <original repo>около верхнего левого.

Если нет изменений для синхронизации, это будет неактивно.

Вот несколько скриншотов, чтобы сделать это легко.


1

Если нечего терять, вы также можете просто удалить свой форк, просто перейдите в настройки ... перейдите в раздел опасной зоны ниже и нажмите «Удалить репозиторий». После этого вам будет предложено ввести имя хранилища и пароль. После этого вы просто снова разветвляете оригинал.


1

Если вы хотите сделать это без кли, вы можете сделать это полностью на веб-сайте Github.

  1. Перейдите в ваш репозиторий fork.
  2. Нажмите на New pull request.
  3. Убедитесь, что ваш форк является базовым хранилищем, а исходный (восходящий) - головным. Обычно вы хотите синхронизировать только основную ветку.
  4. Create new pull request,
  5. Нажмите на стрелку справа от кнопки слияния и убедитесь, что вместо слияния выбрана перебазировка. Затем нажмите кнопку. Таким образом, он не будет производить ненужный коммит слияния.
  6. Выполнено.

0

Чтобы автоматически синхронизировать ваш разветвленный репозиторий с родительским репозиторием, вы можете использовать приложение Pull на GitHub.

Обратитесь к Readme для более подробной информации.

Для расширенной настройки, в которой вы хотите сохранить изменения, внесенные в разветвленный репозиторий, обратитесь к моему ответу на аналогичный вопрос здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.