如何检查是否存在本地不再存在的未跟踪/忽略的文件?(git、linux)
我很困惑,我多次调用了如何检查是否存在本地不再存在的未跟踪/忽略的文件?(git、linux),linux,git,github,Linux,Git,Github,我很困惑,我多次调用了git stash--all和git stash apply stash@{…},还删除了一些未跟踪/忽略的文件 如何检查其中一个存储库中是否存在文件,但不是本地文件?我想您可以运行diff: git diff --name-status stash@{10} 我想您可以运行diff: git diff --name-status stash@{10} TL;博士 您可能希望在每个有效的stash@{number}上使用git diff--name only--diff
git stash--all
和git stash apply stash@{…}
,还删除了一些未跟踪/忽略的文件
如何检查其中一个存储库中是否存在文件,但不是本地文件?我想您可以运行diff:
git diff --name-status stash@{10}
我想您可以运行diff:
git diff --name-status stash@{10}
TL;博士
您可能希望在每个有效的stash@{number}
上使用git diff--name only--diff filter=D stash@{number}^3
。(要获取存储列表,请使用git stash list
)
您可能希望在每个有效的stash{number}
上使用git show--name only stash{number}^3
。请注意,这是git showstash@...,而不是吉特藏匿秀
要了解其中的原因,请继续阅读
长的
git stash所做的事情有点复杂,但可以简单地概括为:
(或旧的拼写,git-stash-push
)进行两到三次提交,而它所做的任何提交都不在任何分支上。然后它运行git-stash-save
或git reset
或它们的一些组合,具体取决于使用的标志git clean
将某个存储中的两个或三个提交的部分或全部内容与现有索引和工作树合并git stash apply
表示运行git-stash-pop
,如果成功,则运行git-stash-apply
git-stash-drop
git stash push
进行两次提交(有时三次),但它没有说明这些提交中包含什么内容,也没有说明它们在存储库中的形式。对于git stash
的最简单用法来说,这些都不重要,但对于您的情况来说,它们是至关重要的
提交
我将简单地提到这些,因为除了那些git stash
制作的,我们并不太关心它们。每次提交都会保存文件的完整快照。具体是哪些文件,我们稍后会看到。除了快照之外,提交还包含一些元数据,包括提交人、提交时间(日期和时间戳)以及提交原因(日志消息)。每个提交都有一个唯一的散列ID,并且作为元数据的一部分,每个提交都包含其父级的散列ID—一个指向上一次提交的链接
合并提交具有指向两个或多个父级的链接。以这种方式链接的提交通常是密切相关的,这就是为什么链接是父级/子级的,毕竟,与快照加元数据部分不同,没有硬性要求任何一个提交中的文件与任何其他提交中的文件有很大关系。我们马上就会看到的,还有藏品
除了通过散列ID标识外,提交大多是永久性的,当然,隐藏提交是非永久性的,在被删除后最终会消失,并且是完全只读的。这意味着它们不能被用来做任何新的工作,这就是为什么Git不仅仅是提交。这就是为什么你需要一个工作树
索引和工作树
正如我们刚才提到的,提交是只读的。不仅如此,每次提交中存储的文件都是一种特殊的压缩只读格式。这意味着两个或多个提交可以共享一个在两个提交中都相同的文件,这反过来意味着即使您提交了数百次某个版本的文件,Git也只需存储一次。我喜欢将这些内部格式文件称为冻干文件
为了让您实际使用或更改您的文件,Git必须将它们重新水化,将它们转换回您可以读写的普通文件。提交被重新水化以供您使用的区域是您的工作树。Git可以到此为止,冻结的提交包含脱水文件,就像提交本身一样永久,加上临时的、短暂的但有用的工作树文件。其他版本控制系统确实到此为止:在任何时候,您都有当前提交中文件的冻干副本,以及工作树中有用的副本。但是出于各种原因,Git添加了文件的第三个副本。这个额外的副本位于提交树和工作树之间,在Git不同地调用的索引或临时区域中
索引中每个文件的额外副本(当前提交中冻结的脱水副本和工作树中有用的副本之间)也是脱水形式。它与当前提交副本之间的关键区别在于它不是只读的。您可以覆盖它,尽管从技术上讲,这只是在任何时候用一个新的冻干副本将前一个文件移到一边。这就是git add所做的:它冻结、干燥工作树副本,并使用它覆盖索引副本
这就是为什么您必须始终添加git
文件的原因。它们已经存在于索引中,准备提交,但它们与上次提交的结果相匹配。您已经修改了工作树副本,但是冻结的副本没有更改当然没有,它已经冻结,索引副本也没有更改,索引副本与提交的副本匹配。因此,现在您必须重新压缩更新的文件并替换索引副本。运行git add updated.ext
,git就可以做到这一点。现在,索引和工作树匹配,并且与冻结的副本不同
当您运行git commit
时,git不会查看您的工作树,而是查看您的索引。无论您的索引中有什么内容,Git都会将这些(已经冻干的)文件打包到一个新的提交中,新的提交将成为您当前的提交。现在索引和提交匹配,因为新的提交是从索引中进行的
这也决定了
...--F--G--H--I <-- master
...--F--G--H <-- master
|
i <-- $tempvar
...--F--G--H <-- master
|\
i-w <-- stash
...--F--G--H <-- master
|
i <-- $i_commit
u <-- $u_commit
...--F--G--H <-- master
|\
i-w <-- stash
/
u
stash^2
git diff-tree --binary $s^2^..$s^2 | git apply --cached
git show stash@{1}^3
git diff <commit-specifier>