3

假设我有一个“master”分支,一个为我的团队审查和批准更改的分支(称为“stage”),以及一堆基于 stage 分支的特性分支。(这个想法是将更改分组为从阶段到主的公共拉取请求。)

如何根据阶段分支的“根”显示所有更改的日志?我希望能够看到该团队/主题正在进行的所有功能。用普通的 Git 术语来说,我怎样才能获得可以到达给定(根)提交的所有提交的日志?对于我的生活,我找不到办法做到这一点。我可以对具有共同祖先的两个分支执行此操作,但不能对源自共同祖先的N个分支执行此操作。

4

3 回答 3

0

我被同样的问题困住了。谷歌搜索没有带来合适的东西,所以我决定写一个脚本。 https://gist.github.com/lvitya/66a9f519d30b7fd2c90d8f95a0b3a1a1 它有助于可视化您的提交树。

这是脚本git_show_graph_from_ancestor.sh的内容

#!/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
于 2017-06-12T07:59:25.897 回答
0

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

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

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

于 2017-06-12T21:25:25.413 回答
0

我认为这可以通过使用git branch --contains <id>(正如torek在对问题的评论中所建议的那样)和git rev-list.

具体来说,假设您对所有感兴趣的分支都有本地分支(如果没有,请尝试将-r或添加-agit branches命令中),那么以下应该做我认为您所追求的:

$ git rev-list $(git branches --contains <ancestor>) --not <ancestor> --pretty=oneline

gitrev-list是一个命令,它会列出所有可以从某些父级访问但不能从其他父级访问的所有修订的列表。在上述调用中,我们使用包含给定祖先的所有分支列表作为起点,然后排除该祖先之前的所有历史记录。添加--pretty=oneline告诉命令包含提交的简要描述;它通常只会每行输出一个修订 ID。

请记住,这可能并不完全符合您的要求,因为我认为提交是按时间顺序排列的,而不是按提交的拓扑图排序的。 git rev-list虽然有很多选项,所以可能有一个可以控制该排序。

如果您确实只想列出具有给定祖先的所有提交,那么有一种更暴力的方法可以做到这一点(尽管它将包括其他无法访问的提交和存储)。我们再次使用rev-list,尽管我们没有传递有趣的分支列表,而是指定--all

$ git rev-list --all --not <ancestor> --pretty=oneline
于 2016-02-28T19:08:36.013 回答