【问题标题】:Remove Old Commit from source code从源代码中删除旧提交
【发布时间】:2013-03-29 09:25:41
【问题描述】:

据我了解,每个 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 linesJust one more line 在提交 2 中进行了更改)

【问题讨论】:

    标签: git extract history


    【解决方案1】:

    您可以使用 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
    

    【讨论】:

    • 这会保留“已删除的提交”数据,不是吗?
    • 提交仍然在对象数据库中,但在一段时间后可以进行垃圾回收(假设没有其他分支仍然指向它)。从用户的角度来看,提交似乎已经消失了。
    • 有什么方法可以保存数据?
    【解决方案2】:

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

    【讨论】:

    • +1,这是正确答案。除非在特殊情况下,否则不应使用变基。
    • 我不同意。变基是一件好事。这是一项清理历史记录以使其更易于他人阅读的操作。在这种情况下,删除一个错误的提交,以便其他人根本不需要阅读它。
    • @KlasMellbourn,是的,我一直这样做。但我总是想起斯大林时代从照片中消失的人……
    【解决方案3】:

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

    git rebase -i HEAD~2
    

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

    【讨论】:

    • 这将删除该提交的所有历史记录,不是吗?有没有办法做到这一点,而不是删除那个提交,它会在没有旧提交数据的情况下再次提交?
    • 如果你想这样,你基本上想恢复提交 2
    • 应该是git revert HEAD~。这会创建一个新的提交,以逆转倒数第二个提交中所做的更改。然后,所有这些提交都将在您的版本历史记录中可见。
    猜你喜欢
    • 2021-09-23
    • 2018-10-18
    • 2018-07-19
    • 2023-02-08
    • 2016-05-27
    • 2011-01-14
    • 2021-04-21
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多