如何更新GitHub分叉存储库?

时间:2011-08-30 13:53:00

标签: git github

我最近分叉了一个项目并应用了几个修复程序。然后我创建了一个拉取请求,然后被接受。

几天后,另一位撰稿人又做出了另一项改变。所以我的fork不包含那个改变。

如何将更改转换为我的分支?当我进行进一步的更改时,是否需要删除并重新创建我的分支?或者是否有更新按钮?

31 个答案:

答案 0 :(得分:3486)

在forked存储库的本地克隆中,您可以将原始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

答案 1 :(得分:688)

从2014年5月开始,可以直接从GitHub更新分支。这仍然适用于2017年9月,它将导致脏的提交历史。

  1. 在GitHub上打开你的叉子。
  2. 点击 Pull Requests
  3. 点击新拉请求。默认情况下,GitHub会将原始内容与您的分叉进行比较,如果您没有做任何更改,则不应该进行比较。
  4. 如果看到该链接,请单击切换基础。否则,手动将基础分支下拉到您的分支,将 head fork 设置为上游。现在GitHub会将你的分叉与原版进行比较,你应该看到所有最新的变化。 enter image description here
  5. 创建拉取请求并为拉取请求指定可预测的名称(例如Update from original)。
  6. 向下滚动到合并拉取请求,但不要点击任何内容。
  7. 现在您有三个选项,但每个选项都会导致一个不太干净的提交历史记录。

    1. 默认情况下会创建一个丑陋的合并提交。
    2. 如果您单击下拉列表并选择" Squash并合并",则所有干预提交将被压缩为一个。这通常是你不想要的东西。
    3. 如果您单击 Rebase并合并,将进行所有提交&#34;使用&#34;您,原始PR将链接到您的PR,GitHub将显示This branch is X commits ahead, Y commits behind <original fork>
    4. 所以,是的,您可以使用GitHub Web UI保持您的repo更新其上游,但这样做会玷污您的提交历史记录。坚持the command line代替 - 这很容易。

答案 2 :(得分:409)

这是GitHub关于Syncing a fork的官方文件:

  

同步分支

     

设置

     

在同步之前,您需要添加指向上游存储库的远程数据库。你最初分叉的时候可能已经这样做了。

     

提示:同步fork只会更新存储库的本地副本;它不会在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)
     

同步处理

     

将存储库与上游同步需要两个步骤:首先必须从远程获取,然后必须将所需的分支合并到本地分支。

     

撷取

     

从远程存储库中获取将引入其分支及其各自的提交。它们存储在特殊分支下的本地存储库中。

$ 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上更新您的存储库,请按照here

中的说明进行操作

答案 3 :(得分:89)

很多答案最终会移动父存储库的提前提交。这个答案总结了here找到的步骤,这些步骤将您的分支移动到与父代相同的提交

  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

  6. 有关这些命令的更多信息,请参阅step 3

答案 4 :(得分:43)

自2013年11月以来,GitHub开启了一个非官方的功能请求,要求他们添加一个非常简单直观的方法来保持本地分支与上游同步:

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

注意:由于功能请求是非官方的,因此建议您与support@github.com联系,以添加对此类功能的支持。上面的非官方特征请求可以用作对此实施的兴趣量的证据。

答案 5 :(得分:39)

前言:您的前叉是“起源”,您分叉的存储库是“上游”。

让我们假设您已经使用以下命令将您的fork克隆到您的计算机:

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

如果有,那么您需要按此顺序继续:

  1. 将“upstream”添加到克隆的存储库(“origin”):

    git remote add upstream git@github.com:original_author/project_name.git
    
  2. 从“上游”获取提交(和分支):

    git fetch upstream
    
  3. 切换到前叉的“主”分支(“起源”):

    git checkout master
    
  4. 存储“主”分支的更改:

    git stash
    
  5. 将“上游”的“主”分支的更改合并到“原点”的“主”分支中:

    git merge upstream/master
    
  6. 解决合并冲突(如果有)并提交合并

    git commit -am "Merged from upstream"
    
  7. 将更改推送到您的前叉

    git push
    
  8. 取回您隐藏的更改(如果有)

    git stash pop
    
  9. 你已经完成了!恭喜!

  10. GitHub还提供了有关此主题的说明:Syncing a fork

答案 6 :(得分:37)

如果像我一样,永远不会直接提交任何东西,你应该这样做,你可以做到以下几点。

从fork的本地克隆中,创建上游远程。你只需要这样做一次:

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

然后,只要您想要了解上游存储库主分支,您需要:

git checkout master
git pull upstream master

假设你自己从未对主人做过任何事情,你应该已经完成​​了。现在,您可以将本地主服务器推送到原始远程GitHub fork。您还可以在现在最新的本地主数据库中重新设置开发分支。

通过初始上游设置和主检出,您需要做的就是运行以下命令将您的主人与上游同步: git pull upstream master

答案 7 :(得分:22)

截至本回答日期,GitHub在网络界面中没有(or shall I say no longer?)此功能。但是,您可以要求support@github.com添加您的投票。

与此同时,GitHub用户bardiharborow创建了一个工具来实现这一目标: https://upriver.github.io/

来源在这里:https://github.com/upriver/upriver.github.io

答案 8 :(得分:16)

有一种方法可以从 GitHub 的 web 应用程序中做到这一点。

让我们来看看下面的例子。

首先,打开您要更新的存储库。

enter image description here

可以看到警告

<块引用>

此分支在 GoogleCloudPlatform:master 后面有 157 次提交。

右侧有两个按钮 Pull requestCompare。按 Compare

由于可能没有什么可比较的,请按 switching the base

enter image description here

将显示所有更改的列表,您可以通过按下按钮 Create pull request

创建拉取请求

enter image description here

给它一个标题,比如说“更新仓库”

enter image description here

并创建拉取请求。

创建请求后,滚动到底部并按 Merge pull request

enter image description here

确认合并,就是这样!

答案 9 :(得分:15)

如果您正在使用GitHub for Windows,那么现在他们只需一键功能即可更新分支:

&#xA;&#xA;
    &#xA;
  1. 选择用户界面。
  2. &#xA;
  3. 点击顶部的“从用户/分支更新”按钮。
  4. &#xA;
&#xA;

答案 10 :(得分:9)

实际上,可以通过浏览器中上游的任何提交在fork中创建一个分支:

Enter image description here

然后,您可以将该分支提取到本地克隆,并且当您在该提交之上进行编辑时,您不必将所有数据推送回GitHub。或者使用Web界面更改该分支中的某些内容。

它是如何工作的(这是猜测,我不知道GitHub是如何做到的):forks共享对象存储并使用namespaces来分隔用户的引用。因此,您可以通过fork访问所有提交,即使它们在分叉时不存在。

答案 11 :(得分:8)

GitHub 现在推出了一项功能,只需单击按钮即可同步分叉

转到您的分叉,点击Fetch upstream,然后点击Fetch and merge,直接将您的分叉与其父存储库同步。 >

enter image description here

您也可以点击Compare按钮在合并之前比较更改。

参考:GitHub 的 tweet

答案 12 :(得分:8)

按照以下步骤操作。我尝试了它们,它帮助了我。

结帐到您的分行

  

语法: git branch yourDevelopmentBranch
  示例: git checkout master

拉取源存储库分支以获取最新代码

  

语法: git pull https://github.com/tastejs/awesome-app-ideas master
  示例: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

答案 13 :(得分:5)

作为对此答案的补充,我一直在寻找一种方法来一次性更新来自上游分支的克隆存储库( origin )的所有远程分支。这就是我做到的。

这假设您已经配置了指向源存储库的上游远程(其中 origin 已分叉)并已与git fetch upstream同步。< / p>

然后运行:

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

此命令的第一部分列出上游远程仓库中的所有磁头,并删除SHA-1,后跟refs/heads/分支名称前缀。

然后,对于这些分支中的每一个,它将上游远程跟踪分支(本地端的refs/remotes/upstream/<branch>)的本地副本直接推送到 origin上的远程分支(远程一侧refs/heads/<branch>)。

任何这些分支同步命令都可能由于以下两个原因之一而失败:上游分支已被重写,或者您已将该分支上的提交推送到您的分支。在第一种情况下,您还没有向分支上的分支提交任何内容,可以安全地强行推送(在上面的命令中添加 -f 开关;即git push -f) 。在另一种情况下,这是正常的,因为你的fork分支已经分歧,你不能期望sync命令工作,直到你的提交被合并回上游

答案 14 :(得分:5)

我用这一行更新我的分叉回购:

git pull https://github.com/forkuser/forkedrepo.git branch

如果您不想将另一个远程端点添加到项目中,请使用此方法,因为此处发布了其他解决方案。

答案 15 :(得分:5)

"Pull" app是一种自动设置并忘记的解决方案。它将把fork的默认分支与上游存储库同步。

访问URL,单击绿色的“安装”按钮,然后选择要启用自动同步的存储库。

该分支每小时直接在GitHub上更新一次,在您的本地计算机上,您需要拉主分支以确保本地副本是同步的。

答案 16 :(得分:3)

当您克隆了分叉存储库时,请转到克隆所在的目录路径以及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存储库中。

&#34; fetch&#34;命令对于在项目中保持最新是必不可少的:只有在执行&#34; git fetch&#34;您是否会被告知同事推送到远程服务器的更改。

您仍然可以访问here进一步查询

答案 17 :(得分:3)

Android Studio现已学会使用GitHub fork存储库(您甚至不必通过console命令添加“上游”远程存储库)。

打开菜单 VCS Git

并注意最后两个弹出菜单项:

  • 重新启动我的GitHub前叉

  • 创建拉取请求

试试吧。我使用第一个来同步我的本地存储库。无论如何,在您单击“Rebase my GitHub fork”后,可以在Android Studio中访问父远程存储库(“上游”)的分支,您将能够轻松地使用它们。

(我使用带有“Git集成”和“GitHub”插件的Android Studio 3.0。)

Enter image description here

答案 18 :(得分:2)

假设您的 fork 是 https://github.com/me/foobar 并且原始存储库是 https://github.com/someone/foobar

  1. 访问https://github.com/me/foobar/compare/master...someone:master

  2. 如果您看到绿色文本 Able to merge,请按创建拉取请求

  3. 在下一页上,滚动到页面底部并点击合并拉取请求确认合并

答案 19 :(得分:1)

我想添加到@krlmlr's answer

最初,分叉的存储库具有一个分支:master。如果您要开发新功能或修复程序,通常会创建一个新分支feature并进行更改。

如果您希望分支的存储库与父存储库同步,则可以为Pull app(功能分支中的 )设置配置文件(pull.yml) >),就像这样:

version: "1"
rules:
  - base: feature
    upstream: master
    mergeMethod: merge
  - base: master
    upstream: parent_repo:master
    mergeMethod: hardreset

这将使分叉存储库的master分支与父存储库保持最新。通过合并叉化仓库的feature分支,可以通过叉化仓库的master分支来更新分支。假设feature分支是包含配置文件的默认分支。

这里有两个mergemethods在起作用,一个是hardreset,这有助于强制派生回购的master分支中的更改与父回购同步,另一种方法是{{1 }}。此方法用于合并您在merge分支中所做的更改和在feature分支中由于强制同步而完成的更改。如果发生合并冲突,则拉应用程序将允许您在拉请求期间选择下一步操作。

您可以阅读有关基本和高级配置以及各种master here的信息。

我目前在叉式仓库here中使用此配置,以确保请求的增强here保持更新。

答案 20 :(得分:1)

rm -rf oldrepository
git clone ...

可能会有更好的选择,但这是我确信本地存储库与上游存储库相同的唯一方法。

答案 21 :(得分:1)

这取决于您的存储库的大小以及您如何分叉它。

如果它是一个非常大的存储库,您可能希望以特殊方式管理它(例如丢弃历史记录)。基本上,你可以获得当前版本和上游版本之间的差异,提交它们,然后樱桃回归掌握。

尝试阅读this one。它描述了如何处理大型Git存储库以及如何使用最新更改来上游它们。

答案 22 :(得分:1)

试试这个,点击“Fetch upstream”从上游master同步你的分叉仓库。 enter image description here

答案 23 :(得分:0)

如果您设置上游。选中git remote -v,就足够了。

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push

答案 24 :(得分:0)

保持叉状存储库始终不断更新有两件事。

  

1。从派生母版创建分支,然后在其中进行更改

因此,当您的 Pull Request 被接受时,您可以安全地删除该分支,因为当您使用上游更新它时,您贡献的代码将保存在您的分支存储库的主目录中。这样,您的母带将始终处于干净状态,以创建新分支来进行其他更改。

  

2。创建一个计划的作业,供fork主控器自动更新

这可以通过 cron 完成。这是一个示例代码,如果您在linux中执行的话。

$ crontab -e

将此代码放在crontab file上以每小时执行一次作业。

0 * * * * sh ~/cron.sh

然后使用 git interaction 和/或 ssh-agent创建cron.sh脚本文件和 expect } 如下

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="git@github.com:<username>/$REPOSITORY.git"   
UPSTREAM=git@github.com:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git push origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

检查分叉的存储库。它会不时地始终显示此通知:

  

该分支甚至与<upstream>:master

enter image description here

答案 25 :(得分:0)

使用这些命令(在幸运的情况下)

git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v

答案 26 :(得分:0)

如果您使用GitHub Desktop,则只需6个步骤(实际上只有5个步骤)即可轻松实现。

一旦打开Github Desktop并选择您的存储库,

  1. 转到“历史记录”标签
  2. 单击搜索栏。它将显示所有可用的分支(包括 父存储库的上游分支)
  3. 选择相应的上游分支(同步母版将是上游/母版 分支)
  4. (可选)它将向您显示上游分支中的所有提交。您可以点击 任何提交以查看更改。
  5. 根据您的活动分支单击在master / branch-name中的合并。
  6. 等待GitHub Desktop做魔术。

以以下示例为例查看GIF:

Sync Upstream branches in a forked repository from the parent repository

答案 27 :(得分:0)

从github页面删除远程开发人员

然后应用以下命令:

1) git branch -D dev
2) git fetch upstream
3) git checkout master
4) git fetch upstream && git fetch upstream --prune && git rebase upstream/master && git push -f origin master
5) git checkout -b dev
6) git push origin dev
7) git fetch upstream && git fetch upstream --prune && git rebase upstream/dev && 8) git push -f origin dev

答案 28 :(得分:0)

如果你想让你的 GitHub 分支与各自的上游保持同步,GitHub 也有专门的 probot 程序:https://probot.github.io/apps/pull/ 可以完成这项工作。 您需要允许在您的帐户中进行安装,这将使您的分叉保持最新。

答案 29 :(得分:0)

如何在本地机器上更新你的分叉仓库?

首先,检查您的遥控器/主控

git remote -v

你应该有起源和上游。例如:

origin  https://github.com/your___name/kredis.git (fetch)
origin  https://github.com/your___name/kredis.git (push)
upstream    https://github.com/rails/kredis.git (fetch)
upstream    https://github.com/rails/kredis.git (push)

然后转到主:

git checkout main

并从上游合并到主:

git merge upstream/main

答案 30 :(得分:0)

$ git remote add upstream https://github.com/....

$ git pull upstream main

$ git push