在线性历史中,两个提交 A 和 B 可以具有以下三种状态之一:
- A 和 B 是相同的提交
- A 严格在 B 之前
- B 严格在 A 之前
Git 的非线性历史允许四个附加选项
- A 和 B 共享父母和孩子
- A 和 B 共享一个父级,但没有一个子级
- A和B共享一个孩子但没有父母
- A和B不共享
我不确定如何在不使用移植点的情况下实现最后两个,但它可能会发生。
我不确定如何以一种简单的方式确定这种关系——目前我只能想到一个有点奇怪的rev-list
解决方案,即单独测试每个案例:
[[ "$a" = "$b" ]] && echo "same"
git rev-list "$b" | grep -q "$a" && echo "a before b"
git rev-list "$a" | grep -q "$b" && echo "b before a"
cat <(git rev-list "$a") <(git rev-list "$b") | sort | uniq -cd | grep -q 2 && echo "A and B share parents"
cat <(git rev-list --children "$a") <(git rev-list --children "$b") | sort | uniq -cd | grep -q 2 && echo "A and B share children"
必须有一种更好的、更糟糕的方式来做到这一点,那是什么?