在特定提交时在脏目录中初始化Git

在特定提交时在脏目录中初始化Git,git,Git,我在本地有一个Git repo,它的文件通过FTP上传到服务器上。我不想一个接一个地上传文件,所以我也尝试在服务器上设置Git。这将允许我简单地使用SSH和git从GitHub中拉取文件 因为我已经在服务器上有了最新版本的文件,所以我想在最新提交时初始化存储库,Git不应该对这些文件做任何操作,因为它们是相同的。然而,事实并非如此: ssh myserver cd /path/to/project git init git remote add origin https://github.com

我在本地有一个Git repo,它的文件通过FTP上传到服务器上。我不想一个接一个地上传文件,所以我也尝试在服务器上设置Git。这将允许我简单地使用SSH和git从GitHub中拉取文件

因为我已经在服务器上有了最新版本的文件,所以我想在最新提交时初始化存储库,Git不应该对这些文件做任何操作,因为它们是相同的。然而,事实并非如此:

ssh myserver
cd /path/to/project
git init
git remote add origin https://github.com/user/repo
git fetch
git checkout master
最后一个命令输出:

错误:签出将覆盖以下未跟踪的工作树文件:

请在切换分支之前移动或删除它们

流产


为什么会这样?Git想要覆盖的文件及其内容完全相同。签出不应该没有问题吗?

此错误的关键部分是“未跟踪”一词:

错误:签出将覆盖以下未跟踪的工作树文件:

这是因为您创建的Git存储库(
Git init
)有一个索引,但该索引当前为空。1因此,工作树中的每个文件都未跟踪。Git不会继续比较内容:在Git看来,不跟踪文件就足以导致问题

诀窍是填充索引。考虑到您希望建议的下一个提交2包含当前由名称
origin/master
标识的提交中的文件,一种简单的方法是:

git read-tree origin/master
您现在可以
git checkout master
origin/master
创建分支
master
,保留工作树文件

(您也可以使用
git add
,从工作树中按原样填充索引。只要工作树的文件及其内容与
origin/master
标识的提交中的内容匹配,任何一种方法都可以)


1A真正的空索引与索引与
HEAD
commit匹配的情况非常不同。如果索引为空,下一次提交将快照。成功签出空树将从工作树中删除所有跟踪文件,现在将根本没有跟踪文件

2除了在合并过程中承担扩展角色外,索引可能最好描述为您建议的下一次提交。一个
git checkout
操作用您要签出的提交中的文件填充索引,并且在此过程中,还将这些文件复制到工作树


我们将从提交中填充索引,而不将文件复制到工作树。

这可能是因为某些已更改/未跟踪的文件位于本地repo中,或者您位于本地repo的其他分支中,并且当您尝试签出master时,它正试图覆盖这些文件。最好使用
git clone
,然后可以使用git pull通过远程repo跟踪工作树。当运行
git diff
时,您可能会看到这个问题。过来看: