提交补丁到Github项目而不将存储库克隆到Github?

时间:2012-01-14 21:39:57

标签: git github

我有一个本地存储库,它是Github上存储库的完整副本。我做了一个改变,我想为原始项目做出贡献。

如果不在Github上重新加载我的项目,我怎么能这样做?我不认为开放问题是正确的方法..

我在How can I contribute a patch to github?中看到我应该分叉项目,但由于我的本地存储库与原始Github存储库“链接”,我不想搞砸它。

所以,如果真的不鼓励以任何方式共享补丁而不是fork,我怎样才能简单地分割原始项目,合并我的更改,然后与原始存储库共享它们? / p>

如果我在“提交”更改后删除了fork但尚未接受,那么我的提交是否会消失?

4 个答案:

答案 0 :(得分:20)

你应该分叉项目,是的。但是,这并不意味着您需要在本地再次克隆整个内容

说明:查看git存储库的一种简单方法是提交图(它是有向的和非循环的,但这与此讨论无关);并且该图的所有节点(即提交)在世界中所有git存储库中都有唯一的标识符 。至于分支,它们只是提交的符号引用(用git的说法,分支 - 或标记 - 称为 refspec )。

此外,您从不以任何方式链接到远程存储库。你唯一真正“链接”的是提交图。一个远程存储库碰巧有一组refspecs(分支,标签)......指向一个提交图,他们也有 - 没有人喜欢悬空引用。克隆存储库时,您将获得提交图(和关联的树)以及refspecs集(即分支,标记)。 refspec指向一棵树。这就是它。

这意味着以下内容:

  • 你有原始的github repo:提交和相关树的图表,一组refspecs;
  • 你已经在本地克隆了它:提交和相关树的相同图表,同一组refspecs;
  • 您已在本地提交了内容:您已添加此图表和相关树,并添加了一组新的refspec。

好的,现在执行以下操作:

  • 克隆github上的原始repo:提交和树的原始图形相同; refspec在这里,前面只有远程名称,默认为origin。那现在呢?
  • 在您的本地存储库中,将您的前叉添加为远程;
  • 推送到该分叉(这将推送refspecs和树);
  • 提交拉取请求。

将fork作为遥控器添加为“简单”:

git remote add myfork git@github.com:youruser/theproject

将你的refspec(分支)推送到它:

git push myfork mybranch

然后向原作者提交拉取请求。

应该注意的是,从理论上讲,你可以将一个遥控器添加到一个与“原始”repo完全没有关系的git存储库中:这只是两个提交图将完全脱离一个另一个 - 然而,这种用例很少见

答案 1 :(得分:5)

是的,你应该分叉项目,但不需要克隆/拉/合并任何东西。单击fork按钮后,执行

git remote add yourfork git@github.com:<yourname>/<project>.git

并使用

将分支推送到您的分支
git push yourfork branchname

然后发出拉取请求。

如果在之后删除了分支,则补丁被上游合并,应该没有问题。我不确定在发生这种情况之前你移开叉子会发生什么。

没有必要合并任何内容。

答案 2 :(得分:2)

您始终可以通过电子邮件将修补程序文件发送给维护者。 Linux内核已经以这种方式制作了很长时间。

答案 3 :(得分:0)

不要摆弄当前的存储库副本。

  • 使用format-patch创建补丁。
  • 上游并克隆它,但不要替换您的工作副本。
  • 将带有git am的修补程序应用于新分叉的项目,推送它们并创建合并请求。

这不是最好的解决方案,但它可以防止您意外地丢失更改。