日升时奋斗,日落时自省
目录
1、Git安装
1.1、创建git本地仓库
1.2、配置Git
1.3、认识Git内部区分
2、Git应用操作
2.1、添加文件
2.2、查看日志
2.3、查看修改信息
2.4、查看添加信息
3、版本回退
4、撤销修改
4.1、工作区撤销
4.2、已经add,但没有commit
4.3、已经add,也commit
4.4、误删文件
4.4.1、删除工作区文件
4.4.2、删除版本库中的文件
5、分支管理
5.1、创建分支
5.2、分支切换
5.3、合并分支
5.4、删除分支
5.5、合并冲突
5.6、分支管理策略
5.6.1、分支策略
5.7、bug分支
6、远程操作
6.1、创建远程仓库
6.2、克隆远程仓库
6.3、向远程仓库推送
6.4、拉取远程仓库
6.5、配置Git
6.5.1、忽略特殊文件
7、标签管理
7.1、创建标签
7.2、删除标签
7.3、标签推送到远程
8、扩展
8.1、拉取远程仓库
8.2、删除远程仓库
注:本文图片较多,比较基础,耐心观看,如果内容有问题请留言,我尽快回复
当前分为以下三个版本的内容(还有一个没有列举出来:分布式版本控制系统)
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
本地分支与远程分支对应:
删除本地对应远程仓库已经删除的分支