Git企业开发级讲解(四)

简介: Git企业开发级讲解(四)

一、理解分⽀


本章开始介绍 Git 的杀⼿级功能之⼀(注意是之⼀,也就是后⾯还有之⼆,之三……):分⽀。分⽀就是科幻电影⾥⾯的平⾏宇宙,当你正在电脑前努⼒学习 C++ 的时候,另⼀个你正在另⼀个平⾏宇宙⾥努⼒学习 JAVA。

如果两个平⾏宇宙互不⼲扰,那对现在的你也没啥影响。不过,在某个时间点,两个平⾏宇宙合并了,结果,你既学会了 C++ ⼜学会了 JAVA!


9dde17e239c6403da2ccf1209173b2f7.png

在版本回退⾥,你已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是一个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即 master 分⽀。

再来理解⼀下HEAD,HEAD 严格来说不是指向提交,⽽是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分⽀。

ee6fc9c46ad24c94aae4a260ce989c89.png

每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分⽀的线也越来越⻓,⽽HEAD只要⼀直指向master分⽀即可指向当前分⽀。

通过查看当前的版本库,我们也能清晰的理出思路:

becbf082e0a042d7a02fa0b27e0d09c5.png


二、创建分支


Git ⽀持我们查看或创建其他分⽀,在这⾥我们来创建第⼀个⾃⼰的分⽀ dev ,对应的命令为:

e9e3773e98df4c0897cf08828390c774.png

当我们创建新的分⽀后,Git 新建了⼀个指针叫 dev, * 表⽰当前 HEAD 指向的分⽀是 master 分⽀。另外,可以通过⽬录结构发现,新的 dev 分⽀:

7a0e9cdd6b6f475d9f13691cc3aa0d61.png

发现⽬前 dev 和 master 指向同⼀个修改。并且也可以验证下 HEAD ⽬前是指向 master 的:

8efd7a3d81ad42838697d231a94f9b96.png

⼀张图总结:

606ff545a09141c5a59a70e02f895d9e.png


三、切换分⽀


那如何切换到 dev 分⽀下进⾏开发呢?使⽤ git checkout 命令即可完成切换,⽰例如下:

3d73da3b50944680a2696d00ece70dd9.png

5abaa7a379e3452b88fd3bc09b123cae.png

我们发现 HEAD 已经指向了 dev,就表⽰我们已经成功的切换到了 dev 上!

接下来,在 dev 分⽀下修改 ReadMe ⽂件,新增⼀⾏内容,并进⾏⼀次提交操作:

c5a43bd9d95441a9ae4bb6852abad732.png

现在,dev 分⽀的⼯作完成,我们就可以切换回 master 分⽀:

acb7422eeb4b4b2597db10f02d32cd43.png

切换回 master 分⽀后,发现ReadMe⽂件中新增的内容不⻅了!!!赶紧再切回 dev看看:

7f48cca37a9042439b9308e748c128ba.png

在 dev 分⽀上,内容还在。为什么会出现这个现象呢?我们来看看 dev 分⽀和 master 分⽀指向,发现两者指向的提交是不⼀样的:

733b20d62f1c4dcc978fe06790fa26f1.png

看到这⾥就能明⽩了,因为我们是在dev分⽀上提交的,⽽master分⽀此刻的提交点并没有变,此时的状态如图如下所⽰:

0d6a1d7e63614790ae735e7c9f00282a.png

当切换到 master 分⽀之时,HEAD 就指向了 master,当然看不到提交了!


四、合并分⽀


为了在 master 主分⽀上能看到新的提交,就需要将 dev 分⽀合并到 master 分⽀,⽰例如下:

604bc32f6612470aaef1c2e5ec3cf8a6.png

git merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 dev 分⽀提交的内容了。此时的状态如图如下所⽰。

c6a9f65b5aa647da8be65f33a9df2bd9.png

Fast-forward 代表“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度⾮常快。

当然,也不是每次合并都能 Fast-forward,我们后⾯会讲其他⽅式的合并。


五、删除分⽀


合并完成后, dev 分⽀对于我们来说就没⽤了, 那么dev分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀,如:

d2fbdd980ec046fc8ad60dafd2e23d02.png

⽽可以在其他分⽀下删除当前分⽀,如:

6f2edee1b7b348de8714b124ae5df5a7.png

此时的状态如图如下所⽰。

84e4bf46f11942e5a32b52c2ea9ae3ff.png

因为创建、合并和删除分⽀⾮常快,所以Git⿎励你使⽤分⽀完成某个任务,合并后再删掉分⽀,这和直接在master分⽀上⼯作效果是⼀样的,但过程更安全。


六、合并冲突


可是,在实际分⽀合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。

为了演⽰这问题,创建⼀个新的分⽀ dev1 ,并切换⾄⽬标分⽀,我们可以使⽤ git checkout -b dev1 ⼀步完成创建并切换的动作,⽰例如下:

cf85f89e01da474c8d2e0fb889174cbd.png

在 dev1 分⽀下修改 ReadMe ⽂件,更改⽂件内容如下 aaa改成 bbb ,并进⾏⼀次提交,如:

69cc5216926c429e80a0009d81d3a5ec.png

切换⾄ master 分⽀,观察 ReadMe ⽂件内容:

c3b2b725c3074266bb5bc8c49f54d221.png

我们发现,切回来之后,⽂件内容由变成了⽼的版本,这种现象很正常,我们现在也完全能理解。

此时在 master 分⽀上,我们对 ReadMe ⽂件再进⾏⼀次修改,并进⾏提交,如下:

b18e09a80cca4126a086e8621604c376.png

现在, master 分⽀和 dev1 分⽀各⾃都分别有新的提交,变成了这样:

a89384df01714450a38671c6301409de.png

这种情况下,Git 只能试图把各⾃的修改合并起来,但这种合并就可能会有冲突,如下所⽰:

7096b9cf6fee4aac9cd5be1ee614b3a5.png

发现 ReadMe ⽂件有冲突后,可以直接查看⽂件内容,要说的是 Git 会⽤ <<<<<<<,=======,>>>>>>> 来标记出不同分⽀的冲突内容,如下所⽰:

7c2ff9e118d64b7886c60ca05a6c400b.png

此时我们必须要⼿动调整冲突代码,并需要再次提交修正后的结果!!(再次提交很重要,切勿忘记)

cb6e0df2632f4e1dabf39c642bd9dad5.png

a8d890f0f2df4d3f93f00d5e09d46b8c.png

到这⾥冲突就解决完成,此时的状态变成了

d69365269d4d4f0c9341d1435a3bea50.png

⽤带参数的 git log也可以看到分⽀的合并情况,具体⼤家可以⾃⾏搜索 git log 的⽤法:

9775eb1fd244432aaa3ade8a575d3d22.png

最后,不要忘记 dev1 分⽀使⽤完毕后就可以删除了:

537c84d4988042d999e091973dd0e73e.png


七、分⽀管理策略


通常合并分⽀时,如果可能,Git 会采⽤ Fast forward 模式。还记得如果我们采⽤ Fast forward 模式之后,形成的合并结果是什么呢?

1f7d4c4cfa91460599106aa59a3fd41b.png

在这种 Fast forward 模式下,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是 merge 进来的还是正常提交的。

但在合并冲突部分,我们也看到通过解决冲突问题,会再进⾏⼀次新的提交,得到的最终状态为:

1f50067bd7774e938f567c2266433e7d.png

那么这就不是 Fast forward 模式了,这样的好处是,从分⽀历史上就可以看出分⽀信息。例如我们现在已经删除了在合并冲突部分创建的 dev1 分⽀,但依旧能看到 master 其实是由其他分⽀合并得到:

95780acadf8641b6a903ed7ccad8cb22.png

Git ⽀持我们强制禁⽤ Fast forward 模式,那么就会在 merge 时⽣成⼀个新的 commit ,这样,从分⽀历史上就可以看出分⽀信息。

下⾯我们实战⼀下 --no-ff ⽅式的 git merge 。⾸先,创建新的分⽀ dev2 ,并切换⾄新的分支:

d8f329ce84834313ba20551812747628.png

修改 ReadMe ⽂件,并提交⼀个新的 commit :

da793591dd3b462ebef3c48900a475bc.png

切回 master 分⽀,开始合并:

1191096eaefd49bfaa6185e6950f4cad.png

请注意 --no-ff 参数,表⽰禁⽤ Fast forward 模式。禁⽤ Fast forward 模式后合并会创建⼀个新的 commit ,所以加上 -m 参数,把描述写进去。

合并后,查看分⽀历史:

b676d410878c45cabc0e082a723a947b.png

可以看到,不使⽤ Fast forward 模式,merge后就像这样:

c4d2d795a5e34848a01da249810320ff.png

所以在合并分⽀时,加上 --no-ff 参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾经做过合并,⽽ fast forward 合并就看不出来曾经做过合并。


八、分⽀策略


在实际开发中,我们应该按照⼏个基本原则进⾏分⽀管理:

⾸先,master分⽀应该是⾮常稳定的,也就是仅⽤来发布新版本,平时不能在上⾯⼲活;

那在哪⼲活呢?⼲活都在dev分⽀上,也就是说,dev分⽀是不稳定的,到某个时候,⽐如1.0版本发布时,再把dev分⽀合并到master上,在master分⽀发布1.0版本;

你和你的⼩伙伴们每个⼈都在dev分⽀上⼲活,每个⼈都有⾃⼰的分⽀,时不时地往dev分⽀上合并就可以了。

所以,团队合作的分⽀看起来就像这样:

04ec71bde967474e961f20814f7a0d43.png

目录
相关文章
|
7月前
|
安全 开发工具 git
Git企业开发级讲解(五)
Git企业开发级讲解(五)
55 0
|
存储 开发工具 git
Git企业开发级讲解(三)
Git企业开发级讲解(三)
70 0
|
算法 安全 Unix
Git企业开发级讲解(二)
Git企业开发级讲解(二)
62 0
|
Linux 开发工具 git
Git企业开发级讲解(一)
Git企业开发级讲解(一)
95 0
|
4月前
|
存储 开发工具 git
|
26天前
|
缓存 Java Shell
[Git]入门及其常用命令
本文介绍了 Git 的基本概念和常用命令,包括配置、分支管理、日志查看、版本回退等。特别讲解了如何部分拉取代码、暂存代码、删除日志等特殊需求的操作。通过实例和图解,帮助读者更好地理解和使用 Git。文章强调了 Git 的细节和注意事项,适合初学者和有一定基础的开发者参考。
44 1
[Git]入门及其常用命令
|
4月前
|
开发工具 git
【GIT 第二篇章】GIT常用命令
Git常用命令涵盖初始化、状态管理、提交、分支处理、远程操作等关键流程。`git init`启动本地仓库,`git clone`下载远程仓库。通过`git status`和`git diff`检查工作状态与差异。利用`git add`暂存文件,`git commit`保存更改。借助`git branch`、`git checkout`、`git merge`和`git rebase`管理分支。使用`git fetch`、`git pull`和`git push`同步远程仓库。通过`git reset`、`git revert`和`git checkout`实现版本回退。
71 0
|
2月前
|
开发工具 git
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
这篇文章是关于Git常用命令的总结,包括初始化配置、基本提交、分支操作、合并、压缩历史、推送和拉取远程仓库等操作的详细说明。
120 1
git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命令
|
29天前
|
开发工具 git 开发者
|
29天前
|
开发工具 git 开发者
提升Git效率:掌握这5个高级命令
【10月更文挑战第17天】
45 0