我如何更新GitHub分叉库?
我最近分了一个项目,并应用了几个修复程序。 然后我创build了一个接受请求。
几天后,另一个贡献者又做了一个改动。 所以我的叉子不包含这种变化…我怎么能把这个变化到我的叉子?
我需要删除并重新创build我的分支时,我有进一步的变化贡献? 还是有更新button?
在分叉库的本地克隆中,可以将原始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
replace上一个命令。 但是,为了进一步提出尽可能干净的请求,最好重新绑定。
如果你已经将你的分支转换到upstream/master
你可能需要强制推送它到你自己分支的GitHub上。 你可以这样做:
git push -f origin master
你只需要重新使用后第一次使用-f
。
从2014年5月开始,可以直接从GitHub更新分支。 这仍然在2017年9月, 但它会导致一个肮脏的承诺历史。
- 在GitHub上打开你的fork。
- 点击Pull Requests 。
- 点击New Pull Request 。 默认情况下,GitHub会将原始文件与您的分叉进行比较,如果您没有做任何更改,则不应该有任何比较。
- 点击切换基地,如果你看到的链接。 否则,手动将基叉分配到您的叉子,并将头叉分配到上游。 现在GitHub会比较你的分叉和原来的,你应该看到所有的最新变化。
- 创build拉取请求并为您的拉取请求分配一个可预测的名称(例如,
Update from original
)。 - 向下滚动到合并拉取请求 ,但不要点击任何东西。
现在你有三个选项,但每个选项都会导致一个不太干净的提交历史logging。
- 默认会创build一个丑陋的合并提交。
- 如果你点击下拉菜单并select“壁球和合并”,所有的中间提交将被压缩成一个。 这通常是你不想要的东西。
- 如果你点击Rebase并合并 ,所有的提交都将与你“进行”,原始的PR将链接到你的PR,并且GitHub将显示
This branch is X commits ahead, Y commits behind <original fork>
。
所以是的,你可以使用GitHub的网页界面来保持你的repo版本更新,但是这么做会玷污你的提交历史。 坚持使用命令行 – 这很容易。
这是GitHub关于同步分叉的官方文档:
同步一个分支
安装程序
在可以同步之前,您需要添加指向上游存储库的远程设备。 当你原来分叉时,你可能已经做到了。
提示:同步您的叉只会更新您的本地版本库; 它不会在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上更新存储库,请按照此处的说明进行操作
很多答案最终都是在父仓库之前移动你的fork。 这个答案总结了在这里find的步骤,将把你的fork移动到与父代相同的提交 。
-
将目录更改为您的本地存储库。
- 如果您不是
git checkout master
切换到master分支
- 如果您不是
-
添加父母作为远程存储库,
git remote add upstream <repo-location>
- 发出
git fetch upstream
-
发出
git rebase upstream/master
- 在这个阶段,你可以通过input
git status
来检查提交的内容
- 在这个阶段,你可以通过input
-
发出
git push origin master
有关这些命令的更多信息,请参阅第3步 。
自2013年11月以来,GitHub开放了一个非官方的function请求,要求他们添加一个非常简单直观的方法来保持本地分叉与上行同步:
https://github.com/isaacs/github/issues/121
注意:由于function请求是非官方的,因此build议您联系support@github.com
以添加对此类function的支持。 上面的非正式的特征请求可以用来作为在这个正在执行的兴趣的数量的证据。
前言:你的叉子是“原产地”,你从中分叉的是“上游”。
假设您已经使用如下命令将叉已经克隆到您的计算机:
git clone git@github.com:your_name/project_name.git cd project_name
如果给出了,那么你需要按照这个顺序继续:
-
将“上游”添加到您的克隆存储库(“起源”):
git remote add upstream git@github.com:original_author/project_name.git
-
从“上游”获取提交(和分支):
git fetch upstream
-
切换到fork的“主”分支(“origin”):
git checkout master
-
藏匿你的“主”分支的变化:
git stash
-
合并从“上游”的“主”分支到您的“起源”的“主”分支的变化:
git merge upstream/master
-
解决合并冲突(如果有)并提交合并
git commit -am "Merged from upstream"
-
将更改推送到您的分叉
git push
-
找回隐藏的变化(如果有的话)
git stash pop
-
你完成了! 恭喜!
GitHub还提供了有关此主题的说明: 同步分支
截至这个答案的date,GitHub没有( 或者我不应该再说? )这个function在网页界面。 但是,您可以要求support@github.com
为您添加投票。
与此同时,GitHub用户bardiharborow创build了一个工具来做到这一点: https ://upriver.github.io/
来源在这里: https : //github.com/upriver/upriver.github.io
如果像我一样,你从不直接向主人提供任何东西 ,你应该这样做,你可以做到以下几点。
从您的叉的本地克隆创build您的上游远程。 你只需要做一次:
git remote add upstream https://github.com/whoever/whatever.git
那么,只要你想赶上上游存储库主分支,你需要:
git checkout master git pull upstream master
假设你从来没有对自己做任何事情,你应该已经完成了。 现在你可以把你的本地主人推到远程的GitHub fork。 您也可以将您的开发分支重新绑定在当前最新的本地主服务器上。
因此,通过初始上游设置和主结帐,您只需运行以下命令即可将您的主服务器与上游进行同步: git pull upstream master 。
如果您正在使用Windows的GitHub,那么现在他们有一个点击function来更新叉子:
- 在UI上select回购。
- 点击“从用户/分支更新”button顶部。
按照以下步骤。 我试过了,它帮助了我。
结帐到你的分支
语法: git分支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
实际上,可以从浏览器中的上游提交中创build分支:
- 打开
https://github.com/<repo>/commits/<hash>
,其中repo是你的fork, hash是完整的提交hash,你可以在上游的web界面find。 例如,我可以打开https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990 ,这在写作的时候指向了linuxmaster
。 - 点击“树:….”button。
- 键入新分支的名称,然后按Enter键
然后,您可以将该分支提取到您的本地克隆,并且当您在该提交之上推编辑时,您不必将所有数据推回顶部的github。 或使用networking界面来改变该分支的东西。
它是如何工作的(这是一个猜测,我不知道github究竟是怎么做的):fork分享对象存储并使用命名空间来分隔用户的引用。 所以你可以通过你的fork来访问所有提交,即使它们在分叉的时候不存在。
作为对这个答案的补充,我一直在寻找一种方法来更新我的克隆回购的所有远程跟踪分支。 我就是这么做的
这假定你已经在源代码仓库configuration了一个upstream
远程指针,并且已经用git fetch upstream
它同步了。
跑:
for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done
此命令的第一部分将列出远程回购upstream
所有头,并删除SHA-1和/refs/heads/
前缀。
然后,对于这些分支中的每一个,它都会将远程分支( refs/remotes/upstream/<branch>
)的本地副本直接推送到origin
远程分支( refs/heads/<branch>
)。
任何这些分支同步命令可能由于以下两个原因之一而失败: upstream
分支已被重写,或者您已将该分支上的提交推送到您的分支。 在第一种情况下,你没有提交任何东西到叉子上的分支是强制推( git push -f
)是安全的。 在另一种情况下,这是正常的,因为你的fork分支已经发生了分歧,你不能指望sync命令工作,直到你的提交被合并回upstream
。
我用这一行更新我的分叉回购:
git pull https://github.com/forkuser/forkedrepo.git branch
如果您不想将另一个远程端点添加到您的项目中,请使用此处,如在此处发布的其他解决scheme。
这取决于你的仓库的大小和你如何分叉它。
如果这是一个相当大的仓库,你可能想用一种特殊的方式来pipe理它(例如放置历史logging)。 基本上你可以得到当前和上游版本之间的差异,提交他们,然后樱桃回到主。
尝试阅读这一个 。 它描述了如何处理大型的Git仓库,以及如何在最新的变化上游他们。
Android Studio现在已经学会了使用github fork存储库(甚至不需要通过控制台命令添加“上游”远程存储库)
打开菜单VCS – > git
并注意最后2个popup菜单项:
-
重新我的github叉子
-
创build拉取请求
试试看 我成功地使用了第一个。 无论如何,在Android Studio中可以访问你分支的远程仓库的“上游”分支,你可以很容易地操作它们。
(我使用Android Studio 3.0“git integration”和“github”插件)