日升时奋斗,日落时自省
目录
注:本文图片较多,比较基础,耐心观看,如果内容有问题请留言,我尽快回复
当前分为以下三个版本的内容(还有一个没有列举出来:分布式版本控制系统)
Git版本管理:自由进⾏版本回退、撤销、修改等Git操作⽅式
Git分⽀管理:从分⽀创建,切换,合并,删除的整个⽣命周期,灵活进⾏各种场景下的分⽀管理
Git远程仓库与本地仓库:结合版本管理与分⽀管理,做到基于分⽀级的个⼈级开发
每次甲方可能会让我们乙方改多次版本,那我们就每次版本都会有所保存,以及修改内容的查询
Git就是为了解决版本控制;
1、Git安装
Linux系统大多使用两种centos和Ubuntu
(1)centos
可以先看自己的linux服务器上是否装有git
输入命令:git
显示:command not found
出现像上的结果,那就是linux没有安装git
安装git命令:yum -y install git
安装好后,可以产看安装版本:
查看版本命令:git --version
(2)Ubuntu
可以先看自己的linux服务器上是否装有git
输入命令:git
显示:command 'git' not found,but can be installed with
安装git: apt-get install git -y
查看版本:git --version
1.1、创建git本地仓库
仓库是进行版本控制的一个文件目录,所以使用过giteee的友友们都是在一个文件夹中创建一个仓库
这里我们先创建文件夹,我在root目录下创建一个gicode文件目录
创建目录命令:mkdir gitcode
其实刚创建的文件是看不见的,查看后也是空空如也
创建一个Git的本地仓库 命令:git init
.git目录是Git用来跟踪管理仓库的这里面的内容不要手动修改,修改乱了,就会破坏仓库
想查看git中详细内容: 我们这里使用命令:tree -a (需要安装tree)
1.2、配置Git
当安装Git后首先要做的事情设置你的用户名称,和e-mail地址,配置是连接你自己要连接的仓库的账号(此处就可以拿gitee中的用户名和邮箱进行连接操作)
修改用户名命令:git config [--global] user.name "输入你的用户名"
修改email命令:git config [--global] user.email "输入你的email"
查看的仓库详细信息命令:git config -l
注:这里的--global加上是针对所有仓库,都能看见,如果不加当前设置只是针对当前仓库,创建仓库也不一定就是这一个绑定的仓库,还会有其他的,所以这里看着自己的需求
1.3、认识Git内部区分
区域分为三个区域:工作区、暂存区、版本库
首先概念上理解:
工作区:在电脑上要写代码或者文件的目录
暂存区:英文叫做stage或 index 一般存放在.git目录下的index文件中,暂存区也叫做索引
版本库:又名仓库,英文名repository,工作区有一个隐藏目录.git 它不算工作区,而是Git版本库,这个版本库里面的所有文件都可以被Git管理,追踪历史,或者再将来某个时刻可以"还原"
注:HEAD是一个指针,它指向当前所在的分支。每次提交都会创建一个新的commit对象,这个对象包含了这次提交的所有更改。HEAD指针总是指向最新的commit对象,也就是当前所在的分支的最新提交
工作区和版本库库是分开的,但是都在一个目录下,通过新建或粘贴目录的文件,并不能称为向仓库新增文件,仅仅是工作区新增文件,必须通过使用git add 和 git commit命令才能将文件添加到仓库中进行管理
2、Git应用操作
2.1、添加文件
演示添加一个ReadMe文件,先在工作区vim ReadMe 写一个文件内容
添加文件到暂存区 :git add [file1] [file2] [file3]...
添加目录到暂存区: git add [dir]
从暂存区提交到本地库中:git commit -m "辅助信息"
注:提交选项 -m 表示的就是做一个提交信息,之后方便我们查看日志(log)的时候能知道对于这个文件是干什么的
(1)针对单个文件进行操作上传
(2)针对多个文件进行上传操作
注:首先我们要工作区进行文件创建或者上传项目源码,才能进git操作
2.2、查看日志
查看日志文件:git log
如果只需要显示提交码:
简介显示命令: git log --pretty=oneline
显示成一行显示,不在显示用户名和 邮箱其实主要是针对提交码
如果提交多次或者很久没有进行查看,不知道当前最新提交文件是那个,通过HEAD指针进行操作
注:通过HEAD指针找到最近提交的位置,查看位置获得提交码
object主要用于存储分支对应的提交记录。当您创建一个新的分支时,Git会将该分支的提交记录存储在.git/objects目录下。当您切换到另一个分支时,Git会将该分支的提交记录从.git/objects目录下移动到相应的目录中
使用命令:ls .git/objects
推荐在linux系统上安装一个tree就能实现树形结构展示
2.3、查看修改信息
我们铜鼓日志log看到了对应很长一个字符串(有数字又字符)这就是每次提交的版本号,我们能根据当前版本号知道针对这个文件都进行了那些操作
查看修改信息命令:git cat-file -p 版本号
注:这里的版本号进行复制就行了,不需要手敲,每次查看日志打印,或看最近一次的日志就是使用HEAD指针进行查询
先通过查看日志找到需要的版本号:git log
通过版本号查询相关信息:git cat-file -p 版本号
再次查找这里的有tree 对应的版本号 就是针对所有文件展示的版本号
再次使用命令:git cat-file -p 版本号(tree对应的版本号)
2.4、查看添加信息
本地仓库目录有文件进行修改,但是没有不知道有没有进行添加,当前查看使用
查看添加信息:git status
最后这里友友们自行提交即可
这里还能查看修改那些内容在没有git add的时候 使用命令:git diff 文件名
3、版本回退
git回退是针对版本控制的
版本回退命令:git reset [--soft | --mixed | --hard] [HEAD]
[--soft | --mixed | --hard]:只能选择其一
--soft:参数对于工作区和暂存区的内容不变,只是将版本库回退到某个指定的版本
--mixed:是默认选项,使用时可以不用带该参数,将暂存区的内容回退为指定提交版本内容,工作区文件保持不变
--hard:参数将暂存区与工作区都回退到指定版本,切忌工作区有提交的代码不要使用这个命令,因为工作区会回滚,提交代码也就没有了,所以--hard使用一定要谨慎使用
这里演示--hard 对应版本回退:
先准备前置操作:添加两个版本,进行版本回退
开始进行回退:
如果真的回退有问题,在一定条件下是可以在找回来了,但是如果太多指令过去了,就可能真的找不到了
挽救命令:git reflog
深度理解版本维护:
4、撤销修改
4.1、工作区撤销
在工作区就是本地文件内容没有进行add,可以自行进行修改,添加和修改无非就是删减代码
但是如果已经添加了很多代码怎么办,这里可以使用 命令:git diff 文件名
能够产看你添加了那些代码
清楚工作区的修改:工作区回退命令:git checkout -- 文件名
4.2、已经add,但没有commit
4.3、已经add,也commit
4.4、误删文件
演示思路:先删除文件--》git status进行检查--》文件确实删除了--》挽救文件--》
4.4.1、删除工作区文件
涉及找回命令:git checkout -- 误删工作区的文件名
4.4.2、删除版本库中的文件
前面展示的只是删除工作区上的文件,但是并没有完全删除,这里需要的是删除整个文件,包括仓库中的文件
使用仓库删除命令:git rm 仓库文件名
进行提交删除命令:git commit -m "delete"
5、分支管理
直接上图:进行分支理解;
在版本回退⾥,你已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线,在Git⾥,这个分⽀叫主分⽀,即master分⽀
5.1、创建分支
Git支持我们查看或者创建其他分支,这里演示创建一个dev分支,对应的命令为:
查看分支:git branch
创建分支:git branch dev
注:*表示的当前所在的分支,这里master就是我们当前正在使用的分支,所以master前面就有一个*(*就是HEAD指针指向位置)
分支存储在路径:.git/refs/heads
也可以查看版本号路径:.git/refs/heads/*
当前分支图如下,dev是刚刚创建一个的分支路径,但是不是提交路径所以当前HEAD是不会改变的
5.2、分支切换
切换分支命令:git checkout 分支名(是的,这里再一次看见了checkout 作用很多)
*在那个分支前面当前就说明是操作那个分支 (说明这里切换成功)
这里再次修改文件操作ReadMe 看看有什么区别
注:放心dev分支上的内容是一点没有少,因为这两个压根不是一起的
dev分支经过一次提交了,此时HEAD指针是在哪呢(没错就是在dev分支新提交的ReadMe上)
5.3、合并分支
master分支上是没有dev分支上的修改内容的,dev就像我们的开发分支,我们最后修改还是要终止与master分支上,那我们就进行分支合并,dev合并到master上
合并分支操作:先切换到我们要合并的分支(也就是主分支),然后使用命令合并 分支
合并命令:git merge 分支名(当前分支为主分支, 将分支名合并到当前所在分支)
注:git merge 命令⽤于合并指定分⽀到当前分⽀。合并后,master就能看到dev分⽀提交的内容了
是不是感觉就像是master分支赶上dev分支,分支合并也相当于add 和 commit一次一样,HEAD指针是会跟着移动的
5.4、删除分支
合并完成后原来的分支也就没有用了,那么原来创建dev分支也就可以被删除了(提示:当前处于分支是不能删除的,需要切换到另一个分支才能进行删除)
删除图解:
5.5、合并冲突
合并也并不是总是能合成成功的,也会遇见冲突问题
这里从新将dev1分支创建回来
创建分支:git checkout -b dev1 (-b 就是春创建后直接进入这个分支)
以下分别修改文件是为了(演示两个不同分支内容的修改代表两个人)
这里看一下合并后的状态:
日志查询以下 提交信息:git log --graph --pretty=oneline --abbrev-commit
注:这里会显示很多之前的操作,这里我只截取了我们分支合并操作的日志
这个日志怎么看,图解一下给友友们看
合并也合并完了,现在可以删除到dev1分支了
5.6、分支管理策略
前面我们进行的合并分支都是采用Fast forward模式,这是默认的,这个默认合并方法有一点不友好就是,删除分支后,查看分支历史时,会丢掉分支信息,看不出来最新提交的到底是merge进来的还是正常提交的(这么说的原因就是:合并冲突的时候,我们手动修改后会再次进行提交)
刚刚的日志友友们也看见了
这里演示强制禁用Fast forward模式,那就需要重新提交一次
强制禁用Fast forward模式合并命令: git merge --no-ff -m "日志" 分支名
前置合并操作已经执行结束,下面来看日志打印:
提示:这里确实看着太明显,这里直接说结论:禁⽤ Fast forward 模式后合并会创建⼀个新的 commit ,所以加上 -m 参数,把描述写进去(这就是为啥我们能看见原因)
在合并分⽀时,加上 --no-ff 参数就可以⽤普通模式合并,合并后的历史有分⽀,能看出来曾
经做过合并,⽽ fast forward 合并就看不出来曾经做过合并
5.6.1、分支策略
分支就是为了控制版本的,多人合作,每个人都有自己的分支,时不时地往dev分支上合并就可以了(master分支为主分支,dev开发分支,michael自己的分支)
5.7、bug分支
假如我们现在正在dev2 分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有bug,需要解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除
6、远程操作
我们日常都是为了进行模块化操作的也就是各自干各自的事情,远程仓库就是为了便利操作项目时的所有使用者,针对这个"服务器"肯定是24小时都在运行的,便于我们拿去第一手资料和推送第一手资料,运行git的服务器是可以我们自己搭建的,当前能拿现成的肯定是不会去自己搭建的,github不就是嘛,一个森罗万象的网络,github是国外网站,访问速度比较慢,这里就使用gitee来进行代码托管,创建一个进行git测试的仓库
6.1、创建远程仓库
那就从建仓库开始一步一步来,按着提示来就行
注:这里只能选择私有,创建后可以再管理处设置为公有(空仓库不能设置为公有)
这里就拿私有来展示效果,友友们想的话可以设置为公有
6.2、克隆远程仓库
创建仓库后点击创建的仓库,可以看见对对应仓库路径,克隆到本地
注:我这里就创建一个gitremote的目录,进行克隆,克隆的就是我们创建的仓库(命名就是参控仓库名)
克隆命令:git clone 远程仓库路径 (这里选择的是http路径进行复制的,需要输入用户和密码)
用户就是@后面内容;密码就是登录密码
查看一下远程仓库的名称
查看远程仓库命令:git remote
查看远程仓库详细命令:git remote -v
6.3、向远程仓库推送
本地要有新的文件才能向远程仓库进行推送,这里创建文件-》写文件-》文件推送
在这里之前再次提起 绑定信息,我们之前绑定过的,就是用户和邮箱,如果绑定不对的话,就推送不了
设置用户命令:git config [--global] user.name "请输入你的用户名" (就是gitee上的用户名)
设置邮箱命令:git config [--global] user.email "请输入你的邮箱"
有邮箱在这里(如果这里有的话,直接复制就行)
本地创建的文件,要先进行添加并提交到版本库中,然后再进行推送
推送命令: git push <远程主机名> <本地分支名>:<远程分支名>
如果本地分⽀名与远程分⽀名相同,则可以省略冒号:
推送命令:git push <远程主机名> <本地分支名>
注:不知道当前分支是什么;使用命令:git branch (当前分支进行查询)
看一下远程仓库:(本来可是什么都没有的)
6.4、拉取远程仓库
这里我们就在file.txt中修改下内容后,进行拉取下来
这里file.txt文件,我们就添加一行hello git
远程仓库是要领取于本地仓库一个版本,为了使本地仓库保持最新版本,这是我们需要拉取远端代码合并到本地
拉取命令:git pull <远程主机名> <远程分支名>:<本地分支名>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略
拉取命令:git pull <远程主机名> <远程分支名>
注:当前我们已经存在文件了,内容不为空现在可以将仓库设置为公有的
6.5、配置Git
6.5.1、忽略特殊文件
在创建库的时候,还有很多的设置,如果没有开启,可以在工作区开启
这里我再次克隆,因为前面把仓库删了(这次是因为有内容,克隆路径需要点击进行,这里可选路径也很多,这次我们采取的HTTPS,进行克隆)
进行克隆操作
克隆命令:git clone (复制过来的HTTPS路径)
我仓库的名字叫test-Git克隆过来后就都是小写一个test-git文件(仓库)
在工作区创建文件是文件会生成但是git是不会提示的,当前不需要git提交给版本库
但是有些文件你虽然过滤掉了但是你还想添加给远程,此时可以强行添加,如果我们之前添加错了文件格式,那现在可以检查了
检查命令:git check-ignore -v 文件
强行提交:git add -f 文件名
刷新一下gitee上的仓库就不难看到(a.so文件已经被推送上去了)
7、标签管理
commit最后一次提交是一次完结,也是具有里程碑意义的,但是为了方便管理标签就比较友好的做到这一点,每次commit最后一次都可以进行"打标签" 表示一个版本(commit id 是不那么好记住的)
7.1、创建标签
打标签命令:git tag 标签
产看标签命令:git tag
给指定的commit id 进行打标签
注:这里的颜色提示是Ubuntu系统初识的设置,Centos7是不显示的,但是可以自己去设置
7.2、删除标签
删除标签的命令:git tag -d 标签
假如这里的v0.9标签打错了:进行删除(就是添加一个 -d 选项 比较简单就不在做解释)
7.3、标签推送到远程
推送命令:git push origin 标签
远程仓库内容:(刷新后可见)
8、扩展
gitee上创建一个分支,本地把分支拉下来,看看仓库都有那些分支
创建gitee分支
现在开始拉取分支
8.1、拉取远程仓库
涉及命令:
查看远程仓库命令:git branch -r (这里的查询不会实时更新,所以有可能仓库已删或者新增)
拉取命令:git pull (拉取的是远程仓库,不是本地仓库就有的)
创建并连接远程仓库: git checkout -b 本地分支名称 远程仓库/远程分支
拉取命令
8.2、删除远程仓库
远程仓库分支已经消失后,本地查看远程仓库分支是还是存在的
这里先删除远程仓库分支dev
删除刷新后就已经没有dev分支了
涉及命令:
查看本地和远程所有分支命令:git branh -a
查看本地与远程对应分支命令:git remote show origin
删除本地存储远程删除的分支:git remote prune origin
本地分支与远程分支对应:
删除本地对应远程仓库已经删除的分支