如何用Github创建一个选择性的pull-request - hg-Git - Mercurial?

hyp*_*not 6 git mercurial github

我想为Github上的一个开源项目做贡献.在我的工作流程之前是以下(没有使用VCS):

  1. 我在硬盘上保留了一个"工作"文件夹和一个"干净"文件夹.我在更改时更新了参考版本并继续处理我的"工作"版本.
  2. 当我想做拉取请求时,我比较了视觉比较程序中的文件并转到Github.com/source/edit文件,手动编辑了不同的文件并在Web界面上发送了拉取请求.

现在我想对这个工作流程进行现代化改造(同时避免使用Git),但经过5个小时的试错后我完全陷入困境.我做了以下事情:

  1. 把Github repro分给了我自己
  2. 克隆了分叉的repro并编辑了url git+ssh://git@github.com以使推送成为可能.Github - hg-Git - Mercurial到目前为止完美无缺.
  3. 像往常一样开始在forked repro上编辑.修改过的文件等
  4. 现在,如果我想为某些编辑过的文件提交拉取请求,我该怎么办?我已经尝试克隆到另一个repro,只修改那里,但我没有看到这对我有什么帮助.

到目前为止,我唯一想到的想法是在硬盘上保留两个分叉的重复,一个"干净",一个"工作".然后我会将文件从'work'复制到'clean',并且只在这些文件的'clean'repro中创建一个提交.但这似乎是一种"hackish"做事的方式,我敢肯定必须有书签/克隆的重复或优雅的东西.

你能告诉我使用Mercurial发送选择性拉取请求的最佳工作流程是什么?

Ry4*_*ase 8

您不能执行仅包含变更集的一部分的pull请求 - 变更集在Mercurial和Git中都是不可分的.

你也不能在不拉动它的所有祖先的情况下推或拉(或请求拉动)一个变更集,所以即使提交两个单独的时间,每次都有不同的文件,如果你提交的东西,也不会得到你想要的东西你不想在你做的事情之前推/拉/提交.

这就是为什么您需要使用功能分支将提交的内容分成逻辑上不同的开发线.

如果上游仓库看起来像这样:

[A]---[B]---[C]---[D]
Run Code Online (Sandbox Code Playgroud)

你克隆它所以现在你有这个:

[A]---[B]---[C]---[D]
Run Code Online (Sandbox Code Playgroud)

然后你创建一个变更集,其中有一些你要作为拉取请求提交的东西,而另一些则不是:

[A]---[B]---[C]---[D]---[E]
Run Code Online (Sandbox Code Playgroud)

你运气不好 你不能在没有全部推动的情况下推动E的一部分.你需要将你想要推送的东西分成一个变更集(F)和你不想要的东西(还有?)想要推送(或请求拉出)到另一个变更集(E):

[A]---[B]---[C]---[D]---[E]---[F]
Run Code Online (Sandbox Code Playgroud)

你仍然没有运气,因为你不能推动(或要求拉F)而不包括E,因为E是F的祖先.

相反,你需要让你的E和F工作兄弟姐妹,而不是父母.像这样:

[A]---[B]---[C]---[D]---[E]
                     \
                      --[F]
Run Code Online (Sandbox Code Playgroud)

现在你可以在没有E的情况下将F推到你的前叉并且可以请求在没有他们甚至看到E的情况下将F拉进去.

无论您使用Mercurial,该分支命令看起来都不同:

hg clone THEIRS # now you have A through D
... work ...
hg commit # now you created E, which you don't want to push
hg update D  # current directory no longer shows E
... work ...
hg commit # now you have F which is a child of D and a sibling of E
hg push -r .    # send F (but not E)
Run Code Online (Sandbox Code Playgroud)

或者git:

git clone THEIRS # now you have A through D
git checkout -b feature_e
... work ...
git commit # now you have created E, which you don't want to push
git checkout master # current directory no longer shows E
git checkout -b feature_f
... work ...
git commit # now you have created F, which you do want to share
git push -u origin feature_f  # send F but not E 
Run Code Online (Sandbox Code Playgroud)

现在你将在那里只有F工作而不是E工作的分支,可以提出你想要的拉取请求.

TL; DR:当你在同一个提交分支中混合贡献和非贡献时,你运气不好.您需要将它们分开或创建补丁并提交补丁而不是拉取请求.