虽然 Dav 的说法是正确的,即信息并未直接存储,但这并不意味着您永远无法找到答案。您可以执行以下几项操作。
查找提交所在的分支
git branch -a --contains <commit>
这将告诉您历史记录中具有给定提交的所有分支。显然,如果提交已经被合并,那么这就没那么有用了。
搜索转发日志
如果您正在进行提交的存储库中工作,则可以在引用日志中搜索该提交的行。超过 90 天的引用日志会被 git-gc 删除,因此如果提交太旧,您将找不到它。也就是说,你可以这样做:
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 --pretty=oneline
,因此,如果您想调整输出格式以使 grep 可以使用不同的内容,那么这就是您的起点!
如果您不在进行提交的存储库中工作,那么在这种情况下您能做的最好的事情就是检查引用日志并查找提交首次引入存储库的时间;运气好的话,你就拿到了它所承诺的分支。这有点复杂,因为您无法同时遍历提交树和引用日志。您需要解析引用日志输出,检查每个哈希以查看它是否包含所需的提交。
查找后续合并提交
这是依赖于工作流程的,但是如果有良好的工作流程,就会在开发分支上进行提交,然后合并到其中。您可以这样做:
git log --merges <commit>..
查看以给定提交作为祖先的合并提交。 (如果提交仅合并一次,则第一个应该是您要进行的合并;否则我想您将不得不检查一些。)合并提交消息应包含已合并的分支名称。
如果您希望能够做到这一点,您可能需要使用--no-ff
选项git merge
即使在快进情况下也强制创建合并提交。 (不过,不要太急切。如果过度使用,这可能会变得令人困惑。)VonC对相关问题的回答 https://stackoverflow.com/questions/2850369/why-uses-git-fast-forward-merging-per-default/2850413#2850413对这个主题进行了有益的阐述。