我要做的是版本检查。我想确保代码保持在最小版本之上。因此,我需要一种方法来知道当前分支是否包含指定的提交。
获取包含特定提交的分支列表。
# 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)。
feature
$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'
如果你有3个本地分支,分别叫feature, feature1, feature2,那么
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)。
local
remote
-a
-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$'
有多种方法可以实现这一结果。第一个简单的选项是使用git log并使用grep搜索特定的提交,但这并不总是准确的
git log
grep
git log | grep <commit_id>
最好直接使用git branch来查找包含给定COMMIT_ID的所有分支
git branch
COMMIT_ID
git branch --contains $COMMIT_ID
下一步是找出当前分支,这可以在git 1.8.1使用后完成
git 1.8.1
git symbolic-ref --short HEAD
结合在一起的
git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID
但是上面的命令不会返回true或false,如果提交在当前分支中,则有一个更短的版本返回退出代码0,如果不是则返回退出代码1
git merge-base --is-ancestor $COMMIT_ID HEAD
退出码很好,但当你想要字符串true或false作为答案时,你需要再添加一点,然后结合bash中的if
true
false
if
if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi
git branch --contains <commit-id> --points-at <target branch name>
如果提交id存在于目标分支中,它将返回目标分支名称。否则命令执行失败。
提取@torek的评论作为答案:
有关如何查找包含指定提交的所有分支,请参阅建议的副本。
要找出当前的分支是否包含提交C,请使用"plumbing"命令git merge-base --is-ancestor。如果C是HEAD的祖先,则当前分支包含C,因此:
git merge-base --is-ancestor
if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash else echo I do not contain commit $hash fi
(旁注:在shell脚本中,退出0的命令为“true”,而退出非0的命令为“false”。)
是的,另一个选择:
git rev-list <branch name> | grep `git rev-parse <commit>`
这对我来说是最好的,因为它也适用于本地缓存的远程分支,如remotes/origin/master,而git branch --contains将无法工作。
remotes/origin/master
git branch --contains
这不仅仅是OP关于“当前分支”的问题;但我发现问“任何分支”是愚蠢的。这个问题的版本,所以我决定张贴在这里。
因为这个问题有一些很好的答案,我添加了我最喜欢的。
这个函数会告诉你,对于$n在$br中的最后一次提交,哪个分支包含了每一个:
$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
列出包含commit的本地分支:
git branch --contains <commit-id>
列出所有包含commit的分支,只包括remote:
git branch -a --contains <commit-id>
类似地,检查commit是否在特定的分支中:
git log <branch> | grep <commit_id>
如果分支在本地不存在,则用origin/前缀分支名
origin/
只在本地分行查,那已经签出去了。
检入所有分支(获取的本地和远程分支)
git branch -a --contains $COMMIT_ID
确保获取遥控器
git fetch origin
在Windows机器的Windows/CMD终端上。你可以:
> git log | findstr "commit-id"
如:
> git log | findstr "c601cd6366d"
Git签出将返回到当前HEAD(当前文件)的分支,但不会签出所有分支。例如,如果你做了一个git检出master,代码将被检出,就像你在master分支上一样,但它不会检出该分支以外的任何文件进行更改。