本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、前言
- 参考安装Git 详细安装教程
- 参考视频B站 Git最新教程通俗易懂,这个有点长,感觉讲的精华不多
- 参考视频『Git』知道这些就够了_哔哩哔哩_bilibili,这个精华多,推荐看这个
- 参考视频7小时学会Git 基础全套完整教程(从入门到精通)_哔哩哔哩_bilibili,这个虽然长,但是他偏实践,对小白友好,特别有意思
- 附一个Git动画学习网站
- Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
讲讲小张的感受:我没有接触过Git,所以看了很多视频,对于入门使用确实只要知道git clone,git add,git commit,git push,git merge ,确实也就足够了。但是我很好奇背后的原理,为什么要用git add到暂存区而不是直接git commit?很多指令之间为什么要按一定的顺序执行?所以这个系列我以初学的时候,小白的角度从安装到工作原理(有的是我自己的见解,如果感觉不对,欢迎指正),再到实际应用!另外,推荐看一遍第三个参考视频,然后看一下第四个参考视频,对工作原理的讲解和实际应用确实不错!
二、Git分支
2.1什么是分支?
在Gitee仓库界面有一个分支按钮
分支就好比把D:\项目A\master复制到了D:\项目A\dev,在“dev"中继续工作
新的分支会继承master分支的提交记录,但是新分支里的提交记录不会被master所记录
graph LR;
master-->A;
A-->B;
B-->C;
graph LR;
1.0-->A;
A-->B;
B-->C;
C-->D;
D-->E;
eg:新建1.0文本提交一次,新建2.0文本提交一次
新建一个分支新分支,在新分支新建一个3.0文本提交一次
查看日志,有三次提交记录
切换到master分支,只有两条记录
2.2 分支有什么用?
1.团队开发
==master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般情况下在新建的dev分支上工作,工作完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。==
开发不同的功能也可以为每一个 功能/小组 分一个新分支。合作完成后,将每一个分支合并到master
如果同一个文件在合并分支时都被修改了则会引起冲突:解决的办法是我们可以修改冲突文件后重新提交!选择要保留他的代码还是你的代码!之后会在git merge讲解决冲突,这里理解什么是分支?
2.个人开发
利用分支,可以将稳定的版本保留在master分支中,开发时新建一个分支dev,每一次改动完之后,将新分支dev合并到master中。
另一种是在开发功能时,dev分支出现了bug,可以从dev分支再切换一个新的分支fixbug,处理完bug将fixbug合并到dev
eg:1.master有一个功能A
graph LR;
master-->功能A;
2.现在开发新的功能,从master切一个dev分支,dev分支会继承master分支,开发完后dev分支如图
graph LR;
dev-->功能A;
功能A-->功能B;
3.假设master中功能A出现bug,从master分支切一个fixbug分支,fixbug继承master,修复完后,fixbug分支如图
graph LR;
fixbug-->功能A;
功能A-->修复功能A;
4.现在切回master,merge合并分支fixbug(合并后git branch -d fixbug删除多余的分支,忘截图了)
graph LR;
master-->功能A;
功能A-->修复功能A
5.之后merge分支dev到master分支,master分支如图
graph LR;
master-->功能A;
功能A-->修复功能A;
修复功能A-->dev开发功能B;
dev开发功能B-->修复merge.dev冲突;
修复功能A-->修复merge.dev冲突;
Q:为什么最后分支图会分叉?
A:第2、3步骤中,新分支都是继承
master分支"功能A"这条记录。dev分支的记录前进到"dev开发新功能",而fixbug分支只是在"功能A"这条记录的基础上修改,它会覆盖上一条记录。fixbug分支合并时没有冲突但合并dev分支时本应该链接"功能A"之后,但是"功能A"之后现在链接"修复功能A",所以会有分叉。
这种分叉可以暂且叫做 “三方合并”,将“功能A”,“修复功能A”,“dev开发功能B”,三者合并
graph LR;
master-->功能A;
功能A-->修复功能A;
功能A-->dev开发功能B;
日志可以完整到看到这个开发的过程,但是过多使用merge,会产生很多很多的分叉,分叉之间又相互联系。四五个人不明显,但当十多个人共用一个仓库,整个开发流程就会很乱,进阶git可以学习一下后面讲的rebase,可以将整个开发流程整合为一条线
eg:merge太多
下一节开始介绍一些常用的指令