图解远程版本库开发周期 —— Git 学习笔记 22
图解远程版本库开发周期
文章目录
- 图解远程版本库开发周期
- 克隆版本库
- 快进推送
- 非快进推送
- fetch 命令
- merge 命令
- push 命令
- 参考资料
克隆版本库
假设服务器上有一个简单的版本库:
最近的 2 次提交用 A 和 B 表示。
这时候,你把这个版本库克隆到了本地:
克隆之后,我们看看这个克隆到本地的版本库都有些什么:
- 原始版本库中的所有提交都复制到克隆版本库。
- 克隆版本库中有一个名为
origin/master
的远程追踪分支( remote-tracking branch)。 - 在克隆版本库中,
origin/master
分支指向原始版本库中 master 指向的提交,也就是 B。 - 克隆版本库中创建了一个新的本地追踪分支( local-tracking branch),称为 master 分支。这个 master 分支指向
origin/master
指向的提交,也就是 B。
克隆后,Git 会选择新的 master 分支作为当前分支,并自动检出它。因此,除非切换分支,否则克隆后所做的任何修改都会影响 master 分支。
在图中,原始版本库和派生的克隆版本库中的开发分支都由深灰色作为背景色,而远程追踪分支则用浅灰色作为背景色。在 Git 的实现中,深灰色背景的分支属于 refs/heads/
命名空间,浅灰色背景的分支属于 refs/remotes/
命名空间。
请注意,本地追踪分支和远程追踪分支都是私有的,并只存在于各自的版本库中。
快进推送
在本地的 master
分支工作的时候,本地的 master
会向前移动,而 origin/master
是不可以移动的。正如下图所示,你的开发使 master
分支变长了:在提交 B 的基础上多出 2 个新的提交 —— X 和 Y。
在你开发期间,如果原始版本库没有任何变化,那么你可以很容易地把 X 和 Y 推送到上游:Git 会把你的提交传输到版本库,并把它们添加到 B 的后边,然后 Git 会对 master 分支执行一种特殊的合并操作 —— 快进(fast-forward),快进本质上是一个简单的线性历史记录推进操作。如下图所示:
非快进推送
但是,在你开发期间,任何其他有权访问原始版本库的开发人员可能已经做了进一步开发,并把他的修改推送到该版本库。如下图:
在这种情况下,我们说版本库的历史记录在提交 B 处分叉(diverged 或 forked)了。当你尝试推送,Git 会拒绝并用一条错误消息告诉你有关的冲突,例如:
$ git pushTo /tmp/Depot/public_html! [rejected] master -> master (non-fast forward)error: failed to push some refs to '/tmp/Depot/public_html'
那么,什么是你真正想要做的?你是想覆盖其他人员的开发工作,还是想要合并两组历史记录?
提示
如果你想覆盖所有其他变化,也是可以的。只要在你的
git push
中使用-f
选项即可。不过我建议你不要这么做。
fetch 命令
更多的时候,你不想覆盖别人的提交,只是想添加你自己的修改。在这种情况下,你必须在推送之前在你的版本库中合并两组历史记录。这时候,就该 fetch
命令大显身手了。
要让 Git 合并两组历史记录,那么这两组历史记录必须存在于同一个版本库的两个不同分支上。现在你的提交 X 和 Y 本身就在你的版本库里,为了把 Origin 中的提交 C 和 D 纳入你的版本库,你可以用 git fetch
命令进行抓取。这个命令会访问远程仓库,从中拉取所有你还没有的数据。
注意,引入 C 和 D 这组历史记录并不能改变由 X 和 Y 代表的历史记录。所以,你没有必要担心 fetch 之后会覆盖你的工作成果。fetch 之后,这两组历史记录同时存在于你的版本库中,形成一幅比较复杂的图,简单来说就是在 B 处分叉了。你的历史记录由 master 分支代表,远程历史记录则由 origin/master 远程追踪分支代表。
merge 命令
既然这两组历史记录已经存在于一个版本库中了,那就整合它们吧。
提示
你不能把 master 分支合并到 origin/master 分支,因为 origin/master 是远程引用,远程引用是只读的。 虽然可以 git checkout 到某个远程引用,但是 Git 并不会将 HEAD 引用指向该远程引用。因此,你永远不能通过 commit 命令来更新远程引用。Git 将这些远程引用作为记录远程服务器上各分支最后已知位置状态的书签来管理。
所以,我们要做的就是把 origin/master 分支合并到 master 分支。
git merge origin/master
假设合并过程很顺利,没有任何冲突,现在,你的版本库已经包含了 origin 版本库和你的版本库中的最新变更。但是反过来是不成立的:origin 版本库里依然没有你的变更。
push 命令
为了让其他人员共享你的变更,你可以用 git push 命令把合并后的历史记录从你的master 分支上推送回 origin 版本库。推送后如下图所示:
最后,你可以看到 origin 版本库已经更新了你的开发,你的版本库和 origin 版本库已经完全更新并再次同步了。
【End】
参考资料
《Git 版本控制管理(第2版)(人民邮电出版社)》
图解远程版本库开发周期 —— Git 学习笔记 22相关推荐
- Git学习笔记:远程仓库
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git版本控制管理——远程版本库
之前提到的Git的所有操作都是在本地完成的,而实际项目开发并不是一个人就可以搞定的,通常需要团队的协作,而这些协作可能又不是在同一个地区的,这就涉及到Git的分布式特性了. Git的分布式特定会涉及到 ...
- Git 学习笔记:自定义Git(完)
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:标签管理以及GItHub
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:分支管理3
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:分支管理(1)
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:中国版GItHub,码云
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- Git学习笔记:分支管理(2)
前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...
- fetch 与引用规格(refspec)—— Git 学习笔记 23
fetch 与引用规格(refspec) 本文想讨论 fetch 命令的细节. 假设我们用命令添加了一个远程版本库: $ git remote add origin https://github.co ...
最新文章
- U-net进行图像分割
- OCM备考 一、Server config 之管理表空间
- 计组—双端口与多模块存储器
- 前端学习(1390):多人管理项目10服务器认证
- 异常的总结 java 1615387415
- netbeans 添加gif图片_GIF动图制作app下载|GIF动图制作安卓版 v3.9.2 官方免费版
- npm设置和取消代理的方法
- 斐讯k1支持千兆吗_千兆宽带如何使用?看这里!
- [USACO13FEB]Milk Scheduling【拓扑序】
- 如何将nupkg离线安装包安装到VS2017、9
- mysql的casewhen 作用_MySQL数据库之Mysql casewhen的三种用法
- SPSS学习笔记【二】-回归分析
- 全世界最高级最好的操作系统,人人都可以用
- 电子合同的一个“安全漏洞”
- 全世界的程序员们,为什么都不在意“穿衣”这档事?
- echarts实现横向柱图文字在柱图上面
- 『互联网架构』软件架构-git服务搭建与使用(四)
- diskgeniuslinux版_下载:强大磁盘工具DiskGenius v3.0.1416 Beta 2
- m序列代码c语言,m序列的生成--闲来无事写代码
- win10设置里找不到以太网