一天,我的同事过来找到我,和我讲:张叫兽,大事不好,我的文件被人覆盖了。git是真的不好用啊
git不好用?文件被覆盖;瞬间我似乎知道了什么,让我想到了某位男明星的语法:他一定是犯了全天下git初学者都会犯的错误。
一了解,果不其然
先说结论:git拉取,如果发生冲突,尽量保证Stage空间文件都提交
下面我们把这起事故的全流程给大家唠唠哈:
- 首先小红和小王都是基于commited 100的提交来做开发
- 开始小红对于README.md文件以及test.c文件都做了修改,然后提交并提到了git服务器(Gitea/Gitee/Github/GitLab)
- 咱们回头再来看小王,小王基于commit 100,对于test.c做了修改,很明显,test.c文件push将会发生冲突;
- 提交本地没问题,push的时候失败,于是通过git pull命令,来去最新代码,解决冲突
- 前方高能!!!合并的时候,已经列出了README.md在Stage区(也就是Git的暂存区),但是,基于SVN的历史经验,小王觉得自己没有修改README.md,然后果断的放弃了修改,只是提交了test.c文件
- 然后就是推送的git 远程服务器
- 此时小红再次拉取新代码,发现自己之前对于README.md的修改丢失了
为什么会这样?
从好理解的角度来看,大家可以理解为,每次push行为是将要让远程服务器的“所有的”文件内容和本地分支的内容,完全一样
那么,git是怎么做到这一点的呢?因为merge操作是一种特殊的提交,对于普通的提交,只是会记录local分支的提交内容:
他会记录本地仓库合并后的文件和合并双方的差异(本地分支原来的文件,以及拉取分支之间的差异),所以当你把这个merge的commit推送到了Git服务器之后,Git的原则就是提交方为大,对于有差异的地方,按照提交方为准。所以就小王的push之后,将自己本地旧版的README.md文件成功的错误的推送到了git服务器。