git 切换本地分支时,把当前分支修改的内容带到了下个分支中去
- 举个梨子,首选小明拥有2个本地分支
A和B
,2个分支中都有test.txt文件,小明在A
分支中修改了test.txt
文件的内容,git checkout B
后,
命令行提示
jack@jack-copumter:~/workspaces$ git checkout B
M text
Switched to branch 'B'
-
如果是小白请看这个,不是请跳过
在使用git checkout , git status,或git diff files时会出现奇怪的标志。如M,T,D,A,R,U等等。
A: 增加的文件.
C: 文件的一个新拷贝.
D: 删除的一个文件.
M: 文件的内容或者mode被修改了.
R: 文件名被修改了。
T: 文件的类型被修改了。
U: 文件没有被合并(你需要完成合并才能进行提交)
X: 未知状态。(很可能是遇到git的bug了,你可以向git提交bug report)
在git diff-files的手册man git diff-files中可以查到这些标志的说明。 -
最后大家就看到了自己在
A
分支修改的test.txt的内容,就跑到了B
中去了
分析
-
什么场景下会出现
小明原本只有A
分支,后来git checkout -b B
生成了一个B
分支;
小明的A和B
分支都从远程分支master下拉了一次版本,现在本地2个分支的版本完全一样
-
原因是什么
我想现在大家已经知道关键问题在哪里了吧,就是2个分支的版本完全一样,原来git checkout
切换分支的时候,会对比当前分支的md5值,查看md5值用git log
jack@jack-copumter:~/workspaces$ git log commit d39c07fa258ab0e82cf9bab19643a390e1670ce6 (tag: v1.1.0, origin/pre, pre) Author: jack <10*****1@qq.com> Date: Tue Nov 13 19:28:16 2018 +0800 1.优化用户认证更新和修改个人资料
当2个分支的md5值一样的时候,
git check
就会带着你的修改去宁外一个分支,
解惑
-
有些小伙伴可能会问了,为啥我
git checkout
它就提示jack@jack-copumter:~/workspaces$ git checkout pre error: Your local changes to the following files would be overwritten by checkout: src/app/api/api.go Please commit your changes or stash them before you switch branches. Aborting
还是我刚刚说的,你们的md5值不一样,实际上md5值就是git的版本号,你可以去查看你的2个分支肯定不在同一个版本上.
-
一些特殊情况,你切换的分支名和你的文件名一样,比如你有一个分支叫
test
刚好有一个文件叫test
,那么你git checkout test
实际上是操作了文
如何解决
- 两种方式二选一
- 可以使用
git stash
把工作区空间的修改隐藏起来,就可以切换到其他分支了,然后使用git stash list
查看stash,再用git stash pop stash@{0}
应用并删除该stash@{0} - 使用
git commit
提交
参考链接:
Git 的M,T,D,A,U标志是什么意思