线性化git历史记录,保留所有提交

3
我想把一个包含合并提交的git历史记录转换为单一线性历史记录,但不将分支中的所有提交压缩为单个提交。
也就是说,从以下内容开始:
* d667df5 (HEAD -> master) Modify merged file
*   233e181 Merge branch 'featurebranch'
|\
| * bca198d (featurebranch) Modify the second file
| * fdc4e08 Add a different file
* | 5e0c25f Modify file yet again
* | 2426135 Modify file again
* | eb56b32 Modify file
|/
* c94a83e Add a file
* bfbfaaa Initial commit

我想要一行文字,如下所示:
* d667df5 (HEAD -> master) Modify merged file
* bca198d Modify the second file
* fdc4e08 Add a different file
* 5e0c25f Modify file yet again
* 2426135 Modify file again
* eb56b32 Modify file
* c94a83e Add a file
* bfbfaaa Initial commit

我想要这样做的原因是,我正在与另一个开发人员在一个特性分支上工作。当他拉取我的更改时,他反复使用了git pull(即创建合并提交),而不是使用变基。我希望在将其合并到主分支之前,这个特性分支的历史记录是线性的。
注:我知道结果中的提交 ID 可能会有所不同。我也知道重写历史的所有常见后果。
更新:这不是这个问题的重复,因为我想保留分支中的单独提交,而不是将它们压缩成一个提交。

在你的例子中,主线没有与你的特性分支并行提交,这种情况会一直存在吗? - Micha Wiedenmann
1
也许你可以创建一个新的分支,然后手动在其上重放提交? - Mateen Ulhaq
1
你可以随时创建临时分支指针,并手动将其变基到任何你想要的地方。 - evolutionxbox
1个回答

4

我想你希望进行一个变基操作。请确保工作目录中没有任何更改。我喜欢的全局思路是在新分支上工作,以重新组织历史记录,然后将此分支设置为主分支。

git checkout -b workingBranch featurebranch // create a new branch and checkout to featurebranch
git rebase 5e0c25f // This create your linear history, instead of merge. You may have to resolve commit for each commits of featurebranch
git checkout master
git reset --hard workingBranch // You will lose the commit d667df5 (HEAD -> master) Modify merged file. If it is not wanted, cherry-pick or rebase again
git branch -D workingBranch

我希望你能够受益。

这是一种简单的方法,使用 git rebase 批量复制提交。唯一的缺点是你得到 git rebase 选择的顺序,而你可能更喜欢各个提交的其他顺序。要选择自己的顺序,请按照此处所示的方式创建新分支进行 rebase,然后逐个 cherry-pick 每个提交。(注意:你可以使用 git checkout -b workingBranch featurebranch 在初始正确提交处创建新名称。) - torek
如果我理解正确,我认为交互式变基将允许您选择所需的顺序并解决您注意到的问题(我猜)。 - Flows
1
是的,交互式变基将允许您将提交重新排列为所需的顺序。我更喜欢手动挑选,因为我经常希望在进行每个提交时检查它,而不是在一个窗口中有一个大的“pick”命令列表,然后不得不弄清楚哪个哈希是哪个,然后一次性触发整个挑选序列,没有任何控制。但其他人可能会更喜欢那种方式。 :-) - torek
感谢您的解释,拥有不同的观点总是很有趣的。 - Flows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接