目录
1. 作用
版本控制、项目托管
2. 特点
分布式版本控制系统:每个人都有一个完整的版本库,用户之间相互不影响,唯一关联就是提供一个中央服务平台(github、码云)进行数据交互。
3. 原理
git本地主要分为两大块,工作区和版本库。工作区也就是.git所在当前目录下的本地文件,版本库主要包含两个区域,分别为缓存区和git分支。主要流程是:工作区添加或创建被修改文件——>add操作添加文件到版本库缓存区——>commit操作将缓存区内容推送到当前分支。缓存区可同时进行多次add操作,一次commit提交是将缓存区的所有文件都提交到当前分支。版本库是git比较重要的一个区域,它记录着git的提交历史记录,每一条记录包含字段commitId、author、date以及commit描述,git的版本控制全依赖于版本库的提交历史记录。
git版本库实际上是以类似链表的形式来存储提交记录的,每一次提交都会在提交记录这一条链上新增一个节点,而分支名和HEAD就类似于两个指针,HEAD为指向当前分支的指针,master则只想master分支最末端节点,add流程如下:
此图表示存在两个分支,分别为master和branch,当前在master分支上,branch创建于第二次提交之后,并在branch分支上进行了一次提交。
4. git本地仓库操作
- git仓库初始化
git安装完成之后,我们会在项目文件目录下初始化一个git仓库来使用git管理项目。使用命令git init来初始化一个git仓库,执行成功后会看到当前目录下多了一个.git文件,说明仓库初始化成功。
- git本地仓库常用操作
git针对本地仓库常用主要有以下操作:
|
命 令 |
作 用 |
| git commit -m"提交描述" | 将缓存区内容提交到版本库中,多次add可对应一次commit操作 |
| git status | 查看工作区与版本库文件变动情况 |
| git diff | 查看工作区与版本库文件不同的地方,通常用+、-符号标识文件变动情况 |
| git log | 查看git日志,显示所有提交过的版本信息 |
| git reflog | 查看所有分支的所有操作记录,与git log不同点就在于能查看所有分支的所有记录 |
| git reset --hard commitId/HEAD^ | 版本控制,回滚操作,可查看git log获取commitId来回退到任意提交版本,也可使用HEAD^、HEAD^^回退上一版本和上上一版本,或者HEAD~n表示回退到第n版 |
| git branch | 显示所有分支,*标识当前所在分支,加-a标识显示包含远程仓库所有的分支 |
| git checkout -b 分支名 | 创建并切换到分支,去掉-b表示直接切换分支,分支名后直接追节origin/远程分支可创建远程分支到本地 |
| git rm 文件名 | 删除文件,执行删除命令之后,再执行commit操作可删除版本库中的文件 |
| git merge branch | 将branch分支合并到当前所在分支上 |
| git tag 自定义版本号 cmmmitId | 有时候为了开发方便,会自定义版本号,例如v0.1。我们可以使用git tag来为提交的版本标记上自定义的版本号,可使用命令git tag来查看所有版本号 |
| git add 文件名/. |
添加工作区文件到git仓库的缓存区 |
- 版本回退操作原理
版本回退操作可类比commit操作,每一次commit操作是在版本库当前分支这一条链上新增一个节点,而reset操作当然不会删除一个节点,如果删除一个节点我们回退有无之后在无办法恢复。一次reset操作实际上伴随的是一次指针的移动,比如当前分支为master,我们进行reset操作回退到上一个版本,master指针会向前移动一个节点,同时HEAD也会跟随master向前移动一个节点,确保HEAD永远指向当前分支。如下图所示:
- 分支合并原理
分支合并类似,原理上同版本回退一致,都是指针的移动。如果在master分支上执行命令git merge dev,是将dev分支合并到master分支上。流程如下所示:
5. git远程仓库
git通过版本库来实现了分布式版本控制系统,但在开发中往往需要分工协作,git提供github和码云两个平台来实现协作开发的目的。
本地仓库与远程仓库连接是通过ssh来连接的,所以我们需要在用户主目录下的.ssh中id_rsa.pub文件中生成**(is_rsa表示私钥文件,is_rsa.pub表示公钥),如果这两个文件须执行命令ssh-****** -t rsa -C "[email protected]"来生成**(windows打开bash执行此命令,邮箱为github账户邮箱),我们需要将公钥key添加到github上,使github信任本机。git与本地是一对多的关系,也就是一个github账号可信任多台主机,添加多个公钥,而一台主机同时只能与一个github账号相连。
github信任本机后,我们可以将本地仓库与远程创建的仓库连接,使用命令git remote add origin [email protected]:ActChen/WorkSpaceofChen.git 来连接账户为ActChen的远程仓库WorkSpaceofChen。使用命令git push -u origin master 将本地分支内容推送到远程分支master上,并且将本地master与远程master绑定,绑定之后可去掉-u来推送本地分支到远程分支。
git针对远程仓库常用操作:
| 命 令 | 作 用 |
| git remote add origin gitSSHKey | 与远程仓库关联,gitSSHKey为github提供的SSH,如[email protected]:ActChen/WorkSpaceofChen.git |
| git clone gitSSHKey | 与远程仓库关联的另一种方式,相对remote add比较简单,直接clone远程仓库到本地 |
| git push -u origin 分支名 | 推送当前分支到远程分支,并将当前分支与远程分支绑定,第二次推送时则不需要再使用-u来绑定两个分支 |
6. git冲突
git冲突产生是由分支合并所导致的,之所以产生冲突是因为在不同分支上对同一个文件的修改都有提交,且文件变动后的内容不同,导致两个被合并分支不能merge。流程如下图所示:
这是未接入远程仓库所产生的冲突,解决方法步骤如下:
- git status 查看冲突所产生文件
- vim 文件名 vim编辑文件,手动解决冲突,选择删除冲突的内容
- git add 文件名 在主合并分支上重新添加文件
- git commit -m“提交描述” 提交到主合并分支上
当我们使用远程仓库协作开发时,可能两个人同时向一个分支提交了对同一个文件的不同修改,此时也会产生冲突,产生冲突的原因与本地分支提交产生冲突的原因类似,只是远程协作开发产生冲突原因是同一文件同一远程分支上的合并冲突。解决方法如下:
- 若当前分支未与远程分支相连接,则需要连接本地分支和远程分支: git branch --set-uostream-to=origin/dev dev;
- 连接成功之后,先将远程分支的文件pull下来:git pull;
- pull成功后你会发现git会报出合并冲突,此时冲突已产生在本地,解决方式与未接入远程仓库时产生冲突的方法一样
7. git忽略特殊文件
如果一个项目有日志输出的话,每一次运行都会使日志文件或者是build.sh产生变动,从而导致了本地文件与版本库的文件内容不同,这种变动是没有必要重复推送到版本库的,git提供在.git目录下配置.gitignore文件来配置需要被忽略的文件。