【问题标题】:Does Git store amends?Git 存储是否修改?
【发布时间】:2013-06-21 12:15:40
【问题描述】:

我知道它们存在于git reflog 中,但是如果我将提交推送到远程存储库,请修改,然后git push --force(警告:通常应避免使用pushing --force 到远程存储库),我覆盖的提交是否存在于某处?

【问题讨论】:

    标签: git version-control git-amend


    【解决方案1】:

    我覆盖的提交是否存在于某处?

    仅在:


    请注意,ORIG_HEADmemento from a time where reflog didn't existed yet不是由git commit(如git commit --amendgit commit --amend -m "new comment")创建/更新的。
    因此,如果reflog 未在 repo 上激活,则 ORIG_HEAD 不能用于引用修改后的提交。

    【讨论】:

    • 我应该注意的是,通常推送到裸存储库,并且裸存储库默认禁用 reflog。所以第二点应该有一个很大的“如果”。
    • @kostix 好点,我在答案中包含了对裸仓库的 reflog 激活。
    • 我也相信(虽然我懒得检查)ORIG_HEAD 引用可能指向在执行修正之前引用的提交 HEAD。从理论上讲,如果由于某种原因在普通的本地存储库中禁用了 reflog(我的意思是,不需要手动探索运行 git fsck),这可能会减轻人们的负担。
    • @kostix 刚刚做了一个C:\Users\VonC\Prog\git\git>c:\prog\Gow\bin\grep.exe -nrHI "ORIG_HEAD" *:以下命令确实是一个update_ref("updating ORIG_HEAD", "ORIG_HEAD", head_commit->object.sha1git mergegit resetgit resolve(现已弃用)、git amgit rebase . 不是git commit。我刚刚测试过。
    • 谢谢。所以基本上它只能通过本地和远程的 reflog(最终被 GCed)访问?
    【解决方案2】:

    没有。您修改后的提交将在您的本地仓库中保留一段时间,但不会被推送。

    推送时,Git 会计算丢失的提交以使远程分支与本地分支位于同一点。由于您修改后的提交不再在分支上,因此不会被推送。

    修改后的提交会一直保留到垃圾回收发生。但是 GC 在删除提交之前会检查几个条件,所以不要害怕丢失数据。

    【讨论】:

    • 在 OP 描述的场景中,提交是在修改之前推送的。
    • 哦,是的,谢谢,我刚刚看到了。我一定误读了这个问题,因为它没有被编辑。顺便说一句,VonC 的回答非常好,我投了赞成票。
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多