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