git - 如何使用 Github - hg-Git - Mercurial 创建选择性 pull 请求?

标签 git mercurial github

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

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

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

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

到目前为止,我能想到的唯一想法是在硬盘上保留两个 fork 的复制品,一个“干净”,一个“工作”。然后我会物理地将文件从“工作”复制到“干净”,并且只在这些文件的“干净”复制中创建一个提交。但这似乎是一种“骇人听闻”的做事方式,我相信一定有一种带有书签/克隆复制品或优雅的东西的干净方式。

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

最佳答案

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

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

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

如果上游代码库是这样的:

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

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

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

然后你做了一个变更集,其中有一些你想作为 pull 请求提交的东西,还有一些你不想提交的东西:

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

你运气不好。您不能在不 push 全部的情况下 push E 的一部分。您需要将要推送到一个变更集 (F) 的内容和您不想(还?)想要推送(或请求 pull )到另一个变更集 (E) 的内容分开:

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

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

相反,您需要让您的 E 和 F 成为工作 sibling ,而不是父子。像这样:

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

现在您可以在没有 E 的情况下将 F 推送到您的 fork 中,并且可以在他们甚至看不到 E 的情况下请求 pull 入 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 工作的分支,并且可以提出您想要的 pull 请求。

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

关于git - 如何使用 Github - hg-Git - Mercurial 创建选择性 pull 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12393156/

相关文章:

version-control - Mercurial 。版本控制和部署。不同的配置文件。如何?

git - 自动 merge package-lock.json

git - merge Git 存储库中的两个远程分支

GitFlow 正在将 master 的不需要的方面 merge 到修复完成的开发中

Mercurial:撤消未提交更改的自动 merge

Git - 将子文件夹推送到不同的存储库

git - 如何使用 Visual Studio Code 连接到我现有的 Git 存储库?

git - 如何重置 git 项目中的所有内容并作为一次提交推送

git - 为什么父级存储在 git Notes 中?

git - p4 命令相当于 git/hg/bzr/svn status 之类的命令是什么? (提示: not `p4 status` )