我最近分叉了一个项目并应用了几个修复程序.然后我创建了一个拉取请求,然后被接受.
几天后,另一位撰稿人做出了另一项改变.所以我的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月,但它将导致脏的提交历史.
在GitHub上打开你的分叉.
点击Pull Requests.
点击New Pull Request.默认情况下,GitHub会将原始文件与您的fork进行比较,如果您没有进行任何更改,则不应该进行任何比较.
switching the base如果您看到该链接,请单击.否则,手动将base fork下拉菜单设置为分叉,然后设置head fork为上游.现在GitHub会将你的分叉与原版进行比较,你应该看到所有最新的变化.
Create pull request并为您的拉取请求分配一个可预测的名称(例如Update from original
).
向下滚动Merge pull request,但不要点击任何内容.
现在您有三个选项,但每个选项都会导致一个不太干净的提交历史记录.
默认情况下会创建一个丑陋的合并提交.
如果单击下拉列表并选择"Squash and merge",则所有干预提交将被压缩为一个.这通常是你不想要的.
如果你点击Rebase and merge,所有提交将与你","原始PR将链接到您的PR,GitHub将显示This branch is X commits ahead, Y commits behind
.
所以,是的,您可以使用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上更新存储库,请按照此处的说明进行操作
很多答案最终会在父存储库之前移动fork 一次提交.这个答案总结了这里的步骤,它们将你的fork移动到与父级相同的提交.
将目录更改为本地存储库.
如果不是,请切换到主分支 git checkout master
将父级添加为远程存储库, git remote add upstream
问题 git fetch upstream
问题 git rebase upstream/master
在此阶段,您将检查是否通过键入提交将要合并的内容 git status
问题 git push origin master
有关这些命令的更多信息,请参阅步骤3.
自2013年11月以来,有一个非官方的功能请求打开GitHub要求他们添加一个非常简单直观的方法来保持本地fork与上游同步:
https://github.com/isaacs/github/issues/121
注意:由于功能请求是非官方的,因此建议您联系support@github.com
以添加对此类功能的支持以实现.上面的非官方特征请求可以用作对此实施的兴趣量的证据.
前言:您的fork是"origin",您分叉的存储库是"上游".
假设你已经使用如下命令将你的fork克隆到你的计算机:
git clone git@github.com:your_name/project_name.git cd project_name
如果给出了那么你需要继续这个顺序:
将"upstream"添加到克隆的存储库("origin"):
git remote add upstream git@github.com:original_author/project_name.git
从"上游"获取提交(和分支):
git fetch upstream
切换到fork的"master"分支("origin"):
git checkout master
存储"主"分支的更改:
git stash
将"上游"的"主"分支中的更改合并到"原点"的"主"分支中:
git merge upstream/master
解决合并冲突(如果有)并提交合并
git commit -am "Merged from upstream"
将更改推送到fork
git push
取回你藏匿的变化(如果有的话)
git stash pop
你完成了!恭喜!
GitHub还提供了有关此主题的说明:同步fork
如果像我一样,你永远不会直接掌握任何东西,你应该真的,你可以做到以下几点.
从fork的本地克隆中,创建上游远程.你只需要这样做一次:
git remote add upstream https://github.com/whoever/whatever.git
然后,只要您想要了解上游存储库主分支,您需要:
git checkout master git pull upstream master
假设你自己从未对主人做过任何事情,你应该已经完成了.现在,您可以将本地主服务器推送到原始远程GitHub fork.您还可以在现在最新的本地主服务器上重新设置开发分支.
因此,在初始上游设置和主校验之后,您需要做的就是运行以下命令将主服务器与上游同步:git pull upstream master.
截至本答复发布之日,GitHub 在Web界面中没有(或者我不再说?)这个功能.但是,您可以要求support@github.com
为此添加投票.
与此同时,GitHub用户bardiharborow创建了一个工具来做到这一点: https ://upriver.github.io/
来源在这里:https://github.com/upriver/upriver.github.io
如果您正在使用GitHub for Windows,那么他们现在只需一键功能即可更新分支:
在UI中选择存储库.
单击顶部的"从用户/分支更新"按钮.
实际上,可以通过浏览器中上游的任何提交在fork中创建一个分支:
打开https://github.com/
,其中repo是你的fork,hash是完整的commit提交,你可以在上游web界面找到它.例如,我可以打开https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d28990,它指的linux
master
是写作时间.
单击"树:...."按钮.
输入新分支的名称,然后按 Enter
然后,您可以将该分支提取到本地克隆,并且当您在该提交之上进行编辑时,您不必将所有数据推送回GitHub.或使用Web界面更改该分支中的某些内容.
它是如何工作的(这是猜测,我不知道GitHub是如何做到的):forks共享对象存储并使用命名空间来分隔用户的引用.因此,您可以通过fork访问所有提交,即使它们在分叉时不存在.
请按照以下步骤操作.我尝试了它们,它帮助了我.
结账到您的分行
语法: git branch 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
作为此答案的补充,我正在寻找一种方法,可以一口气从上游分支更新克隆的回购(源)的所有远程分支。这就是我做的。
假设您已经配置了指向源存储库(源是从其派生的)的上游远程服务器,并且已与同步。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
该命令的第一部分列出了上游远程回购中的所有头,并删除了SHA-1,后跟refs/heads/
分支名称前缀。
然后,对于这些分支中的每一个,它将上游远程跟踪分支的本地副本(refs/remotes/upstream/
在本地)直接推到原始站点(refs/heads/
在远程)上的远程分支。
这些分支同步命令中的任何一个都可能由于以下两个原因之一而失败:上游分支已被重写,或者您已将该分支上的提交推送到派生。在第一种情况下,您没有向分支上的分支提交任何内容,可以安全地强制执行(添加-f开关;即git push -f
在上面的命令中)。在另一种情况下,这是正常的,因为您的fork分支已经分叉了,您不能期望sync命令起作用,直到您的提交被合并回上游。
我用这一行更新我的分叉存储库:
git pull https://github.com/forkuser/forkedrepo.git branch
如果您不想在项目中添加另一个远程端点,请使用此选项,如此处发布的其他解决方案一样。
的“拉”的应用程序是自动设置和忘记的解决方案。它将把fork的默认分支与上游存储库同步。
访问URL,单击绿色的“安装”按钮,然后选择要启用自动同步的存储库。
该分支每小时直接在GitHub上更新一次,在您的本地计算机上,您需要拉主分支以确保本地副本是同步的。