git会在本地维护 origin/master分支,通过该分支 感知远程github的内容
origin/master一般建议 不要修改,是一个只读分支
我们可以用一个命令去感知本地仓库与远程仓库的差距(是否落后或先进):git remote show origin
up to date表示本地仓库master分支与远程仓库保持一致。
本地与远程冲突
假如有2个本地仓库,一个是mygit01 , 另一个是mygit02,它们关联的是同一个远程仓库。
刚开始时,它们的commit链的最新节点都是 58f5448
然后mygit01修改了a.txt文件,提交然后push到远程。
此时mygit01和远程仓库的commit链都是 58f5448 -> 241644f
然后mygit02也修改了a.txt文件,然后commit。
此时mygit02的commit链是 58f5448 -> 1e7bdlaf
然后在push的时候就是失败,因为冲突了。官方建议(也是解决办法)是:
1.git pull(拉取远程代码,pull 就是 fetch + merge)
2.然后自己修改冲突的文件 (这一步你会看到冲突的文件是怎样的,你甚至可以不修改冲突文件的,但逻辑上我们肯定要修改)
3.commit (在这一步git会认为你已经解决好冲突了)
4.push
就会成功。
失败的示例:
mygit02修改冲突后,查看commit链,发现变成了 58f544 -> 241644f -> le7bdlaf -> 13e5f48 (13e5f48是我们解决冲突时的commit节点,也就是解决冲突的第三步生成的commit节点
)
所以git 解决冲突的逻辑是:把远程的commit链放在前面,自己的commit链放在后面,使之合成一条链来解决。
冲突的本质是两个仓库处于不同的commit链,因为无法确定要以那条链为基准,所以无法合并。