找出分支是否包含未合并的更改

时间:2015-02-20 22:54:40

标签: git gerrit

在我的涉及Gerrit进行代码审查的开发工作流程中,分支包含对文件的一个或多个更改。在这些获得批准后,这些樱桃选择了附带的评论标签。

但是,在尝试删除工作分支时,我收到一条警告,并非所有更改都已合并:

$ git branch -d documentation 
error: The branch 'documentation' is not fully merged.
If you are sure you want to delete it, run 'git branch -D documentation'.

但更改的文件完全相同。唯一的区别(通过git show --pretty=fuller找到包括Committer,CommitDate和commit消息.Grerit插入的Change-Ids完全相同。

有没有办法删除分支而不抱怨这样的差异?显然,当有不同的提交没有合并时,它仍然会抱怨。

2 个答案:

答案 0 :(得分:3)

git branch仅适用于DAG。你要求git检查内容是否完全合并,这是一个更难的问题。

有两种明显的git工具可以找到答案:

  1. git cherry:这可能就是你想要的;尝试一下。
  2. git merge:在你认为你应该全押的分支的尖端上找到一个独立的HEAD,然后对你想要删除的分支进行虚拟合并。如果生成的合并提交与首次分离HEAD的点具有相同的树,则可以安全地执行建议的删除。 (如果没有,可能是错误合并,或者可能是合并冲突,如果/当解决时,表明它仍然是安全的。)

答案 1 :(得分:0)

Torek建议尝试合并分支以查看是否所有内容都已合并。这很容易做到,但要求可以修改工作树。

假设以下git日志,其中docs update是修改doc/README.dissectordocumentation分支上存在的文件master的提交。您可以看到自提交a984dbf("父提交")中的拆分后没有其他提交。

* 9667666 (master) latest commit
* ...
* 6284040 docs update (commit cherry-picked by Gerrit)
* ...
* a984dbf other commits on master
| * 8b8cb8f (documentation) docs update (branch pushed for review)
|/  
* e76e140 parent commit

它的工作原理如下:

  1. 确保当前工作树清洁(即没有未经修改的更改)。如果不是这种情况,请使用git stash将更改放在一边。

    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    nothing to commit, working directory clean
    
  2. 在这里,您可以看到删除documentation分支的尝试因为问题中描述的细微差异而失败:

    $ git branch -d documentation
    error: The branch 'documentation' is not fully merged.
    If you are sure you want to delete it, run 'git branch -D documentation'.
    
  3. 没问题!尝试合并......

    $ git merge --squash documentation
    Squash commit -- not updating HEAD
    Automatic merge went well; stopped before committing as requested
    
  4. ...并检查是否会产生任何差异(您也可以使用git diff)。如您所见,没有剩余的变化:

    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    nothing to commit, working directory clean
    
  5. 现在我们确认分支机构不包含其他提交,我们可以安全地将其删除:

    $ git branch -D documentation
    Deleted branch documentation (was 8b8cb8f).
    

  6. 有一种第二种但不那么明显的方法来测试合并而不触及工作三和https://stackoverflow.com/a/6283843/427545中描述的索引。

    仅当提交引用(" master"在示例中)不包含自拆分以来的其他更改时,它才有效。如果确实如此,那么在提交合并之后,您将获得包含master中新更改的diff。在这种情况下,请使用先前的提交而不是" master"。

    示例会话:

    1. 查找基本提交(" e76e140父提交"在给定示例中):

      $ git merge-base master documentation
      e76e14074e5a9c46886ab3124a5649eabe7bfe99
      
    2. 尝试合并:

      $ git merge e76e14074e5a9c46886ab3124a5649eabe7bfe99 master documentation
      changed in both
        base   100644 3fdc91af1748f6db1dcb9729cd6e2846b9c7b2f8 doc/README.dissector
        our    100644 10ba4e6b3f1a2e91cb61dc4133bca4a61b50e47b doc/README.dissector
        their  100644 61384b5df44ff0e13374e3d93b3e6d01fa9c380a doc/README.dissector
      
    3. 得出结论。上面的输出可能会让您觉得文档分支没有被合并到主分支中。然而情况并非如此。如果文件不同,则会在这些行下方显示差异。当输出为空时,分支完全合并(并且git branch -d documentation不会抱怨) 由于没有差异(一切都已合并),我们可以安全地删除分支:

      git branch -D documentation
      
    4. 使用以下git别名,您只需调用git test-merge documentation即可自动完成上述步骤:

      git config --global alias.test-merge '!sh -c '\''branch="${2:-$(git rev-parse --abbrev-ref HEAD)}"; git merge-tree $(git merge-base "$1" "$branch") "$branch" "$1"'\'' --'
      

      用法:

      # Test merge of branch "documentation" in the current branch
      git test-merge documentation
      # Test merge of branch "documentation" in the "master-1.12" branch
      git test-merge documentation master-1.12