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


302

Давайте предположим, что someone/foobarна GitHub есть репозиторий , который я разветвил me/foobar.

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

Цель состоит в том, чтобы:

  • git pull извлечь из родительского хранилища
  • git push отправить все на мою развилку

26
Удивительный ответ @Olufemi, кажется, делает то, что вы хотите, за исключением того, что, как отмечает ChristianGosch в комментарии, вы получаете «коммит слияния» в верхней части ветки, и «ничего для сравнения» не появится. Это кажется неприемлемым для многих проектов, для которых вы хотите создать ветки для них. Так неужели нет способа сделать этот самый основной из рабочих процессов для участников в github без выполнения тайных команд git на персональном компьютере? Или, может быть, я должен просто выбросить весь репо и заново делать каждый раз, когда я хочу внести свой вклад ??
nealmcb




@nealmcb Разве можно избежать проблемы с «коммитом слияния» в верхней части ветки, если вы перебазируете?
Марко

Ответы:


586

Откройте раздвоенный Git-репозиторий me / foobar .

Нажмите на Сравнить :

Вот пример изображения страницы

Вы получите уведомление:

Там не с чем сравнивать.
Кто-то: мастер в курсе всех коммитов от меня: мастер . Попробуйте переключить базу для сравнения.

Нажмите на переключение базы на этой странице:

Вот пример на странице

Затем вы увидите все коммиты, сделанные кому-то / foobar после дня, когда вы его разветвили.

Нажмите на Создать запрос на извлечение :

Вот пример страницы

Укажите для pull-запроса заголовок и, возможно, описание, и нажмите « Создать pull-запрос» .

На следующей странице перейдите к нижней части страницы и нажмите « Слить запрос на выборку» и « Подтвердить слияние» .

Ваш Git-репозиторий me / foobar будет обновлен.

Изменить: параметры перебазирования показаны здесь:

введите описание изображения здесь


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

8
Для того, чтобы избежать запутанной ситуации упоминание выше, было бы лучше , нажмите на Editкнопку и вручную переключить base forkна me/foobarи head forkна someone/foobar. Таким образом , это много ясно
macemers

26
Еще один: это прекрасно работает, если вы уже делали это раньше, но после этого в верхней части истории коммитов появляется «коммит слияния». При этом «не с чем сравнивать» не появится. Вместо этого нужно использовать кнопку «Редактировать» и вручную поменять базу и вилку, чтобы это работало.
Кристиан Гош

26
Нет ли способа избавиться от этого нелепого слияния?
kumarharsh

17
@kumar_harsh, начиная с сентября 2016 года , теперь есть возможность «перебазировать и объединить» для запросов на извлечение, которая позволяет избежать фиксации слияния.
Waldyrious

41
git remote set-url origin git@github.com:someone/foobar
git remote set-url origin --push git@github.com:me/foobar

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

Изменить:
На самом деле, вы можете git pull git@github.com:me/foobar , который удаляет предупреждение.
Выбор за вами, который легче запомнить.


8

Для этого я использовал довольно простой метод с использованием веб-интерфейса GitHub :

  1. Откройте исходный репозиторий Git (не разветвленный репозиторий Git me/foobar)
  2. Перейдите в папку src и откройте файл, который хотите изменить.
  3. Нажмите на значок пера. Он автоматически создаст ярлык в вашем личном форке с именем «patch-1» на основе текущей версии главного репозитория: Введите описание изображения здесь
  4. Наслаждайтесь! Введите описание изображения здесь

3
Пытаясь это, в основном открывает редактор файла в оригинальном git-репо. У меня нет прав записи (по замыслу) в исходное git-репо. Похоже, для этого метода вы должны изменить файл, иначе нет способа «сохранить» файл. Без сохранения файла я не смог бы получить ваш эквивалент ветки «patch-1» для отображения в моем разветвленном хранилище. Что мне здесь не хватает?
Электро-зайчик

5

Приложение "Pull" - это решение для автоматической настройки и забывания. Он будет синхронизировать ветку по умолчанию вашего форка с репозиторием восходящего потока.

Зайдите на URL, нажмите зеленую кнопку «Установить» и выберите репозитории, в которые вы хотите включить автоматическую синхронизацию.

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

Также ответил в https://stackoverflow.com/a/58965171/946850 .


1

Другой вариант - использовать Update from upstreamRepoName/masterкнопку в GitHub для Mac (и я предполагаю, что GitHub для Windows).

Введите описание изображения здесь


TIL: что есть приложения для GitHub помимо веб-интерфейса :-) [и это позор, что опыт между ними не унифицирован]
Том Гудфеллоу

Я не вижу этого в Windows
Денис

1
@ Денис, это их старое приложение. Я не уверен, что их новое приложение имеет его.
Стив Мозер

Ага. Это работало в «GitHub Desktop» (для Mac, не уверен насчет Windows).
michaelok

0

Я не знаю, как это можно сделать без добавления другого пульта, однако я всегда добавляю репо, с которого я разветвился, как upstreamпульт, чтобы я мог просто сделать:

git branch -a|grep remotes/upstream| while IFS="/" read p r b; do echo Syncing $r/$b to origin/$b; git push origin $r/$b:refs/heads/$b; done

Это будет синхронизировать все ветви вкл. создание новых (удалите, refs/heads/чтобы обновить только существующие ветки). Если какая-либо из ваших ветвей разошлась, она выдаст ошибку для этой ветви.

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