前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的保障手段,现在我们先简单回忆下相关概念,以便为接下来的协同开发做好铺垫!

远程仓库和远程分支

远程仓库

远程仓库其实并不复杂,实际上只是本地电脑上的本地仓库在另一台远程电脑的备份而已.

相对本地仓库来说远程电脑上的版本库自然就是远程仓库,远程仓库使得我们的版本库更加安全,毕竟远程电脑可不是一般的电脑,出错的概率比我们平时工作所使用的电脑概率要小得多,这样一来即使不小心丢失了本地仓库的全部数据,只要远程仓库没有丢失,那我们就可以通过远程仓库重新取回最新数据!

还有一点,远程仓库让代码社交化,因为大家有了一致途径来访问远程仓库,团队也好或者陌生人也罢,只有你愿意,他们就可以获取远程仓库的最新代码并参与开发,这也是 github 的一大亮点!

远程分支

回顾好远程仓库的概念后,我们再来讲一下本地仓库的远程分支是什么意思?

当前你正在工作的电脑上存储的是本地仓库,如果没有远程仓库的支持,只能一个人鼓捣,别人无法共享你的工作成果,现在加入了团队开发流程,自然不再一个人独自开发,需要和团队其他人协同开发,共享开发成果.

所以本地仓库必然保存着远程仓库的基本信息,只有区分好自己的工作成果公共成果,才能不乱套,又能做到信息及时共享.

实际上,在项目初期刚刚拷贝远程仓库(git clone)时,git 已经默认在本地仓库创建一个远程分支(origin/master),本地修改提交首先都是在本地仓库完成的,比如 git add,git commit 等命令,如果需要发布你的工作成果,那么就需要使用 git push origin <branch> 命令推送到远程仓库,这里的 origin 指的就是远程仓库名称(因为最初大家都是先从远程仓库克隆下来的,所以远程仓库存储的项目相当于原始项目,故而叫origin).

git clone 命令帮助本地仓库的 master 分支和远程仓库的 master 分支建立了关联,一般称远程仓库名称为 origin.

查看远程仓库信息 : git remote 或 git remote -v

  1. # 查看远程仓库名称
  2. $ git remote
  3. origin
  4. # 查看远程仓库详情 : 拉取和推送链接
  5. $ git remote -v
  6. origin git@github.com:snowdreams1006/git-demo.git (fetch)
  7. origin git@github.com:snowdreams1006/git-demo.git (push)
  8. $

本地分支推送到远程仓库 : git push origin <branch>

本地仓库和远程仓库的分支理论上应该一一对应,本地仓库的主干分支叫做 master ,而远程仓库也有相应的分支叫做 master ,这种映射关系是使用 git clone 命令时默认生成的,也是推荐的做法.

一般来说,本地仓库的分支推送到远程仓库指的就是推送到远程仓库同名的分支上,例如 git push origin master 意思是: 推将本地仓库的 master 分支推送到远程仓库的 master分支,当然你也可以推送其他分支到相应的远程分支上.

按照之前约定的分支管理策略来说,master 分支用于生产环境部署,dev 分支用于收集开发成果,feature 分支用于开发具体功能分支,既然如此,那这些本地分支哪些需要同步推送到远程仓库就比较清晰了!

  • 推送本地 master 分支到远程仓库的 master 分支 : git push origin master
  • 推送本地 dev 分支到元层仓库的 dev 分支 : git push origin dev
  1. # 查看当前分支 : `master` 主分支
  2. $ git branch
  3. dev
  4. * master
  5. snow
  6. # 推送本地 `master` 分支到远程仓库 `origin` 上相应的 `master` 分支
  7. $ git push origin master
  8. Counting objects: 15, done.
  9. Delta compression using up to 4 threads.
  10. Compressing objects: 100% (15/15), done.
  11. Writing objects: 100% (15/15), 1.31 KiB | 1.31 MiB/s, done.
  12. Total 15 (delta 9), reused 0 (delta 0)
  13. remote: Resolving deltas: 100% (9/9), completed with 3 local objects.
  14. To github.com:snowdreams1006/git-demo.git
  15. e60c8ad..dcce09c master -> master
  16. $

正常来说,本地仓库的 master 分支应该领先远程仓库 origin 上的 master 分支若干个版本.

一旦我们已经将本地分支上的工作成果推送到远程仓库上相应分支时,本地仓库和远程仓库这时候就保持一致了.

  1. $ git status
  2. On branch master
  3. Your branch is up to date with 'origin/master'.
  4. nothing to commit, working tree clean
  5. $

远程仓库下载到本地分支 : git fetch

远程仓库的操作可以简单归纳为两部分: 上传和下载.

本地仓库推送到远程仓库是上传,而远程仓库拉取到本地仓库就是下载.

团队多人协作开发时,大家都会定期或不定期往 master 或 dev 等分支上推送各自的更改,相应的我们就需要下载别人的最新工作成果.

现在模拟其他伙伴正在往 master 分支上推送更改,最好在另一个电脑另一个账户,当然模拟的话也可以是同一个电脑下其他目录,或者最简单的方式,直接登录 github 更改 master 分支上某个文件内容,简单起见,我们采用最后一种方式.

其他伙伴已往远程仓库上的 master 分支提交了新的版本: 创建 git-remote.txt 文件

现在我们想要下载其他人的最新工作成果,接下来让我们看看本地仓库的 master 还能和远程仓库的 master 分支保持一致吗?

  1. # 下载远程仓库的 `master` 分支
  2. $ git fetch origin master
  3. remote: Enumerating objects: 4, done.
  4. remote: Counting objects: 100% (4/4), done.
  5. remote: Compressing objects: 100% (2/2), done.
  6. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
  7. Unpacking objects: 100% (3/3), done.
  8. From github.com:snowdreams1006/git-demo
  9. * branch master -> FETCH_HEAD
  10. dcce09c..10942ff master -> origin/master
  11. $

执行 git fetch 命令后,远程仓库上的最新提交记录已经下载到本地仓库,同时更新了本地仓库的远程分支origin/master ,值得注意的是本地仓库的 master 分支并没有更新!

那你可能会有疑问了,我想要的结果是下载其他人的最新工作成果,怎么我本地仓库的 master 分支并没有更新呢?

  1. # 查看工作区
  2. $ ls
  3. LICENSE README.md test.txt
  4. # 查看版本库状态
  5. $ git status
  6. On branch master
  7. Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  8. (use "git pull" to update your local branch)
  9. nothing to commit, working tree clean
  10. $

既然 git fetch 并没有更新本地仓库的 master 分支,那它到底做了哪些工作呢?

git fetch 会做的事情

实际上, git fetch 完成了仅有的但是很重要的两步操作:

  • 从远程仓库下载本地仓库中缺失的提交记录
  • 更新本地仓库的远程分支(比如origin/master)

通过上述两步操作完成的效果是: 将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态.

远程分支实际上是反映了远程仓库在你最后一次与它通信时的状态,而git fetch 就是你与远程仓库通信的方式了!

git fetch 不会做的事情

git fetch 并不会改变你本地仓库的状态,所以也就不会更新你的 master分支,自然也不会修改你磁盘上的文件.

理解这一点很重要,因为许多开发人员误以为执行了 git fetch 以后,他们本地仓库就与远程仓库同步了.

实际上它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件.

既然本地仓库的远程分支已更新,那么想要更新本地仓库的 master 分支该如何做呢?很简单,可以 git merge 啊!

远程仓库更新到本地分支 : git pull

其实通过 git fetch 命令我们已经下载了远程仓库的最新版本,只不过还没有合并到本地仓库而已,如何合并分支相信大家已经轻车熟路了,有很多方法:

  • git merge origin/master
  • git rebase origin/master
  • git cherry-pick origin/master

实际上,先抓取更新(git fetch)再合并(git merge)这个流程很常用,因此 git 是有专门的命令来完成这两步操作的,这就是拉取更新git pull --- 刚好与推送更新 git push 相反!

  1. # 拉取最新版本
  2. $ git pull
  3. Updating dcce09c..10942ff
  4. Fast-forward
  5. git-remote.txt | 1 +
  6. 1 file changed, 1 insertion(+)
  7. create mode 100644 git-remote.txt
  8. # 查看版本库状态
  9. $ git status
  10. On branch master
  11. Your branch is up to date with 'origin/master'.
  12. nothing to commit, working tree clean
  13. # 查看工作区内容: 文件已更新
  14. $ ls
  15. LICENSE README.md git-remote.txt test.txt
  16. $

团队协作

掌握了远程仓库和远程分支的相关概念后,现在开始真正模拟团队协作开发了,为了简单起见,仍然以直接操作 github 上的 master 分支为例说明如何协同开发.

(1). 其他人已往远程仓库推送2个版本

(2). 你正在本地仓库提交1个版本

  1. $ echo "learn teamwork" >> test.txt
  2. $ git commit -am "learn teamwork"
  3. [master f971647] learn teamwork
  4. 1 file changed, 1 insertion(+)
  5. $

(3). 你推送到远程仓库前先拉取最新版本

  1. # 拉取最新版本,并尝试合并
  2. $ git pull
  3. remote: Enumerating objects: 8, done.
  4. remote: Counting objects: 100% (8/8), done.
  5. remote: Compressing objects: 100% (5/5), done.
  6. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
  7. Unpacking objects: 100% (6/6), done.
  8. From github.com:snowdreams1006/git-demo
  9. 10942ff..612e08a master -> origin/master
  10. Merge made by the 'recursive' strategy.
  11. git-remote.txt | 2 ++
  12. 1 file changed, 2 insertions(+)
  13. # 查看版本库状态
  14. $ git status
  15. On branch master
  16. Your branch is ahead of 'origin/master' by 2 commits.
  17. (use "git push" to publish your local commits)
  18. nothing to commit, working tree clean
  19. # 查看其他人工作成果
  20. $ cat git-remote.txt
  21. git remote
  22. git clone
  23. git commit -am "fake second teamwork"
  24. # 查看自己即将推送的工作成果
  25. $ cat test.txt
  26. add test.txt
  27. see https://snowdreams1006.github.io/git/usage/remote-repository.html
  28. learn git branch
  29. see https://snowdreams1006.github.io/git/usage/branch-overview.html
  30. git commit c1
  31. git commit c2 and c3
  32. git checkout -b dev
  33. fast forward not recommend
  34. Happy coding
  35. learn git stash
  36. learn git rebase
  37. learn teamwork
  38. $

(4). 你将本地仓库更改内容推送到远程仓库

  1. # 推送到远程仓库
  2. $ git push origin master
  3. Counting objects: 5, done.
  4. Delta compression using up to 4 threads.
  5. Compressing objects: 100% (5/5), done.
  6. Writing objects: 100% (5/5), 564 bytes | 564.00 KiB/s, done.
  7. Total 5 (delta 3), reused 0 (delta 0)
  8. remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
  9. To github.com:snowdreams1006/git-demo.git
  10. 612e08a..8fe5aba master -> master
  11. $

现在前往 github 网站确认我们已经推送成功,我们的工作成果和其他人的工作成果同时存在于远程仓库中,这样就完成了一次团队协同开发的案例.

现在简单回顾一下整个协同开发流程:

  1. 其他人先于我们提交2个版本
  2. 我们本地提交1个版本
  3. 本地版本推送前拉取远程仓库
  4. 本地仓库推送到远程仓库

小结

  • 查看远程仓库信息: git remote -v
  • 本地仓库推送到远程仓库: git push origin <branch>
  • 远程仓库抓取到本地仓库: git fetch
  • 远程仓库拉取到本地仓库: git pull 相当于 git fetch 和 git merge
  • 本地创建和远程仓库一致的分支: git checkout -b <branch> origin/<branch>,本地和远程分支名称最好一直,比如本地 master 和 远程 origin/master,本地 dev 和远程 origin/dev
  • 本地分支和远程分支建立关联: git branch --set-upstream <branch> origin/<branch> ,足够任性的话,本地 dev 可以关联远程 remote-dev 等,不过建议名称最好一致.
  • 团队协同开发时,不仅平时要定期拉取(git pull),推送到远程仓库前更应先拉取(git pull)再推送(git push),如出现冲突,解决冲突后再推送.

原文;https://www.cnblogs.com/snowdreams1006/p/10589700.html

【转】Git 教程之协同开发的更多相关文章

  1. Visual Studio C# 利用git和github协同开发时产生冲突的解决办

    Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法 前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料 ...

  2. Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码

    前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...

  3. git 入门教程之协同开发

    前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协同开发的基础,也是代码备份的 ...

  4. Git分支及其协同开发

    目录 Git分支 Git是如何保存数据的 Git分支的本质 Git分支的操作 远程仓库与本地仓库分支开发 一个项目多个远程仓库 远程仓库操作命令 协同开发 Git flow工作流 GitLub安装搭建 ...

  5. git命令与协同开发

    一 git命令 1.简单命令 git init # 初始化 (建立git 版本相关文件关系都放这里) git config --global user.email "you@example. ...

  6. git 多人协同开发

    一.允许他人操作程序(两种方式) 1.添加合作者 2.创建组织 二.分支 每个开发者创建一个属于他们的dev分支 三.合并规则 1.一起合并(代码会出现冲突) 2.尽量缩短合并的周期

  7. 使用git和github进行协同开发流程

    (本文假设各位已经对基本git的基本概念.操作有一定的理解,如无相关git知识,可以参考Pro Git这本书进行相关的学习和练习) 很多项目开发都会采用git这一优秀的分布式版本管理工具进行项目版本管 ...

  8. 用Git进行协同开发

    用Git进行协同开发 问题场景描述 常常会遇到这样的协同场景:后台的同事和前端的同事需要共同开发一个新功能,而他们的代码相互依赖,所以需要不停地更新各自的代码进行联调. 对于这种场景,最简单的方式就是 ...

  9. Git--代码托管/协同开发

    Git--代码托管 我爱写代码,公司写,家里写,如果每天来回带一个U盘拷贝着实麻烦,Git有没有类似于云盘似得东西可以进行数据同步呢?答案肯定是有. GitHub,一个基于Git实现的代码托管的平台, ...

随机推荐

  1. 基于UML的毕业选题系统建模研究

    一.基本信息 标题:基于UML的毕业选题系统建模研究 时间:2018 出版源:电脑迷 领域分类:UML建模技术 二.研究背景 问题定义:为了加强学生设计分析开发软件的相关能力,有效避免结构化模型存在的 ...

  2. CUDA并行编程思维过程

    CUDA并行编程思维过程 1)确定应用程序中需要且可以并行化的部分 2)将并行化代码中需要用到的数据分离出来,具体方法是用API函数在并行技术设备上分配内存空间 3)用API函数将数据传输到并行计算设 ...

  3. commons-text StrBuilder字符串构建工具类例子

    package com.skylink.junge.demo; import java.util.ArrayList; import java.util.List; import org.apache ...

  4. Ocelot使用

    1.在网关项目中通过nuget引入Ocelot 2.Startup.cs文件代码调整 using System; using System.Collections.Generic; using Sys ...

  5. 一个简单的将Markdown二级标题进行排序的脚本

    我在写博客<Linux的1000个命令>的时候,相对二级标题进行一下排序,方便阅读和查找,于是就有了这个小程序. #! /usr/bin/env python3 import os imp ...

  6. sudo rm -rf iTunes.app Operation not permitted

    https://www.howtogeek.com/230424/how-to-disable-system-integrity-protection-on-a-mac-and-why-you-sho ...

  7. Java学习笔记31(集合框架五:set接口、哈希表的介绍)

    set接口的特点: 1.不包含重复元素 2.set集合没有索引,只能用迭代器或增强for循环遍历 3.set的底层是map集合 方法和Collection的方法基本一样 set接口的实现类HashSe ...

  8. SQL Server性能优化(14)索引碎片

    一. 外部碎片和内部碎片的概念 碎片的概念和检测,参考MSDN:https://msdn.microsoft.com/zh-cn/library/ms189858.aspx 二.对于碎片的解决办法 解 ...

  9. Java_反射demo

    package com.cnit.reflect; import java.lang.reflect.Field; import java.lang.reflect.Method; public cl ...

  10. Android并发编程 多线程与锁

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 前一篇Android并发编程开篇呢,主要是简单介绍一下线程以及 ...