利用Git和Github进行协作开发 | 青训营

323 阅读8分钟

利用Git和github进行协作开发

为了满足项目组各成员远程协作开发项目以及代码管理的需求,本文介绍了通过github建立远程仓库、Git进行代码版本控制的collaborator协作开发模式。

关于Git合作流程的collaborator模式和contributor模式的介绍,可以参考这篇博文

一、在github上建立远程仓库

  1. 由leader在自己的github账号上新建一个仓库作为项目的远程仓库

    image-20230802203447120.png

    填好仓库名、描述、是否公开等,然后点击创建仓库。

    image-20230802203544688.png

    由于我勾选了默认添加一个README文件,因此仓库创建好后直接有个README文件。

  2. 添加组员为Collaborators

    leader在仓库的settingsCollaborators一栏中添加项目的协作开发成员

    image-20230802194142464.png

    在弹出的输入框中输入协作者的github用户名邮箱等来邀请他们加入项目开发。

    image-20230802194318957.png

    然后协作者的邮箱会收到邀请协作的邮件,点击accept即可加入。

  3. 这样其他协作者就拥有几乎同样于仓库创建者即leader的权利,可以直接对项目进行“写”。

    对于信任度较高或者重要性不强的合作小型开发项目,采用此种方式即可。

二、创建本地仓库

  1. 在本地新建一个文件夹作为本地仓库,如test_repo

  2. 进入该文件夹,右键选择“Git Bash Here”打开git终端

    image-20230802195422781.png

  3. 在终端输入git init指令将本地文件夹变成本地仓库

    git init
    

    image-20230802195626244.png

    该文件下会出现一个隐藏文件夹.git(git的控制文件,不要删除)

  4. leader可以通过git clone指令从github远程仓库克隆项目代码。如下图,复制仓库的地址。

    image-20230802203834712.png

    在git终端执行

    git clone 仓库地址
    

    image-20230802203903606.png

  5. 进入clone下来的文件夹,发现当前本地分支为main

    image-20230802200808454.png

  6. 执行git checkout -b dev 指令在main分支下新建dev本地分支并跳转到dev分支下

    git checkout -b 分支名
    

    image-20230802201100308.png

    注意

    • 如果只是在本地仓库创建本地分支而不跳转则执行:

      git branch 分支名
      
    • 若要跳转到某分支,则执行:

      git checkout 分支名
      
    • 查看本地分支,执行:

      git branch
      

      image-20230802204001935.png

      星号(*)表示当前所在分支

    • 查看全部分支(包括远程分支和本地分支),执行:

      git branch -a
      

      image-20230802204045662.png

    关于项目开发中分支的常用命名及作用可以看这篇博文

  7. 在本地dev分支下创建一个文本文件a.txt

  8. 执行git add *指令添加当前目录(包括子目录)下的所有文件改动到暂存区

    git add *
    
  9. 执行git commit -m "提交信息"指令提交暂存区到本地仓库中

    git commit -m "提交信息"
    

    提交信息建议每次提交时按照统一的规范填写,能够描述此次提交的作用。

  10. 此时如果直接执行git push将本地仓库推送到远程仓库是会报错的:

    image-20230802212414733.png

    这是因为上面只是在本地创建了一个dev分支,远程仓库可能并没有dev分支或者有但是没有与本地仓库的dev分支相关联

    在clone的过程中,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,本地的main分支自动连接到远程的origin/main分支。但其他没有对应关系的分支就需要手动设置了。

    • 若远程仓库没有dev分支,则执行:

      git push -u origin dev
      

      git push --set-upstream origin dev
      
      • 该指令把本地的当前分支推送到远程仓库origin的dev分支(远程没有就自动创建dev分支),然后把本地的当前分支关联到远程仓库origin的dev分支。(在推送的同时,设置upstream。)

      • 实际上git push -u就是git push --set-upstream缩写版本。

      • origin,就是远程仓库的别名,github把远程仓库的名称默认称为origin。

      • upstream 是指本地分支与远程仓库中的分支之间的流通道,建立流通道就是建立本地分支与远程分支的关联。建立之后,后续就可以直接使用git push指令把本地分支的commit推到远程分支中。

      • 在设置了本地分支的upstream后,之后在该分支pull或push就可以直接执行git pullgit push而不需要指定远程分支。

      此时到github中就可以看到远程仓库里也出现了dev分支,且该分支里有了我们刚刚push上去的a.txt文件。

      image-20230802212637097.png

    • 若远程仓库和本地仓库均有dev分支,只是没有关联起来,则可以只执行:

      git branch -u origin/dev
      

      git branch --set-upstream-to=origin/dev
      

      当然,这种情况也可以使用git push -u origin dev

  11. 其他协作者可以根据自己负责的功能模块,以dev分支为基线,创建对应的feature/xxx分支来作为自己这一功能模块的分支。比如负责用户信息模块的成员可以在dev分支下创建feature/user分支,然后在此分支编码并上传。

    注意:创建新分支前记得先pull最新的代码,然后再创建分支。

  12. 若完成某一功能模块的编写,需要合并分支,则用到git merge指令

    • 切换到你要合并到的目标分支,比如想将本地的feature/user分支合并到dev分支,则先切换到dev分支:

      git checkout dev
      
    • 然后执行pull最新的代码:

      git pull
      
    • 合并分支:

      git merge feature/user
      

    注意:如果合并出现了代码冲突(两个分支对于同一个文件的同一个部分是不同的),需要人工手动处理完冲突后再合并

    关于Git合并分支的原理可以看这篇博文

  13. 最后leader逐步将各个功能模块的分支merge到dev分支,然后将dev分支merge到main分支。

    • dev分支上的代码达到上线的标准后,要合并到 main 分支:

      git checkout dev
      git pull
      git checkout main
      git merge dev
      git push -u origin main
      
    • main分支代码改动了,需要更新到dev分支上的代码:

      git checkout main 
      git pull 
      git checkout dev
      git merge main 
      git push -u origin dev
      

三、其他常用的git操作

  1. 删除分支

    • 删除本地分支

      当一个分支被推送并合并到远程分支后,执行指令:

      git branch -d 分支名
      

      注意:

      • 当你还在该分支上时,git不允许删除该分支,必须先切换到其他分支。
      • 如果一个分支还没有被推送或者合并,那么可以使用-D强制删除它。
    • 删除远程分支

      执行指令:

      git push origin --delete 远程分支名
      

      git push origin :远程分支名
      
  2. 查看本地分支的upstream信息

    git branch -vv
    

    image-20230802215953534.png

    后面那个蓝色的是该本地分支关联到的远程分支。

  3. 不切换分支直接设置其他分支的upstream

    git branch -u origin/test test
    

    或在push时直接设置:

    git push -u origin test:test
    

    image-20230802221835982.png

    比如上面在本地dev分支直接设置test分支的upstream。

  4. 取消upstream

    • 取消当前分支的upstream

      git branch --unset-upstream
      
    • 取消其他分支的upstream

      git branch --unset-upstream 分支名
      
  5. 查看工作区当前状态,显示有变更的文件

    git status
    
  6. 从远程获取代码库,但不进行合并操作

    git fetch
    

    git pull 相当于 git fetch + git merge

  7. 比较文件的不同,即暂存区和工作区的差异

    git diff
    
  8. 查看远程仓库信息

    git remote -v
    
  9. 将远程仓库与本地仓库关联起来

    git remote add origin 远程仓库的url
    

四、注意事项

  1. 多人在同一代码仓库开发时,会经常遇到代码冲突的问题,操作时需要注意如下事项:

    • 新建分支之前,一定要先pull最新的代码,然后再创建分支
    • commit之前,要先将代码add到暂存区,以免代码没有被提交
    • commit之后,要先pull一下当前分支的最新代码(如果多个人公用一个分支开发)
    • 如果要将当前分支合并到分支B,先要切到分支B,pull最新的代码再合并
    • 合并分支如果有冲突,必须先在本地解决完冲突,再addcommit代码
    • 最后再进行push

    总之,不管是提交代码还是合并代码push之前,都要先pull一下,确保当前分支是最新的代码。否则可能出现陈旧代码被push上去覆盖了远程仓库的较新的代码。前期不确定的话,记得及时备份自己负责模块的代码。

  2. 某次修改后push的流程严格遵守git add -> git commit -> git pull -> git push

    若pull下来有冲突则先协商解决完冲突重复上述流程直至没有冲突成功push。

    关于工作区、暂存区、本地仓库、远程仓库的含义和区别,可以看这篇博文

  3. GitHub仓库页面可以直接手动添加远程分支。

    image-20230803092546622.png

  4. 尽量保证相关联的远程分支与本地分支命名相同,比较方便。

  5. commit时养成写规范的提交信息的习惯。