从我的git历史中删除4个提交

时间:2012-06-20 05:29:08

标签: git git-rebase

我做了一些提交并将它们推送到我的存储库中。然后我做了拉取请求,但我意识到有些提交我不想在拉请求中。

他们看起来像这样:

My commits look like this:

Correct HTML    
ab1c41c 

HTML escaping   
8b38955 

Merge branch 'master' into internationalized    
2854662

Modified config 
b942f13 

tried pushing   
b73d792 

Added assets    
f20106e 

Added config    
408118f 

Fixed views conflicts   
86f2509 

added layouts   
da27e11 

Fixed layout markup
92d6bcc 

如果我想摆脱这些提交:

Modified config 
b942f13 

tried pushing   
b73d792 

Added assets    
f20106e 

Added config    
408118f 

我该怎么办?请注意,我想保留那些我想要删除的那些:

Correct HTML    
ab1c41c 

HTML escaping   
8b38955

3 个答案:

答案 0 :(得分:14)

你可以interactive rebase

假设您的头部位于示例中的ab1c41c,请按以下方式调用rebase

git rebase -i HEAD~7

这告诉git你想操纵最后8个左右的提交。您将被列入编辑器,其中包含提交列表和一些说明。

删除包含要删除,保存和退出的提交的行。 Git会预先制作rebase,就是这样。

请记住,由于rebase,如果你想推送到同一个分支,你需要传递选项--force

免责声明重新定位和强行推动可能会导致您失去工作或让人失望,所以请确保您了解自己在做什么。 :)

答案 1 :(得分:3)

正如Blake Taylor提到here,您可以使用interactive rebase重新排序提交(或)删除中间提交。

但是,在将这些提交推送到公共存储库之前,必须这样做。 Refer here。在您的情况下,这些提交已经在公共回购中提供。所以,我不建议使用rebase。

如果您不想在工作目录中提交这些提交。

  • a)创建一个分支,指向86f2509(工作树中的最后一个稳定提交)。

    git checkout -b <branch name> 86f2509

  • b)Cherry Pick您想要的那些提交。在您的情况下ab1c41c8b38955

    git cherry-pick 8b38955 ab1c41c

现在您的工作目录不会有那些不需要的提交。

答案 2 :(得分:1)

只需在之前的提交中使用--hard重置:

git reset --hard 86f2509

要注意:你将永远失去这些承诺,无法回头。 此外,如果某人已经提交了您想要摆脱的提交,事情可能会变得混乱。 在这种情况下,你可能想看看'git revert'。