使用git init
创建新存储库并执行第一次提交(进入master
分支)
然后我尝试编辑一些文件,而工作目录还不干净,我可以 git checkout -b dev
然后git add .
,git commit
(进入开发版)所有成功。
但此时编辑dev分支中的文件后,虽然工作目录还不干净,我做不到 git checkout master
,git要求我 stash 或以其他方式完成提交,然后再签出其他分支。
我很好奇为什么git在这种情况下的行为不同。
答案 0 :(得分:2)
因为当repo刚刚初始化时,根本没有分支。
使用git checkout -b
创建一个不会更改当前工作树中的任何内容。
同样,如果已经存在分支master
,则创建新分支意味着只需初始化dev
HEAD,而不必修改当前工作树。
但是,一旦创建了一个分支(意味着至少有一个提交),如果这将删除正在进行的一些工作,则无法切换到另一个分支。
在master
中有待修改的情况下返回dev
会删除所述修改,这就是推荐git stash
或git commit
的原因。
切换分支时,如果对当前分支和要切换到的分支之间的一个或多个文件进行本地修改,则该命令拒绝切换分支以保留上下文中的修改强>
git checkout
将更新工作树中的文件,以匹配索引或指定树中的版本。
在OP的图片中,第一个git checkout -b dev
不必更新master
中的任何文件,以匹配dev
中所述文件的版本(因为dev
是刚刚创建。)
但是在第二个git checkout master
中,必须从file1
(当前正在修改)更新dev
以匹配来自file1
的{{1}}版本:这就是为什么在切换之前需要master
或git stash
。