如何合并两个Git提交记录

4

我已经提交了一系列的代码,现在发现我希望将两个提交合并。不是最后两个提交,而是再往前一些。

我的日志:

commit 326f35d83963660893d065e480f231b76f052dd2
Author: Peter Smit <peter@something.eu>
Date:   Thu Dec 16 11:13:47 2010 +0200

    Small editing in ASR chapter

commit 652b4c27a5fcb2125ed82aea31421fca4e8eee47
Author: Peter Smit <peter@something.eu>
Date:   Thu Dec 16 11:12:55 2010 +0200

    Added longtable package for abbreviations

commit 74069a151cce9c47484403c1db76e68e1360d8ee
Author: Peter Smit <peter@something.eu>
Date:   Thu Dec 16 11:12:23 2010 +0200

    Changed some headings in the introduction

commit 94126f79fdc6f4927a3f270c152393377e9ef5a5
Author: Peter Smit <peter@something.eu>
Date:   Thu Dec 16 11:11:57 2010 +0200

    Added abbreviations chapter

所有四个提交都在更改不同的文件,因此不可能存在合并冲突。

我想将 652b4(添加了长表格)添加到 94126(添加了缩写)的提交中。我该怎么做?


可能是git:重写历史记录:重新排序和合并提交的重复问题。 - Josh Lee
2个回答

10

这种情况可以通过使用交互式变基来处理。请注意,不要修改已推送的历史记录的标准警告仍然适用。 Git Book 中有一个不错的解释,但我个人认为 rebase -i 的界面完全相反。

通过命名需要修改的最早提交的父节点(parent)来开始变基:

$ git rebase -i 94126f7^

一个编辑器会弹出来,按照时间顺序列出提交记录(所以你需要把头倒过来)。列表中包含从HEAD到命名提交的子节点的每个提交记录,这就是为什么你要给它的父节点命名的原因:

pick 94126f7 Added abbreviations chapter
pick 74069a1 Changed some headings in the introduction
pick 652b4c2 Added longtable package for abbreviations
pick 326f35d Small editing in ASR chapter

你需要做的是把提交记录652b4c2squash到94126f7上,所以你需要把它的命令改成“squash”,并将其直接移动至后者之后:

pick 94126f7 Added abbreviations chapter
squash 652b4c2 Added longtable package for abbreviations
pick 74069a1 Changed some headings in the introduction
pick 326f35d Small editing in ASR chapter

保存并退出;接下来弹出的编辑器将用于合并提交信息。您可以任意更改此信息,然后退出即可完成变基。

在变基过程中遇到冲突可能很烦人(有些补丁根本无法交换位置),合并尤其棘手,但重新排序文件添加不会有任何问题。


比我的回答更详细。+1 - VonC

3
如果您还没有提交那些提交,请执行git rebase --interactive命令(参见交互式变基)。这样您就可以将这两个提交合并成一个。

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