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