目录
🌈前言🌈
📁 Git的概念
📂 版本控制
📂 集中式 和 分布式
📁 创建和配置本地仓库
📁 理解工作区,暂存区,版本库
📁 Git的基本操作
📂 添加文件
📂 查看
📂 修改文件
📂 撤销修改
📂 删除文件
📂 配置命令别名
📁 分支管理
📂 理解分支
📂 查看分支
📂 创建分支
📂 切换分支
📂 合并分支
📂 删除分支
📂 分支策略
📂 bug分支
📂 强制删除分支
📁 远程操作
📂 创建远程仓库
📂 克隆远程仓库
📂 向远程仓库推送编辑
📂 拉取远程仓库
📂 忽略特殊文件
📁 标签管理
📂 创建删除标签
📂 推送标签
📁 总结
🌈前言🌈
Git作为程序员必备技能,重要程度可想而知。所以本期内容,我们将用一篇文章带你轻松入门Git,掌握使用Git。
我将先带大家先了解Git的原理概念,再依次学习Git的各种操作,最后带大家了解公司中程序员是如何使用Git来多人协作的。
📁 Git的概念
Git是目前主流的一个分布式版本控制系统。版本控制就是一种记录文件内容变化,以方便将来查阅特定版本修改情况的系统。
📂 版本控制
版本控制其实最重要的就是记录文件修改记录,从而使用户能够查看历史版本,方便版本切换。
例如,某天,上司让我们写一份设计文档,写完之后觉得不好,让你重写,你就拿回去修改,他又觉得不好,就这样,你拿着第三次设计文档找到他,他来了句不如第1版的,你把第1版的拿过来用吧。
可是,我们是在原文档上进行修改的,第1版的部分内容早就修改没了,最后只能受到上司一顿职责。
所以这就有了版本控制的概念,即将每次文件修改内容记录下来,让变日后的查看。
📂 集中式 和 分布式
以上是集中式版本控制系统,我们只有一台服务器,将源代码上传到服务器中,如果有一天,服务器挂了,我们的源代码也就没了,所以这是非常危险的。
而对于分布式版本控制,在我们本地上就有版本控制系统,如果有一天服务器挂了,日后我们也可以通过本地将资源再次上传到中央服务器。
📁 创建和配置本地仓库
我们首先创建一个文件夹,创建并初始化一个本地仓库
git init
此外,本地仓库里,我们还要配置两个重要的内容,即name 和 email,方便日后的查询是谁提交的。
git config user.name xxxxx
git config user.email xxxxx
我们下面这条指令来查看是否配置成功
git config -l
如果我们不小心输错,可以使用下面这条指令来重置
git config --unset user.name / user.email : 重置
此外,我们可以加上参数--global,将配置项作用与该机器下的所有git仓库。
git config --global xxx : 将配置项作用于该机器下所有的git仓库
git config --global --unset xxx :
📁 理解工作区,暂存区,版本库
如果想要实现文件版本控制,先来看看文件信息是怎么被记录的。
我们创建了file文件,.git就是本地版本控制系统,它能否管理file文件呢。答案是不能。
.git是不能手动修改的,即不能在.git中添加删除文件,所以我们只能在gitcode文件夹中创建修改文件,而这个文件夹就成为工作区,.git就是版本库(仓库)
在工作区创建修改文件操作时,都会写入到objects中,暂存区和master(主分支)中都寄存着git对象的索引(commit id),通过索引找到该对象。
对于工作区的所有操作,添加,删除,修改都会保存在git对象中。通过维护git对象,来实现对文件的版本控制
📁 Git的基本操作
📂 添加文件
1. git add . / 文件名
1) . : 将该目录下的所有文件添加到暂存区
2) 文件名 :指定文件添加到暂存区
2. git commit -m "提交信息"
提交信息很重要,方便日后的查看
通过以上两步,就将工作区文件添加到版本库中,完成对文件的版本控制。
📂 查看
git log
📂 修改文件
通过以下指令,来查看上一次提交后,文件是否被修改。
git status
如果,我们修改了文件,但还没有添加到暂存区,可以通过一下指令,查看最近一次提交,显示工作区和暂存区的不同。
git diff 文件名
git diff HEAD -- 文件名 :来查看 暂存区 和 版本库的区别。
📂 撤销修改
学习撤销修改前,先了解一下版本回退。
执行 git reset 命令可以回退版本,可以指定退回某一次提交的版本,也可以退回到当前版本。
版本回退的本质是要将版本库中的内容进行回退,工作区或暂存区是否回退有命令参数决定。
git reset [--soft] [--mixed] [--hard] [HEAD 或 索引号]
--soft 只是回退版本库
--mixed(默认) 回退版本库 和 暂存区
--hard 工作区,暂存区,版本库都进行回退,慎用。
前文有一个HEAD 这里的HEAD是一个指针,指向master,master中存放着最近一次的提交对象的索引。所以,版本回退就是修改指针指向的内容。
了解了版本回退后,我们来看一下,如果文件总有要撤销修改的情况,如果处理;文件提交到暂存区,版本库中,如果撤销修改。
1. 工作区撤销修改
(1)手动修改,不建议。
(2)git checkout -- 文件名
2. 工作区,暂存区撤销修改
git reset [HEAD 或 索引号] 文件名
(HEAD^表示上个版本,HEAD^^表示前两个版本 )
git checkout -- 文件名
3. 工作区,暂存区,版本库都撤销修改
git reset --hard [HEAD 或 索引号]
📂 删除文件
git rm 文件名
git commit -m “…"
📂 配置命令别名
git config --global alias.别名 指令
初学者还是建议多练习一下原指令。
📁 分支管理
📂 理解分支
master是主分支,通过一个master指针来维护,通过master指针来进行版本管理。
我们不仅可以使用master分支,还可以使用其他分支 ,合并其他分支,来提高效率。
HEAD指针不只指向master ,Head指向的分支就是工作分支。
📂 查看分支
git branch
当前我们只有master分支,也只有一个master指针。
📂 创建分支
git branch 分支名
我们创建了一个新的dev分支,有了一个dev指针。当前的工作分支是master。
目前HEAD指针指向master,master是工作分支,dev是基于当前版本创建的一个分支,且没有进行任何操作,所以dev指针指向当前最新的提交。
📂 切换分支
git checkout 分支名
切换完之后,HEAD指向dev分支,dev是工作分支。
📂 合并分支
git merge 分支名
如果,我们在dev分支上进行修改,但master并不会受影响,如果想要mater进行修改,需要在master分支上合并dev分支,合并分支后,master指向dev分支的最新提交。
1. 分支冲突
例如,在master和dev分支都一个最新提交,merge合并时,Git不能知道保留保留哪一分支的代码。所以git在合并时出现问题,这就是合并冲突问题,需要手动解决。
我们只能在工作区的源代码中手动删除不保留的代码,然后提交。例如只保留bbb的代码。
在master分支修复合并冲突后,mater指向最新的提交,dev依旧指向它的提交,没有改变。
git log --graph --abbrev-commit
2. 分支模式
(1)Fast-forward (快速提交,简称ff ) : 在该模式下,删除分支后,查看分支历史时,会丢失分支信息,看不出最新的提交是merge进来的还是正常提交的。
(2)no-ff (非ff模式) : 查看分支历史时,不会丢失分支信息。
ff模式下是将master指向dev最新的提交,而no-ff是怎么产生提交的?
在no-fff模式下,在merge时,进行提交。
git merge --no-ff -m "提交信息" 分支名
📂 删除分支
git branch -d 分支名
不能在工作分支删除工作分支,只能在其他分支删除。
因为创建,合并,删除分支非常快,所以Git鼓励使用分支或完成某个任务,合并再删掉该分支,这和直接在master分支上工作是一样的,但过程更加安全。
📂 分支策略
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不在上面干活;干活是在dev分支上,也就是说dev分支是不稳定的,每个人都有自己的分支,时不时往dev分支上合并就可以了。
📂 bug分支
在新分支上进行开发,开发时发现master分支上有bug,需要解决,在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
例如,有一个新分支dev进行开发,master分支通过fix_bug分支修复完成合并。dev合并master,在dev分支中解决分支冲突,冲突在dev中解决,master再合并dev分支。
不想工作区中dev分支影响到master分支:
git stash 将新的修改保存到stash文件中
git stash pop 将stash文件中的修改恢复到分支中。
📂 强制删除分支
如果,我们创建了个分支,提交文件到版本库中,git不会删除这个分支,除非强制删除分支。
git branch -D
📁 远程操作
📂 创建远程仓库
目前主流的远程仓库平台有GitHup ,Gitee 。由于GitHup连接不稳定,所以教学使用Gitee,但并没有什么本质区别。
点击创建,我们就创建了一个远程仓库。我们先来一步步了解里面的内容。
仓库名称就是我们的项目名称,输入名称,下面就有有一个仓库链接了。
设置模版中有三个文件,分别有什么含义呢?
Readme文件,就是一个介绍文件,其中包含了该项目的一些介绍等信息。
Issues就是一个提交问题的讨论帖,如果项目中你觉得有问题,或者可以改进,可以发一篇issue,提交给管理者。
Pull Requests作用就是,将分支合并请求发送给管理者。在远程仓库中,并不是想合并就可以合并的,开发者要提一个PR合并申请单,说明合并理由,管理员同意,才可以进行merge操作。
📂 克隆远程仓库
克隆远程仓库,需要一份协议,常用的有HTTPS,和SSH。SSH主要优点是公钥加密和公钥登录,需要将公钥先保存到Git仓库中,而HTTPS则没有任何要求。
1. HTTPS
git clone HTTPS链接
注意不能在本地仓库所在目录下使用该命令。
git remote :查看远端仓库
git remote :查看远程仓库的权限
push是推权限,fetch是拉权限。有了这两个权限,我们就可以和远端仓库进行交互。
2. SSH
使用SSH方式克隆仓库,由于我们没有添加公钥到远程仓库端中,服务器会拒绝我们的clone链接。需要我们设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa 和 id_rsa.pub这两个文件,如果有了,可以直接跳到下一步。如果没有需要创建SSH Key。
git clone SSH链接
cd .ssh
执行一下代码,创建公钥和私钥内为Gitee的邮箱。
ssh-keygen -t rsa xxxx@xxx
查看公钥
cat id_rsa.pub
第二部:在Gitee上添加公钥。将公钥全部粘贴复制到公钥中,点击确定即可。
📂 向远程仓库推送
本地我们有一个file.txt文件,如何将它从本地推送到远程呢?
git push origin 本地分支:远程分支(名字一样,可以写成一个)
📂 拉取远程仓库
如果本地仓库想要看到远程仓库的内容需要进行pull操作。
git pull origin 远端分支:本地分支(名字一样,可以写成一个)
拉取和推送都是分支分支之间的操作,所以远端仓库与本地仓库的分支必须有联系,而master分支之间在克隆的时候就建立了练习,那么其他分支如何确立联系呢?
📂 忽略特殊文件
在日常开发中,有些文件不想或者不应该被提交到远端,比如保存了数据库密码的配置文件,那怎么让Git知道呢?在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
Gitee在创建仓库是就可以自动为我们生成,不过需要我们主动勾选:
如果当初没有选择,也可以在工作区中创建.gitignore文件
查看被忽略原因的命令:
git checkignore -v 文件名
📁 标签管理
标签tag,可以理解为针对某次commit的一个标识,相当于起一个别名。例如,在项目发布某个版本的时候,针对最后一次commit起一个v1.0这样一个标签来标识里程碑的意义。
有什么用呢?相比于难以记住的commit id,tag很好的解决了这个问题,因为tag一定要给一个容易记住,且有意义的名字。当我们回退到某个重要版本时,直接使用标签能很好的定位。
📂 创建删除标签
//查看标签
git tag
//创建标签
git tag 标签名 [commit id]
git tag -a 标签名 -m "描述信息" [commit id]
//查看标签描述
git show 标签名
//删除标签
git tag -d 标签名
📂 推送标签
git push origin 标签名
//推送所有标签
git push origin --tags
//本地删除远端标签
git tag -d 标签名
git push origin : 标签名
📁 总结
以上,就是Git的所有操作了,其中讲解了什么是Git,Git的基本操作,分支管理,远程操作,以及标签管理。
理论的内容全部讲解完毕,剩下的只是实操了,大家可以在日常中,将自己写的代码进行Git,提交到远程仓库。
如果感觉本期内容对你有用,欢迎点赞,收藏,关注。Thanks♪(・ω・)ノ