“弧形嫁接”和“弧形补丁”之间有什么区别?

Gab*_*les 4 git phabricator arcanist

arc help --full | less显示以下内容graft

  graft revision

      Grafts revision and its dependencies (if any) onto your working tree.

      --force
          Do not run any sanity checks.

      --skip-landed
          Do not try to patch landed/closed diffs.
Run Code Online (Sandbox Code Playgroud)

这是为了patch

  patch D12345
  patch --revision revision_id
  patch --diff diff_id
  patch --patch file
  patch --arcbundle bundlefile
      Supports: git, svn, hg
      Apply the changes in a Differential revision, patchfile, or arc
      bundle to the working copy.

      --arcbundle bundlefile
          Apply changes from an arc bundle generated with 'arc export'.
Run Code Online (Sandbox Code Playgroud)

这对我来说很模糊。用“嫁接”一词来描述“嫁接”的含义对我没有多大帮助。


对于那些不知道的人,arc(Arcanist)是“ Phabricator”内部的命令行工具,其作用类似于Git的高级包装(甚至是Mercurial和Subversion),以协助大型软件项目的开发过程。这里有一些链接:

https://phacility.com/phabricator/

Phabricator最初是作为Facebook内部工具开发的。[7] [8] [9] Phabricator的主要开发人员是Evan Priestley。[1] Priestley离开了Facebook,在一家名为Phacility的新公司中继续Phabricator的开发。[2] https://zh.wikipedia.org/wiki/药剂师

Gab*_*les 5

因此,经过一些试验和反复试验,我想我明白了:

两者arc graftarc patchgit cherry-pick的引擎盖下,完成类似的事情。然而,他们有一些细微的差别,有时arc patch失败,则必须使用arc graft--skip-landed标志代替(更新:或许arc patch--skip-dependencies?标志将工作太)。

例子:

arc patch --skip-dependencies D999 # cherry-pick their "D999" "diff" (branch) onto your current branch, while creating a new single branch for you named "arcpatch-D999", skipping dependencies in case they've already landed on the branch (ex: master) you currently have checked out.
Run Code Online (Sandbox Code Playgroud)

要么

arc graft --skip-landed D999 # cherry-pick their "D999" "diff" (branch), *as well as all parent branch(es) it depends on*, onto your current branch, while creating the entire dependency tree of branches for you, exactly as the submitter originally had on their local machine, skipping any commits that have already landed on your local branch (ex: master) you currently have checked out
Run Code Online (Sandbox Code Playgroud)

假设您的arc flow依赖树仅包含“ master”分支:

master
Run Code Online (Sandbox Code Playgroud)

但是,同事具有以下arc flow依赖关系树:

master                              
???new_feature_1
   ???new_feature_2 
Run Code Online (Sandbox Code Playgroud)

简而言之:什么是arc flow依赖树?回答:这是一个树结构,通过arc flow命令显示,该树结构显示哪些分支取决于什么。作为一个人,您手动进行跟踪是有点武断的事情,因为您知道一个功能取决于另一个功能。要建立“依赖关系”,您有两个选择:

  1. arc flow new_branch_name当前已检出要成为父级的分支时,调用创建一个新的子分支,或者:
  2. 使用git创建一个新分支,然后将其上游设置为您希望成为父分支的分支。例如:

    git branch new_branch_name
    git checkout new_branch_name # Or use `git checkout -b new_branch_name` to do both at once
    git branch --set-upstream-to=upstream_branch_name # or `git branch -u upstream_branch_name` for short
    
    Run Code Online (Sandbox Code Playgroud)

现在,arc flow将显示您的依赖关系树。这样,您就可以进行arc cascade从父级到子级的操作,这只是从父级到子级进行自动递归git rebase(即:将子级重新定位到父级)。

一旁结束。


无论如何,通过上面显示的依赖关系树,您的同事已签出“ new_feature_2”,arc diff供您查看。您转到基于Web的“差异”工具并开始查看更改。但是,您要对其进行测试。这意味着您需要将它们的差异拉到本地计算机上。您有两种选择:1.将arc patch它们的差异(依赖树感知分支)连接到本地主机,或2.将arc graft它们的差异连接到本地主机。

假设它们的差异为“ D999”,并且您当前已检出“ master”分支,则命令和生成的依赖关系树如下所示:

  1. arc patch D999。现在,您有了这棵树,其中新创建的“ arcpatch-D999”是其“ new_feature_2”分支:

    master
    ???arcpatch-D999 
    
    Run Code Online (Sandbox Code Playgroud)
  2. arc graft D999。您现在有了这棵树,就像它们一样:

    master                              
    ???new_feature_1
       ???new_feature_2 
    
    Run Code Online (Sandbox Code Playgroud)

但是,(我认为,根据我的问题),有时当他们有一个多代的依赖关系树这样的,arc patch会失败(给人一个错误,指出“樱桃匹克失败!”),在这种情况下,你必须使用arc graft替代!但是,如果他们的主人与您的主人不完全相同(几乎可以肯定不会,因为他们可能把主人拉了一段时间,您应该把主人拉出来以确保您拥有最新的主人),然后尝试移植物或补丁将失败。失败可能与以下事实有关:分支历史中的某些提交包含已登陆并存在于您的主数据库中的更改。解决方案是使用arc graft D999 --skip-landed,这将允许您获取它们的差异并将其拉下,从而镜像其arc flow依赖关系树。在这种情况下,arc patch D999将很可能继续失败,直到他们拉出最新的master和arc cascade(或git rebase两次),然后重新arc diff将其更改推送到服务器上,此时您便可以arc patch D999成功地将您的master上。但是,由于无法始终让他们arc cascade立即恢复基准/,请立即执行arc graft D999 --skip-landed并完成!让他们重新定位并重新arc diff开始。

但是,一个小问题是,如果您arc graft辛苦工作,那么会使哪个分支(您还是其他人?)产生混乱,因此,我建议您养成嫁接到自己命名的新分支上的习惯,因为如下,仅用于组织:

git checkout master # same as `arc flow master`
git pull origin master # pull latest master
arc flow graft-D999 # create and checkout a new child branch you are calling "graft-D999" (name it appropriately)
arc graft D999 --skip-landed # graft their entire dependency tree onto your branch "graft-D999"
Run Code Online (Sandbox Code Playgroud)

现在,您的依赖关系树如下:

master                              
???graft-D999
   ???new_feature_1
      ???new_feature_2 
Run Code Online (Sandbox Code Playgroud)

优秀!尼斯和有条理。现在,您可以签出“ new_feature_2”并进行编译和测试。但是请注意,“ master”和“ graft-D999”将是完全相同的分支,但是可以。


Von*_*onC 0

这可能与gitrafts有关,您在其中进行提交/修订,并更改其父提交,从而更改存储库的历史记录。
(尽管自 Git 2.18, Q2 2018 起,graft 已被 git 取代ref/replace/

与补丁相反,补丁只是从现有差异创建新的提交/修订,添加到存储库的历史记录中。