git多人协作的日常6种场景

开篇:之所以写git基本工具的使用,主要原因是通过这几年的工作,发现身边很多人无法熟练使用这个工具,日常工作中将很多的时间浪费在这些问题上,而无法聚焦到自己的本职工作中,所以本篇将介绍git多人协作中的一些高频场景。

一、环境准备

  1. 我在github上新建了一个仓库oa,包含一个MIT的license文件。git仓库的地址是:[email protected]:mudongchun/oa.git
  2. 在本地有一个oa的demo项目,本示例就以这个项目为实验对象。
  3. 我准备了两个github账户,模拟两个人对项目进行操作。
  4. 目前远程仓库只有一个分支,master,分支结构视图如下。

git多人协作的日常6种场景_第1张图片

     5. 将本地的oa项目使用git init进行初始化。并且使用git add将文件都跟踪起来,使用git commit进行提交到本地仓库。

     6. 使用git add remote github [email protected]:mudongchun/oa.git添加远程仓库

     7. 由于本地master和远程是两个不同的仓库,使用下面的命令对本地master分支和远程仓库的master分支进行合并。

          git merge --allow-unrelated-histories 188a5d2  #188a5d2为远程分支

     8. 最终本地仓库的分支视图结构如下:

           git多人协作的日常6种场景_第2张图片

      9. 我们将本地的仓库推送到远端仓库。

             git push github master

     10. 远程仓库的分支视图变为和本地一样。

           

     11. 新建另外一个本地目录oa2,用来模拟第二个开发人员。并clone远端仓库。使用下面的命令配置user.name和user.email

           git config --local --add user.name 'yangting'

           git config --local --add user.email '[email protected]'

     12. 在远端仓库再创建一个新的分支addComment,并且分别在本地的两个目录执行下面的命令创建一个与远程分支同名的本地分支

           git checkout -b add_comment github/add_comment

     13. 最终本地分支的视图结构如下

           

场景一:不同的人修改了不同的分支的文件

一个账户在oa目录修改主干分支的pom.xml文件,并且推送到远程,另一个账户在oa系统下修改了addComment分支的pom.xml文件,并且推送到远程。这种场景非常简单,由于修改的是不同的分支,所以大家互不干扰。github上的分支结构视图如下:

               git多人协作的日常6种场景_第3张图片

场景二:不同的人修改了相同的分支的不同文件

  1. 现在我们两个账户都。账户一对add_comment分支的pom.xml文件进行修改,提交并先推送到远程分支正常;
  2. 账户二对add_comment分支的oa_biz模块下的pom.xml文件进行修改,提交;
  3. 账户二推送到远程分支肯定是有问题的,因为两个账户修改的是同一个分支的不同文件,对应于两个commit,当账户二推送到远程分支的时候,git不知道应该将头指针指向哪一个commit节点,因为是同一个分支,不管指向哪一个commit,都会造成另一个commit的修改被丢弃,除非对两个commit节点进行合并,可惜的是git不会自动对我们的修改做合并,需要我们自己进行合并。
  4. 所以账户二需要先pull(先fetch后merge)远程分支的代码到本地,这样远程分支中账户一做的修改和账户二做的修改就做了合并,这时推送本地分支到远程,这样远程的分支就是完整的两个账户修改的代码。修改后的本地分支账户如下图:

             git多人协作的日常6种场景_第4张图片

      5. 将账户二的本地分支推送到远程

      6. 对账户一执行git pull操作,获取远程最新的分支代码。

      7. 远程分支的视图结构如下,和本地分支的意义相同:

              git多人协作的日常6种场景_第5张图片

场景三:不同的人修改了相同分支相同文件的不同部分

这个场景和场景二一样,在账户一修改、提交、push到了远程分支后,账户二在修改提交同一个文件后,需要先在本地进行pull合并操作,再推送到远程。

 

场景四:不同的人修改了相同分支相同文件的相同部分

  1. 账户1对主目录下的pom.xml文件修改,提交并推送到远端
  2. 账户2对主目录下的pom.xml文件修改提交,并推送到远程,和上面的场景一样,对应了两次提交,git并不知道应该将头指针指向哪一次提交,需要我们pull到本地合并。
  3. 当我们执行pull操作进行代码合并的时候,问题来了,由于两个账户修改的是相同文件的相同地方,git也不知道该怎么处理了,这就是冲突,需要我们手动解决。需要注意的是,git pull对于conflict的报错非常不明显,需要仔细观察,倒数第二行的大写Conflict,如下图所示:

            git多人协作的日常6种场景_第6张图片

     4. 解决冲突。分三步,第一编辑冲突文件,第二步,使用git add/git commit进行提交。第三步,不要忘记将本地分支推送到远程分支。

     5. 最终本地分支和远程分支的视图如下:

          git多人协作的日常6种场景_第7张图片

         git多人协作的日常6种场景_第8张图片

场景五:相同分支,一个人修改了文件名,另一个人修改了文件内容

这个场景和场景2类似,解决方案也完全一样,这里不再进行描述。

场景六:相同分支,两个人同时修改了文件名

  1. 账户1修改pom.xml文件名为pom1.xml,并进行提交和推送到远程
  2. 账户2修改pom.xml文件名为pom2.xml,并进行提交和推送到远程,这个时候就会出错,问题的原因和场景二一样。
  3. 解决方案是先进行pull,但是pull的时候,git发现两个账户对同一个文件名做的修改,它不知道该保留哪一个,于是两个都保留,等待我们手动解决冲突。

        

      4. 冲突解决方案。分下面几步:

            (1) 由于两个账户都删除了pom.xml,所以先使用git rm对pom.xml进行删除操作

           (2) 使用git rm对pom1.xml进行删除操作

           (3) 使用git add -u/ git commit进行提交

           (4) 使用git push推送到远端

      5. 最终本地分支和远程分支的结构如下:

            git多人协作的日常6种场景_第9张图片

            git多人协作的日常6种场景_第10张图片

 

你可能感兴趣的:(git)