为什么 git 不承认我的文件已经被更改,因此 git 添加不工作

我正在尝试使用 bash 将文件推送到 github。他们已经在那里,我正在上传一个新的版本与新的行和代码等。但当我尝试 git add然后 git status它说:

在树枝主人身上

没有犯罪工作目录

我正在使用的文件刚刚被修改过。

252645 次浏览

我们没有足够的证据来回答这个问题所以我给你们几个猜测:

1)您隐藏您的更改,以修复类型: git stash pop

2)你已经做了改动并提交了它们,你应该能够在 git log中看到你的提交

3)你做了一些变化做了一些 git reset --hard或其他,你的变化可能在那里的重新测试,类型 git reflog --all然后检查或挑选裁判,如果你曾经找到它。

4)你已经检查了同一个回购几次,你是在错误的一个。

发生了这么奇怪的事。Eclipse Kepler 的 git 插件自动将我的所有项目文件夹标记为忽略。吉蒂诺文件夹。

当我在 Team菜单上找到 commit的时候,它们都会回到被忽略的状态。据我所知,这是因为我将它们设置为在父项目中派生的。取消标记作为 dervied修复这一点。我从没在《靛蓝》上看过这个。希望能有所帮助。

我曾经遇到过一个问题,我曾经将 git 索引设置为在我的文件上“假设不变”。

你可以通过以下方法告诉 git 停止忽略对文件的更改:

git update-index --no-assume-unchanged path/to/file

如果这对 重置没有帮助,那么对于其他奇怪的病例也许就足够了。


在实践中,我发现删除缓存文件并重新设置它可以工作:

git rm --cached path/to/file
git reset path/to/file

git rm --cached意味着只从索引中删除文件,而 reset告诉 git 从上次提交中重新加载 git 索引。

你想上传什么样的文件?现在我花了将近一个小时上传我的 CSS 修改。但是这个 css 是由样式文件编译的,因此 git 忽略了它。当我改变风格的来源,然后一切工作。

希望能有帮助。

检查你的 .gitignore文件。您可能会发现文件、文件的扩展名或要处理的文件的路径与 .gitignore中的一个条目匹配,这将解释为什么该文件被忽略(并且不能识别为已更改的文件)。

当我遇到类似的问题时,情况就是这样。

我有这个问题。我的不工作,因为我把我的文件。 git 文件夹在我的项目。

对于这个问题,首先检查您是否正在编辑您认为正在编辑的文件!我在编辑传输的 JavaScript 文件而不是源文件时遇到了这个问题(传输的版本不在源代码控制之下)。

我的 Git 客户机(Gitg)导致了这个问题。我通常会运行的普通命令不起作用。甚至触摸项目中的每个文件都不起作用。

我找到了解决的办法,但我还是不知道是什么引起的。复制项目目录。丢失的文件将显示在复制目录的 git status中。重命名可能会做同样的事情。

尝试使用 git add * 然后是 git commit

您使用的是正确的存储库吗?

我的故事有点滑稽,但我认为它可以发生在某人谁可能有类似的情况,所以在这里分享它。

实际上,在我的机器上,我在同一个名为 source的根目录中配置了两个单独的 git 存储库 repo1repo2。这两个存储库实质上是我在公司中不断开发的两个产品的存储库。现在的问题是,作为一个标准准则,所有产品的源代码的目录结构在我的公司是完全相同的。

所以我没有意识到我修改了一个完全相同的命名文件在 repo2,我应该改变在 repo1。所以,我只是继续在 repo1上运行命令 git status,它一直给出相同的消息

在树枝主人身上

没有犯罪工作目录

半个小时。然后我的同事用独立的眼睛观察了它,并且让我注意到这个东西,我错了,但是看起来非常相似。当我切换到 repo1 Git 时,开始注意到文件的更改。

不是那么常见的情况。但你永远不知道!

你把目录从你的 shell 中移出来了吗?如果从备份中还原项目,就可能发生这种情况。要解决这个问题,只需要 cd输出和输入:

cd ../
cd -

我们在 Windows 上通过 WinMerge 工具传输差异来更改文件时就发生过这种情况。显然,WinMerge (至少在我的计算机上是这样配置的)有时不会更新它更改的文件的时间戳。

在 Windows 上,Git 状态使用文件的时间戳和文件大小的更改来确定文件是否已更改。因此,由于时间戳没有更新,它只能通过文件大小。不幸的是,有问题的文件是一个简单的版本文件,其中的内容从 7.1.2更改为 7.2.0。换句话说,文件大小也保持不变。其他的文件也被 WinMerge 修改了,没有更新他们的时间戳,但是在修改后有不同的大小,被 Git 状态检测到了。

有时取决于 git 版本,如果你忘记做 git add .

要检查对存储库的更改,始终使用显示所有未跟踪和更改的文件的 git status。因为 git diff只显示添加的文件。

确保 没有从 Windows 的 Git Bash 内部创建符号链接(ln -s source dest)。

它不生成符号链接,而是将源代码深度拷贝到目录

我在 Windows 的 Git Bash (版本2.16.2)的 MINGW64终端上经历了与 OP 相同的行为,意识到我的“编辑过的”更改实际上在原始目录中,而我的 Git Bash 命令来自一个深度拷贝,并且没有改变。

我在使用 崇高的文字-3时遇到了类似的问题。 在对代码进行了新的更改并保存之后,我尝试使用 git add。/status 命令的响应是“ Branch already-up to date”。 我发现,不管在文本编辑器中保存更新,文件实际上是不变的。 在其他编辑器中打开文件并保存更改对我来说很有效。

听起来很疯狂,但有时候你并不在正确的回购,即使你认为你是。例如,您可能已经移动了父目录,但是忘记在文本编辑器中切换回购协议。反之亦然: 您在文本编辑器中处于正确的回购中,但在命令行中处于错误的回购中。在第一种情况下,您在正确的 文件中进行编辑,但它与在命令行中打开的文件夹不同,因此实际上是错误的文件。在第二种情况下,您实际上编辑了正确的文件,但是您的命令行 git 不能识别更改,因为您不在命令行的正确目录中。

我也有同样的问题。原来我有两个项目的副本,我的终端在错误的项目文件夹!

遇到了这个问题,但是只有两个目录,我不知道的是,这两个目录最终都被配置为 git 子模块。这是怎么发生的我不知道,但过程是按照这个链接上的一些指示,但不删除目录(因为他在最后) ,而是做 git add path/to/dir

正如我们已经讨论过的,这些文件可能被标记为“预设-未改变”,这基本上告诉 git 您不会修改这些文件,因此它不需要跟踪这些文件的更改。然而,这可能会影响到多个文件,如果工作区很大,您可能不希望逐个检查它们。在这种情况下,你可以尝试: Git update-index —— really-refresh

根据文件:

Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.

它基本上会强制 git 跟踪所有文件的更改,而不管是否使用“预设未更改”标志。

当您在 VisualStudio 中编辑文件时,即使文件没有保存,它也会立即在 git 更改中列出。所以你需要做的就是手动保存文件(对于当前显示的文件是 Ctrl + S,对于所有的项目文件是 Ctrl + Shift + S) ,然后 git bash 就会接收它们。

这种情况也发生在我身上,我尝试了上面提到的方法,但没有任何帮助。那么解决方案就是通过终端而不是 GUI 来更改文件。我不知道为什么这个工作,但工作。在我从终端 git 通过 nano 编辑文件之后,我发现文件被修改了,我可以添加并提交。

我有同样的问题在这里 VS2015没有识别我的 js 文件的变化,删除远程从存储库设置,然后重新添加远程 URL 路径解决了我的问题。

当我使用 vi 编辑器在服务器上创建补丁文件时,也遇到了类似的问题。看来问题出在间隔上。当我从本地推出补丁时,部署是正确的。

我有一些 git 子模块配置错误。我去了 repo 的根目录,并在以前有 .git文件夹的目录上发出了以下命令:

git rm --cached sub/directory/path -f

然后目录出现在 git status中。

为了以防万一,你可能需要在尝试之前复制一份你的回购协议。

我也有同样的问题。我需要提交的文件也从未在 .gitignore文件中声明过。

在我的例子中,使用 -f标志强制添加文件提升到暂存并修复了问题。

git add -f <path to file>
git update-index --really-refresh

您可以尝试此命令,它将更新您的文件夹中的索引。

如果您正在使用 VSCode 并切换到一台新机器上,那么您可能关闭了自动保存功能,因此即使您对文件进行了更改,git 也不会识别它们。

这解决了我的问题

以下几点对我很有效:

git mv tesfile.js TestFile.js

详情请浏览: https://stackoverflow.com/a/16071375/11677643

当所有的更改都在一个新目录中时,这种情况发生在我身上

git add newdirectory/new.file

然后 git status按预期显示目录中的其他文件。

尝试重命名 File,git 将识别添加文件的新更改。

例如,如果文件路径是 产品/index.tsx,那么您可以将路径重命名为: ProductItem/index.tsx.

在尝试了以上所有建议的解决方案之后,这个方法奏效了。

服从命令对我很管用

rm .git/index


git reset

我有同样的问题后,谷歌驱动器桌面同步我的项目文件,Git 没有检测到变化。

我发现这个 git rm 缓存了 sudo 凭证。 然后不要做 git 重置,这只是重置 git 状态和设置一切回到发生问题的时间点。

因此,对于 Linux 和 Mac 来说,这样做效果很好:

`sudo git rm --cached -r .`

对于未来的读者: 我遇到过一个有趣的例子,我们试图将整个文件夹复制到一个 git 存储库中,却没有意识到我们也复制了。Git 文件夹。

由于索引的复制。Git 文件夹中包含了复制的文件夹内容,git 认为没有进行任何更改。

在我的例子中,解决方案是创建一个新的分支,并且只复制没有. git 文件夹的文件夹。

如果您正在使用 VSCode,则必须首先保存更改,然后 git 才能识别它们。

新闻稿:

窗口用 Ctrl + Shift + S

用于 Mac 的 Command + S

现在又是 git status

重新启动窗口是我解决这个问题的唯一方法; 而关闭 powershell 窗口/Visual Studio 没有任何效果。


我在 Visual Studio 里看过,在编辑的时候,VS 会 视觉效果显示它的变化,很好。但是当我保存时,VS 和命令行 git status都不会显示它被更改。

再一次,我关闭了所有系统,重启了。

我也有同样的问题。在我的例子中,文本编辑器中的自动保存被关闭,因此这些更改不会在命令行中被检测到。我打开了自动保存,现在可以用了。

我们尝试了上述解决方案,但不幸的是,它没有工作在我们的最后。 后来我发现问题的原因是我的子目录有自己的 .ssh/目录。

所以我们这边的解决方案,

(1) -是删除子目录中的 .ssh/目录

/.ssh
/frontend
/.ssh      <-----------delete this
/backend
/.ssh      <-----------delete this

(2) -删除缓存

git rm --cached .

(3) -分阶段改变

git add .