在遵循时间顺序的同时如何重新提交到一个分支?

时间:2019-01-20 16:51:17

标签: git

如何将两个分支重新设置为一个分支,以便按创建时间对提交进行排序?

示例情况:

* cf28348 (HEAD -> master) g [2019-01-07]
* 2613a13 d [2019-01-04]
| * 887ba70 (feature) f [2019-01-06]
| * 96c6abf e [2019-01-05]
| * 909eee5 c [2019-01-03]
|/  
* ed32245 b [2019-01-02]
* 645aaf9 a [2019-01-01]

所需结果(省略了哈希):

* (HEAD -> master) g [2019-01-07]
* f [2019-01-06]
* e [2019-01-05]
* d [2019-01-04]
* c [2019-01-03]
* b [2019-01-02]
* a [2019-01-01]

1 个答案:

答案 0 :(得分:0)

您可以使用两个连续的变基操作来执行此操作,但是严重的缺点是结果最终不会成为masterfeature分支的子代:它将分支到重新排列提交的第一个地方。这也意味着您必须使用push -f来推动此更改,这可能不会使您的团队感到满意。

如果您不介意该警告,请尝试:

MERGE_BASE=`git merge-base master feature`
git rebase master
git rebase -i $MERGE_BASE

然后,您将必须手动订购提交:

pick 0a95943 c
pick 7e0c4a3 d
pick 57b52d2 e
pick 84a23b7 f
pick 0ad6b79 g

在rebase窗口中,您将看不到日期,因此我将在并行窗口中运行此命令以提供帮助:

git log --graph --decorate --author-date-order master feature

我在评论中看到您想要一个非交互式解决方案:如果您想进一步自动化,您可以为添加到git log的{​​{1}}命令的输出编写一个解析器。提取要按正确顺序选择的提交,但是--pretty=oneline似乎没有任何选择。

实际上,此log命令将更易于解析:

rebase

这是一个最小的解析器,它可以生成您需要提供给交互式资源库的内容:

git log --pretty=oneline  --author-date-order $BASE..feature $BASE..master