点击查看【music163】

1.什么是Git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
image.png
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

2.代码托管服务平台

全球最流行的代码托管平台:GitHub
开源中国旗下的代码托管平台:码云
基于git的仓库管理程序:GitLab
灵活强大的代码托管平台:BitBucket
支持社交元素的代码托管平台:CODING - 一站式软件研发管理平台
接下来主要使用Gihub

3.安装Git和可视化管理工具

Git官网:https://git-scm.com/
选择相对应的系统版本下载安装即可。安装过程中有很多选项,一路默认即可。

Git会自带两个软件,Git Bash(命令行)和Git GUI(可视化工具),都可以操作,只是方式不同。命令行上手门槛稍高,所以接下来主要使用可视化工具。 可视化工具可以使用Git GUI,但稍微不是很友好,下文使用Sourcetree。

Sourcetree官网:https://www.sourcetreeapp.com/
选择相对应的系统版本下载安装即可。

4.Git本地配置并注册GitHub账号

1)配置用户名和邮箱

Git Bash输入:

  1. git config --global user.name "TameDragoon8817"
git config --global user.email jcz20010219@gmail.com

2)注册GitHub

GitHub官网:https://github.com/
右上角Sign Up为注册,按流程注册即可。

3)生成SSH

在下文使用Github推送代码之前,我们需要在本地生成一个SSH并且绑定在Github上。
Git Bash输入:

ssh-keygen -t rsa -C "jcz20010219@gmail.com"

image.png
到相对应的文件夹内复制id_rsa.pub文件中的密钥。
登陆github账户,在Settings里找到SSH密钥设置,将密钥粘贴进Key文本框中,Add即可。
image.png

5.新建Repository

1)本地新建仓库

在Sourcetree中选择Create选项卡。
image.png
选择一个目录作为Git仓库,起一个名字,点击“创建”。
image.png
进入工作空间主页面,创建完成。

这个过程也可以使用命令实现

git init

创建会在文件夹中创建一个.git的隐藏文件夹,为Git的工作目录,请不要对该文件夹进行任何操作。

2)远程新建仓库

同样,在GitHub上也需要先新建一个Repository。
在GitHub首页或者个人页面都能找到new按钮。
QQ截图20220224143833.pngQQ截图20220224143912.png
进入后填写仓库名,描述等,点击创建即可。
QQ截图20220224144113.png
跳转到仓库主页面,复制下来红框的Git网址,接下来会用到。

GitHub各标签页功能参见:https://blog.csdn.net/wang975380547/article/details/78095299 不同的项目需求不同,一般会用到Code(存代码的地方)、Issues(讨论区)、Pull requests(拉取请求),也会用到Wiki(记录项目相关说明文档)、Insights(监控看板)等。

回到Sourcetree,点击“仓库”菜单中的“添加远端”,将上一步的链接粘贴到URL中。输入用户名确认即可。
image.png

3)克隆现有项目

与新建项目类似,寻找一个想要clone到本地的仓库,点击Code按钮,复制Git链接。
QQ截图20220224233416.png
在Sourcetree中选择Clone,粘贴链接,可以更改克隆到本地的仓库名和位置,点击克隆即可。
image.png

这个过程也可以使用命令实现

git clone https://github.com/TameDragoon8817/minilib-springboot.git

6.Git基本操作

1)提交Commit

接下来就可以进行敲代码了。
这里举个例子,在demo文件夹中写一个Hello World。
image.png
回到Sourcetree,已经检测到了我们新建了一个文件。
image.png
Git有缓冲区这样的一个概念。简单理解就是对文件进行的增加删除修改不会立刻被Git记录,提交代码的时候有可能会提交一些错误的代码,这个区域为了有机会反悔提交的代码。
image.png
那么具体提交的步骤是什么呢?
Git&GitHub - 图15
在可视化工具中操作:
image.png
Commit之后,我们就能看到在默认的master分支中多了一次提交,内容包括作者、日期、修改的内容等。
image.png

这个过程也可以使用命令实现

git add Untitled-1.c
git status
git commit -m hello

2)推送push

接下来把这一次提交推送到Github。
Sourcetree点击导航栏中的推送。确认推送的本地分支和远端的分支。点击推送即可。
image.png
推送成功后我们便可以从GitHub网站看到提交的更改了。
image.png

这个过程也可以使用命令实现

git push https://github.com/TameDragoon8817/demo.git master

3)拉取pull

多人同时开发项目,每个人都开发各自的内容,如果前一个人将修改提交推送,后一个人没有同步前一个人所做的修改的话,会导致进度不同步,这显然是不现实的;或者想获取GitHub上的开源项目;拉取操作是必不可少的。

在Sourcetree中,注意到有两个按钮,分别是拉取和获取。 QQ截图20220224201648.png 二者区别在于拉取是执行了git pull,包括fetch和merge,目的是把本地仓库没有,而远程仓库有的更新写到本地中;而获取仅仅执行了fetch,目的是检查是否有更新,而不会直接写到本地仓库中。 通俗来说,获取是检查更新,拉取是检查更新并更新。一般情况直接用拉取就好。

我们来模拟拉取场景。
在GitHub上修改文件并提交。
image.png
在Sourcetree中执行获取操作
image.png
可以看到,提示本地master分支落后于远端的master分支一次提交,但是本地的master仍然停留在第一次提交上。
再来尝试执行拉取操作。
image.png
本地分支此时与远程分支进度同步。

7.分支

在很多开发情况下,会有很多人操作同一个仓库,每个人本地之间都有工作副本(本地的工作目录),如果多人同时操作很有可能会导致冲突问题,使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
在实际开发情况下,直接在master分支上commit是非常危险的行为,可能会导致不可估量的后果,因为master分支一般存放成熟的正式发布的提交,应该从master中分出一条分支专门用来开发并将master分支保护起来防止未经验证可靠性的提交。
其实分支的很多概念和编程中接触的指针概念是有关的,在此不对原理过多阐述,感兴趣可以看这篇博客https://www.cnblogs.com/matengfei123/p/8252128.html

参考:引自https://www.cnblogs.com/edwardwzw/p/13185890.html image.png Master分支: 用于版本发布,每一个节点都应该是可发布版本; 每次合并到master时,都应添加tag标签作为版本号; 严禁从develop分支或feature分支直接合并到master分支;

Develop分支: 作为开发的主分支始终存在; 当有功能分支完成,应尽早合如develop分支,开发人员应daily拉取远端develop分支,尽早解决冲突代码

Release分支: 发布新版本前的准备分支,从develop分支创建,创建后develop的更新不再合并到此release分支中, 该分枝只进行bug修复和文档修改,待版本稳定后,将该分支合并到master和develop分支,并删除该分支;

Feature分支: 功能开发分支,从develop分支创建,主要是在本地开发使用的分支,开发周期不宜过长,应尽早处理与服务器的冲突; 功能完成后,合并到develop分支,并删除该分支; 当存在比较独立或长期或容易与其他任务产生大的冲突的任务,建议check出feature分支,独立开发

Hotfix分支: 生产环境紧急bug修复分支,从master分支创建,完成bug修改后,合并到master和develop分支,并删除该分支;

1)新建分支

新建分支的操作可以理解为将当前分支复制为新的一个分支,需要进行的操作可以在新的分支中进行。
Sourcetree中点击分支,输入新分支的名称,就会出现一个新的分支。
QQ截图20220224212609.png
比如上图基于master新建了一个dev分支,可以看到现在master和dev在一个提交上,并且默认切换到了dev分支,也就是说接下来进行的所有提交都是针对于dev分支而言的,不会影响到master分支。
QQ截图20220224212757.png
接下来我们尝试在dev上进行两次提交。
image.png
可以看到master分支仍然停留在分支前的提交状态,而dev分支比master多了分支后的两次提交。

2)合并分支

现在对dev分支的开发已经结束,测试没有问题,想要把更改提交到master分支,这个时候就需要将dev分支中的提交合并到master分支中。
在Sourcetree中操作也很简单,对于上一段提到的应用场景,先将操作分支切换到master(双击左侧的master分支,使指示标指向master即可);点击合并,选择要将哪个提交合并到master,在本例中选择最新的dev所在的提交选中,点击确定即可。
QQ截图20220224214053.png
此时再回到History观察,master分支已经和dev分支的提交同步,并且提示本地master分支领先于远程master分支两个提交。
image.png

3)解决冲突

A和B两个人在两个分支对同一个文件进行了修改,当A开发完毕想要将提交合并到B那里的时候,这个文件就会引发问题,Git不知道该保留哪个人的更改?或者都保存?或者都不要?这就造成了冲突。这个时候一定要谨记原则:一定要A和B两个人一起讨论决定到底保留哪些删除哪些,再进行操作。
举个例子,我们现在在demo仓库中新建两个分支,对Untitled-1.c同时进行操作并提交,看看会发生什么。
image.png
尝试将c2分支合并到c1中。
image.png
Sourcetree报错提示需要解决冲突才能继续操作。
回到文件状态页面发现在提交description和暂存区都有提示Untitled-1.c存在冲突,原因是右面的HEAD(也就是现在的c1分支)写了一行printf,但是c2又写了另一行printf引发冲突。这个时候A和B进行讨论,最后决定两行都要,直接修改Untitled-1.c,将git自动添加的提示性文字删除,修改文件,和正常提交流程一样,暂存冲突文件并提交即可。

Sourcetree在操作菜单中提供了解决冲突的程序,但是在前期对Git还不是很熟悉的情况下建议手动解决冲突。

QQ截图20220224215827.png

比如此时用vscode打开Untitled-1.c,会有鲜明的颜色提示,可以选择接受现有改变,接受新的改变,全部接受,或者在新的选项卡左右匹配对比差异,非常方便。 image.png image.png 点击”Accept Both Changes”,vscode会自动将将全部更改留下,并且自动将git生成的标记删除。 image.png

image.png
再次提交成功,文件内容也如预期般提交到仓库中了。

4)保护分支

需要对某个分支进行保护,避免其他人随意push。这一点在本节最开始已经说明。
进入GitHub Repository,选择settings(Repository的设置,而不是个人账户的设置),点击左侧的Branches,在右侧的protection rules中点击Add rule;QQ截图20220224223544.png
填写需要保护的分支的名字,并且设定保护规则,这里我只选择第一个。选择“合并前需要拉取请求”的后果是不能够向master分支提交代码,必须通过合并分支的方式进行提交;也不能直接向master分支合并,必须通过提出pull request,并且远程仓库管理员审核通过后才能进行合并。
image.png

5)拉取请求

点击Repository功能条中的”Pull requests”进入拉取请求页。image.png
点击”New pull request”新建一个拉取请求:
现在想将c1分支合并到master,所以base选master,compare选c1,提示Able to merge.说明合并分支不存在冲突等问题可以发起合并请求,接下来是确认两个分支之间的提交和文件差异。image.png
点击”Create pull request”,填写标题和信息(这里在commits中查看是算作在master分支进行了一次提交)
QQ截图20220224225622.png
确认创建拉取请求之后,会跳转到本次请求的详细页面,在这里可以和项目管理员交流,相当于一个小贴吧。管理员如果确认审核通过,就可以点击”Merge pull request”来进行本次合并(因为这个demo仓库就我一个人,所以这里可以直接合并)
image.png
拉取请求确认完毕后请求状态由Open变为Merged,查看master分支,合并成功。
image.png

8.发布Release

当项目进展到一定程度,可以进行版本发布的时候,我们就可以发布Release了。
我们可以将编译好的项目文件随源码一起发布。
Release在仓库Code页右部,点击Create就可以发布第一个Releaseimage.png
选择标签,发布的分支,描述,需要随代码一起发布的文件(我这里发布的是C语言文件编译形成的可执行文件),点击发布即可。
image.png

附:视频版

点击查看【bilibili】