概述
为什么不commit(到本地版本库)就不能(从远端服务器)pull?
若干基础
1.默认的commit是提交stage(暂存区)中的内容到本地版本库。
2.一般可以认为pull = fetch + merge
(1)fetch是指创建并更新本地远程分支(origin/master),并将FECTH_HEAD指定为刚才的分支。
(2)merge是指将指定的分支1与当前分支合并,合并存在两种情况(git采用三路合并算法是用于解决冲突的一种方式,当产生冲突时,三路合并算法会获取三个节点:本地冲突的B节点,对方分支的C节点,B,C节点的共同最近祖先节点A。三路合并算法会根据这三个节点进行合并。具体过程是,B,C节点和A节点进行比较,如果B,C节点的某个文件和A节点中的相同,那么不产生冲突;如果B或C只有一个和A节点相比发生变化,那么该文件将会采用该变化了的版本;如果B和C和A相比都发生了变化,且变化不相同,那么则需要手动去合并;如果B,C都发生了变化,且变化相同,那么并不产生冲突,会自动采用该变化的版本。最终合并后会产生D节点,D节点有两个父节点,分别为B和C。)
进行试验发生的情况
1.版本1(刚刚clone下来的)在工作区进行了修改1,直接pull,成功
2.版本2在工作区进行了修改2,commit,pull,push,成功
3.此时版本1pull,失败,显示 Your local changes to the following files would be overwritten by merge:test.txt.Please commit your changes or stash them before you merge.
Aborting
思考
思考1:git判断出了可能的危险。什么危险呢,一如警告中所写,本地文件可能会被overwritten,有可能被合并而导致相关文件被修改(复写)。
思考2,什么时候会发生这种问题呢?首先,本分支有未提交的内容,第二,merge会导致这些内容被修改。
思考3:关于快速合并,在1.中直接pull是可以进行的,为什么呢?因为他就是上游版本,从快速合并的角度来说如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前”(fast forward)操作;git 不创建任何新的提交(commit)(这里很关键,意味着你不会对工作区有改动),只是将当前分支指向合并进来的分支。
一个猜测的解释:
只有发生了快速合并,并且你在上游,才可以不commit直接pull,否则都可能因为merge而更改当前分支的内容而导致overwritten工作区的文件(即merge会将merge的结果反作用在当前分支的工作区上,除了fast-forward)。
最后
以上就是悦耳大雁为你收集整理的为什么不commit(到本地版本库)就不能(从远端服务器)pull?为什么不commit(到本地版本库)就不能(从远端服务器)pull?的全部内容,希望文章能够帮你解决为什么不commit(到本地版本库)就不能(从远端服务器)pull?为什么不commit(到本地版本库)就不能(从远端服务器)pull?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复