【问题标题】:Git - do amended commits persist?Git - 修改后的提交是否持续存在?
【发布时间】:2015-09-10 11:27:19
【问题描述】:

在我的 Git 分支上,我创建了一个提交并推送。后来,我对索引添加了更改,使用了git commit --amend,然后使用了git push -f。我的新提交覆盖了我分支上本地和远程的第一个提交。

此时,我希望(或希望)原始提交不再存在,或者至少存在(可能在 reflog 中)但不再有父提交,因此,一旦我运行 GC,它就会不复存在。但是,提交似乎仍然存在,并且其父级仍然完好无损。 (在这种情况下,我发现它的方式是通过 Jira,它将我链接到我在 github 上的覆盖提交)

为什么会这样?它将如何被删除?这是否意味着,每当我不小心将密码推送到 GitHub,然后使用git commit --amendgit reset,然后使用git push -f,提交实际上永远不会真正被删除?

【问题讨论】:

  • 修改后的提交是否仍然存在? 是;见this answer

标签: git git-amend


【解决方案1】:

来自git help gc

--prune=<date>

修剪比日期更早的松散对象(默认为 2 周前,可由配置变量 gc.pruneExpire 覆盖)。 --prune=all 修剪松散的物体,无论其年龄大小。 --prune 默认开启。

所以你可能想运行git gc --prune=all

【讨论】:

    【解决方案2】:

    git 2.7(2015 年第四季度)引入了关于“git gc --prune=all”的警告

    参见 Junio C Hamano (gitster)commit fae1a90(2015 年 10 月 14 日)。
    (由 Junio C Hamano -- gitster -- 合并到 commit ce555f3,2015 年 10 月 20 日)

    Documentation/gc:警告--prune=<now>

    git gc”可以随时安全运行,只是因为它具有内置的宽限期来保护由等待引用更新的其他进程创建的对象,以将它们锚定到历史记录。
    为了在没有宽限期的情况下运行,用户必须确保 存储库处于静止状态

    静止:在git user manual page中已经提到:

    您应该只在静止状态下运行 git prune 存储库——有点像做一个文件系统fsck恢复:你 在挂载文件系统时不想这样做。

    所以静止意味着处于不活动或休眠的状态或时期。

    新文档提到:

    --prune=all 修剪松散的物体,无论其年龄大小
    除非您确切知道自己在做什么,否则不要使用 --prune=all
    除非存储库处于静止状态,否则您将丢失尚未使用 ref 锚定的新创建的对象并最终损坏存储库
    )。
    --prune 默认处于启用状态。

    【讨论】:

      猜你喜欢
      • 2013-09-06
      • 1970-01-01
      • 2016-02-08
      • 2016-12-06
      • 2020-08-23
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多