行业知识
【程序员必备技能】Git入门
���录
前言
Git的概念
版本控制
集中式 和 分布式
创建和配置本地仓库
理解工作区,暂存区,版本库
Git的基本操作
添加文件
查看
修改文件
撤销修改
删除文件
配置命令别名
分支管理
理解分支
查看分支
创建分支
切换分支
合并分支
删除分支
分支策略
bug分支
强制删除分支
远程操作
创建远程仓库
克隆远程仓库
向远程仓库推送编辑
拉取远程仓库
忽略特殊文件
标签管理
创建删除标签
推送标签
总结
前言
Git作为程序员必备技能,重要程度可想而知。所以本期内容,我们将用一篇文章带你轻松入门Git,掌握使用Git。
我将先带大家先了解Git的原理概念,再依次学习Git的各种操作,最后带大家了解公司中程序员是如何使用Git来多人协作的。
Git的概念
Git是目前主流的一个分布式版本控制系统。版本控制就是一种记录文件内容变化,以方便将来查阅特定版本修改情况的系统。
版本控制
版本控制其实最重要的就是记录文件修改记录,从而使用户能够查看历史版本,方便版本切换。
例如,某天,上司让我们写一份设计文档,写完之后觉得不好,让你重写,你就拿回去修改,他又觉得不好,就这样,你拿着第三次设计文档找到他,他来了句不如第1版的,你把第1版的拿过来用吧。
可是,我们是在原文档上进行修改的,第1版的部分内容早就修改没了,最后只能受到上司一顿职责。
所以这就有了版本控制的概念,即将每次文件修改内容记录下来,让变日后的查看。
集中式 和 分布式
以上是集中式版本控制系统,我们只有一台服务器,将源代码上传到服务器中,如果有一天,服务器挂了,我们的源代码也就没了,所以这是非常危险的。
而对于分布式版本控制,在我们本地上就有版本控制系统,如果有一天服务器挂了,日后我们也可以通过本地将资源再次上传到中央服务器。
创建和配置本地仓库
我们首先创建一个文件夹,创建并初始化一个本地仓库
git init
此外,本地仓库里,我们还要配置两个重要的内容,即name 和 email,方便日后的查询是谁提交的。
git config user.name xxxxxgit 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♪(・ω・)ノ
下一篇:ps怎么疏密对比?