我想创建一个工具,列出已合并到分支(例如master)中的功能分支的名称,但不包括已经恢复其合并的分支。
例如:
/--*--*--*--\ feature
/ \
------*--*-------*--*--*--*-------------* master
^ ^
| | git revert -m1 abc1 (#abc2)
|
| git merge --no-ff feature (#abc1)
我理解git branch --contains feature
将返回master
,我理解为什么,但我想知道是否有一种简单的方法来排除已经被还原的分支。
如果没有,最佳解决方案是什么?比较差异?
答案 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,则可能无效。