如何从GIT中删除提交?

时间:2014-11-20 15:37:51

标签: git

MacBook-Pro:$ git log
commit 3d3232089a4a3683230b10865f1a3b2c59ecb5db
Author: ********
Date:   Thu Nov 20 13:25:56 2014 +0200

    view added

commit f59c3d655b9c4ab9b224af285b50e456d6e1d7f2
Author: ********
Date:   Thu Nov 20 13:23:50 2014 +0200

    lol

commit a4c52b4a543204cd182687df87ee1723adc02e92
Author: ********
Date:   Thu Nov 13 20:30:12 2014 +0200

    tmp

如何从GIT中删除提交,保持本地代码不变?例如,我想要删除lol

2 个答案:

答案 0 :(得分:0)

听起来你想要做一个互动的rebase。当您运行此命令时,编辑器将打开,您将能够看到提交列表,其中包含其SHA,提交消息以及每次提交时要执行的操作。默认情况下,它们都将被“挑选”。我们有7个选项来处理提交:pick,squash,edit,reword,fixup,exec和delete。删除你只是需要删除该行,但你也将丢失代码更改。相反,我们想要压缩提交,将其合并到之前的提交中。然后,如有必要,我们可以重新提交提交消息,然后继续。它看起来像这样

git rebase --interactive --root master
#editor opens up

您的文件将如下所示:

pick a4c52b4 tmp
pick f59c3d6 lol
pick 3d32320 view added

我们需要更改第二行以“删除”lol提交:

pick a4c52b4 tmp
squash f59c3d6 lol
pick 3d32320 view added

保存并关闭文件后,git将解析文件并重新绑定。在壁球上,它将打开另一个编辑器窗口,允许您根据需要调整提交消息。如果出现严重错误,git会将您引导至命令行。然后,您可以运行git rebase --abort并且git应该将所有内容修复到其原始状态。

几个笔记

这会重写您的提交历史记录。如果这些提交已被推送和分享,那么推动并告诉每个人你必须重写历史以便他们采取适当的措施是不值得的。但是,如果您的提交仅限本地,或者远程git存储库仅用于您的目的,则应该没问题。您必须运行git push --force告诉git事情可能与遥控器不匹配,并且它只需要强制推动。

答案 1 :(得分:0)

首先确保在上次提交后工作目录中没有任何更改。 如果有一些,请将它们存储(git stash,在重写提交历史记录后,使用git stash apply重新应用更改)或使用它们更新最后一次提交(git commit --am在大多数情况下都可以)。< / p>

然后:

$ git rebase -i <commit-pointer>

其中提交指针是提交哈希或HEAD~[number]。您希望清除之前的目标是提交。这将是lol的提交更改。

编辑器(可能是nano)将显示由Git(git-rebase-todo)创建的临时文件。 按照说明操作(您将更改&#39;选择f59c3d6 lol&#39; fixup f59c3d6 lol&#39;)并保存文件(Ctrl-X,y,Enter)。

如果您要将更改从lol应用到较新的提交,则必须使用view added标记squash提交,并在保存git-rebase-todo文件后另一个将弹出提交的压缩提交消息。编辑并保存。

改变提交N提交前的复杂性类似于O(N),所以最好不要从项目的一开始就改变一些东西,或者至少去喝咖啡。