Can';认真地说,不要在git中添加文件

Can';认真地说,不要在git中添加文件,git,git-add,Git,Git Add,已解决,如接受答案下的注释所述 我多年来一直在使用Git,我真的很惊讶,我有一个特定的文件,我不能添加到我的一个回购的暂存区!我不想删除和重新创建回购协议,但想了解发生了什么并修复它。另外,现在我担心可能还有其他文件没有添加到回购协议中(或其他回购协议中) 我有一个repo,我刚刚提交并成功推送了一堆文件,然后我意识到其中一个,init.el,没有上传。 这就是我所拥有的: 运行git add init.el不会产生任何输出 在任何.gitignore文件中(在当前文件夹、子文件夹或父目录之一

已解决,如接受答案下的注释所述

我多年来一直在使用Git,我真的很惊讶,我有一个特定的文件,我不能添加到我的一个回购的暂存区!我不想删除和重新创建回购协议,但想了解发生了什么并修复它。另外,现在我担心可能还有其他文件没有添加到回购协议中(或其他回购协议中)

我有一个repo,我刚刚提交并成功推送了一堆文件,然后我意识到其中一个,
init.el
,没有上传。 这就是我所拥有的:

  • 运行
    git add init.el
    不会产生任何输出
  • 在任何
    .gitignore
    文件中(在当前文件夹、子文件夹或父目录之一中,直到根目录中)都未指定该文件(或与之匹配的模式)
  • 没有我意外创建的父Git存储库,这会弄乱该文件
  • .git/info/exclude
  • 当我运行
    git ls files--others-I--exclude standard
然后,我尝试删除文件
rm init.el
,该文件正确地导致

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 add init.el
的文件,没有显示任何输出,并且文件仍然从暂存区域丢失(我已经通过
git status
git diff--cached
以及提交和推送(参见下一行))检查了这一点)。 尝试提交、推送并仔细检查Github中发生的情况会确认该文件尚未添加

你永远不会停止学习,是否有任何我不知道的可能触发这种行为的标准,或者这是一个错误,因此有没有办法修复回购

编辑,回答一条评论

  • pwd
    提供
    /Users/my\u user/.my\u spacemacs.d
  • cat.gitignore
  • find-名称“.gitignore”
    给出
  • 最后,
    cat./spacemacs\u d_backup2020/.gitignore
    给出

让我们来谈谈git在和它说话时说的话。首先,这里是一个文件夹,其中包含一些文件:

$ ls
a.txt   b.txt
现在,我将尝试向临时区域添加一个.txt:

$ git add a.txt
$ 
嗯,吉特什么也没说。就像你报道的那样:

运行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 status
git diff--cached

你还说,

当我运行
git ls files--others-I--exclude standard

好的,我也来试试:

$ git ls-files --others -i --exclude-standard
$
没什么!天哪,这太糟糕了。为什么不在暂存区添加一个.txt呢

因为它已经在暂存区中了。这里的问题不是a.txt不在暂存区中,而是对暂存区的误解——可能是对git本身的误解

这里有一件事要记住:

  • 每次提交都包含所有文件

  • 默认情况下,每个新提交包含与上一次提交相同的所有文件。(唯一的区别是您已更改的文件。)

  • 默认情况下,暂存区域包含上次提交中的所有文件

  • 当你问诸如
    git status
    git diff
    之类的问题时,git只告诉你什么是新的和不同的。它不报告存在什么

这就解释了其中的奥秘。在所有这些开始之前,我已经添加并提交了一个.txt。因此它已经在暂存区域中,并且已经在最后一次提交中

所以当我说git add a.txt时,git对自己说:“是的,a.txt已经在暂存区了,它没有改变,所以这里没有什么新的东西,继续前进,伙计们,继续前进”——它没有回答

当我说
git diff--cached
时,git没有提到a.txt,因为
diff
表示“差异”,并且暂存区域中的a.txt与上次提交中的a.txt没有区别

但这并不意味着a.txt不在最后一次提交中或不在暂存区域中。相反,它的意思正好相反。它意味着它在这两个位置

现在我们来谈谈清单

假设我们想知道暂存区域中有哪些文件。这就是
git ls files
的用途,简单明了:

$ git ls-files
a.txt
b.txt
看,它在那里!a.txt毕竟在那里!好的,让我们假设我们想知道最近提交的内容。记住,最近提交的内容也是上一次提交中的内容,之前的提交,以及之前的提交,除了我们每次可能执行的任何更改。每个提交都包含所有文件,按默认值。因此,如果a.txt曾经提交过,那么查看它是否在最新提交中就足够了。下面是如何做到这一点:

$ git ls-tree --name-only HEAD
a.txt
又来了

所以你看,a.txt毕竟并没有失败,只是我不明白git告诉我的是什么

最后,你还说

尝试提交、推送和双重检查Github中发生的情况会确认文件尚未添加

嗯,我不能解释这个问题。但是我不能回头看看你在GitHub做什么——GitHub很难使用。也许问题只是不知道如何查看。如果你在本地的分支上,你提交并推送,然后去GitHub查找文件,你可能找不到它,因为GitHub默认情况下是我没带你去看分店
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    new file:   b.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
$ git ls-files --others -i --exclude-standard
$
$ git ls-files
a.txt
b.txt
$ git ls-tree --name-only HEAD
a.txt