给定SHA-1哈希值,是否有方法确定提交来自哪个分支?
如果你能告诉我如何使用Ruby Grit实现这一点,那就加分。
给定SHA-1哈希值,是否有方法确定提交来自哪个分支?
如果你能告诉我如何使用Ruby Grit实现这一点,那就加分。
当前回答
gitcheckout<SHA>->将使您进入分离的HEAD状态。
git rev parse--abbrev ref HEAD->将打印HEAD,因此此命令在这种状态下不起作用。
现在我们处于分离HEAD状态,可以使用以下命令获取分支名称。PS:如果您没有处于分离的HEAD状态,这将不起作用!
git branch -a --contains HEAD | sed -n 2p | awk '{ printf $1 }'
瞧!现在您有了分支名称。
其他回答
TL;博士:
如果您关心shell退出状态,请使用以下内容:
branch current-当前分支的名称分支名称-干净的分支名称(每行一个)分支名称-确保仅从分支名称返回一个分支
分支名称和分支名称都接受提交作为参数,如果没有给出,则默认为HEAD。
在脚本编写中有用的别名
branch-current = "symbolic-ref --short HEAD" # https://stackoverflow.com/a/19585361/5353461
branch-names = !"[ -z \"$1\" ] && git branch-current 2>/dev/null || git branch --format='%(refname:short)' --contains \"${1:-HEAD}\" #" # https://stackoverflow.com/a/19585361/5353461
branch-name = !"br=$(git branch-names \"$1\") && case \"$br\" in *$'\\n'*) printf \"Multiple branches:\\n%s\" \"$br\">&2; exit 1;; esac; echo \"$br\" #"
只能从一个分支进行提交
% git branch-name eae13ea
master
% echo $?
0
输出至STDOUT退出值为0。
可从多个分支访问的提交
% git branch-name 4bc6188
Multiple branches:
attempt-extract
master%
% echo $?
1
输出至STDERR退出值为1。
由于退出状态,可以安全地构建这些。例如,要获取用于获取的远程:
remote-fetch = !"branch=$(git branch-name \"$1\") && git config branch.\"$branch\".remote || echo origin #"
要查找本地分支机构,请执行以下操作:
grep -lR YOUR_COMMIT .git/refs/heads | sed 's/.git\/refs\/heads\///g'
要查找远程分支,请执行以下操作:
grep -lR $commit .git/refs/remotes | sed 's/.git\/refs\/remotes\///g'
除了在所有树中搜索直到找到匹配的哈希值之外,没有。
虽然Dav认为信息没有直接存储是正确的,但这并不意味着你永远都找不到。这里有一些你可以做的事情。
查找提交所在的分支
git branch -a --contains <commit>
这将告诉您其历史中具有给定承诺的所有分支。显然,如果提交已经被合并,这就不太有用了。
搜索回流
如果您正在进行提交的存储库中工作,可以在reflog中搜索该提交的行。gitgc会删除90天以上的反射,因此如果提交时间太长,您将找不到它。也就是说,您可以这样做:
git reflog show --all | grep a871742
找到提交a871742。请注意,您必须使用提交的缩写7个第一位数字。输出应该是这样的:
a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite
表明提交是在分支“完成”时进行的。默认输出显示缩写的提交哈希值,因此请确保不要搜索完整的哈希值,否则将找不到任何内容。
git reflog show实际上只是git log-g--abbrev commit--prett=oneline的别名,因此如果您想修改输出格式以使grep可以使用不同的内容,这就是您的出发点!
如果您不是在进行提交的存储库中工作,那么在这种情况下,您所能做的最好的工作就是检查reflog并查找提交首次引入存储库的时间;幸运的是,您获取了它提交到的分支。这有点复杂,因为您不能同时遍历提交树和reflog。您可能需要解析reflog输出,检查每个哈希,看看它是否包含所需的提交。
查找后续合并提交
这取决于工作流,但对于良好的工作流,在开发分支上进行提交,然后将其合并到中。您可以这样做:
git log --merges <commit>..
以查看将给定提交作为祖先的合并提交。(如果提交只合并了一次,那么第一次应该是您要进行的合并;否则,我想您必须检查一些。)合并提交消息应该包含合并的分支名称。
如果您希望能够做到这一点,您可能需要使用--noff选项来gitmerge,以强制创建合并提交,即使在快进情况下也是如此。(不过,不要过于急切。如果过度使用,这可能会让人困惑。)VonC对相关问题的回答有助于阐述这一主题。
简单的答案是Git不存储提交的分支的名称。试图重建这些信息的技巧似乎在所有情况下都不起作用。