我最近分叉了一个项目并应用了几个修复程序。然后我创建了一个拉取请求,然后被接受。
几天后,另一位撰稿人做出了另一项改变。所以我的 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 月, 但它将导致脏的提交历史。
Update from original
)。 现在您有三个选项,但每个选项都会导致一个不太干净的提交历史记录。
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 上更新存储库,请按照此处的说明进行操作