【问题标题】:I am completely lost in how to delete a loose commit in Git我完全迷失在如何删除 Git 中的松散提交
【发布时间】:2020-09-14 20:19:01
【问题描述】:

我正在努力学习 Git。这是我的Git commit history

我想删除以下松散的提交:

  • e4ab7e8
  • 6d93a36
  • 2a604a9
  • f31bf0e

我正在从我的 Git 存储库中恢复、变基和重置地狱。但无论我做什么,提交历史似乎只会增长。有什么帮助吗?

【问题讨论】:

  • 如果一个提交真的很松散,它会在几天后自动清理。您可以通过各种方式(垃圾收集等)加速该过程,但我不推荐这样做。别担心。要开心。了解 git 是什么,不要与之抗争。
  • 为什么要删除它们?你运行什么命令才能看到它们?如果它们不属于任何 ref,Git 通常不会显示它们。
  • @knittl 我认为,你是对的。提交显示在我的 reflog 中。这已经帮助了我很多。因此,似乎在这些提交被正确合并或重新调整之前,该分支已被删除。所以现在他们就住在那里。但是我不需要它们的内容,所以我不需要将它们合并到我的主分支中。我应该把它们原样留在那里吗?

标签: git reset rebase revert


【解决方案1】:

理解这一点的关键是 Git 是关于提交的。每个提交指向一个或多个父提交(没有父提交的根提交除外)。

分支只是单个提交的“标签”。每次移动这个标签,你在这个分支上创建一个新的提交。通过遵循提交的父点,Git 可以重建历史记录。

分支(记住:标签)也可以手动移动,或者它们可以通过提交之外的其他操作移动:合并、重置、变基等。

当提交变得无法访问(有时是“悬空”)时,这意味着不再有 ref[^1] 指向该提交。 ref 通常是分支(=动态标签)或标签(=静态标签)。

Git 不会立即删除悬空提交,而是将它们留在本地存储库中。这使您可以回到以前的状态,以防万一您搞砸了。正如您所发现的那样,您的分支的旧状态存储在 reflog 中。 reflog 维护了所有以前签出的提交的列表。

reflog 中的条目在给定时间段后过期。因此,提交现在真的无法访问。 Git 会在特定情况下(时间、对象数量等)自动运行垃圾回收。垃圾收集时,真正无法访问的提交也将从您的存储库中永久删除。

TLDR:不用担心,它们最终会被删除。

[^1]:reference

的缩写

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 2018-09-13
    • 2012-01-07
    • 2012-07-01
    • 2015-11-05
    • 1970-01-01
    • 2017-02-04
    • 2011-01-30
    • 2011-09-06
    相关资源
    最近更新 更多