使用Git,我如何显示所有共享共同祖先的提交树?

时间:2015-11-03 21:46:28

标签: git tree branch ancestor

假设我有一个'主人'分支机构,审查和分支机构我的团队批准的更改(称之为“阶段”),以及一系列基于阶段分支的功能分支。 (我们的想法是将更改分组为从舞台到主节点的常见拉取请求。)

如何根据" root"显示所有更改的日志?舞台分支?我希望能够看到该团队/主题的所有功能正在进行中。在vanilla Git术语中,如何获取可以达到给定(root)提交的所有提交的日志?对于我的生活,我找不到办法做到这一点。我可以为具有共同祖先的两个分支执行此操作,但不适用于从共同祖先派生的 N 分支。

3 个答案:

答案 0 :(得分:0)

我认为这可以通过使用std::vector(正如问题评论中的torek所建议的)和git branch --contains <id>的组合来完成。

具体来说,假设您对所有感兴趣的分支都有本地分支(如果没有,请尝试将git rev-list-r添加到-a命令),然后以下应该做我认为你想要的事情:

git branches

$ git rev-list $(git branches --contains <ancestor>) --not <ancestor> --pretty=oneline rev-list是一个命令,它将列出所有可从某些父母而非其他父母访问的修订。 在上面的调用中,我们使用包含给定祖先的所有分支的列表作为起点,然后排除该祖先之前的所有历史记录。 添加git告诉命令包含提交的简要描述;它通常只会输出每行一次的修订ID。

请记住,这可能不会完全符合您的要求,因为我认为提交是按时间顺序排序的,而不是通过提交的拓扑图。 --pretty=oneline有一个数量的选项,因此可能有一个可以控制该排序。

如果你真的想要列出所有具有给定祖先的提交,那么有一种更强力的方法(尽管它将包括其他无法访问的提交和存储)。 我们再次使用git rev-list,但不是传递有趣分支列表,而是指定rev-list

--all

答案 1 :(得分:0)

  

如何获取可以到达给定(root)提交的所有提交的日志?

git log --ancestry-path --all --not $given

使用您想要的任何显示选项。 --graph --decorate --oneline是通常的起点,--simplify-by-decoration显示尽可能少的未装饰提交,同时仍显示分支结构。

答案 2 :(得分:-1)

我遇到了同样的问题。 谷歌搜索并没有带来适合的东西,所以我决定写一个剧本。 https://gist.github.com/lvitya/66a9f519d30b7fd2c90d8f95a0b3a1a1

或者使用下一个代码:

#!/bin/bash -x
# $1 == ancestor

BR_LIST=$(git for-each-ref --contains "$1" --format="%(refname)")
git log "$1"^! $BR_LIST --oneline --decorate --graph

这将生成从给定祖先开始的所有提交的图表。也就是说,您可以根据公共主分支查看所有功能分支。

$ ~/scripts/git_show_graph_from_ancestor.sh master
* feature2
* commit
* commit
| * feature1
| * commit
|/
* master