git 入门教程之本地和远程仓库的本质

本地仓库远程仓库在本质上没有太大区别,只不过一个是本地电脑,一个是远程电脑.git

远程仓库不必定非得是 github 那种专门的"中央服务器",甚至局域网的另一台电脑也能够充当"中央服务器"的角色,由于它存在的最初目的只是方便你们交换彼此的提交记录而已!github

因此本地仓库和远程仓库的基本行为应该是一致的,约定俗成的规定是远程仓库通常不直接参与平常开发工做,主要做为项目托管中心.缓存

某些自动化持续集成环境中也可能会直接操做远程仓库,这时远程仓库就真的和本地仓库没什么区别了!

我的开发经常使用命令

我的开发看重的是效率,同时兼顾下版本控制的话算是是锦上添花,git 的本地仓库是本地备份,而远程仓库则是网盘备份.服务器

git init : 初始化本地项目

将本地项目初始化 git 项目,直观表现是在该项目同级目录下多了 .git 隐藏目录,其存储着 git 版本库相关信息.分布式

此后当前项目便具有了本地管理的能力,能够与 git 进行交互.

git clone : 克隆远程项目

git init 同样的做用,也是建立本地仓库,只不过 git init 是直接将本地项目做为本地仓库,而git clone 是将远程项目克隆到本地并做为本地仓库.fetch

因而可知, git clonegit init 多了一层远程仓库的概念.

git add : 添加文件

将工做区的提交记录添加到暂存区,暂存区是工做区和版本库交互的桥梁,暂存区积累到必定量的提交记录时能够批量提交到版本库,这一点暂存区有点像缓存.spa

git commit : 提交文件

将暂存区的版本提交到版本库,从而造成工做区->暂存区->版本库的基本链路,本地工做区的版本控制流程大体如此.版本控制

git push : 推送文件

若是是使用 git clone 命令克隆的本地项目,当工做到必定程度时可能须要将这部分工做成果推送到远程仓库,这时候使用 git push 命令完成本地版本的推送流程.code

若是是使用 git init 命令初始化的本地项目,可能没有远程仓库,天然也就不须要推送.若是后来建立了远程仓库,那么你天然是想要将本地仓库推送到远程仓库的,所以你须要准确告诉 git 你要推送到哪一个远程仓库.
使用 git remote add origin git@github.com:username/repos.git 命令添加远程仓库信息,这样就创建了本地仓库和远程仓库的关联,之后就能够正常推送到远程仓库了.开发

团队开发经常使用命令

团队开发注重的不只是我的效率还有团队的总体进度,随着企业级开发的日趋复杂化,再也不是一我的可以独立完成的,更况且时间也不容许慢慢完成,大多数公司采用的是人力换时间的方式,团队并行开发来缩短整个项目周期,这种复杂需求下正是 git 大展拳脚的好机会.

项目总体采用并行开发模式,拆解成不一样的功能模块,每一个人负责各自模块,模块之间相对独立但也不排除存在交集的可能性.对于每个个体开发者来讲,既须要版本控制又须要团队交流.这时候分支的做用就凸显出来了.

根据项目的业务特色将其拆解成不一样的功能模块,这些功能模块分别表明不一样的分支,而这些功能模块又组成了完整的项目,这就是主干和分支的关系.

初始时项目是一个总体,中间拆解成不一样功能模块,最后再合并成一个整---"分久必分合久必分".

git branch <branch> : 建立分支

每个独立的功能模块被定义成一个单独分支,建立分支的过程实际上是拆解项目的过程,建立本地分支后就在分支上开发特有功能,再也不关心其余功能分支.

git checkout <branch> : 切换分支

模块拆解完成并建立了相应的分支后,须要切换到既定分支上才能开展本身的工做.

git merge <branch> : 合并分支

没有绝对的独立,项目再怎么拆分也是总体的一部分,确定须要和其余功能模块发生关系,某些状况下须要其余分支的工做成果合并到本身的本地仓库中,这样才能完成一次小规模的组装.

能够预期的是,当这种组装足够多的时候,最终便会演变成项目的终极形态,造成一个总体.

git fetch : 抓取远程分支

合并目标分支首先须要可以获取到目标分支的提交记录,既然每一个功能模块都是不一样的项目成员负责开发的,也就不在咱们电脑上,因此咱们先要将目标分支下载到咱们本地电脑,而后才能合并该分支到本地分支.

git pull : 拉取远程分支

"先下载目标分支再合并到本地分支,从而小规模组成更复杂更强大的功能",每一次的组装过程都须要两步操做者显然不符合懒人思惟啊,git pull 就是这两步操做的简化命令,先下载再合并就是这么简单!

本地和远程仓库的碰撞

不管是我的开发仍是团队开发,咱们几乎习惯惯站在主动方的角度来思考问题,有没有想过当远程仓库接收到咱们的git pushgit pull 请求时,远程仓库发什么了什么改变,这种改变对本地仓库又有什么影响?

远程仓库(远程电脑上的本地仓库)只是众多分布式电脑上本地仓库中的一员,说它特殊也很特殊,充当着"中央服务器"做用,其他人统一从这里下载或推送;说它普通也很普通,和本地电脑上的本地仓库没有什么不一样,由于它随时可被任意电脑上的本地仓库所取代!

揭开远程仓库的神秘面纱后,如今咱们只须要将其视为普通的本地仓库同样对待便可,然而咱们本地电脑上已经有了本地仓库,故而须要将远程仓库作一下简单标识区分(origin)称之为远程分支.

  • 先说说 git push 命令作了什么?

    1. 对于本地来讲,git 将本地仓库的指定分支推送到远程仓库的相应分支,同时更新了本地仓库的远程分支.
    2. 对于远程来讲,git 接收到本地仓库的推送请求时应该在相应分支上合并本地分支,同时更新远程仓库的相应分支.

只要本地的指定分支成功推送到远程的相应分支时,对于本地来讲,不管是指定分支仍是远程分支(origin/master)都应该是最新状态,由于已经与服务器同步了.

而远程接收到这次推送请求时,应该尝试合并这次推送请求,再更新本身的相应分支,远程合并完成后再通知本地这次推送结果,如此一来,三端同步,皆大欢喜!

git-local-remote-push.gif

  • 再讲讲 git pull 命令发生了什么?

    1. 对于远程来讲,接收到本地的拉取请求时,由于没有新版本须要处理,因此无需任何操做.
    2. 对于本地来讲,当远程仓库的相应分支下载到本地时应该更新远程分支状态,再尝试合并到本地的相应分支.
git pull 命令或者说是 git fetch 命令是本地和远程通讯的方式,因此 origin/master 会自动更新!

git-local-remote-pull.gif

小结

本地仓库和远程仓库本质上没有太大区别, git fetch 是本地仓库和远程仓库之间的通讯途径,本地仓库中的远程分支(origin/master)保存着它们之间最后一次的通讯状态.

相关文章
相关标签/搜索