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

git:从远程分支签出更改本地文件?,git,branch,git-remote,Git,Branch,Git Remote,我刚刚签出到一个远程分支,直接在文件中查看与本地分支的差异。根本没有做任何更改,但当我尝试返回(ck=checkout)到主控时,我得到一个错误:“您对以下文件的本地更改将被checkout覆盖: 编辑:错误没有说明任何关于挂起的提交或其他内容 我不明白为什么签出会对文件进行任何更改,但签出来自远程分支并且错误显示为“本地文件”这一事实让我感到困惑…本地文件必须引用我切换到的本地主分支,但我刚刚提交了该主分支中的所有更改…(!?)。 编辑:这是提交后的状态: 我(肯定)不明白的是什么?简短

我刚刚签出到一个远程分支,直接在文件中查看与本地分支的差异。根本没有做任何更改,但当我尝试返回(ck=checkout)到主控时,我得到一个错误:“您对以下文件的本地更改将被checkout覆盖:

编辑:错误没有说明任何关于挂起的提交或其他内容

我不明白为什么签出会对文件进行任何更改,但签出来自远程分支并且错误显示为“本地文件”这一事实让我感到困惑…本地文件必须引用我切换到的本地主分支,但我刚刚提交了该主分支中的所有更改…(!?)。

编辑:这是提交后的状态:

我(肯定)不明白的是什么?

简短回答 放弃对工作树的任何更改,这些更改可能已通过添加到索引中

git checkout HEAD -- .
对于Windows FAT32文件系统上的存储库,告诉git忽略文件模式上的执行位

git config core.fileMode false
之后,您应该能够结帐您的主分支

git checkout master
或者使用你的别名

git ck master

详细说明 在您告诉git在当前目录(
)和任何子目录中添加所有新文件和更改之后

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

再加上它上面的那条线

264 files changed, 0 insertions(+), 0 deletions(-)
我们的结论是,内容没有改变——只有权限

上下文对于本段至关重要。在运行
git commit-m“许多更改都没有…”
之后,您可以通过运行
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 core.fileMode false
忽略它,这就是解释

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

某些文件系统在签出标记为可执行的文件时会丢失可执行位,或者签出打开可执行位的非可执行文件。或者探测文件系统以查看其是否正确处理可执行位,并且根据需要自动设置此变量

但是,存储库可能位于正确处理filemode的文件系统上,该变量在创建时设置为true,但稍后可以从另一个丢失filemode的环境中访问(例如,通过CIFS装载导出ext4,使用Git for Windows或Eclipse访问Cygwin创建的存储库)。在这种情况下,可能需要将此变量设置为false。请参阅

Git哲学 Git非常小心不要破坏您的工作。在继续签出master之前,Git会将当前工作树的状态与所需分支的头进行比较,例如,看到
.gitignore
与master中的
.gitignore
不同

由于git看到必须覆盖到签出主机的未提交更改,因此它会中止签出,并让您知道您需要故意丢弃这些更改

git checkout HEAD -- .
或者使用
git stash
git add
git commit
将它们放在安全的地方保存。通过一个干净的工作树,您可以安全地签出不同的分支

比较文件 有关具体更改内容的详细信息,请运行以下命令之一。正确的调用取决于上下文

创建新提交后

您添加了更改并在分支主控上创建了一个commit-on-branch-master,对象名为644ccb8(如您从
git-commit-m[…]
输出的屏幕截图所示)。在创建它时,644ccb8成为主分支的
,要查看它和
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
,以及不太常见的使用
git reset
从索引中删除更改。索引状态良好后,
git commit
将索引内容的新提交添加到历史记录中

您的屏幕截图显示您从存储库的根目录运行了
git add.

  • 旁白:请注意,
    git add.
    画笔很宽。有时这是你想要的,但它通常会拾取比你想要的更多的文件-尤其是当你的
    .gitignore
    缺少一些模式时。在一个大的
    git add
    之后,一定要运行
    git status
    ,以确保你没有拾取一个文件我喜欢搭便车
在运行
git add
一次或多次之后,但在运行
git commit
之前,要查看索引或缓存中当前的更改,请添加
--cached
选项

git diff --cached
或者限制在一个o
git diff --cached
git diff --cached -- README.md
git diff
git diff -- README.md