Как мне обновить разветвленный репозиторий GitHub? - PullRequest
3240 голосов
/ 30 августа 2011

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

Через несколько дней другой участник внес другое изменение.Так что моя вилка не содержит этого изменения.

Как я могу получить это изменение в моей вилке?Нужно ли мне удалять и заново создавать мой форк, когда у меня появятся дальнейшие изменения?Или есть кнопка обновления?

Ответы [ 18 ]

3533 голосов
/ 30 августа 2011

В вашем локальном клоне вашего разветвленного репозитория вы можете добавить исходный репозиторий GitHub в качестве «удаленного». («Remotes» подобны псевдонимам для URL репозиториев - например, origin.) Затем вы можете получить все ветви из этого репозитория upstream и перебазировать свою работу, чтобы продолжить работу над версией upstream. С точки зрения команд, которые могут выглядеть так:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

Если вы не хотите переписывать историю вашей основной ветки (например, потому что другие люди, возможно, клонировали ее), то вам следует заменить последнюю команду на git merge upstream/master. Тем не менее, для выполнения максимально простых запросов на извлечение, вероятно, лучше выполнить ребазинг.


Если вы переместили свою ветку на upstream/master, вам может потребоваться принудительное нажатие, чтобы перенести ее в свой собственный разветвленный репозиторий на GitHub. Вы бы сделали это с:

git push -f origin master

Вам нужно использовать -f только в первый раз после того, как вы перебазировали.

690 голосов
/ 25 мая 2014

Начиная с мая 2014 года, можно обновлять форк напрямую из GitHub. Это все еще работает с сентября 2017 года, НО , это приведет к грязной истории коммитов.

  1. Откройте вилку на GitHub.
  2. Нажмите Запросы на извлечение .
  3. Нажмите Новый запрос на извлечение . По умолчанию GitHub будет сравнивать оригинал с вашим форком, и не нужно ничего сравнивать, если вы не внесли никаких изменений.
  4. Нажмите , переключив базу , если увидите эту ссылку. В противном случае вручную установите опорную вилку на вилку, а вилку - вверх по течению. Теперь GitHub будет сравнивать ваш форк с оригиналом, и вы должны увидеть все последние изменения. enter image description here
  5. Создайте запрос извлечения и назначьте предсказуемое имя для вашего запроса извлечения (например, Update from original).
  6. Прокрутите вниз до Слить запрос на извлечение , но пока ничего не нажимайте.

Теперь у вас есть три варианта, но каждый из них приведет к менее чистой истории фиксации.

  1. По умолчанию будет создан ужасный коммит слияния.
  2. Если щелкнуть раскрывающийся список и выбрать «Сквош и объединить», все промежуточные коммиты будут сведены в один. Чаще всего это то, что вам не нужно.
  3. Если вы нажмете Перебазировать и объединить , все коммиты будут сделаны «с вами», исходные PR свяжутся с вашим PR, и GitHub отобразит This branch is X commits ahead, Y commits behind <original fork>.

Так что да, вы можете поддерживать репо в обновленном состоянии с помощью веб-интерфейса GitHub, но это приведет к потере истории ваших коммитов. Придерживайтесь командной строки вместо этого - это просто.

417 голосов
/ 22 октября 2013

Вот официальный документ GitHub по Синхронизация форка :

Синхронизация вилки

Настройка

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

Совет: Синхронизация вашего форка обновляет только вашу локальную копию хранилища; он не обновляет ваш репозиторий на GitHub.

$ git remote -v
# List the current remotes
origin  https://github.com/user/repo.git (fetch)
origin  https://github.com/user/repo.git (push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
origin    https://github.com/user/repo.git (fetch)
origin    https://github.com/user/repo.git (push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (push)

Syncing

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

Fetching

Извлечение из удаленного хранилища приведет к его ветвям и их соответствующим коммитам. Они хранятся в вашем локальном хранилище в специальных ветках.

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

Теперь у нас есть основная ветвь вышестоящего потока, хранящаяся в локальной ветке, upstream / master

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/origin/HEAD     -> origin/master
  remotes/origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

Слияние

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

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

Если в вашем локальном филиале не было уникальных коммитов, вместо этого git выполнит «перемотку вперед»:

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Совет: Если вы хотите обновить свой репозиторий на GitHub, следуйте инструкциям здесь

90 голосов
/ 05 августа 2015

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

  1. Перейдите в локальный репозиторий.

    • Переключитесь на главную ветку, если вы не git checkout master
  2. Добавить родителя в качестве удаленного хранилища, git remote add upstream <repo-location>

  3. выпуск git fetch upstream
  4. Выпуск git rebase upstream/master

    • На этом этапе вы проверяете, что фиксирует то, что будет объединено, набирая git status
  5. Выпуск git push origin master

Для получения дополнительной информации об этих командах см. шаг 3 .

43 голосов
/ 21 февраля 2016

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

https://github.com/isaacs/github/issues/121

Примечание. Поскольку запрос функции является неофициальным, также рекомендуется связаться с support@github.com, чтобы добавить поддержку такой функции, которая будет реализована.Вышеупомянутый неофициальный запрос может быть использован в качестве доказательства заинтересованности в этом.

41 голосов
/ 16 марта 2016

Предисловие: Ваш форк - это "источник", а репозиторий, из которого вы открыли, - "восходящий поток".

Предположим, что вы уже клонировали свой форк на свой компьютер с помощью командыкак это:

git clone git@github.com:your_name/project_name.git
cd project_name

Если это дано, то вам нужно продолжить в следующем порядке:

  1. Добавить «восходящий» к вашемуклонированный репозиторий («источник»):

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Извлечение коммитов (и ветвей) из «восходящего потока»:

    git fetch upstream
    
  3. Переключитесь на ветку «master» вашего форка («origin»):

    git checkout master
    
  4. Сохраните изменения вашей «master» ветви:

    git stash
    
  5. Объедините изменения из "master" ветви "upstream" в вашу "master" ветку вашего "origin":

    git merge upstream/master
    
  6. Resolveконфликты слияния, если таковые имеются, и зафиксируйте ваше слияние

    git commit -am "Merged from upstream"
    
  7. Нажмите изменения на своей вилке

    git push
    
  8. Верните свои скрытые изменения (если есть)

    git stash pop
    
  9. Готово!Поздравляем!

GitHub также предоставляет инструкции по этой теме: Синхронизация форка

38 голосов
/ 03 января 2017

Если, как и я, вы никогда ничего не делаете напрямую для освоения , что вам действительно нужно, вы можете сделать следующее.

Из локального клона вашего форка создайте свой апстримдистанционный пульт.Вам нужно сделать это только один раз:

git remote add upstream https://github.com/whoever/whatever.git

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

git checkout master
git pull upstream master

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

Чтобы выполнить первоначальную настройку и проверку мастер-версии, все, что вам нужно сделать, - это запустить следующую команду, чтобы синхронизировать мастер с вышестоящим: git pull upstream master .

22 голосов
/ 14 сентября 2016

На момент получения этого ответа GitHub не имеет ( или я больше не говорю? ) этой функции в веб-интерфейсе. Однако вы можете попросить support@github.com добавить свой голос за это.

Тем временем, пользователь GitHub bardiharborow создал инструмент для этого: https://upriver.github.io/

Источник здесь: https://github.com/upriver/upriver.github.io

15 голосов
/ 01 апреля 2016

Если вы используете GitHub для Windows, то теперь у них есть возможность одним щелчком мыши обновить вилки:

  1. Выберите хранилище в пользовательском интерфейсе.
  2. Нажмите кнопку «Обновить от пользователя / ветви» вверху.
9 голосов
/ 18 января 2017

На самом деле, в вашем форке можно создать ветку из любого коммита восходящего потока в браузере:

Enter image description here

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

Как это работает (это предположение, я не знаю, как именно GitHub это делает): вилки совместно используют хранилище объектов и используют пространства имен для разделения ссылок пользователей.Таким образом, вы можете получить доступ ко всем коммитам через ваш форк, даже если они не существовали на момент разветвления.

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