如何按git拓扑顺序从第二位父母中排除第一位父母?

时间:2019-05-02 20:25:39

标签: git

我正在尝试自定义git拓扑提交顺序,以便仅在没有这样的第一父级时显示第二父级。 这是设置脚本:

touch a
git add a
git commit -m "a"

git checkout -b feature_b
touch b
git add b
git commit -m "b"

git checkout master
echo "1" > a
git commit -am "a1"

git checkout feature_b
git merge --no-ff -m "master to feature_b" master

git checkout master
git merge --no-ff -m "feature_b to master" feature_b

结果

$ git log --graph --abbrev-commit --format=oneline
*   697e92f (HEAD -> master) feature_b to master
|\  
| *   2eaef1a (feature_b) master to feature_b
| |\  
| |/  
|/|   
* | 2f83cbf a1
| * c4aa6df b
|/  
* d8f1101 a

问题是如何告诉git在“ a1”之前列出提交“ b”? 这样输出看起来像这样

*   697e92f (HEAD -> master) feature_b to master
|\  
| * 2eaef1a (feature_b) master to feature_b
| |\
| * c4aa6df b
| | |  
| |/
|/|
* | 2f83cbf a1
|/  
* d8f1101 a

我要问的原因是在master和release分支之间合并并强制执行是很常见的。如果可能的话,不重新排序提交似乎更方便。此外,第一个提交“ 697e92f”明确声明“ 2eaef1a”在“ 2f83cbf”之后。并且由于“ c4aa6df”是“ 2eaef1a”的一部分,因此应将它们一起显示。

尝试了不同的git选项,但是它没有一个,或者我缺少了一些东西。

3 个答案:

答案 0 :(得分:1)

原来,已经有一个Git补丁可以完全满足我的需求。该补丁是两个月前由Micha Nelissen发布的。 这是link

它引入了一个新选项“ --tree”

这是它的工作方式:

$ git log --tree --oneline
*   697e92f (HEAD -> master) feature_b to master
|\  
| * 2eaef1a (feature_b) master to feature_b
| * c4aa6df b
* 2f83cbf a1
* d8f1101 a

感谢大家的评论!

答案 1 :(得分:0)

不幸的是,没有。 Git有--first-parent,它排除了所有的父母,除了第一个父母以外,但没有条件“如果有多个父母,则排除第一父母”或“当提交时排除第二父母以外的所有父母”是合并”选项。

您可以做的虽然很痛苦,但是可以使用git rev-list来枚举与父母一起提交的内容:

git rev-list --parents HEAD

读取输出,一次一行。如果显示的提交是合并,请记住其父级。排除第一位父母(如果需要,还可以拥有其自己的父母),直到第二位父母的后代回到第一位父母为止。如果需要,请添加--topo-order,以帮助限制已释放父母的顺序。取得您自己的算法的输出,该算法选择要显示的提交,并将其提供给git log --no-walk --stdin

答案 2 :(得分:-1)

  

不重新排列提交顺序似乎更方便[…]第一个提交“ 697e92f”明确声明“ 2eaef1a”在“ 2f83cbf”之后。

我在这里看不到任何重新排序。因为您总是说“妈妈和爸爸”,您的妈妈一定比您的爸爸大吗?不。您在一个列表中的位置不会“明确说明”您在其他列表中的位置。

  

由于“ c4aa6df”是“ 2eaef1a”的一部分,因此应将它们一起显示。

2f83697e一样,是c4aa的一部分。两次提交都必须分开以绘制您明确请求的祖先链接

基本上,您已经发现了表示方式上的限制,并通过主动错误地表示明确要求的主要内容来建立一个相当似锦的案例,以“改善”历史显示的次要方面。