当工作目录不干净时,Git在检查其他分支时的行为会有所不同

时间:2015-07-18 08:34:07

标签: git

使用git init创建新存储库并执行第一次提交(进入master分支)

然后我尝试编辑一些文件,而工作目录还不干净,我可以 git checkout -b dev然后git add .git commit(进入开发版)所有成功。

但此时编辑dev分支中的文件后,虽然工作目录还不干净,我做不到 git checkout master,git要求我 stash 或以其他方式完成提交,然后再签出其他分支。

我很好奇为什么git在这种情况下的行为不同。

编辑(添加屏幕截图)

1 个答案:

答案 0 :(得分:2)

因为当repo刚刚初始化时,根本没有分支。
使用git checkout -b创建一个不会更改当前工作树中的任何内容。

同样,如果已经存在分支master,则创建新分支意味着只需初始化dev HEAD,而不必修改当前工作树。

但是,一旦创建了一个分支(意味着至少有一个提交),如果这将删除正在进行的一些工作,则无法切换到另一个分支。
master中有待修改的情况下返回dev会删除所述修改,这就是推荐git stashgit commit的原因。

git checkout man page确实包括:

  

切换分支时,如果对当前分支和要切换到的分支之间的一个或多个文件进行本地修改,则该命令拒绝切换分支以保留上下文中的修改

git checkout更新工作树中的文件,以匹配索引或指定树中的版本。

在OP的图片中,第一个git checkout -b dev不必更新master中的任何文件,以匹配dev中所述文件的版本(因为dev是刚刚创建。)

但是在第二个git checkout master中,必须从file1(当前正在修改)更新dev以匹配来自file1的{​​{1}}版本:这就是为什么在切换之前需要mastergit stash