检查分支是否已合并为主分支并且尚未恢复

时间:2013-11-28 11:45:51

标签: git

我想创建一个工具,列出已合并到分支(例如master)中的功能分支的名称,但不包括已经恢复其合并的分支。

例如:

   /--*--*--*--\                           feature
  /             \
------*--*-------*--*--*--*-------------*  master
                 ^     ^
                 |     | git revert -m1 abc1 (#abc2)
                 |       
                 | git merge --no-ff feature (#abc1)

我理解git branch --contains feature将返回master,我理解为什么,但我想知道是否有一种简单的方法来排除已经被还原的分支。

如果没有,最佳解决方案是什么?比较差异?

3 个答案:

答案 0 :(得分:1)

首先,从“How can I know in git if a branch has been already merged into master?”,您可以检查您的功能分支是否属于git branch --merged或检查git merge-base以查找合并提交。

其次,问题“Telling if a Git commit is a Merge/Revert commit”确实警告我们很难找到恢复提交,并且只提倡提交消息中的恢复消息样板。

答案 1 :(得分: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文件都颠倒过来(也许有一个选项可以允许它,但我不知道它是什么)

答案 2 :(得分:0)

执行此操作的简单方法是简单地浏览日志:

git log | grep "^commit " | grep <commit-id>
  • git log - 显示所有提交的日志
  • grep "^commit " - 按提交ID过滤(因为它们都以“commit”开头)
  • grep <commit-id> - 仅根据您关注的提交进行过滤

注意 - 如果git更改了提交ID,则可能无效。