在我的涉及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完全相同。
有没有办法删除分支而不抱怨这样的差异?显然,当有不同的提交没有合并时,它仍然会抱怨。
答案 0 :(得分:3)
git branch
仅适用于DAG。你要求git检查内容是否完全合并,这是一个更难的问题。
有两种明显的git工具可以找到答案:
git cherry
:这可能就是你想要的;尝试一下。git merge
:在你认为你应该全押的分支的尖端上找到一个独立的HEAD,然后对你想要删除的分支进行虚拟合并。如果生成的合并提交与首次分离HEAD的点具有相同的树,则可以安全地执行建议的删除。 (如果没有,可能是错误合并,或者可能是合并冲突,如果/当解决时,表明它仍然是安全的。)答案 1 :(得分:0)
Torek建议尝试合并分支以查看是否所有内容都已合并。这很容易做到,但要求可以修改工作树。
假设以下git日志,其中docs update
是修改doc/README.dissector
和documentation
分支上存在的文件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
它的工作原理如下:
确保当前工作树清洁(即没有未经修改的更改)。如果不是这种情况,请使用git stash
将更改放在一边。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
在这里,您可以看到删除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'.
没问题!尝试合并......
$ git merge --squash documentation
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
...并检查是否会产生任何差异(您也可以使用git diff
)。如您所见,没有剩余的变化:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
现在我们确认分支机构不包含其他提交,我们可以安全地将其删除:
$ git branch -D documentation
Deleted branch documentation (was 8b8cb8f).
有一种第二种但不那么明显的方法来测试合并而不触及工作三和https://stackoverflow.com/a/6283843/427545中描述的索引。
仅当提交引用(" master"在示例中)不包含自拆分以来的其他更改时,它才有效。如果确实如此,那么在提交合并之后,您将获得包含master中新更改的diff。在这种情况下,请使用先前的提交而不是" master"。
示例会话:
查找基本提交(" e76e140父提交"在给定示例中):
$ git merge-base master documentation
e76e14074e5a9c46886ab3124a5649eabe7bfe99
尝试合并:
$ 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
得出结论。上面的输出可能会让您觉得文档分支没有被合并到主分支中。然而情况并非如此。如果文件不同,则会在这些行下方显示差异。当输出为空时,分支完全合并(并且git branch -d documentation
不会抱怨)
由于没有差异(一切都已合并),我们可以安全地删除分支:
git branch -D documentation
使用以下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