如何在推送的存储库中合并三个旧提交?

时间:2018-09-12 06:30:03

标签: git

我有一个可供三个人使用的存储库。 该存储库已推送到服务器并可以进行生产。我们只有master分支。

如果我使用git log,那么我会遇到类似的事情:

commit 9999999 Author: A
commit 8888888 Author: B
commit 7777777 Author: A
commit 6666666 Author: C
commit 5555555 Author: B
commit 4444444 Author: A
commit 3333333 Author: A
commit 2222222 Author: C

但是我想拥有:

commit 9999999 Author: A
commit 8888888 Author: B
commit 7777777 Author: A
commit 6666666 Author: C
commit 5555555 Author: B // or other commit name
commit 2222222 Author: C

所以我想将3333333、4444444和5555555合并到5555555。

是否所有人都可以下载这些更改并且该应用程序可以在生产环境中正常工作?

1 个答案:

答案 0 :(得分:2)

就在我开始之前,Tim Biegeleisen在上面的评论中写的是正确的。如果您在服务器上重写历史记录,这意味着所有协作者将不同步,并且可能将需要存储库的全新克隆。您也可能没有权限重写服务器上的历史记录。

如果我没有正确理解,那么您正在寻求将提交444444433333332222222合并为2222222。在这种情况下,您打算做一个rebase

我建议将您的存储库克隆到另一个目录中,以用作沙箱(cd ~/my_sandbox; git clone ~/my/repo/location)。这是一种安全措施。如果您在变基过程中的任何时候都遇到问题,则可以键入git rebase --abort,然后您应该回到开始的位置(所有提交)。

如果您希望合并最近的 3次提交,请输入: git rebase -i HEAD~3

然后,您将在文本编辑器中看到一个交互式屏幕。

pick 4444444 Commit message #4
pick 3333333 Commit message #3
pick 2222222 Commit message #2

将这三个都压缩成一个:

pick 4444444 Commit message #4
s 3333333 Commit message #3
s 2222222 Commit message #2

保存并退出文本编辑器。
然后,将显示另一个屏幕,您可以在其中创建全新的提交消息:

[ Squashed commit ]
 - This is a squashed commit of my most recent 3 commits.

注意:每行以#开头的行都将被忽略,并且不包含在新的提交消息中。保存并退出文本编辑器。

键入git log以查看新外观。 3个最新提交将被压缩为一个。但是请记住,它将有一个新提交哈希,而不是2222222。如果要检查工作,可以键入git show以显示压缩的提交中的所有更改。