如何更新GitHub的分叉仓库?

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

几天后,另一个贡献者又做了一个改动。所以我的fork不包含那个改动。

我怎样才能把这个改动放到我的分叉中呢?当我有更多的修改要贡献时,我需要删除并重新创建我的叉子吗?还是有一个更新按钮?

解决办法

在分叉仓库的本地克隆中,你可以将原始的 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 "就可以了。

评论(28)

从2014年5月开始,可以直接从GitHub上更新一个分叉。截至2017年9月,这仍然有效,但***会导致提交历史被破坏。

1.在GitHub上打开你的分叉。 2.点击Pull Requests。 3.3. 点击新的拉动请求。默认情况下,GitHub会将原版与你的分叉版进行比较,如果你没有做任何改动,就不应该有任何东西需要比较。 4.4.点击切换基础如果你看到该链接。否则,手动设置base fork下拉到你的分叉,而head fork到上游的。现在GitHub会将你的fork与原版进行比较,你应该看到所有最新的修改。 ![在此输入图片描述][1] 。 5.创建拉动请求并为你的拉动请求指定一个可预测的名字(例如,从原版更新)。 6.6. 向下滚动到合并拉动请求,但先不要点击任何东西。

现在你有三个选项,但每个选项都会导致一个不那么干净的提交历史。

1.1.默认会创建一个丑陋的合并提交。 2.2.如果你点击下拉菜单,选择 "压扁并合并",所有间隔的提交将被压扁为一个。这通常是你不希望看到的。 3.如果你点击Rebase and merge,所有的提交将与你一起进行",原PR将链接到你的PR,并且GitHub将显示 "该分支领先X个提交,落后Y个提交"。

所以是的,你可以使用GitHub网页界面保持你的 repo 与其上游的更新,但这样做会玷污你的提交历史。请坚持使用命令行--这很简单。

评论(15)

这里是GitHub关于同步分叉的官方文件。

同步化分叉

设置

在进行同步之前,你需要添加一个指向上游仓库的远程。你可能在最初分叉的时候就已经做了这个。

*提示:同步你的分叉只更新你的本地仓库副本,它不会更新你在GitHub上的仓库。

$ git remote -v

列出当前的远程

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

设置一个新的远程

$ git remote -v

验证新的远程

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

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

取回

从远程版本库获取将带来它的分支和它们各自的提交。这些都是存储在你的本地仓库的特殊分支下。

$ git fetch upstream

抓取上游远程'的分支

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

列出所有本地和远程跟踪的分支

* 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

检查我们的本地主干分支

Switched to branch 'master'

$ git merge upstream/master

将上游的主分支合并到我们的主分支中

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 更新34e91da...16c56ad 快进 README.md | 5 +++-- 1个文件被修改,3个插入(+),2个删除(-)。

提示:如果你想在GitHub上更新你的仓库,请按照说明这里

评论(5)