有没有办法在给定SHA-1哈希值的情况下找出提交来自哪个分支?
如果您能告诉我如何使用 Ruby Grit 来完成此任务,则可以加分。
虽然 Dav 没有直接存储信息是正确的,但这并不意味着您永远无法找到。以下是您可以做的几件事。
git branch -a --contains <commit>
这将告诉您所有在其历史记录中具有给定提交的分支。显然,如果提交已经被合并,这将不太有用。
如果您在进行提交的存储库中工作,则可以在 reflogs 中搜索该提交的行。超过 90 天的 Reflog 会被 git-gc 修剪掉,所以如果提交太旧,你将找不到它。也就是说,你可以这样做:
git reflog show --all | grep a871742
找到提交 a871742。请注意,您必须使用提交的前 7 位数字缩写。输出应该是这样的:
a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite
表示提交是在分支“完成”上进行的。默认输出显示缩写的提交哈希,因此请确保不要搜索完整的哈希,否则您将找不到任何东西。
git reflog show实际上只是 grep 的别名git log -g --abbrev-commit --pretty=oneline,因此,如果您想修改输出格式以使 grep 可以使用不同的东西,那就是您的起点!
git reflog show
git log -g --abbrev-commit --pretty=oneline
如果您不在进行提交的存储库中工作,那么在这种情况下您能做的最好的事情就是检查 reflog 并找出提交首次引入存储库的时间;幸运的是,您获取了它所承诺的分支。这有点复杂,因为您不能同时遍历提交树和引用日志。您想要解析 reflog 输出,检查每个哈希以查看它是否包含所需的提交。
这是依赖于工作流的,但是对于良好的工作流,提交是在开发分支上进行的,然后合并到。你可以这样做:
git log --merges <commit>..
查看将给定提交作为祖先的合并提交。(如果提交只合并了一次,第一个应该是你之后的合并;否则你将不得不检查一些,我想。)合并提交消息应该包含被合并的分支名称。
如果您希望能够做到这一点,您可能希望使用该--no-ff选项git merge来强制创建合并提交,即使在快进情况下也是如此。(不过,不要太急切。如果过度使用,这可能会变得令人困惑。)VonC 对相关问题的回答有助于详细阐述这个主题。
--no-ff
git merge