删除某个提交,就好像它从未发生过一样

时间:2012-08-23 00:29:06

标签: git

我有一个看起来像

的日志
  

c2ba4f3cfd3e8b29e634b41d7178ffe38f8c9f0a版本0.1   d825b48fe86107c3842f62c9e9bc5f290a2c2475 test2   0a06037c3c29a0c9446707e884d9b2777336db59测试   c7453d959fc86d2868076b3900e0fd1ed63e2709开始

所有已经被推送到我的原始服务器但是我想以这样一种方式合并提交,即我所做的唯一一个是带有注释version 0.1的提交。当我推送它时,服务器必须反映提交合并。

简而言之,我希望存储库只有一个提交,其中包含我命名的内容。

我一整天都尝试过rebase并且无法获得理想的结果。我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

强制性警告:更改已经推送到远程存储库的历史记录对于使用存储库的任何其他人来说都是一个巨大的麻烦。

互动式rebase可以帮助您。

# start an interactive rebase onto the parent (~) of 'begin'
git rebase -i c7453d9~

交互式rebase将弹出一个如下所示的编辑器:

pick c7453d9 begin
pick 0a06037 test
pick d825b48 test2
pick c2ba4f3 version 0.1

如果您希望保留所有提交的所有更改,但让它们看起来像一次提交,请将其更改为:

reword c7453d9 begin
fixup 0a06037 test
fixup d825b48 test2
fixup c2ba4f3 version 0.1

reword将提示您更改提交消息(将其更改为“版本0.1”),fixup会将提交中的所有内容提取到上一次提交中。最终结果将是包含所有四个内容的单个提交。

完成同样事情的另一种方法:

pick c7453d9 begin
fixup 0a06037 test
fixup d825b48 test2
squash c2ba4f3 version 0.1

squash将提交内容提取到上一次提交中,但允许您更改提交消息(在本例中为“0.1版”)。

如果您想完全放弃前三次提交的更改并且只保留上一次的更改,请将rebase行更改为:

pick c2ba4f3 version 0.1

基本上,删除前三行。最终结果将只是'版本0.1'提交,没有来自先前提交的任何内容。

修改完历史记录后,您需要使用--force强制push到您的遥控器。

答案 1 :(得分:0)

您可以删除之间的提交。

git reset --mixed c7453d9
git checkout c2ba4f3cf -- .
git add -A
git commit -C c2ba4f3cf