- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
它显示本地存储库,登台存储库,远程存储库还是其他位置的文件?
我经常看到“ git ls-files”中存在一个文件。该文件已从远程存储库中删除。之后,我尝试进行git pull。但是,该文件仍显示在此命令列表中。它不应在此处显示,因为它也不在远程存储库中。
最佳答案
摘要
您需要全神贯注,Git会为每个文件至少存储三个,有时最多多达五个活动副本:一个在当前提交中,一个(或两个或三个!)在索引中,以及一个(唯一的)您可以在工作树中看到并使用它。 git ls-files
命令查看这些副本,然后根据提供给git ls-files
的标志告诉您一些副本。
如果没有每个文件三到五个副本的想法,Git中的许多事情将永远毫无意义。 (嗯,尽管有些事情仍然棘手,但这完全是另一个问题。)
长
我认为这里有两个问题。一种需要一些术语,然后另一种应该适用:
[git ls-files
]是否显示本地存储库中的文件,
有点,但是:
登台存储库,
Git没有暂存库。每个存储库都有一个在不同的Git文档中称为索引或暂存区的东西。 (有一个过时的第三个名称,缓存,它也显示在the Git glossary中。)
远程仓库
绝对不是:根本不需要任何远程存储库(即,其他具有自己的存储库的Git),如果存在,只有git fetch
和git push
可以让您的Git调用其Git并与它们交换数据。 (好吧,git ls-remote
做git fetch
的头几位,而git pull
运行git fetch
,所以这两个也与远程交换数据。但是git ls-files
却不。)
还是其他地方?
是的,有点。这使我们回到了第一部分。因此,让我们采用the Git glossary中定义的这三个术语。下面的斜体(包括粗斜体)文本直接来自链接的文档:
资料库
refs的集合以及包含来自引用的object database的所有对象的reachable,可能还包含来自一个或多个porcelains的元数据。存储库可以通过alternates mechanism与其他存储库共享对象数据库。 (所有链接都是他们的)
当然,这充满了更多的术语。为了使它神秘化,他们在这里所说的是,适当的存储库不包括索引和工作树:它主要由提交(及其内容)组成。当然,这要求我们定义“索引”和“工作树”,因此让我们继续:
指数
具有统计信息的文件的集合,其内容存储为对象。索引是您的working tree的存储版本。说实话,它还可以包含工作树的第二个甚至第三个版本,在merging时使用。
工作树(我通常将此工作树称为):
实际检出文件的树。工作树通常包含HEAD提交树的内容,以及您已进行但尚未提交的所有本地更改。
提交被永久冻结
当您运行git commit
时,Git会为您所有文件(无论如何,所有被跟踪文件)创建快照,并将其以及一些元数据(例如您的姓名和电子邮件地址)存储在提交中。该提交基本上是永久性的-您可以摆脱提交,通常会遇到很多困难,但是为了方便起见,将它们视为永久性的-完全是完全100%只读的。像这样故意是只读的,因为它允许其他提交共享相同的文件副本,因此,如果一次,十次甚至一百万次提交同一文件,则实际上只有一个副本。资料库。只有当您将文件更改为新版本时,Git才能提交新的单独副本。
提交编号,但不是通过简单易用的顺序编号系统编号。也就是说,我们可以将它们绘制为一系列简单的带数字或字母的东西:
... <-C4 <-C5 <-C6 ...
.git
目录/文件夹中。
git add
的作用:
git add
从工作树中获取文件的普通副本,将其压缩为冻结干燥的格式,然后替换索引中的副本。或者,如果文件根本不在索引中,则将副本放入索引中。
git add
归档文件的原因。在Mercurial中,您只需
hg add
一个文件。之后,您只需运行
hg commit
,Mercurial就会查看它知道的所有文件,并将其冻结为新的提交。在大型存储库中,这可能需要很长时间。相比之下,Git已经在索引中拥有了它应该知道的所有文件,并且已经脱水,因此
git commit
可以将这些脱水的文件打包成一个新的冻结提交。这种速度的代价是
git add
,但是如果您对索引副本进行巧妙的欺骗(例如,使用
git add -p
),则不仅会获得提速的好处。
git merge
还是来自
git revert
或
git cherry-pick
或使用合并引擎的任何其他Git命令),并且操作都不顺利,Git会把所有三个输入每个文件都放入索引中,因此得到的不仅仅是三个
file.ext
副本。但是只要您不在合并的中间,索引中就只有一个副本。
HEAD
冻结副本匹配,或与工作树副本匹配,或两者都匹配。例如,在新的
git checkout
之后,所有三个副本都匹配。然后,您在工作树中修改
file.ext
:现在,提交和索引已匹配,但是它们与工作树副本不同。然后您
git add file.ext
,现在索引和工作树匹配,但是它们与冻结副本不同。然后,您
git commit
进行一个新提交,该提交成为当前提交,并且所有三个副本再次匹配。
vim file.ext
git add file.ext
vim file.ext
git status
会说您已暂存提交的更改,因为索引副本不同于当前提交的副本,并说您未暂存更改的提交,因为工作树副本不同从索引副本。
git add
。这些文件现在不在索引中,并且如果您运行
git commit
,它们也将不在新的提交中,因为Git从索引中构建了新的提交。
git rm --cached file.ext
file.ext
。 (当然,以前的提交仍然可以。)
git ls-files
的作用
git ls-files
的作用是读取所有内容:提交,索引和工作树。根据您为
git ls-files
提供的参数,它随后显示索引和/或工作树中某些或所有文件的名称:
git ls-files --stage
HEAD
提交和工作树中的副本。)或者:
git ls-files --others
HEAD
提交中的副本进行任何说明。)或者:
git ls-files --modified
HEAD
提交中的副本(或根本不在
HEAD
提交中的副本)不同的文件(的名称)。没有选择:
git ls-files
HEAD
提交或工作树中的文件。
关于git - “git ls-files”的作用是什么,以及如何从中删除文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56235287/
如果我执行 ls -la,我会得到如下结果 total 16 drwxr-xr-x 4 rockse staff 136 Apr 28 16:55 . drwx------+ 23 rocks
我找到了一些Linux文件,当我键入ls -lah时,它将输出以下权限格式: ... drwxr-xr-x. 2 root root ... -rw-rw-r--. 1 root r
我正在尝试从 python 执行 ls -l 来检查文件的最后修改日期。 os.listdir 不显示长列表格式。subprocess.call 显示格式,但实际上打印它,并返回 0。我希望能够将其放
以下 shell 函数定义卡在 Cygwin 的 bash 控制台 (RHEL/Ubuntu) 中,当它被调用时它只是退出终端。 $ function ls { ls; } $ ls 为什么会出现这种
为什么这两个命令的输出不同: ls | cat ls 第一个似乎用换行符分隔文件名。 这也适用于命令 suc 有 ls > outfile 和类似的东西。 我使用的是 Mac OSX,如果这有什么不同
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我使用 eshell-parse-command 'ls -l' 得到了这个: (progn (eshell-trap-errors (eshell-named-command "l
如何使用 RegExp 在 JavaScript 中实现类似于 alias 的功能? ALIAS = [{pattern: /^ls[$ ]/, replace: 'ls --color '}] s
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在编写一个 shell 程序,当将值传递给 execv() 时,我需要一个指向程序名称的 char 指针(即 ls),我需要一个指向参数的 char 指针数组的指针。 我会检查并解析用户的输入,如
我对使用 bash 编写脚本还比较陌生,并编写了以下脚本: # Set variables logfile=/tmp/peter/logfile.log indir=/mls/indir/IG/ te
所以基本上我有一个任务要使用 strace 进行分析,ls 命令需要哪些系统调用才能提供与 ls -l 相同的信息。 但是对于 ls -l 命令有许多奇怪的系统调用,例如 stat 64 被调用时使用
我在 ubuntu 的文件夹中有一个文件夹列表。IE。/mnt/source/customcode/files/brands/下 root@a919794ec280:/mnt/source/custo
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
#include #include #include #include #include int flag; void catch (int sig) { if (sig == SIGI
我使用 Process 来调用 shell(zsh),我想 cd ~ 或其他一些目录,例如在 shell 中定义的 cd $PROJ_ROOT。但似乎无法处理这些 token 。如何解决这个问题? s
我在我的 Centos5 机器上运行了这个: ls -al & ; ls -al 我期待它在后台运行 ls -al,同时在前台运行 ls -al,并演示终端的输出是如何被破坏的通过这样做。 但是,我得
当我在 PowerShell 中使用 Get-ChildItem 时,我会得到目录中以行格式设置的项目列表。该列表经常会超出屏幕,如果我想查看列表的其余部分或以前的命令和输出,则迫使我向上滚动。我想为
我试图用所有必要的参数绕过调用 JNIEnv->DefineClass 方法,但当我尝试从 java 调用该方法时,它总是返回 java.lang.NoClassDefFoundError: ls.H
我是一名优秀的程序员,十分优秀!