3

据我了解,每个 git commit 都会存储自上次提交以来对跟踪文件所做的更改。有没有办法让你从源代码中删除一个旧的提交?例如,如果您有一个文本文件

文本文件.txt

Text line one
More text line

你继续承诺git commit -m "Initial Commit"

然后您再次编辑 textfile.txt

文本文件.txt

Text line one
More text line
Even more lines
Just one more line

你继续承诺git commit -m "Added new lines 2"

然后,您进行了最终编辑

文本文件.txt

Text line one
More text line
Even more lines
Just one more line
These are the last lines
In this file

并承诺git commit -m "Added new lines 3"

有没有办法删除提交号 2 中的所有更改(“添加新行 2”),以便文件看起来像:

文本文件.txt

Text line one
More text line
These are the last lines
In this file

(请注意已删除的行Even more lines以及Just one more line在提交 2 中所做的更改)

4

3 回答 3

4

您可以使用 rebase 来做到这一点(您不需要交互式 rebase):

git rebase HEAD --onto HEAD~2

这基本上意味着:

从 HEAD 获取所有提交并进一步(因此提交),并将它们应用于父级的父级(您的第一次提交)。因此,父提交(您的第二次提交)被跳过。

前:

     HEAD
      |
A--B--C

后:

A--B--C
 \
  C'
  |
 HEAD

您的 HEAD 现在指向C'(原始 C 的副本),但C'现在A作为父级而不是B.

编辑:

从您对 Klas Mellbourn 的回答的评论来看,您似乎想要保留提交,但想要撤消它的更改。就是git revert这样。

git revert HEAD~1
于 2013-03-29T09:42:25.297 回答
3

其他答案(由 KlasMellbourn 和 Ikke 提供)删除了提交,“它从未发生过”。像这样重写历史并不好(但有时是必要的......)。您可以使用git revert(只需发出它以--help获取详细信息)创建一个新的提交来撤消旧的提交。

于 2013-03-30T02:33:05.657 回答
2

进行交互式变基并删除该提交

git rebase -i HEAD~2

这将在编辑器中向您显示两个提交的列表。完全删除您不想要的提交行。保存并关闭编辑器以完成变基。提交和更改将从您的可见历史记录中消失(原始提交仍在存储库中,但最终将被垃圾收集)

于 2013-03-29T09:36:35.323 回答