给定提交ID,如何确定当前分支是否包含提交?

时间:2017-04-21 06:08:11

标签: git

我正在尝试做的是版本检查。我想确保代码保持在最低版本之上。所以我需要一种方法来知道当前分支是否包含指定的提交。

8 个答案:

答案 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

退出代码很不错,但是当您想要字符串truefalse作为答案时,您需要添加更多内容,然后与来自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个名为featurefeature1feature2的本地分支,那么

$ git branch --contains <commit-id> | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

# output
feature     

您还可以同时在localremote分支中搜索(使用-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