git学习笔记(十三)--git的合并

在大致学习完git的本地操作后,现在主要学习一下git协同工作的知识,这也是git的精华和关键。

大体上要调整一下学习策略,抓住重点的知识,迅速掌握核心的一些命令,而一些小的技巧和问题,先放一放,有时间慢慢学,毕竟git的学习成本比较高,想要全面用好,会用,是需要一个过程的。

 

git在数据交换使用的协议:


 

git支持丰富的协议,比如ssh,git,http,ftp还有本地协议~

其中ssh,git,和本地协议属于智能协议,也是这次重点了解和学习的三个协议。

SSH协议用来和服务器进行数据交换

    ssh://[user@]exaple.com[:80]/user/local/git/repo.git

    [user@]exaple.com:/user/local/git/repo.git

GIT协议是最常用的只读协议,可以快速从服务器端下载最新的版本库

  git:example.com:80/usr/local/git/repo.git

  其中git是协议名,example.com是网址(或用IP表示),80是端口号,/usr/local/git/repo.git是版本库的绝对路径

本地协议可以让我们在本地模仿远程操作,这次学习主要先使用本地协议。

 

图1:

在本地建立一个共享库sharerepo,从sharerepo克隆共享库直接初始化用户user1和user2

 

图2:

在user1中创建一个文件,提交后push到共享库,从user2中pull最新提交,在本地查看后发现有新文件

 

图3:

可能遇到一个快速推送的问题,当在user1中上传修改更新共享版本库后,user2不能在旧的版本库基础上直接提交,必须建立在远程版本库对应分支最新提交的基础上才能上传,因此一般要先从共享版本库Pull回来最新的提交

 

图片4:

解决上述问题,pull回来后,发现多了一个text_user1文件,这时候再push,就没有问题了


下面通过一个例子了解合并冲突和解决方法:


 

 

图片5:在user1的文件profile_user1中添加一行“冲突解决”,push到共享服务器;在user2的文件profile_user1中也添加一行“解决”

 

图片6:user2中的也上传到本地版本库,然后执行pull操作,发现提示:“自动合并失败,修正冲突然后提交修正结果”

在下面profile_user1文件中,连续7个<组成的<<<<<<<表示发生冲突位置的本地内容,连续7个=组成的========表示分隔符,连续7个>组成的>>>>>>>表示pull回来的分歧内容

 

图7:

① 查看暂存区中的记录:用git ls-files -s命令

② 发现Profile_user1对应有3个文件,在以前的学习中,我们知道git ls-files对应输出的内容的含义,其中第三列指的是暂存区,如果正常,应该都为0暂存区,现在有1,2,3暂存区,表示出现冲突,其中1暂存区保存的是冲突发生之前双方的共同祖先内容;2暂存区保存的是本地修改后的内容;3暂存区保存的是远程版本库中新提交后的内容;

③ 我们修改该文件,然后提交

④ 查看日志,发现有合并操作

⑤ 再次查看暂存区,只有0号出现了

 

注意:

  1. 每次从共享版本库pull,都是pull的最新提交,过往的旧提交不会pull下来。
  2. git pull其实相当于git fetch + git merge 而git merge一般都带有提交操作,也就是每次我们pull一个回来,都会产生一个新的合并提交
  3. 当发生冲突后,默认不会merge,内容都保存在暂存区,需要我们自己解决冲突,然后自己提交

 

最后:

关于合并冲突的地方,需要经验的积累,不要随意改动已经上传文件的名字,不要随意改变一些函数的调用关系和返回值

多创建tag,多利用branch,才能发挥git的威力,继续学习!

posted on 2012-07-30 10:09  melburg  阅读(2084)  评论(0)    收藏  举报