我有一个本地存储库,它是Github上存储库的完整副本。我做了一个改变,我想为原始项目做出贡献。
如果不在Github上重新加载我的项目,我怎么能这样做?我不认为开放问题是正确的方法..
我在How can I contribute a patch to github?中看到我应该分叉项目,但由于我的本地存储库与原始Github存储库“链接”,我不想搞砸它。
所以,如果真的不鼓励以任何方式共享补丁而不是fork,我怎样才能简单地分割原始项目,合并我的更改,然后与原始存储库共享它们? / p>
如果我在“提交”更改后删除了fork但尚未接受,那么我的提交是否会消失?
答案 0 :(得分:20)
你应该分叉项目,是的。但是,这并不意味着您需要在本地再次克隆整个内容。
说明:查看git存储库的一种简单方法是提交图(它是有向的和非循环的,但这与此讨论无关);并且该图的所有节点(即提交)在世界中所有git存储库中都有唯一的标识符 。至于分支,它们只是提交的符号引用(用git的说法,分支 - 或标记 - 称为 refspec )。
此外,您从不以任何方式链接到远程存储库。你唯一真正“链接”的是提交图。一个远程存储库碰巧有一组refspecs(分支,标签)......指向一个提交图,他们也有 - 没有人喜欢悬空引用。克隆存储库时,您将获得提交图(和关联的树)以及refspecs集(即分支,标记)。 refspec指向一棵树。这就是它。
这意味着以下内容:
好的,现在执行以下操作:
origin
。那现在呢?将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
的修补程序应用于新分叉的项目,推送它们并创建合并请求。这不是最好的解决方案,但它可以防止您意外地丢失更改。