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

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

然后我尝试编辑一些文件,而工作目录还不干净,我可以成功执行git checkout -b dev然后git add.,git commit(进入dev分支).

但是此时编辑dev分支中的文件后,虽然工作目录尚未清理,但我无法执行git checkout master,git要求我在保存到其他分支之前保存或以其他方式完成提交.

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

编辑(添加截图)

最佳答案 因为当repo刚刚初始化时,根本就没有分支.

使用git checkout -b创建一个不会更改当前工作树中的任何内容.

类似地,如果已经存在分支主机,则创建新分支意味着只需初始化主机所在的开头HEAD,而无需修改当前工作树.

但是,一旦创建了分支(意味着至少有一个提交),如果这将删除正在进行的某些工作,则无法切换到另一个分支.
在dev中有待修改的情况下回到master会删除所述修改,这就是为什么建议使用git stash或git commit.

git checkout man page确实包括:

When switching branches, if you have local modifications to one or more files that are different between the current branch and the branch to which you are switching, the command refuses to switch branches in order to preserve your modifications in context.

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

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

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

点赞