我正在尝试做的是版本检查。我想确保代码保持在最低版本之上。所以我需要一种方法来知道当前分支是否包含指定的提交。
答案 0 :(得分:85)
有多种方法可以达到这个效果。第一个天真的选择是使用git log
并使用grep
搜索特定的提交,但这并不总是精确的
git log | grep <commit_id>
最好使用git branch
直接使用
COMMIT_ID
的所有分支
git branch --contains $COMMIT_ID
下一步是找出自git 1.8.1
使用
git symbolic-ref --short HEAD
并合并为
git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID
但上面的命令不会返回true或false,如果commit在当前分支中,则返回退出代码0的较短版本,如果不是,则返回退出代码1
git merge-base --is-ancestor $COMMIT_ID HEAD
退出代码很不错,但是当您想要字符串true
或false
作为答案时,您需要添加更多内容,然后与来自bash的if
结合使用
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
答案 1 :(得分:58)
获取包含特定提交的分支列表。
# get all the branches where the commit exists
$ git branch --contains <commit-id>
检查分支是否具有特定提交。
# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>
使用完全匹配搜索分支(例如,feature
)。
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
例如如果您有3个名为feature
,feature1
,feature2
的本地分支,那么
$ git branch --contains <commit-id> | grep 'feature'
# output
feature
feature1
feature2
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
# output
feature
您还可以同时在local
和remote
分支中搜索(使用-a
),或仅在remote
分支中搜索(使用-r
)。
# search in both 'local' & 'remote' branches
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'
# search in 'remote' branches
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'
答案 2 :(得分:4)
要列出包含提交的本地分支:
git branch --contains <commit-id>
并列出所有包含提交的分支(仅包括远程分支):
git branch -a --contains <commit-id>
类似地检查commit是否在特定分支中:
git log <branch> | grep <commit_id>
,如果分支在本地不存在,请在分支名称前加上origin/
答案 3 :(得分:1)
通过@torek提取评论作为答案:
有关如何查找包含指定提交的所有分支的信息,请参见建议的副本。要确定当前分支是否包含提交C,请使用“管道”命令git merge-base --is-ancestor
。如果C是HEAD的祖先,则当前分支包含C,因此:如果git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
答案 4 :(得分:0)
git branch --contains <commit-id> --points-at <target branch name>
如果该分支中存在提交ID,它将返回目标分支名称。否则,该命令将失败。
答案 5 :(得分:0)
是的,另一种选择:
git rev-list <branch name> | grep `git rev-parse <commit>`
这对我来说是最好的,因为它也可以在本地缓存的远程分支(例如remotes/origin/master
)上使用,而在这些分支上git branch --contains
将不起作用。
这不仅涵盖了OP关于“当前分支”的问题,但我觉得问这个问题的“任何分支”版本是愚蠢的,所以我还是决定在此处发布。
答案 6 :(得分:0)
由于此问题的答案很不错,因此我添加了我的收藏夹。
这将向您显示$n
中最后$br
个提交,其中每个分支包含:
br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'
这是相似的,但对于分支列表却是相同的:
br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done
答案 7 :(得分:0)
仅在已签出的本地分支机构中签入。
pip
检入所有分支(已获取的本地和远程)
git branch --contains $COMMIT_ID
确保获取遥控器
git branch -a --contains $COMMIT_ID