6

我想为 Github 上的一个开源项目做出贡献。在我的工作流程如下之前(未使用 VCS):

  1. 我在硬盘上保留了一个“工作”文件夹和一个“干净”文件夹。当有变化时,我已经更新了参考版本,并继续使用我的“工作”版本。
  2. 当我想做一个拉取请求时,我在一个可视化比较程序中比较了文件,然后转到 Github.com/source/edit 文件,手动编辑不同的文件并在 Web 界面上发送拉取请求。

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

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

到目前为止,我能想到的唯一想法是在硬盘驱动器上保留两个分叉的复制品,一个“干净”,一个“工作”。然后我会物理地将文件从“工作”复制到“干净”,并且只在这些文件的“干净”复制中创建一个提交。但这似乎是一种“hackish”的做事方式,我敢肯定,书签/克隆复制品或其他优雅的东西必须有一种干净的方式。

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

4

1 回答 1

9

你不能做一个只有部分变更集的拉取请求——变更集在 Mercurial 和 Git 中都是不可分离的。

您也不能在不拉动所有祖先的情况下推送或拉动(或请求拉动)变更集,因此即使提交两次不同的时间,每次使用不同的文件,如果您提交这些东西,也不会得到您想要的你不想在你做的事情之前推/拉/提交。

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

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

[A]---[B]---[C]---[D]

然后你克隆它,所以现在你有了这个:

[A]---[B]---[C]---[D]

然后你创建一个变更集,其中包含一些你想作为拉取请求提交的东西,而一些你不想提交的东西:

[A]---[B]---[C]---[D]---[E]

你不走运。你不能推动 E 的一部分而不推动它的全部。您需要将要推送到一个变更集 (F) 的内容和您不想(还?)想要推送(或请求拉入)另一个变更集 (E) 的内容分开:

[A]---[B]---[C]---[D]---[E]---[F]

您仍然不走运,因为您不能在不包括 E 的情况下推动(或请求拉动 F),因为 E 是 F 的祖先。

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

[A]---[B]---[C]---[D]---[E]
                     \
                      --[F]

现在你可以在没有 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)

或混帐:

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 

现在你将在那里有一个只有 F 工作而不是 E 工作的分支,并且可以发出你想要的拉取请求。

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

于 2012-09-13T00:04:55.380 回答