Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Github-hg Git-Mercurial创建选择性拉取请求?_Git_Mercurial_Github - Fatal编程技术网

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

如何使用Github-hg Git-Mercurial创建选择性拉取请求?,git,mercurial,github,Git,Mercurial,Github,我想为Github上的一个开源项目做贡献。之前,我的工作流程如下(未使用VCS): 我在硬盘上保存了一个“工作”文件夹和一个“干净”文件夹。当发生变化时,我已经更新了参考版本,并继续使用我的“工作”版本 当我想要执行拉取请求时,我在一个可视化比较程序中比较了文件,然后转到Github.com/source/edit file,手动编辑不同的文件,并在web界面上发送拉取请求 现在我想使这个工作流程现代化(同时避免使用Git),但经过5个小时的反复试验,我完全被卡住了。我做了以下工作: 把Gith

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

  • 我在硬盘上保存了一个“工作”文件夹和一个“干净”文件夹。当发生变化时,我已经更新了参考版本,并继续使用我的“工作”版本
  • 当我想要执行拉取请求时,我在一个可视化比较程序中比较了文件,然后转到Github.com/source/edit file,手动编辑不同的文件,并在web界面上发送拉取请求
  • 现在我想使这个工作流程现代化(同时避免使用Git),但经过5个小时的反复试验,我完全被卡住了。我做了以下工作:

  • 把Github复制品分给了我自己
  • 克隆了forked repo并将url编辑到
    git+ssh://git@github.com
    使推送成为可能。到目前为止,Github-hg Git-Mercurial工作得很好
  • 像往常一样开始在分叉的复制上编辑。修改过的文件等
  • 现在,如果我想提交对我编辑的文件的部分的拉取请求,我该怎么办?我试着克隆到另一个复制程序中,只是在那里修改,但我不知道这对我有什么帮助
  • 到目前为止,我唯一能想到的办法是在硬盘上保留两个分叉复制,一个“干净”,一个“工作”。然后,我会将文件从“工作”物理复制到“清理”,并仅在“清理”复制中从这些文件创建提交。但这似乎是一种“黑客式”的做事方式,我相信一定有一种干净的方式来使用书签/克隆复制或其他优雅的东西


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

    您不能执行只有变更集一部分的拉取请求——变更集在Mercurial和Git中都是不可分离的

    您也无法在不拉取所有祖先的情况下推送或拉取(或请求拉取)变更集,因此,即使提交两次不同的时间,每次提交不同的文件,如果您在提交之前提交了不想推送/拉取/提交的内容,也无法得到您想要的内容

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

    如果上游回购如下所示:

    [A]---[B]---[C]---[D]
    
    然后你克隆了它,现在你有了这个:

    [A]---[B]---[C]---[D]
    
    然后,您创建一个变更集,其中包含一些您想作为拉取请求提交的内容,而有些您不想:

    [A]---[B]---[C]---[D]---[E]
    
    你真倒霉。你不能只推E的一部分而不推它的全部。您需要将您想要推进到一个变更集中的内容(F)和您不想要推进(或请求已经拉入)到另一个变更集中的内容(E)分开:

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

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

    [A]---[B]---[C]---[D]---[E]
                         \
                          --[F]
    
    现在你可以在没有E的情况下将F推到你的叉子上,并且可以要求将F拉进去,而他们甚至都看不到E

    无论您使用的是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:当你在同一个提交分支中混合贡献和非贡献时,你就不走运了。您需要将它们分开,或者创建一个补丁并提交一个补丁,而不是一个请求。

    感谢您提供这本精彩的指南!我想我终于明白了你的解释。让我困惑的一件事是hg-Git不支持
    hg-push-r
    ,但我会尝试在其中使用一个本地克隆的repo和push-r,并且只支持与hg-Git连接的正常推送。我会试试看它是否有效!该命令末尾有一个点(
    )。如果您执行了
    hg push
    操作,您将同时按下
    F
    E
    ,因为默认情况下
    hg push
    会按下所有分支。然而,通过执行hg push-r.您说的是“仅推送变更集点及其祖先”,而dot(
    )对于“我当前更新到的内容”或在这种情况下
    F
    )来说是易变的。不幸的是,我没有使用HGGit,所以我不知道这是否会改变Mercurial命令。从概念上讲不应该,但我不知道在git回购中会使用什么命名分支,因为git不能/不会做未命名分支(比如Mercurial will)。我可以花几天时间尝试一下,下面是它的工作原理<代码>hg push-r。不起作用,它说:
    中止:修订版d7547776b15d无法推送,因为它没有ref
    。工作原理如下:1。将
    master
    书签移动到当前位置,2<代码>hg推送-f。这使得git部件中只有当前位置可见。如果您想让另一个分支的工作在git中可见,您必须创建一个书签。HgGit然后从书签中生成另一个分支。噢,HgGit确实施加了一些疯狂的限制。我很高兴你让它工作了。我更喜欢Mercurial,但我每天都使用这两种工具,一旦你拍了几张照片,用git而不是hg 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