检查分支是否已合并到主分支并且未被撤销。

4
我希望创建一个工具,可以列出已合并到分支(例如主分支)中的特性分支名称,但排除那些合并后被撤销的分支。
例如:
   /--*--*--*--\                           feature
  /             \
------*--*-------*--*--*--*-------------*  master
                 ^     ^
                 |     | git revert -m1 abc1 (#abc2)
                 |       
                 | git merge --no-ff feature (#abc1)

我知道git branch --contains feature将会返回master,也理解这是为什么,但我想知道是否有一种简单的方法可以排除已被回退的分支。
如果没有,最优解是什么?比较差异吗?

好问题,如果您尝试再次合并,则会得到“已经是最新的”。 - cforbish
3个回答

1
进行简单搜索,即为:
git log --grep="This reverts commit ${merge_sha}"

如果他们手动编辑了提交信息,那么你将会被卡在像这样糟糕的东西上:
matchId=$(git diff  ${merge_sha}^! | grep -v -e "^diff --git" -e "^--- " -e "^+++ " -e "^index " | sha1sum

for sha in $(git revlist ${merge_sha}..HEAD)
do
  shaId=$(git diff  -R ${sha}^! | grep -v -e "^diff --git" -e "^--- " -e "^+++ " -e "^index " | sha1sum)
  if [ ${matchId} == ${shaId} ]
  then
      echo "${sha} might be a ninja revert of ${merge_sha}"
   fi
done

这显然可以大大改善,以反转我目前使用grep排除的某些行的字段。你基本上会重新实现git patch-id,但允许它将a/b文件全部反转(也许已经有一个允许的选项了,但我不知道是什么)。

1

是的,我也知道这个问题。仅依赖于样板恢复消息对我的口味来说并不够健壮。我认为解决方案将涉及将特性分支的差异与主分支进行比较,但我想那也容易出错,特别是如果存在合并冲突的情况。 - apancutt
@apancutt 同意。虽然两个差异之间的相似度在90%以上将是一个好的指示来撤销提交。 - VonC
我尝试使用 git diff -R | git patch-id,但即使在一个简单的情况下,结果也无法使用。然而,在非合并冲突的情况下,通过一些额外的过滤可能会起作用。 - Andrew C

0

一个简单的方法是通过日志进行grep:

git log | grep "^commit " | grep <commit-id>
  • git log — 显示所有提交的日志
  • grep "^commit " — 按提交 ID 过滤(因为它们都以 "commit" 开头)
  • grep <commit-id>— 只过滤你关心的提交

注意—如果 git 更改了提交 ID,则此方法可能无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接