从 git 历史记录中删除并完全删除提交

vij*_*jay 10 git push github post-commit git-commit

我的 git 历史中有一个提交

1.commit 4930da17d8dd23d650ed38435d8b421816a0c451
  Date:   Sat Dec 5 14:34:18 2015 +0530

2.commit e1ebbbb599ee20ebec3ca92c26266d9fd16e7ccc
  Date:   Sat Dec 5 13:22:20 2015 +0530

3.commit 1c4a11a80eb054d24dafec2efed0b0282188e687
  Date:   Sat Dec 5 12:11:50 2015 +0530

4.commit b4ab3c164a3a8d93e0a71a94b5c561cb5e20ebf6
  Date:   Sat Dec 5 12:09:56 2015 +0530

5.commit 167b1d10258381f09663ce61fa88ce3bbcd404c4
  Date:   Sat Dec 5 12:09:21 2015 +0530

6.commit c61bcadac673e1c83f4c14b66d56e23b12fa3198
  Date:   Sat Dec 5 12:07:58 2015 +0530
Run Code Online (Sandbox Code Playgroud)

在第三次和第四次提交中包含错误的代码,但我在不知不觉中提交并推送了。

3.commit 1c4a11a80eb054d24dafec2efed0b0282188e687
  Date:   Sat Dec 5 12:11:50 2015 +0530

4.commit b4ab3c164a3a8d93e0a71a94b5c561cb5e20ebf6
  Date:   Sat Dec 5 12:09:56 2015 +0530
Run Code Online (Sandbox Code Playgroud)

但第五次和第六次提交包含正确的代码。我需要这个承诺才能工作。

5.commit 167b1d10258381f09663ce61fa88ce3bbcd404c4
  Date:   Sat Dec 5 12:09:21 2015 +0530

6.commit c61bcadac673e1c83f4c14b66d56e23b12fa3198
  Date:   Sat Dec 5 12:07:58 2015 +0530
Run Code Online (Sandbox Code Playgroud)

现在我想完全删除并删除我在第三次和第四次提交中更改的所有内容。

我想从 git 历史记录中删除第三次和第四次提交。但不是第五和第六。

这样我的分支才会安全。

Ali*_*ani 13

您可以使用interactive rebase来返回提交历史记录并以不同的方式执行操作。要使用交互式变基,只需:

\n\n
git rebase -i <commit_id>\n
Run Code Online (Sandbox Code Playgroud)\n\n

<commit_id>是您要编辑的最后一次提交的父级。执行此命令后,只需将d或放在drop您要删除的提交前面,甚至删除与该提交对应的行。

\n\n

运行此命令会在文本编辑器中显示提交列表,如下所示:

\n\n
pick f7f3f6d changed my name a bit\npick 310154e updated README formatting and added blame\npick a5f4a0d added cat-file\n\n# Rebase 710f0f8..a5f4a0d onto 710f0f8\n#\n# Commands:\n#  p, pick = use commit\n#  r, reword = use commit, but edit the commit message\n#  e, edit = use commit, but stop for amending\n#  s, squash = use commit, but meld into previous commit\n#  f, fixup = like "squash", but discard this commit\'s log message\n#  x, exec = run command (the rest of the line) using shell\n#\n# These lines can be re-ordered; they are executed from top to bottom.\n#\n# If you remove a line here THAT COMMIT WILL BE LOST.\n#\n# However, if you remove everything, the rebase will be aborted.\n#\n# Note that empty commits are commented out\n
Run Code Online (Sandbox Code Playgroud)\n\n

交互式变基为您提供了一个它将运行的脚本。它将从您在命令行上指定的提交开始,并从上到下重放每个提交中引入的更改。它在顶部列出了最旧的,而不是最新的,因为 \xe2\x80\x99 是它将重播的第一个。

\n\n

但由于您已将分支推送到上游存储库,因此请将此历史重写传达给您可能的同事,如git 文档所述:

\n\n
\n

再次记住,这是一个变基命令\xe2\x80\x93,无论您是否更改消息,该范围内包含的每个提交都将被重写。不要\xe2\x80\x99包含您已推送到\n中央服务器\xe2\x80\x99的任何提交,\n这样做会通过提供\n相同更改的替代版本来迷惑其他开发人员。

\n
\n


dri*_*san 8

您可以使用 git rebase -i 以交互方式重写历史记录:

git rebase HEAD~6 -i 
Run Code Online (Sandbox Code Playgroud)

将打开您的编辑器并允许您将多个提交压缩为一个,或者将它们从历史记录中完全删除(通过删除编辑器中这些提交的行。) ~6 表示重写最后 6 个提交,-i 表示执行此操作交互地。在您的情况下,您需要删除“pick 1c4a11a”和“pick b4ab3c”的行。

请注意,编辑器中启动的最新提交是最后一行,而不是第一行,并且由于您正在重写历史记录并且已经推送,因此您还必须“git push --force”,不仅仅是“git Push”才能将您的更改发送到上游。

  • 我一直在寻找的确切命令 - 四年多后仍在拯救生命:) (3认同)