为什么 Git 错误地认为我的文件是最新的?

为什么 Git 错误地认为我的文件是最新的?

我的文件目录中有两个文件夹 A 和 B,它们链接到同一个 Git 存储库。

我在文件夹 A 中创建了一个名为 的文件index.html。然后在文件夹 B 中创建了另一个名为 的文件index.html。然后我将其添加index.html到文件夹 B 中,提交并推送 B 的内容。

当我从文件夹 A 拉取文件时,Git 声称我的文件“已更新”。但是两个文件夹显然有不同的index.html文件。发生了什么?

答案1

git pull的工作是将fetch新提交添加merge到当前分支。如果当前分支与你从中拉取的分支相比并不过时,pull 会说Already up-to-date. 即使你的工作目录中有本地更改.git pull关注的是分支,而不是工作树 —— 仅当存在干扰合并的更改时它才会对工作树进行评论。

您的描述不足以解释为什么它不反对现有的index.html,但您不应将其Already up-to-date.视为 git 认为您没有更改的意思。相反,请使用git status来获取摘要。

为了了解您的分支的状态,git branch -v它很有用(它显示提交 ID 和与每个分支的上游分支的关系),或者gitk --all显示所有提交的图形视图。

答案2

如果我理解正确的话,以下脚本应该可以重现您的问题:

mkdir 测试
CD测试
git init --裸测试.git
git clone 测试.git a
git clone 测试.git b
回显 a > a/index.html
回声 b > b/index.html
光盘
git 添加 index.html
git 提交 -m 添加
git push origin master
cd../a
git pull

最后git pull打印:

远程:计数对象:3,完成。
远程:总计 3(增量 0),重用 0(增量 0)
拆开物体:100% (3/3),完成。
来自 /home/cyrus/tmp/test/test
 * [新分支] master -> origin/master

并且的内容index.html已被默默覆盖:

cyrus:~/tmp/test/a$ cat index.html
b

答案3

记住一件事git——它跟踪内容,而不是文件

从内部来看,存储库保存的所有内容都是斑点某处。您认为是文件的东西,git其实是指向 blob 的名称。您认为是两个内容相同的文件的东西,git其实是链接到同一个 blob 的两个名称。因此,由于所有 blob 均未发生更改,因此存储库未发生更改。

您希望 git 像您的文件系统一样工作(或者可能像大多数其他版本控制系统一样) -git在这方面实际上更节省空间。这本书很好地解释了这个概念 - 具体来说,Git 对象模型

答案4

看起来你已经习惯了 SVN,其中不同的文件夹(甚至是文件,不知道)可以检出不同的修订版本。

git 无法做到这一点。无论你所在的文件夹是什么,提交或签出(这也是成功拉取的最后一步)都会独立于你当前所在的文件夹对所有工作文件执行操作。

相关内容