我正在尝试使用 bash 将我的文件推送到 github。他们已经在那里了,我正在上传一个带有新行和代码等的更新版本。但是当我尝试git add
然后git status
它说:
在分支主
没有什么可提交的,工作目录干净
我正在使用的文件刚刚被修改。
我有一个问题,曾几何时,我在我的文件中将 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 索引。
检查您的.gitignore
文件。您可能会发现您尝试使用的文件、文件扩展名或文件路径与 中的条目匹配.gitignore
,这可以解释为什么该文件被忽略(并且不被识别为更改的文件)。
当我遇到类似问题时,事实证明我就是这种情况。
听起来很疯狂,但有时即使您认为自己在正确的存储库中,您也不在正确的存储库中。例如,您可能已经移动了父目录,但忘记在文本编辑器中切换存储库。反之亦然:您在文本编辑器中位于正确的仓库中,但在命令行中位于错误的仓库中。在第一种情况下,您在正确的文件中进行了编辑,但它与在命令行中打开的文件夹不同,因此它实际上是错误的文件。在第二种情况下,您实际上确实编辑了正确的文件,但是您的命令行 git 不会识别更改,因为您不在命令行上的正确目录中。
就像已经讨论过的那样,这些文件可能被标记为“assume-unchanged”,这基本上告诉 git 你不会修改这些文件,因此它不需要跟踪它们的更改。但是,这可能会影响多个文件,如果它是一个很大的工作区,您可能不想一个一个地检查它们。在这种情况下,您可以尝试: git update-index --really-refresh
根据文档:
Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.
它基本上会强制 git 跟踪所有文件的更改,而不管“假定未更改”标志如何。
好吧,我们没有足够的能力来回答这个问题,所以我会给你几个猜测:
1)您隐藏了更改,以修复类型:git stash pop
2)您进行了更改并提交了它们,您应该能够看到您的提交git log
3)您进行了某种git reset --hard
或其他的更改,您的更改可能存在于 reflog 中,键入git reflog --all
然后签出或挑选 ref(如果您确实找到它)。
4) 你已经多次检查了同一个 repo,但你错了。
发生了这样一件怪事。Eclipse Kepler 的 git 插件自动在 .gitignore 文件夹中将我的所有项目文件夹标记为已忽略。
当我commit
进入Team
菜单时,它们都会重新设置为忽略。据我所知,这是因为我将它们设置为在父项目中派生的。将它们取消标记为已dervied
修复。我以前从未在 Indigo 上看到过这种情况。希望它可以帮助某人。
我有一些 git 子模块配置错误。我去了 repo 的根目录,并在.git
以前有文件夹的目录上发出了这些命令:
git rm --cached sub/directory/path -f
然后目录出现在git status
.
为了以防万一,您可能需要在尝试之前复制您的存储库。
通过 WinMerge 工具传输差异来更改文件时,我们在 Windows 上发生过这种情况。显然 WinMerge(至少在我的计算机上配置的方式)有时不会更新它更改的文件的时间戳。
在 Windows 上,git status使用文件的时间戳和文件大小的变化来确定文件是否已更改。所以由于时间戳没有更新,它只有文件大小。不幸的是,有问题的文件是一个简单的版本文件,其中内容从7.1.2更改为7.2.0。换句话说,文件大小也保持不变。其他文件也被 WinMerge 更改并且没有更新其时间戳,但在git status检测到更改后大小不同。
TL;博士; 你甚至在正确的存储库上吗?
我的故事有点有趣,但我认为它可能发生在可能有类似情况的人身上,所以在这里分享。
实际上,在我的机器上,我有两个单独的 git 存储库repo1
并repo2
配置在同一个名为source
. 这两个存储库本质上是我在公司工作和使用的两种产品的存储库。现在的问题是,作为标准指南,我公司所有产品的源代码目录结构都完全相同。
所以没有意识到我修改了一个完全相同的命名文件repo2
,我应该在repo1
. 所以,我只是继续运行命令git status
,repo1
它一直给出同样的信息
在分支主
没有什么可提交的,工作目录干净
半个小时。然后我的同事将其视为独立的一双眼睛,并让我注意到我错了但看起来非常相似的存储库。我切换到repo1
Git 的那一刻开始注意到更改的文件。
不是那么常见的情况。但你永远不知道!
我在使用Sublime Text-3时遇到了类似的问题。在对代码进行新的更改并保存后,当我尝试 git add ./status 命令时,响应是“分支已经是最新的”。我发现,无论在文本编辑器中保存更新,文件实际上都没有改变。在其他编辑器中打开文件并保存更改对我有用。
您是否将目录从外壳下移出?如果您从备份中恢复了项目,则可能会发生这种情况。要解决此问题,只需cd
退出并返回:
cd ../
cd -
git update-index --really-refresh
你可以试试这个命令,它会更新你文件夹中的索引。
当您在 Visual Studio 中编辑文件时,即使文件未保存,它也会立即列在 git 更改中。所以你需要做的只是手动保存文件(Ctrl+S 用于当前显示的文件或 Ctrl+Shift+S 用于所有项目文件),git bash 会选择它们。
它也发生在我身上,我尝试了上述方法,但没有任何帮助。然后解决方案是通过终端更改文件,而不是 GUI。我不知道为什么这有效但有效。在我从终端通过 nano 编辑文件后,git 将其识别为已更改,并且我能够添加它并提交。
我有同样的问题。原来我有两个项目副本,我的终端位于错误的项目文件夹中!
遇到了这个问题,但它只有两个目录,我不知道这两个目录最终都被配置为 git 子模块。我不知道这是怎么发生的,但过程是按照这个链接上的一些说明进行操作,但不要删除目录(就像他最后所做的那样),而是这样做git add path/to/dir
一般来说,对于这个问题,首先检查您是否正在编辑您认为的文件!我在编辑转译的 JavaScript 文件而不是源文件时遇到了这个问题(转译的版本不受源代码控制)。
我遇到过同样的问题。我需要提交的文件也从未在.gitignore
文件中声明过。
-f
在我的情况下,使用提升到暂存的标志强制添加文件并解决了问题。
git add -f <path to file>
我的 Git 客户端 (Gitg) 为我造成了这个问题。我通常会运行的正常命令不起作用。即使触摸项目中的每个文件也不起作用。
我找到了修复它的方法,但我仍然不确定是什么原因造成的。复制您的项目目录。丢失的文件将显示在复制目录的git status
. 重命名可能会做同样的事情。
有时取决于 git 版本,如果你忘记做git add .
.
要检查您对存储库的更改,请始终使用git status
显示所有未跟踪和更改的文件。因为git diff
只显示添加的文件。
我在这里遇到了同样的问题 VS2015 无法识别我的 js 文件更改,从存储库设置中删除远程,然后重新添加远程 URL 路径解决了我的问题。
如果您正在使用 VSCode 并切换到新机器,您可能会关闭 Autosave,因此即使您对文件进行了更改,git 也不会识别它们。
这解决了我的问题
当我使用 vi 编辑器在服务器中创建补丁文件时,我遇到了类似的问题。似乎问题在于间距。当我从本地推送补丁时,部署是正确的。
当所有更改都在新目录中时,这发生在我身上。我添加了第一个文件
git add newdirectory/new.file
然后git status
按预期显示目录中的其他文件。
您尝试上传什么样的文件?现在我只花了将近一个小时来上传我的 css 修改。但是这个 css 是从 styl 文件编译的,因此 git 只是忽略了它。当我更改样式源时,一切正常。
希望能帮助到你。
确保不要从 Git Bash for Windows 内部创建符号链接 ( ln -s source dest
)。
它不创建符号链接,而是将源的深度副本复制到目标
我在 Windows 版 Git Bash(版本 2.16.2)的 MINGW64 终端上经历了与 OP 相同的行为,以意识到我的“编辑”更改实际上位于原始目录中,而我的 git bash 命令来自保留的深层副本不变。
我有这个问题。我的没有工作,因为我将文件放在项目内的 .git 文件夹中。
尝试使用git add *
然后git commit