git:从远程分支签出会更改本地文件吗?

时间:2019-05-02 16:47:36

标签: git branch git-remote

我刚刚签到远程分支,直接在文件中查看与本地分支的区别。根本没有进行任何更改,但是当我尝试返回(ck = checkout)主服务器时,出现错误:“您对以下文件的本地更改将被checkout覆盖: checkout from remote branch

编辑:该错误并未说明未决的提交或it just says abort

我不知道为什么检出会对文件进行任何更改,但是检出来自远程分支并且错误显示“本地文件”的事实使我迷惑不解...然后,本地文件必须引用我要切换到的本地master分支,但是我刚刚提交了该master分支中的所有更改...(!?)。 add . local master commit

编辑:这是提交后的状态: enter image description here

我(肯定)不了解什么?

1 个答案:

答案 0 :(得分:2)

简短回答

丢弃对您的工作树的任何更改,并且这些更改可能已经添加到了

git checkout HEAD -- .

对于Windows FAT32文件系统上的存储库,请告诉git忽略文件模式下的执行位。

git config core.fileMode false

之后,您应该可以检出master分支。

git checkout master

或使用您的别名

git ck master

详细说明

告诉git将所有新文件和更改添加到当前目录(.)和任何子目录中

git add .

然后提交,请注意git告诉您文件权限已更改,例如

mode change 100644 => 100755 .gitignore

与紧邻其上方的行

264 files changed, 0 insertions(+), 0 deletions(-)

我们得出的结论是内容没有更改-仅更改了权限。

上下文对于本段至关重要。运行git commit -m 'many changes were not ...'之后,您可以立即运行git diff origin/master来确认这一点,并且输出将包含许多表格

$ git diff origin/master
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
[...]

但未插入新行或删除了行。

您的屏幕快照和名为Desktop的目录的出现使我相信(稍后的评论已确认)您正在文件系统上使用Microsoft Windows,该文件系统不代表执行模式位,因此git必须被git config documentation解释的git config core.fileMode false告知忽略它。

  

core.fileMode
  告诉Git是否尊重工作树中的可执行文件。

     

某些文件系统在签出标记为可执行文件的文件或签出可执行文件位的不可执行文件时丢失了可执行文件位。 git-clonegit-init探测文件系统以查看其是否正确处理了可执行位,并根据需要自动设置了此变量。

     

但是,存储库可能位于正确处理文件模式的文件系统上,并且在创建该变量时将其设置为true,但以后可以从丢失文件模式的另一个环境(例如,通过CIFS挂载导出ext4,使用适用于Windows或Eclipse的Git访问Cygwin创建的存储库)。在这种情况下,可能需要将此变量设置为false。参见git-update-index

Git哲学

Git非常小心,不要破坏您的工作。在继续进行master检出之前,git将当前工作树的状态与所需分支的头部进行比较,例如,发现.gitignore所在的位置与master中的.gitignore不同。

因为git看到了必须提交给结帐主数据库的未提交更改,所以它中止了结帐,并让您知道您要么有意放弃这些更改

git checkout HEAD -- .

或将它们放到某个地方,以便与git stashgit addgit commit一起安全存放。有了干净的工作树,您就可以安全地检出不同的分支。

比较文件

有关确切更改的详细信息,请运行以下命令之一。正确的调用取决于上下文。

创建新提交后

您添加了更改,并在分支主机上创建了SHA-1对象名称为644ccb8的提交(如git commit -m [...]的输出的屏幕截图所示)。在您创建它时,644ccb8成为您的主分支的HEAD,要查看它与master之间的所有更改,请运行

git diff origin/master

在英语中,这意味着“向我显示origin/master和我当前正在处理的分支的尖端之间的所有更改。”实际上,以上命令等效于git diff HEAD origin/master,该命令显式地要求与HEAD进行比较。

要显示以--分隔符命名的一个或多个文件的更改,请使用

git diff origin/master -- .gitignore README.md

分期后但承诺之前

您的屏幕快照不会显示全部内容,但是git status输出中的绿色文本表示某些更改已“暂存”或已添加到索引中。在git中,我们通过一次或多次调用git add来逐步建立索引中的下一个提交(也称为暂存区或缓存),并且较不常见的是,使用{{1}从索引中删除更改}。一旦索引的状态良好,git reset会将带有索引内容的新提交添加到历史记录中。

您的屏幕截图显示,您是从存储库的根目录运行git commit的。

  • 在旁边:请注意git add .用宽笔刷绘画。有时这就是您想要的,但是通常它会收到比您预期的更多的文件-尤其是当您的git add .缺少一些模式时。经过大.gitignore后,请务必确保运行git add,以确保您没有搭便车。

在运行git status一次或多次之后,但在运行git add之前 之前,要查看索引或缓存中当前的更改,请添加git commit选项。

--cached

或限制为一个或多个特定文件

git diff --cached

登台前

要查看工作树中的内容与索引(或缓存)中的内容之间的增量,请运行以下其中之一

git diff --cached -- README.md

这是git diff git diff -- README.md 的默认模式。

独立的头

从屏幕截图中注意到,您的存储库有一个detached HEAD,在文档中定义为

  

这仅表示HEAD指的是特定的提交,而不是指的是命名分支。

根据经验,通常不是要签出远程跟踪分支(例如git diff),标签或SHA-1哈希如果您打算进行修改,则直接使用。