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



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

示例情况:

* 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]

您可以通过两个连续的重新基本操作来完成此操作,但严重的缺点是,结果最终不会成为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命令的输出编写一个解析器,添加--pretty=oneline来提取要按正确顺序挑选的提交,但rebase似乎没有任何选项可以做到这一点。

事实上,这个日志命令将更容易解析:

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

这里有一个最小的解析器,它可以生成您需要提供给交互式rebase的内容:

| tac | sed 's/^/pick /'

最新更新