问题描述
我已经使用Git多年了,我很惊讶我无法在我的一个存储库中添加一个特定文件到暂存区!我不想删除并重新创建存储库,而是要了解正在发生的事情并对其进行修复。另外,现在我担心也许还有其他文件没有被添加到仓库(或其他仓库)中。
我有一个回购,其中我刚刚提交并成功推送了一堆文件,然后我意识到其中的一个init.el
没有上传。
这就是我所拥有的:
- 运行
git add init.el
不会产生任何输出 - 未在任何
.gitignore
文件中指定文件(或与之匹配的模式)(在当前文件夹,子文件夹或父目录之一中,直到根目录为止)。 - 没有我偶然创建的父Git存储库,该存储库弄乱了该文件
- 该文件(或与之匹配的模式)未在
.git/info/exclude
中列出
- 我运行
git ls-files --others -i --exclude-standard
时没有显示文件(或与之匹配的模式)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: .gitignore
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: init.el
然后,我尝试做git rm init.el
,这又正确地导致了
rm 'init.el'
但是放回文件,然后添加带有git add init.el
的文件将显示无输出,并且暂存区域中仍缺少该文件(我已经用git status
,git diff --cached
进行了检查并通过提交和推送(请参见下一行)。
尝试提交,推送并仔细检查Github中发生的情况,确认未添加文件。
您永远都不会停止学习,是否有任何我不知道的标准可能触发这种行为,或者这是一个错误,所以有什么办法可以修复该回购协议?
编辑,回答一条评论
-
pwd
给出/Users/my_user/.my_spacemacs.d
-
cat .gitignore
给出
.DS_Store
spacemacs_d_backup2020/
-
find . -name '.gitignore'
给出
./spacemacs_d_backup2020/.gitignore
./.gitignore
- 最后,
cat ./spacemacs_d_backup2020/.gitignore
给出
.DS_Store
解决方法
让我们谈谈git在与之交谈时所说的话。首先,这是一个其中包含一些文件的文件夹:
$ ls
a.txt b.txt
现在,我尝试将 a.txt 添加到临时区域:
$ git add a.txt
$
嗯,git什么也没说。就像您报告的一样:
运行git add init.el不会产生任何输出
该死。为什么不添加它?好吧,让我们尝试其他事情:
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: b.txt
嗯,它没有列出 a.txt 。我很担心!好的,让我们尝试另一种方式:
$ git diff --cached
diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+hello
嗯,还是没有提到 a.txt 。就像您报告的一样:
暂存区域中仍缺少该文件(我已经用
git status
,git diff --cached
进行了检查
您还说过:
当我运行
时,文件(或与之匹配的模式)没有出现git ls-files --others -i --exclude-standard
好的,我也尝试一下:
$ git ls-files --others -i --exclude-standard
$
没事!天哪,这太可怕了。为什么不将 a.txt 添加到登台区域?
因为它已经在暂存区中。这里的问题不是 a.txt 不在登台区域中;而是这是对暂存区的误解,可能是对git本身的误解。
这是要记住的事情:
-
每个提交都包含 all 个文件。
-
默认情况下,每个 new 提交都包含与 previous 提交相同的所有文件。 (唯一的区别是您已更改了文件。)
-
默认情况下,登台区域包含上次提交中的所有文件。
-
当您问诸如
git status
或git diff
之类的问题时,git只会告诉您的新内容和不同之处。它不报告存在的内容。
因此可以解释这个谜。在开始所有这些操作之前,我已经 添加并提交了 a.txt 。因此它在暂存区域中已经已经,在上一次提交中已经已经。
因此,当我说git add a.txt
时,git自言自语:“是的,a.txt已经在暂存区中了,并且没有改变,所以这里没有新内容,大家一起来,前进”,并且不会回复。
当我说git diff --cached
时,git没有提到 a.txt ,因为diff
的意思是“差异”,而 a.txt 在暂存区域中的位置与上次提交中的 a.txt 相同。
但是 none 都不意味着 a.txt 不在最后一次提交中,或者不在临时区域中。相反,这恰恰相反。这意味着在这两个地方都是。
现在让我们来讨论列表。
比方说,我们想知道临时区域中有哪些文件。这就是git ls-files
的用途,简单明了:
$ git ls-files
a.txt
b.txt
看,那里!毕竟是 a.txt !好的,假设我们想知道最近一次提交中的内容。请记住,除了我们可能每次执行的任何 changes ,最近一次提交中的内容也与上一次提交中的内容,之前的提交,之前的提交以及之前的提交相同。默认情况下,每个提交都包含 all 个文件。因此,如果 a.txt 已提交 ever ,则足以查看它是否在 latest 提交中。这是这样做的方法:
$ git ls-tree --name-only HEAD
a.txt
又来了!
所以您看到, a.txt 毕竟没有失败。只是我不明白git在告诉我什么。
最后,你也说
尝试提交,推送并仔细检查Github中发生的情况,确认未添加文件
嗯,我无法解释那个。但是我看不到你在GitHub上所做的事情-GitHub很难使用。也许问题只是不知道外观的问题之一。如果您在本地的某个分支上,然后提交并推送,然后转到GitHub并寻找文件,则可能找不到它,因为GitHub默认情况下不会向您显示您正在处理的分支。它显示master
(或main
)。
因此,这是我对发生的事情的猜测:您在本地的一个分支上,并且您已经添加并提交了 init.el ,也许很久以前了,但是您没有更改从那以后。正如我所证明的那样,这将解释您在问题中描述的现象。