一个问题

有些需求有好几期,做后面几期的可能完全不了解前几期做了什么,拿到分支号后,就需要找到最初的commit点。由于这个分支已经merge到了master上,所以找最近的ancestor就不对了。

1
git merge-base branch1 branch2 //只能找到最近的祖先

那么如何找到这个分支最初的fork点呢,下面给出两种方案,亲测有效。

解决方案

git 别名

1
2
3
git config --global alias.oldest-ancestor '!zsh -c '\''diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne "s/^ //p" | head -1'\'' -'
git config --global alias.branchdiff '!sh -c "git diff `git oldest-ancestor`.."'
git config --global alias.branchlog '!sh -c "git log `git oldest-ancestor`.."'

上述三个命令就可以找到最初的commit点,以及这个分支做了什么。参见stackoverflow上的回答: Finding a branch point with Git? - Stack Overflow

git分支图

如果你使用zsh, 内置的有两个相关的命令glgg,glgga.

  • glgg: 显示当前分支的分支图
1
2
➜  ~  alias glgg
glgg='git log --graph'
  • glgga: 显示所有分支的分支图
1
2
➜  ~  alias glgga
glgga='git log --graph --decorate --all'

从分支图中可以快速的看出当前分支是在哪里fork出来的

分支图的显示方式

  • reverse chronological: 默认显示方式,会按照commit的时间,逆序显示

  • topo order: 按照commit的拓扑顺序显示,子提交在父提交之前显示

查看fork点的时候,最好是按照拓扑排序显示,这样分支图不会很乱,便于找到。

可视化工具

可视化工具和git log的用法是一样的,顺着查找即可。这里我用idea为例:

开启InteliSort后,注意红框勾上。

开启后是按照提交排序的,并没有按照插入的时间,这样可以清楚的顺着提交找到最初的fork点。

参考

  1. Finding a branch point with Git? - Stack Overflow

  2. git图示所有分支的历史 - ChuckLu - 博客园

  3. Git Book 中文版 - 查看历史 -Git日志