Как мне обновить разветвленный репозиторий GitHub?

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

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

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

2994 голоса | спросил Lea Hayes 30 PM00000050000000031 2011, 17:53:00

12 ответов


0

В локальном клоне вашего разветвленного репозитория вы можете добавить исходный репозиторий 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 только в первый раз после того, как вы сделали ребазинг.

ответил Mark Longair 30 PM00000060000002631 2011, 18:01:26
0

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

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

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

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

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

ответил lobzik 25 Mayam14 2014, 11:31:20
0

Вот официальный документ 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, следуйте инструкциям здесь

ответил jumpnett 22 +04002013-10-22T03:04:15+04:00312013bEurope/MoscowTue, 22 Oct 2013 03:04:15 +0400 2013, 03:04:15
0

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

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

git clone [email protected]:your_name/project_name.git
cd project_name

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

  1. Добавьте «upstream» в свой клонированный репозиторий («origin»):

    git remote add upstream [email protected]:original_author/project_name.git
    
  2. Извлекает коммиты (и ветки) из "апстрима":

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

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

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

    git merge upstream/master
    
  6. Разрешите конфликты слияния, если они есть, и подтвердите свое слияние

    git commit -am "Merged from upstream"
    
  7. Вставьте изменения в свою вилку

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

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

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

ответил Benny Neugebauer 16 MarpmWed, 16 Mar 2016 15:24:11 +03002016-03-16T15:24:11+03:0003 2016, 15:24:11
0

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

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

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

Тогда всякий раз, когда вы хотите догнать основную ветку репозитория, вы должны:

git checkout master
git pull upstream master

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

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

ответил Slion 3 Jpm1000000pmTue, 03 Jan 2017 19:59:08 +030017 2017, 19:59:08
0

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

  1. Выберите хранилище в пользовательском интерфейсе.
  2. Нажмите кнопку "Обновить от пользователя /ветви" вверху.
ответил Shital Shah 1 AMpFri, 01 Apr 2016 00:45:04 +030045Friday 2016, 00:45:04
0

Выполните следующие шаги. Я попробовал их, и это помогло мне.

Оформление заказа в вашем филиале

  

Синтаксис: ветка git yourDevelopmentBranch
Пример: мастер проверки git

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

  

Синтаксис: git pull https://github.com/tastejs /awesome-app-ideas master
Пример: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

ответил Venkat.R 15 Jpm1000000pmFri, 15 Jan 2016 15:31:23 +030016 2016, 15:31:23
0

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

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

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

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

ответил max630 18 Jam1000000amWed, 18 Jan 2017 09:41:58 +030017 2017, 09:41:58
0

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

Предполагается, что вы уже настроили удаленный восходящий поток , указывающий на исходный репозиторий (откуда было разветвлено origin ), и синхронизировали его с git fetch upstream

Затем запустите:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

В первой части этой команды перечислены все главы в удаленном репо upstream и удален SHA-1, за которым следует refs/heads/ префикс имени ветви.

Затем для каждой из этих ветвей она отправляет локальную копию восходящей ветви удаленного отслеживания (refs/remotes/upstream/<branch> на локальной стороне) непосредственно в удаленную ветку в origin (refs/heads/<branch> на удаленной стороне).

Любая из этих команд синхронизации ветвей может завершиться с ошибкой по одной из двух причин: либо ветка upstream была переписана, либо вы передали коммиты в этой ветке на ваш форк. В первом случае, когда вы ничего не добавили в ветку на своей вилке, безопасно нажимать принудительно (добавьте переключатель -f ; т.е. git push -f в приведенной выше команде). В другом случае это нормально, так как ваша ветвь ветвления разошлась, и вы не можете ожидать, что команда sync будет работать, пока ваши коммиты не будут объединены обратно в upstream .

ответил Thomas Guyot-Sionnest 12 J0000006Europe/Moscow 2017, 23:17:19
0

Android Studio теперь научилась работать с репозиториями вилок GitHub (вам даже не нужно добавлять «восходящий» удаленный репозиторий по команде консоли).

Открыть меню VCS → Git

И обратите внимание на два последних пункта всплывающего меню:

  • Перебазировать мой форк GitHub

  • Создать запрос на извлечение

Попробуйте их. Я использую первый, чтобы синхронизировать мой локальный репозиторий. В любом случае ветки из родительского удаленного репозитория («upstream») будут доступны в Android Studio после того, как вы нажмете «Перебазировать мой GitHub fork», и вы сможете легко с ними работать.

(Я использую Android Studio 3.0 с подключаемыми модулями Git и GitHub.)

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

ответил alexshr 13 12017vEurope/Moscow11bEurope/MoscowMon, 13 Nov 2017 23:03:38 +0300 2017, 23:03:38
0

Когда вы клонировали свой разветвленный репозиторий, перейдите в путь к каталогу, где находится ваш клон, и в несколько строк в вашем Git Bash Terminal.

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

И вот тебе хорошо. Все обновленные изменения в основном репозитории будут помещены в ваш репозиторий fork.

Команда «fetch» ​​незаменима для актуальности проекта: только при выполнении «git fetch» ​​вы будете информированы об изменениях, которые ваши коллеги отправили на удаленный сервер.

Вы все еще можете посетить здесь для дальнейших запросов

ответил Prateek Chanda 10 MaramSat, 10 Mar 2018 05:21:30 +03002018-03-10T05:21:30+03:0005 2018, 05:21:30
0

Это зависит от размера вашего хранилища и от того, как вы его разветвляли.

Если это довольно большой репозиторий, вы, возможно, захотите управлять им особым образом (например, история удаления). По сути, вы можете получить различия между текущей и исходной версиями, зафиксировать их, а затем снова выбрать master.

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

ответил s0nicYouth 23 PMpSun, 23 Apr 2017 15:47:30 +030047Sunday 2017, 15:47:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132