我最近分叉了一个项目并应用了几个修正。然后我创建了一个拉动请求,并被接受。
几天后,另一个贡献者又做了一个改动。所以我的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 "就可以了。
从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个提交<原始fork>"。
所以是的,你可以使用GitHub网页界面保持你的 repo 与其上游的更新,但这样做会玷污你的提交历史。请坚持使用命令行--这很简单。
这里是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上更新你的仓库,请按照说明这里。