如何清理我的Github分支,以便我可以进行干净的拉取请求?

84
我在Github上fork了一个仓库。我做了一些小的更改并向上游提交了pull request,但是在此过程中,我的fork变得如此混乱,以至于我无法生成干净的pull request;当我从拥有六个更改的分支开始pull request时,Github要提交十三个,其中七个已经存在于上游(自然)。
我的问题似乎与仅拉取最新的commits有关,但是当我创建一个新分支并挑选commits时,我仍然会有额外的commits。我也尝试了rebase,但现在看起来我的主分支也混乱了,我无法生成upstream的干净副本。这显然是因为我没有理解需要rebase而不是merge,所以显然我犯了错误;我正在努力找出如何解开这个困境,回到一个干净的状态,以便我可以有用地前进。
我有点想清除我的fork并创建一个新的upstream的fork,但我发现这也很难。
坦白我的Git罪过后,我该如何获得github的赦免?

1
喜欢你的忏悔和请求被宽恕 :-) - Jon Kern
什么,还有人不把Git当作宗教信仰吗?;-) - pjmorse
3个回答

104

步骤1:拉取上游更改
建议按照分叉存储库页面上的说明将上游存储库添加为“upstream”:

git pull --rebase upstream master

--rebase 选项将你的修改放在最新提交的顶部,而不需要合并。

步骤2:(可选)将你的多次提交合并为一个提交

git reset --soft upstream/master

这个命令将“撤销”所有的提交,但不会更改文件。所以你可以在一个单独的提交中提交所有的更改。

git commit -a

第三步:检查并测试您的更改

使用内置的GUI(如gitk)、SourcetreeTortoiseGitTower (付费)等工具来显示更改。

第四步:推送

git push会抛出错误,因为推送将更改目标仓库的历史记录。
如果您确信第三步中显示的更改是正确的,请使用"-f"参数进行强制推送。

git push -f origin master


额外信息
添加远程仓库的命令为:

git remote add upstream git://github.com/[username]/[project].git

你也可以从直接的URL中拉取:

git pull --rebase  git://github.com/[username]/[project].git

但是在其他步骤中,您需要使用最新上游提交的哈希而不是"upstream/master"。


3
非常感谢你。GitHub应该更新他们的“分叉存储库”页面。 - buschtoens
谢谢!我尝试了很多方法来解决这个问题,但都没有成功。在找到这个答案之前,我准备放弃了……但它奏效了。谢谢! - Judah Gabriel Himango
嗨,@JudahHimango。你也跟随了“步骤2”吗?因为我和你处于同样的情况。你能帮我吗? - arunit21
这是一个很棒的资源。谢谢! - Dr. Jan-Philip Gehrcke
我的分叉存储库一直显示与上游不同步,所以我会拉取并合并 - 这导致我的分叉上有一些不必要的提交。使用这种方法并强制推送已解决了这个问题。我还使用了rebase来合并一些早期的提交: git rebase -i HEAD~n [其中n是提交的数量] - The Coder

4
据我所知,使用Git和Mercurial(我只用过后者,所以可能有所不同),删除并重新fork一个分支并不是什么大问题。我经常这样做我的项目。如果你可以接受这样做(备份你的更改或没有重要的更改在你的分支中),我认为这可能是最好的方法。
请记住,使用分布式版本控制系统(DVCS)时,fork一个存储库会完全克隆整个存储库。如果你删除当前的分支,然后再次fork原始存储库,你将拥有一个完全干净的状态来工作。

在这种情况下,Fork是Github的一个特殊功能,而不是核心Git,尽管它使用了核心Git的功能。您可以使用github-forks进行特殊的Github管理操作。 - Seth Robertson
1
啊,我明白了。我主要使用BitBucket,而在那里,“Fork”在你使用个人工作副本时相当于“克隆”。然而,我还是会把我的答案留在这里,以防万一。 - Sean Edwards
是的,我已经删除了我的本地克隆并重新克隆了几次。我对另一个存储库进行了实验,看起来删除分叉并从同一源创建新分叉没有问题。 - pjmorse
注意:我正在使用 git format-patch 命令来保留我想要保存的提交记录。 - pjmorse
1
删除您的派生存储库并重新派生是不必要的,使用 git format-patch 保存您的工作有点绕过了 git 管理分支的所有有用工具。将来,使用 git rebase -i 在新的上游 master 分支顶部有选择地重写提交是正确的做法。 - Mark Longair

0
在您的私有存储库中,将被派生存储库添加为远程存储库。从远程分支重新设置/重置您的分支。强制推送到您的 GitHub 存储库。
如果您需要确切的命令,请告诉我。还请告诉我是否要尝试保留本地提交或者“清除”是否可以接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接