【问题标题】:Do a file removal by “git revert” is a bug?通过“git revert”删除文件是一个错误吗?
【发布时间】:2020-08-21 14:18:49
【问题描述】:

要重现看起来像错误的行为,让我们执行以下操作:

创建一个临时目录:

$ mkdir tmp
$ cd tmp

创建一些文本文件:

$ echo "some text" > tmp.txt

初始化空的 Git 存储库:

$ git init

暂存tmp.txt:

$ git add tmp.txt

将工作树更改记录到存储库:

$ git commit

检查对存储库的更改:

$ git log --oneline

833f4b3 (HEAD -> master) 重现还原错误:添加 tmp.txt

恢复初始提交:

$ git revert 833f4b3

$ ls -al  # Shows that tmp.txt was deleted

在那之后,期望git revert 仅将tmp.txt 留在工作树中而不将其从工作树中删除会更合乎逻辑。因为tmp.txt 在初始提交之前就已经存在了。

【问题讨论】:

    标签: git shell


    【解决方案1】:

    Git 不关心文件的创建时间。它关心修订中的内容。在修订版中,创建的文件具有特定内容...然后您要求还原(内容仍然相同),它会删除该文件。

    提供一些上下文: 当 git 创建修订版时,它不会保存很多关于文件的信息(当它是文件时)......除了内容......和一些权限标志。因此,在第一个修订版中,您创建了一个修订版对象,修订版对象将指向一个树对象,根目录信息......以及该目录上的子目录和文件。在您的情况下,在根目录树对象上,您会看到 yet 另一个对象,即我们正在讨论的文件,它指向一个 blob 对象(文件内容本身)。因此,git 知道它将恢复什么的方法是与您要恢复的版本的先前版本进行比较。以前的修订版不存在,所以 git 理解您想要将文件作为一个整体收回,因为在此修订版之前该文件不存在......在修订版之后,该文件确实存在并且有一些内容。如果您想恢复它,如果内容匹配,文件必须消失......如果您更改了内容(例如在第二个修订版上)然后您尝试恢复第一个修订版,您会看到树冲突...和内容冲突?不确定内容冲突。树冲突开始了,因为如果内容与在还原操作中添加的修订版中的内容不匹配,git 不会尝试删除文件。

    【讨论】:

    • 某些文件内容的含义还不够清楚。该文件是在尚未创建 git 存储库时创建的。
    • ???没关系。对于 git,在该修订版中,您 创建了文件 并添加了内容。让我这样说吧:如果你是 git,你会在第一次修订中节省什么?添加内容?在 non existing 修订版中不存在的文件上?让我稍微介绍一下 git 在响应中的工作方式,以便您了解一些上下文。
    • 我明白了。在 $ git add tmp.txt 之后,此文件已被跟踪和暂存,但尚未成为工作树或 .git directory 的一部分。在$ git commit 833f4b3 tmp.txt 成为.git directory 或工作树的一部分之后。并且在$ git revert 833f4b3git 之后根据.git directory 之前的.git directory 的状态返回工作目录git commit。在git commit 工作树之前没有tmp.txt。所以该文件必须被删除。
    • 很高兴你有这个想法。但是,从技术上讲:不完全是。将对象添加到暂存区域后,git 会将这些对象(文件、目录)放入其数据库中。然后 git 会在你提交时创建一个不同类型的对象,一个修订版。
    猜你喜欢
    • 2021-04-11
    • 2017-07-09
    • 2023-03-18
    • 2019-03-09
    • 2011-06-30
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多