避免 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
我最近创建了一个 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