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

Mak*_*s_F 21 git github

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

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

我在中看到如何为github贡献补丁?应该分叉项目,但由于我的本地存储库"链接"到原始的Github存储库,我不想搞砸它.

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

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

fge*_*fge 20

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

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

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

这意味着以下内容:

  • 你有原始的github repo:提交和相关树的图表,一组refspecs;
  • 你已经在本地克隆了它:提交和相关树的相同图形,同一组refspecs;
  • 你已经在本地提交了东西:你已经添加了这个图和相关的树,并添加了一组新的refspecs.

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

  • 克隆github上的原始repo:提交和树的原始图形相同; refspecs在这里,前面只有远程名称,origin默认情况下.现在怎么办?
  • 在本地存储库中,将fork添加为远程 ;
  • 推到那个叉子(这会推动refspecs和树木);
  • 提交拉取请求.

将fork作为远程添加就像"简单"一样:

git remote add myfork git@github.com:youruser/theproject
Run Code Online (Sandbox Code Playgroud)

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

git push myfork mybranch
Run Code Online (Sandbox Code Playgroud)

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

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


Fre*_*Foo 5

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

git remote add yourfork git@github.com:<yourname>/<project>.git
Run Code Online (Sandbox Code Playgroud)

用你的分支推动你的分支

git push yourfork branchname
Run Code Online (Sandbox Code Playgroud)

然后发出拉取请求.

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

没有必要合并任何东西.