避免 Git 日志中的圣诞树 --all

Avoid Christmas tree in Git log --all

我最近创建了一个 release 分支,我在其中合并了所有标记的提交。目标是将 master 重命名为 develop 然后使用 master 作为 release 分支(git-flow like)

现在,当我用 git log --all 显示我的完整日志时,我得到了一棵很棒的圣诞树,但并不是很有用。

* | e503add 10 days ago 
| *   a2948b1 11 days ago 
| |\
| * \   b22e247 3 weeks ago 
| |\ \
| * \ \   01f1ebc 4 weeks ago   
| |\ \ \
| * \ \ \   01336c7 4 weeks ago  
| |\ \ \ \
| * \ \ \ \   59f83a8 5 weeks ago 
| |\ \ \ \ \
| * \ \ \ \ \   25a2444 6 weeks ago  
| |\ \ \ \ \ \
| * \ \ \ \ \ \   4271ae9 6 weeks ago 
| |\ \ \ \ \ \ \
| * \ \ \ \ \ \ \   ef62400 8 weeks ago 
| |\ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \   f56aa1e 2 months ago
| |\ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \   7fdab4a 4 months ago  
| |\ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \   b25d101 4 months ago
| |\ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \   7477021 6 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \ \   8b166b4 8 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \ \ \   93be56f 9 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \   7b28785 1 year, 4 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ \   4aaa409 1 year, 4 months ago
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \   4cab662 1 year, 5 months ago 
| |\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
| * \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \   996564a 1 year, 6 months ago 

一种解决方案是使用 git log --date-order 而不是默认值 --topo-order。但是我无法真正解释为什么我会收到这样的日志。

我使用这个 shell 脚本创建了我的发布分支:

#!/bin/bash
set -e
git checkout -b release $first-tag
for tag in "${tags[@]}"
do
    date=$(git show -s --format="%ad" $(git log -n1 --format=%h $tag))
    export GIT_AUTHOR_DATE=$date;
    export GIT_COMMITTER_DATE=$date;
    git merge -Xtheirs -m $tag $tag
    git tag --delete $tag
    git tag -a -m $tag $tag
done         

如何在 --topo-order 中避开这棵圣诞树?

--topo-order 在多头 [*] 时表现不佳。如果您想要漂亮的图片,请尝试将其与特定分支一起使用,而不是 --all(在您的情况下为 release)。

[*] 提交必须在它被合并到的任何提交之后,所以如果一些以前的版本提交放在当前版本之后,它会强制所有分支下降,导致树。

重现我所见问题的示例脚本:

#!/bin/sh

set -e

git init
git commit --allow-empty -m init
git tag init
for i in $(seq 1 10)
do
 sleep 1
 git commit --allow-empty -m b$i
 git branch b$i
 git reset --hard init
done
for i in $(seq 1 10)
do
 sleep 1
 git merge --no-edit b$i
done
git branch merge1
git reset --hard init
for i in $(seq 1 10)
do
 sleep 1
 git merge --no-edit b$i
done