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

Tie*_*Dad 114 git

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

Jir*_*riS 154

有多种方法可以实现这一结果.第一个选项天真选项是使用git log和搜索特定的提交grep,但这并不总是精确的

git log | grep <commit_id>
Run Code Online (Sandbox Code Playgroud)

您最好git branch直接使用查找包含给定COMMIT_ID使用的所有分支

git branch --contains $COMMIT_ID
Run Code Online (Sandbox Code Playgroud)

下一步是找出自git 1.8.1使用以来可以完成的当前分支

git symbolic-ref --short HEAD
Run Code Online (Sandbox Code Playgroud)

并结合在一起

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID
Run Code Online (Sandbox Code Playgroud)

但上面的命令不返回true或false,如果commit在当前分支中,则返回退出代码0的较短版本如果不是,则退出代码1

git merge-base --is-ancestor $COMMIT_ID HEAD
Run Code Online (Sandbox Code Playgroud)

退出代码很不错,但是当你想要字符串truefalse作为答案时,你需要添加更多,然后与ifbash 结合使用

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
Run Code Online (Sandbox Code Playgroud)

  • 那不对; 如果`git log`由于其他原因提到提交SHA,则`grep`可能导致误报,例如,在提交消息中提到它是来自另一个分支的端口的结果. (7认同)
  • 请参阅该问题的评论,该评论使用内置的git工具集./sf/ask/3047459271/#comment74126598_43535132 (3认同)
  • 我喜欢第一个选项,但为了排除 Adam 的反对意见,我将选项 `--format=format:%H` 添加到 `git log`。 (2认同)

Saj*_*han 64

获取包含特定提交的分支列表.

# get all the branches where the commit exists
$ git branch --contains <commit-id>
Run Code Online (Sandbox Code Playgroud)

检查分支是否具有特定提交.

# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>
Run Code Online (Sandbox Code Playgroud)

feature使用完全匹配搜索分支(例如).

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
Run Code Online (Sandbox Code Playgroud)

例如,如果你有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     
Run Code Online (Sandbox Code Playgroud)

您还可以在同时进行搜索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$'
Run Code Online (Sandbox Code Playgroud)

  • 根据 [对相关问题的评论](/sf/ask/189475821/#comment9642845_2707110) 添加`-r `("remote") 或 `-a` ("all") 选项到 `git branch` 以查找可能不会在本地 repo 克隆中复制的分支。 (2认同)

hgr*_*rey 14

列出包含提交的本地分支:

git branch --contains <commit-id>

并列出所有包含提交的分支,仅包括远程分支:

git branch -a --contains <commit-id>

类似地检查提交是否在特定分支中:

git log <branch> | grep <commit_id>

如果本地不存在分支,则分支名称前缀为origin/


Pra*_*nha 14

仅在当地分支机构检查,已检查。

git branch --contains $COMMIT_ID
Run Code Online (Sandbox Code Playgroud)

签入所有分支(获取的本地和远程分支)

git branch -a --contains $COMMIT_ID
Run Code Online (Sandbox Code Playgroud)

确保获取遥控器

git fetch origin
Run Code Online (Sandbox Code Playgroud)


Zit*_*rax 12

@torek 提取的评论作为答案:

请参阅建议的副本以了解如何查找包含指定提交的所有分支。

要查明当前分支是否包含提交 C,请使用“管道”命令git merge-base --is-ancestor。如果 C 是 HEAD 的祖先,则当前分支包含 C,因此:

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi
Run Code Online (Sandbox Code Playgroud)

(旁注:在 shell 脚本中,退出零的命令为“true”,而退出非零的命令为“false”。)


log*_*cor 5

是的,另一种选择:

git rev-list <branch name> | grep `git rev-parse <commit>`
Run Code Online (Sandbox Code Playgroud)

这对我来说效果最好,因为它也适用于本地缓存的远程分支,例如remotes/origin/master,在这些分支上git branch --contains不起作用。

这不仅涵盖了 OP 关于“当前分支”的问题,但我发现问这个问题的“任何分支”版本很愚蠢,所以我还是决定在这里发帖。