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

18

我已经进行了一些提交并将它们推送到我的存储库中。然后我发起了一个拉取请求,但我意识到有一些提交我不想在拉取请求中出现。

这些提交看起来像这样:

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

1
你想要摆脱掉这三个提交的所有文件和修改吗?或者你只是不想显示提交信息? - vincent mathew
你想把那些提交放在中央存储库里吗?还是只放在你的工作目录里? - Karthik Bose
3个回答

28

你可以进行交互式变基

假设你的当前分支的提交为示例中的ab1c41c,则可以按如下方式调用变基命令:

git rebase -i HEAD~7

这告诉 Git 你想要操作最后的8个或者更多提交记录。你会被带入到编辑器中,看到一个提交记录列表和一些说明。

删除包含需要删掉的提交记录的行,保存并退出。Git 将执行 rebase 操作,就是这样。

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

免责声明 Rebasing 和 force pushing 可能会导致你丢失工作或惹怒别人,所以确保你知道自己在做什么。 :)


3
警告:不要在已经推送到公共代码库的提交上进行变基操作。请参考此处。在这种情况下,这些提交已经在公共代码库中可用。 - Karthik Bose

8

正如Blake Taylor在这里提到的那样,您可以使用交互式变基来重新排序提交(或)删除中间提交。

但是,在将这些提交推送到公共存储库之前必须完成此操作。请参阅此处。在您的情况下,这些提交已经可在公共存储库中使用。因此,我不建议使用变基。

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

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

    git checkout -b <分支名称> 86f2509

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

    git cherry-pick 8b38955 ab1c41c

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


0

在提交之前使用 --hard 进行重置:

git reset --hard 86f2509

注意:你将永久失去这些提交,无法回退。 此外,如果有人已经拉取了你想要摆脱的提交,情况可能会变得混乱。 在这种情况下,你可能需要考虑使用“git revert”。


1
如果之前有一些提交我想要保留怎么办?我进行了复刻,其中有一些提交我想要保留。 - Hommer Smith
我猜你需要创建一个分支,重置,然后挑选你想要的顶部提交。 - Kenneth Hoste

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