协慌网

登录 贡献 社区

如何更新 GitHub 分叉存储库?

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

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

我怎样才能把这个改变变成我的叉子?当我进行进一步的更改时,是否需要删除并重新创建我的分支?或者是否有更新按钮?

答案

在 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

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

  1. 在 GitHub 上打开你的 fork。
  2. 单击Pull Requests
  3. 单击New Pull Request 。默认情况下,GitHub 会将原始文件与您的 fork 进行比较,如果您没有进行任何更改,则不应该进行任何比较。
  4. 如果看到该链接,请单击切换基础 。否则,手动将基础分支下拉到您的分叉,并将分叉下移到上游。现在 GitHub 会将你的分叉与原始分析进行比较,你应该看到所有最新的变化。 在此处输入图像描述
  5. 创建拉取请求并为拉取请求指定可预测的名称(例如, Update from original )。
  6. 向下滚动到合并拉取请求 ,但不要点击任何内容。

现在您有三个选项,但每个选项都会导致一个不太干净的提交历史记录。

  1. 默认情况下会创建一个丑陋的合并提交。
  2. 如果单击下拉列表并选择 “Squash and merge”,则所有干预提交将被压缩为一个。这通常是你不想要的。
  3. 如果单击Rebase 并合并 ,所有提交都将 “与” 你,原始 PR 将链接到您的 PR,GitHub 将显示This branch is X commits ahead, Y commits behind <original fork>

所以,是的,您可以使用 GitHub Web UI 保持您的 repo 更新其上游,但这样做会玷污您的提交历史记录。坚持命令行 - 这很容易。

这是 GitHub 关于同步 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 上更新存储库,请按照此处的说明进行操作