从源代码中删除旧提交

时间:2013-03-29 09:25:42

标签: git extract history

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

TextFile.txt的

Text line one
More text line

然后你开始提交git commit -m "Initial Commit"

然后再次编辑textfile.txt

TextFile.txt的

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

然后你开始提交git commit -m "Added new lines 2"

然后你做了最后的编辑

TextFile.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行和第34行;),以便文件看起来像这样:

TextFile.txt的

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

(请注意已删除的行Even more linesJust one more line已在提交2中进行了更改

3 个答案:

答案 0 :(得分:4)

您可以使用rebase执行此操作(此时不需要交互式rebase):

git rebase HEAD --onto HEAD~2

这基本上意味着:

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

在:

     HEAD
      |
A--B--C

后:

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

您的主管现在指向C'(原始C的副本),但C'现在A为父代,而不是B

编辑:

根据您对Klas Mellbourn的回答的评论,您似乎想要保留提交,但想要撤消它的更改。这就是git revert的作用。

git revert HEAD~1

答案 1 :(得分:3)

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

答案 2 :(得分:2)

执行交互式rebase并删除该提交

git rebase -i HEAD~2

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