- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了Git的奇怪行为:
我有一个存储库,其中包含许多在.gitignore
文件中指定的未跟踪文件和文件夹。
我所做的确切步骤:
存放了4个文件:git stash
检阅了我几个月前的第一次提交:git checkout <hash of first commit>
环顾四周,不改变任何东西
回到我的工作分支,做git checkout <my working branch>
应用了隐藏:git stash apply
然后我注意到一些(不是全部)未跟踪的文件和文件夹消失了。怎么可能?
附加信息:
隐藏的文件与消失的文件无关,我注意到隐藏操作只是为了完整性
我没有执行命令git stash --include-untracked
或git stash save -u
之一,如@Ashish Mathew所猜测的
似乎只有文件和文件夹在第一次提交时就消失了,而这些文件和文件夹在.gitignore
中还没有出现,但后来又被添加到其中了。
最佳答案
隐藏的文件与消失的文件无关...
确实。
似乎只有文件和文件夹在第一次提交时就消失了,而这些文件和文件夹在.gitignore
中还没有出现,但后来又被添加到其中了。
这,再加上一件事,(几乎可以肯定)是问题的根源。幸运的是,您应该能够取回这些文件,或者至少取回这些文件的某些版本。不幸的是,您必须将它们全部拼写出来,然后与Git一起大惊小怪,您可能会得到错误的版本。请参阅底部的示例会话。
首先,请注意,只有未跟踪的文件会被忽略
未取消跟踪(已跟踪)的文件永远不会被忽略,即使.gitignore
文件说忽略它。仅忽略未跟踪的文件:已跟踪文件,未跟踪但未被忽略的文件或未跟踪并被忽略的文件。
但是,等等:未跟踪的文件到底是什么?
未跟踪的文件是不在索引中的文件
这个定义是Git中为数不多的简单明了的定义之一。或者更确切地说,如果很清楚索引是什么。不幸的是,索引很难看到。
我对索引的最好的一行描述是:*索引是构建下一个提交的地方。*
该索引,也称为暂存区和缓存,可跟踪您的工作树,即索引。工作树是您工作的地方:文件具有其正常的非Git格式的文件。在Git信息库中,永久且只读存储在提交中的文件具有特殊的,压缩的,仅Git格式。索引位于这两个位置之间:它具有工作树中所有可提交的文件,都已设置为可提交。但是索引中的文件是可变的(不同于内部提交中的文件),即使它们已经转换为特殊的Git格式。
这意味着您的索引实际上为空的情况非常罕见。大多数情况下,它仅与您当前的提交匹配。那是因为您刚刚签出该提交,这会将这些文件放入索引(仅Git形式,准备进行下一次提交)和工作树(以常规普通文件形式,准备使用或编辑)。
如果修改文件F
并运行git add F
,则git add
会替换以前在索引中(Git格式)的文件副本。索引不是空的-它包含F
以及其他所有内容-它刚好与当前提交匹配,因此大多数Git命令在工作中更改F
之前都不会提及F
树。
因此,让我们考虑:
检阅了我几个月前的第一次提交:git checkout <hash of first commit>
这告诉Git:从第一次提交开始就填充索引和工作树。假设我们尚未实际运行此命令,而只是考虑:这将做什么?那是什么承诺?
好了,该提交在创建时具有索引中的任何内容,无论您使用git add
复制到索引中的是什么。例如,其中包括文件abc.txt
,您后来决定必须对其进行跟踪。
要取消跟踪,必须在某个时候从索引中删除abc.txt
,可能是:
git rm --cached abc.txt
git rm --cached
之后,您进行了
git commit
。从运行
git rm --cached
到现在,该文件都不在索引中。它在工作树中。因此它是未跟踪的。
abc.txt
。 Git需要将提交的
abc.txt
版本复制到索引和工作树中。
abc.txt
,Git将检查您是否要使用其他
abc.txt
破坏它。通常,Git会拒绝这样做,告诉您先将其移开。但是,如果工作树中的
abc.txt
与提交中的
abc.txt
相匹配,那么可以安全地使用提交中的
abc.txt
填充索引。毕竟,它与工作树中的一个匹配。
git checkout <my working branch>
在索引中了。现在已被跟踪!
abc.txt
<my working branch>
的第一个提交切换到
abc.txt
的尖端提交。该提交中没有
git checkout <hash>
。 Git将从索引中删除该文件...,并将其也从工作树中删除,因为它已被跟踪。
git checkout <my working branch>
时,Git将文件复制到索引和工作树中(除非它毕竟不必触摸工作树版本)。当您运行
<hash>
取回文件时,Git删除了该文件,但是提交是只读的(通常是永久性的),因此该文件仍以Git-only形式存在于提交
<hash>
中。
git show hash:path > path
而不将其放回索引中,从而使其以普通的非Git格式存在。这些天最简单的方法是使用
git show
,例如:
git show hash:abc.txt > abc.txt
--textconv
不会应用行尾翻译和污迹过滤器-在现代Git中,您应该能够使用
.gitgnore
做到这一点)。
README
使用破坏性数据使Git正常运行
abc.txt
和文件
original
进行了一次初始提交,其中文件
abc.txt
包含一行读取
initial
的行:
$ mkdir tt
$ cd tt
$ git init
Initialized empty Git repository in ...
$ echo original > abc.txt
$ echo for testing overwrite > README
$ git add README abc.txt
$ git commit -m initial
[master (root-commit) a721a23] initial
2 files changed, 2 insertions(+)
create mode 100644 README
create mode 100644 abc.txt
$ git tag initial
$ git rm abc.txt
rm 'abc.txt'
$ git commit -m 'remove abc'
[master 20ba026] remove abc
1 file changed, 1 deletion(-)
delete mode 100644 abc.txt
$ touch unrelated.txt
$ echo abc.txt > .gitignore
$ git add .gitignore unrelated.txt
$ git commit -m 'add unrelated file and ignore rule'
[master 067ea61] add unrelated file and ignore rule
2 files changed, 1 insertion(+)
create mode 100644 .gitignore
create mode 100644 unrelated.txt
$ git log --oneline --decorate
067ea61 add unrelated file and ignore rule
20ba026 remove abc
a721a23 (tag: initial) initial
.gitignore
中:
$ echo precious > abc.txt
$ git status
On branch master
nothing to commit, working tree clean
$ cat abc.txt
precious
abc.txt
:
$ git checkout initial
Note: checking out 'initial'.
You are in 'detached HEAD' state. [mass snip]
HEAD is now at a721a23... initial
$ cat abc.txt
original
initial
指令,它赋予Git破坏文件的权限。为了证明这一点,让我们使
$ cp /dev/null .gitignore
$ git add .gitignore
$ git commit -m 'do not ignore precious abc.txt'
[master 564c4fd] do not ignore precious abc.txt
Date: Thu Feb 8 14:16:08 2018 -0800
1 file changed, 1 deletion(-)
$ git log --oneline --decorate
564c4fd (HEAD -> master) do not ignore precious abc.txt
067ea61 add unrelated file and ignore rule
20ba026 remove abc
a721a23 (tag: initial) initial
$ echo precious > abc.txt
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
abc.txt
nothing added to commit but untracked files present (use "git add" to track)
$ git checkout initial
error: The following untracked working tree files would be overwritten by checkout:
abc.txt
Please move or remove them before you switch branches.
Aborting
关于git - Git Checkout意外删除了未跟踪的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48639081/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!