如何清理Github叉,以便发出干净的拉取请求?


83

我在Github上创建了一个存储库。我做了一些细微的更改,并向上游提交了拉取请求,但是在此过程中,我的前叉变得非常混乱,无法生成干净的拉取请求。当我从具有六个更改的分支开始拉取请求时,Github希望提交十三个,其中七个已经存在于上游(natch)。

我的问题似乎拉最新的提交有关,但是当我创建一个新的分支和Cherry-pick提交时,我仍然有其他功能。我futzed与基础重建为好,但现在看起来,即使我的主人是那么糟糕,我不能生成的原始副本上游。显然这是因为我不了解我需要重新设置基础而不是合并,所以很明显我犯了错误。我想做的是弄清楚如何解开结并回到干净的状态,在此我可以有效地前进。

我有点想吹掉我的叉子,并在上游制作一个新的叉子,但是我也觉得这很困难。

承认我的Git罪过之后,如何获得github赦免?


1
爱您的表白,并请求被赦免:-)
Jon Kern 2015年

什么,有些人不是git?;-)
pjmorse 2015年

Answers:


102

步骤1:提取上游更改
建议按照Fork a Repo页面上的说明将上游仓库添加为“上游” :

git pull --rebase upstream master

--rebase选项将您的更改置于最新提交的顶部,而不会合并。

步骤2 :(可选)将您的提交合并为1个提交

git reset --soft upstream/master

该命令将“撤消”您的所有提交,但不会更改文件。因此,您可以一次提交所有更改。

git commit -a

步骤3:检查并测试您的更改

要显示更改,请使用GUI(例如内置gitkSourcetreeTortoiseGitTower (付费)

步骤4:推送

git push会引发错误,因为推送会更改目标存储库的历史记录。
如果您确定第3步中显示的更改正确无误,请按“ -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

但是,在其他步骤中,您将需要最新上游提交的哈希,而不是“上游/主”。


3
非常感谢你。GitHub应该更新他们的Fork A Repo
buschtoens

谢谢!我尝试了多种方法来解决此问题,但没有任何效果。正准备在找到这个答案之前吹走我的叉子...并且它起作用了。谢谢!
Judah Gabriel Himango 2014年

嗨,@ JudahHimango。您是否也遵循了“步骤2”。因为我和你一样处于同样的情况。你能帮助我吗。
arunit21

这是个很棒的资源。谢谢!
Jan-Philip Gehrcke博士,2015年

我的分叉存储库一直说它与上游不同步,所以我会下拉并合并-导致不必要的分叉提交。使用这种方法并强制执行推送可以解决此问题。我还使用了rebase来合并一些我以前的提交:git rebase -i HEAD〜n [n是提交数]
The Coder

4

据我了解,对于Git和Mercurial(我只使用了后者,所以我可能是错的),吹掉叉子再叉起来根本没什么大不了的。我一直在做我的项目。如果您可以这样做(可以备份您的更改,或者您的fork中没有任何重大更改),那么我想这可能是可行的方法。

记住,使用DVCS时,对存储库进行分叉将完全复制整个仓库。如果您删除当前的分支,然后再次分支原始仓库,那么您将拥有一个完全干净的状态。


在这种情况下,Fork是github的一个特殊功能,而不是core git,尽管它使用了git的核心功能。您可以使用github-forks执行特殊的github管理功能。
塞斯·罗伯逊

1
知道了 我主要使用BitBucket,并且在其中使用个人工作副本时,“ Fork”与“ clone”同义。为了以防万一,我还是把答案留在这里。
肖恩·爱德华兹

是的,我已经删除了本地克隆,并已经重新克隆了好几次。我对另一个仓库进行了实验,看起来删除一个叉子并从相同的源创建一个新叉子没有问题。
pjmorse 2011年

注意:我git format-patch用来保存我想先保存的提交。
pjmorse 2011年

1
不需要删除分支的存储库并进行重新分支,而使用git format-patch来保存工作只是避开git用于管理分支的所有有用工具。将来,使用git rebase -i选择性地在新的上游master分支顶部重写您的提交是正确的选择。
马克·朗伊尔

0

在您的私人仓库中,将分叉者的仓库添加为远程仓库。从远程分支重新设置分支/重置分支。强制推送到您的github存储库。

如果您需要确切的命令,请告诉我。也让我知道您是想尝试保留本地提交还是“吹走”是否可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.