撤消git命令-git签出--

撤消git命令-git签出--,git,git-checkout,Git,Git Checkout,是否有方法撤消以下git命令: git checkout -- . 我试图删除添加到repo目录但未暂存或提交的文件。该命令似乎没有这样做,而是更改了一些其他文件 更新: 未跟踪的归档文件和未归档文件之间存在差异。在这种情况下,我想找到一种方法来丢弃未跟踪和未老化的文件。当我运行git checkout--.时,我以为它会清除未跟踪的文件,但据我所知,它只清除了未老化的文件。git checkout--path将索引/暂存区域复制到工作树 如果您命名的路径是一个目录,Git会将它知道的所有文件

是否有方法撤消以下git命令:

git checkout -- .
我试图删除添加到repo目录但未暂存或提交的文件。该命令似乎没有这样做,而是更改了一些其他文件

更新:

未跟踪的归档文件和未归档文件之间存在差异。在这种情况下,我想找到一种方法来丢弃未跟踪和未老化的文件。当我运行
git checkout--.
时,我以为它会清除未跟踪的文件,但据我所知,它只清除了未老化的文件。

git checkout--path
将索引/暂存区域复制到工作树 如果您命名的
路径是一个目录,Git会将它知道的所有文件(如在索引/暂存区域中找到的)复制到工作树中,从该目录开始,包括所有子目录

不过,要使用这个答案,您需要了解每个文件的三个活动副本

每个文件的(最多)三份副本 请记住,在Git中,每个文件最多有三个版本始终处于活动状态。例如,假设您在存储库中提交了名为
README.txt
a.ext
的文件。在任何给定时间,您都可以使用三份
README.txt
,以及三份
a.ext
。三份副本中有两份是仅限Git的特殊格式

如果我们使用
git show
用于访问仅git格式文件的语法,我们可以这样描述这三个副本:

    HEAD             index        work-tree
---------------   -----------     ----------
HEAD:README.txt   :README.txt     README.txt
HEAD:a.ext        :a.ext          a.ext
如果您现在创建一个新的未跟踪文件
b.dat
,您有:

    HEAD             index        work-tree
---------------   -----------     ----------
HEAD:README.txt   :README.txt     README.txt
HEAD:a.ext        :a.ext          a.ext
                                  b.dat
索引/暂存区域中还没有
b.dat
的副本。另外两个文件有两个逻辑上独立的副本,即使它们在
头和索引中都相同。(当它们相同时,Git会自动共享底层副本,因此不需要额外的空间。)

工作树副本是普通文件 工作树中存储的任何文件的任何副本都只是普通文件。你可以用它做任何你的计算机允许你做的事情。Git不关心您对这些文件做了什么。如果你问Git有什么不同,Git会告诉你工作树副本和索引副本不同

git add path
从工作树复制到临时区域 假设此时您使用您喜欢的任何编辑器修改
README.txt
,该编辑器编辑工作树副本(除非它非常熟悉Git,否则它根本不能使用或接触索引副本)。工作树副本现在与索引副本不同。索引副本采用特殊的Git-only格式,可以进行下一次提交

现在需要运行git add README.txt
,将更新后的工作树文件复制到索引中。当您这样做之后,
README.txt
的旧版本仍然是
HEAD
commit格式,也采用仅限Git的特殊格式,但是现在
HEAD:README.txt
不同于
:README.txt
,而
:README.txt
README.txt
相同

每个文件的
提交副本为只读;索引副本不可用 任何提交中的任何内容都无法更改。因此,您提交的
README.txt
副本和提交的
a.ext
副本将安全地保存在存储库中,直到永远。索引/暂存区域中的副本可能与
头上的副本相同,也可能与
提交上的副本不同,可以随时覆盖该副本。它的开头与
HEAD
commit中的开头相同,但是
git add将工作树中的副本添加到索引中


1如果放弃或删除提交(通常通过
git reset
git rebase-i
),则可能会导致git丢失冻结副本:冻结副本只在包含它的提交时持续。然而,大多数Git都是围绕着添加新提交的思想构建的,而不删除旧的提交

2如果您可以克服“签出或提交后头和索引匹配”的正常情况。这个答案中没有足够的空间来讨论这些细节


git commit
将所有索引副本冻结到新提交中 git commit
所做的是以当时索引中的格式获取索引中的每个文件,并将其冻结为只读提交副本。此提交的文件集将成为新的
提交。一旦
git commit
完成运行并返回提示,您就有了一个新的commit,您的
HEAD
commit和您的索引匹配,因为git根据索引进行了新的提交

未跟踪的文件 Git非常简单地定义了一个未跟踪的文件:它是一个不在索引中的文件。这就是它的全部,但它有一个强烈的后果:如果
b.dat
不在索引中,
git commit
将不会将其放入新的commit中。此外,
git checkout--
找不到
b.dat
,因为它不在索引中,所以无法覆盖工作树副本

请注意,仅仅因为存储库中的某个提交中存在某个文件,并不意味着该文件被跟踪!当且仅当该文件当前在索引中时,才会跟踪该文件。如果对确实包含该文件的提交运行
git签出
,那么此时git会将该文件从提交复制到索引中,然后复制到工作树中。此时将跟踪该文件。如果随后从索引中显式删除该文件,则此时将停止跟踪该文件。因此,您必须始终记住或测试索引中是否有某个特定文件的副本,以了解它是否被跟踪

git checkout提交--路径
从提交复制到索引和工作树 这里,还有