git merge 冲突_更新了!深入浅出图解Git,入门到精通(保姆级教程)第三篇
原文链接:https://mp.weixin.qq.com/s/d7YwRi1mEkxUSUqxWD_B1Q
这一篇写完基本Git的操作就图解完了,如果想深入了解Git,这里可以推荐一些Git的硬核书籍:【精通Git】、【GitHub入门与实践】、【Git权威指南】、【Git版本控制管理】、【GitHub实践】。
这些都是一些关于Git的比较好的书籍,有兴趣的可以可看一看,网上也有很多电子书。闲话不多说,下面就开始我们的正题。
日志
Git查看日志前面有提到过可以通过git log命令进行查看:
git log可以查看你「提交的时间、提交的作者、以及提交的id」都可以查到,如果你觉得查询的信息太多,可以加上参数--pretty=oneline,只会显示版本号和提交时的备注信息。
如果你想查最近的几条历史记录,可以通过加参数"-n"的形式制定查询几条记录,历史记录是「按照操作的时间」进行排序的:
还可以通过加参数" --graph",以图形化的形式展示历史记录,方便与查看历史记录与分支的关系:
还可以加参数"-p",可以查看每一个commit操作更改的文件的哪一行,加参数"-stat"查看哪些文件改动了,进行简要的统计。更加详细的git log参数可以查看命令帮助。
Git查看历史记录的另一个命令是git reflog,它可以查看「所有分支的所有操作记录,包括已经删除的commit记录和reset记录」。
衍合(rebase)
分支管理中有「合并」和「衍合」操作,合并操作在在第二年篇的分支章节已经详细讲解过了,就来讲解一下衍合操作:git rebase操作。
假如有两位开发人员Tom和Jerry,Tom和Jerry都把远程的master分支签出到本地,此时当前的Tom和Jerry本地都是只有一条master分支:
此时Tom开发人员,创建一条新的分支branch,并且将新的分支branch推向远程仓库(git push origin branch):
此时Tom本地仓库和远程仓库的分支保持一致,分支如下图所示:
Tom在自己的分支branch上开发自己的模块,假如开发期间Tom进行了「两次」的提交,最后Tom本地的分支形成如下所示:
也可以通过git log查看两次提交的记录:
若是,此时Tom开发人员准备把自己的branch的分支推向远程仓库,但是,Jerry在此之前已经在master提交了自己的开发代码,所以master分支相比之前记录,已经向前推进了一个版本。
所以此时Tom想提交,必须先更新一下自己的本地分支:
Tom中通过git log命令可以查看到Jerry的提交记录情况,说明此时分支已经与远程仓库同步:
此时Tom更新分支后,本地的分支情况如下所致,相比原来master指向c1,现在向前推进了一个版本指向c4:
此时,Tom必须重新合并分支进行提交,把branch的代码合并到master分支上,现在Tom可以有两种方式:
- 直接git merge。
- 先git rebase,然后git merge。
(1)若是使用第一种方法直接在master分支上执行git merge命令,「Git会把master分支上最新的提交c4的内容和branch分支上最新的提交c3 合并后生成一个新的提交点c5」:
上面实在没有冲突的前提下,若是有冲突,则解决冲突:
此时就完成了master和branch分支的合并。
(2)若是使用第二个方法,先master也需要拉取到最新版本,然后是切换到branch分支,这个也就是要切换到rebase的分支,这里指的是branch分支。
在branch分支执行git rebase master,表示chanch上新提交的c4节点会在master上的最新提交点后重新设立起点重新执行,若是有冲突则解决冲突,没有冲突执行git add,最后执行git rebase --continue。
通过git log查看你可以发现,之前branch分支上进行【「删除HELLO ABC」】的操作commit hash已经发生改变,最后切换到master分支,执行git merge master。
通过测试可以发现,原来branch分支上重新commit的节点c4在rebase到master分支后hash发生了改变,并且提交的内容被复制保留,从而使得master分支整个呈现线性的commit记录,而不是直接git merge后的分叉记录。
在master分支进行branch分支rebase的原理图如下:
注意:「一般不是在branch进行rebase主分支master的提交,因为会导致master的新提交在本地丢失,这样有可能会导致本地仓库与远程仓库发生冲突,从而无法push操作」。
「总结」:「git merge会将两个分支的最新提交点进行一次合并,形成一个新的提交点,最终形成树状的提交记录」,但是有些人并不是喜欢merge,觉得merge之后出现的分叉会难以管理,那么可以选择rebase操作来替代merge。
「git rebase操作是将要rebase的分支最新提交点作为新的基础点,将当前执行git rebase master的分支的新commit点重新生成commit hash值,rebase完后再次切换到另一条分支进行合并,就可以保证线性的commit的记录」。
「最后只选择merge还是rebase取决于个人和实际情况,假如你想提交记录呈现线性整洁那么选择rebase,否则选择merge,实际情况也有可能是这样的,每个人本地开发,可能会提交非常的多次,有些提交可能是修一些简单的bug,那么最后的提交只想做一次完整、正确的提交,那么也可以使用rebase。」
标签管理
Git中使用的标签有两种类型:「轻量级的(lightweight)和含附注的(annotated)」。轻量级标签只需在git tag后加上标签的名字,就可以添加标签。
标签管理作为开发人员可能很少使用,可以作为了解,「tag是针对Git中某一时间某一版本打上标签」,tag的使用命令也是非常的简单。
新建标签
新建一个标签,默认是在HEAD新建,可以指定commit id新建,具体命令如下所示:
$ git tag $ git tag $ git tag -a -m "备注"
删除标签
删除标签若是标签没有推向远程仓库,直接使用以下命令删除:
$ git tag -d
若是标签已经推向远程仓库,先删除本地,再删除远程仓库的标签:
$ git tag -d $ git push origin :refs/tags/
查看标签
git tag的方式是查看所有的标签,git show 的方式是查看每个特定的标签
$ git tag$ git show
推送标签到远程
推送标签也是分两种情况,一种是指定标签的推送,另一种是推送所有标签。
$ git push origin $ git push origin --tags
提交了错误代码
代码错误提交了怎么办,重新再一次提交一个版本呗,这个可能是很多人的解决方案,当然Git也是有提供自己的解决方案的命令。
第一种就是再次将修改文件然后git add .到暂存区,最后git commit --amend提交修改 ,它的原理图如下所示:
这种方法只能修改当前HEAD,也就是最新的提交,那么要修改是倒数第二个或者倒数第三个的提交呢?
这时候就要使用rebase -i(「交互式rebase」)进行操作了,这个命令是指定commit链中哪一个commit需要修改。
比如执行命令:git rebase -i HEAD^。它表示的含义就是把当前commit内容rebase到HEAD之前的一个commit上。
若是想直接丢弃最新的commit的修改,则直接使用命令:git reset --hard HEAD^。他表示当前commit往前移动一次。
那想丢弃某一次的修改呢?并不是最新的commit,通用也是要使用rebase的交互式操作:git rebase -onto HEAD^^ HEAD^ master。他表示的含义就是以倒数第二个为起点,master为终点,rebase到倒数第三个commit上。
git merge 冲突_更新了!深入浅出图解Git,入门到精通(保姆级教程)第三篇相关推荐
- git merge 冲突_卧槽!小姐姐用动画图解 Git 命令,这也太秀了吧?!
公众号关注 "GitHubDaily" 设为 "星标",每天带你逛 GitHub! 大家好,我是小 G. 在座的各位应该都知道,Git 作为居家必备.团队协作之 ...
- (一)深入浅出图解Git,入门到精通(保姆级教程)
Git简介 在我们的认知范围Git和SVN都是对于代码托管的工具,那么这两者又有什么不同呢? Git是世界上先进的「分布式的版本控制系统」,而SVN是「集中式的版本控制系统」,SVN对于版本的管理集中 ...
- ios git解决冲突_适用于iOS和Linux的远程同步解决方案:Git和工作副本
ios git解决冲突 如何在iOS上使用Git设置跨平台的云同步解决方案以在任何地方工作. (How to set up a cross-platform cloud sync solution f ...
- 【图解SHA1杂凑算法】SHA1杂凑算法的Python实现保姆级教程 | 物联网安全 | 信息安全
系列索引:[图解安全加密算法]加密算法系列索引 Python保姆级实现教程 | 物联网安全 | 信息安全 起初写实验时找到的代码大多基于c/c++,python可参考的资料很少,所以借着这次实验的机会 ...
- 图片适应窗口_毕业论文排版保姆级教程——图片和公式排版
[小技巧]Origin作图过程中如何让图看起来更生动 2020-05-30 [小技巧]简单设置让你origin导出的图片不在有大白边 2020-05-29 [干货放送]萤火科研资源免费赠送第一期--必 ...
- git、github保姆级教程(手把手交)以及如何在github上提交pr,参与开源项目
git.github保姆级教程(手把手交)以及如何在github上提交pr,参与开源项目 一.git的安装 直接参考 git官方网站:https://git-scm.com/ 二.git的使用(从新手 ...
- git 删除分支_深入浅出图解Git,入门到精通(保姆级教程)
原文链接:https://mp.weixin.qq.com/s/_G3l9urASsFjyrYAZBWhDg 分支管理 Git中比较最重要的一点就是分支的概念,有了分支就有了合并和衍合的操作,「合并」 ...
- (二)深入浅出图解Git,入门到精通(保姆级教程)
上一篇原创写了图解Git的第一篇,个人感觉还是可以,比较基础的那种,有兴趣的可以看一看[],这一篇我们继续图解Git,上一篇基本就是基础,这一篇算是进阶. 分支管理 Git中比较最重要的一点就是分支的 ...
- git stash pop冲突_这有一份 git 日常使用清单,你需要吗?
点击上方"前端教程",选择"星标" 每天前端开发干货第一时间送达! 作者:echozh juejin.im/post/5d5b4c6951882569eb570 ...
最新文章
- 想学python有什么用-python学来有什么用
- java基础----Java的格式化输出
- PHP(Thinkphp框架)将数据表导出csv文件
- 程序员,你恐慌的到底是什么?
- 亚马逊如何变成 SOA(面向服务的架构)?
- Python Ctypes结构体指针处理(函数参数,函数返回)
- 前端学习(3051):vue+element今日头条管理-表格组件基本使用
- 数组:三种初始化及内存分析
- java 拦截器ajax_(转)拦截器深入实践 - JAVA XML JAVASCRIPT AJAX CSS - BlogJava
- 华为P30真机屏幕盖板曝光:超窄边框水滴屏
- OpenShift 4 之Istio-Tutorial (10) 访问白名单、黑名单
- 不看可惜!无需代码,小白都会的可视化大屏,领导不重用你都难
- NLPIR语义智能平台支持大数据个性化学习
- git --amend 使用和撤销
- 信号与系统公式笔记(8)——拉普拉斯变换
- Python+OpenCV3.3图像处理视频教程-贾志刚-专题视频课程
- 计算机网络可以划分几个阶段,计算机网络的发展可以划分为几个阶段.doc
- 【保姆级】阿里云服务器frp内网穿透教程
- 自动写作ai-自动写作神器
- Android——币种转换App