通过“git revert”删除文件是一个bug吗?

通过“git revert”删除文件是一个bug吗?,git,shell,Git,Shell,要重现看起来像bug的行为,让我们执行以下操作: 创建临时目录: $ mkdir tmp $ cd tmp 创建一些文本文件: $ echo "some text" > tmp.txt 正在初始化空Git存储库: $ git init $ git commit $ git log --oneline Staging tmp.txt: 将工作树更改记录到存储库: $ git init $ git commit $ git log --oneline 正在检查对存储库的更改:

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

创建临时目录:

$ mkdir tmp
$ cd tmp
创建一些文本文件:

$ echo "some text" > tmp.txt
正在初始化空Git存储库:

$ git init
$ git commit
$ git log --oneline
Staging tmp.txt:

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

$ git init
$ git commit
$ git log --oneline
正在检查对存储库的更改:

$ git init
$ 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不关心文件是何时创建的。它关心修订版上的内容。在修订版上,该文件是使用特定内容创建的。。。然后你要求还原的内容仍然是一样的,它会删除文件

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

某些文件内容的含义还不够清楚。该文件是在git存储库尚未创建时创建的。???没关系。对于git,您在该修订版上创建了文件并添加了内容。让我这样说:如果你是git,你会在第一次修订版上保存什么?添加内容?在不存在的修订版上不存在的文件上?让我稍微介绍一下git在响应中的工作方式,这样您就可以了解一些上下文。我明白了。$git add tmp.txt之后,该文件已被跟踪和暂存,但尚未成为工作树或.git目录的一部分。$git commit之后,833f4b3 tmp.txt已成为.git目录或工作树的一部分。在$git之后,将833f4b3 git还原回工作目录,相应地恢复到git提交之前的.git目录的状态。在git提交之前,工作树没有tmp.txt。所以文件必须删除。我很高兴你有这个想法。然而,从技术上讲:不完全如此。一旦您将一个对象添加到暂存区域,git就会将这些对象、文件和目录放入其数据库中。然后git将在您提交时创建一个不同类型的对象,一个修订。