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中去了

分析
  1. 什么场景下会出现
    小明原本只有A分支,后来git checkout -b B生成了一个B分支;
    小明的A和B分支都从远程分支master下拉了一次版本,现在本地2个分支的版本完全一样

  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实际上是操作了文

如何解决
  • 两种方式二选一
  1. 可以使用git stash把工作区空间的修改隐藏起来,就可以切换到其他分支了,然后使用git stash list查看stash,再用git stash pop stash@{0}应用并删除该stash@{0}
  2. 使用git commit提交

参考链接:
Git 的M,T,D,A,U标志是什么意思

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐