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

615

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

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

Почему
источник
1
Возможно дублирование, или, может быть, просто связано: слияние между вилками в GitHub .
Если есть дополнительные теги, которые вы можете синхронизировать, сделайте git push --force origin --tagsпосле предложенных решений!
MediaVince
1
Возможный дубликат Как мне обновить раздвоенный репозиторий GitHub?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

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? ».

VonC
источник
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.

n00shie
источник
Что если я знаю, что в ветке 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

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

Chan
источник
1

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

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

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

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

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

Saurabh P Bhandari
источник