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


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

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

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


2796


источник


Ответы:


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

# 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в первый раз после того, как вы переиграли.


3061



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

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

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

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

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


637



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

Синхронизации

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

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

Теперь у нас есть главная ветвь вверх по течению, хранящаяся в локальной ветви, вверх / вниз

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


363



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

  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 ,


80



Since November 2013 there has been an unofficial feature request open with GitHub to ask them to add a very simple and intuitive method to keep a local fork in sync with upstream:

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

Note: Since the feature request is unofficial it is also advisable to contact support@github.com to add your support for a feature like this to be implemented. The unofficial feature request above could be used as evidence of the amount of interest in this being implemented.


39



Foreword: Your fork is the "origin" and the repository you forked from is the "upstream".

Let's assume that you cloned already your fork to your computer with a command like this:

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

If that is given then you need to continue in this order:

  1. Add the "upstream" to your cloned repository ("origin"):

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. Fetch the commits (and branches) from the "upstream":

    git fetch upstream
    
  3. Switch to the "master" branch of your fork ("origin"):

    git checkout master
    
  4. Stash the changes of your "master" branch:

    git stash
    
  5. Merge the changes from the "master" branch of the "upstream" into your the "master" branch of your "origin":

    git merge upstream/master
    
  6. Resolve merge conflicts if any and commit your merge

    git commit -am "Merged from upstream"
    
  7. Push the changes to your fork

    git push
    
  8. Get back your stashed changes (if any)

    git stash pop
    
  9. You're done! Congratulations!

GitHub also provides instructions for this topic: Syncing a fork


27



As of the date of this answer, GitHub has not (or shall I say no longer?) this feature in the web interface. You can, however, ask support@github.com to add your vote for that.

In the meantime, GitHub user bardiharborow has created a tool to do just this: https://upriver.github.io/

Source is here: https://github.com/upriver/upriver.github.io


21



If, like me, you never commit anything directly to master, which you should really, you can do the following.

From the local clone of your fork, create your upstream remote. You only need to do that once:

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

Then whenever you want to catch up with the upstream repository master branch you need to:

git checkout master
git pull upstream master

Assuming you never committed anything on master yourself you should be done already. Now you can push your local master to your origin remote GitHub fork. You could also rebase your development branch on your now up-to-date local master.

So past the initial upstream setup and master checkout, all you need to do is run the following command to sync your master with upstream: git pull upstream master.


20



If you are using GitHub for Windows then now they have a one-click feature to update forks:

  1. Select the repository in the UI.
  2. Click "Update from user/branch" button the top.

12



Follow the below steps. I tried them and it helped me.

Checkout to your branch

Syntax: git branch yourDevelopmentBranch
Example: git checkout master

Pull source repository branch for getting the latest code

Syntax: git pull https://github.com/tastejs/awesome-app-ideas master
Example: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME


8



Actually, it is possible to create a branch in your fork from any commit of the upstream in the browser:

Enter image description here

You can then fetch that branch to your local clone, and you won't have to push all that data back to GitHub when you push edits on top of that commit. Or use the web interface to change something in that branch.

How it works (it is a guess, I don't know how exactly GitHub does it): forks share object storage and use namespaces to separate users' references. So you can access all commits through your fork, even if they did not exist by the time of forking.


8