Git教程
git 简介
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
版本控制系统
版本控制系统就是在开发中用于记录不同阶段的开发文件的管理系统,可以在你需要的时候查找或者回到任何一个历史版本的文件.
git的特点
简单易用,安全性高
git的诞生
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
在2002年以前,世界各地的志愿者把源代码文件发给Linus,通过手工方式合并代码!累死他了都!
虽然当时也有其他的版本管理系统 SVN之类的 但是因为SVN是集中式的版本管理系统需要服务器存储版本信息,那时候网络不发达所以不合适,其他的是要收费的!
BitMover公司曾经给linux社区免费使用过版本管理系统,但是有人破解,所以被警告了.linus于是开始自己着手写一个版本管理系统.
一个月后 git诞生了,2008年github也应运而生.
集中式和分布式的区别
集中式:
所有用户产生的版本信息全部存在主服务器中,所有用户需要跟服务器进行通讯进行版本管理,一旦服务器出问题,啥都没了!
分布式:
所有用户的版本信息都在本地中有完整的信息备份,多用户开发版本也会在每个用户的电脑中存储所有的信息.一旦某台电脑出现问题可以从其他的用户处获取备份.
当然分布式也可以存在服务器,主要用于多人之间的数据交换,没服务器本地也可以一样进行版本管理.
git的安装
git是全平台都可以使用的版本管理系统,无论linux还是macos和window都可以使用,目前我们介绍window的使用.
双击安装下一步即可.
版本库操作
因为git的window版本是命令行模式,所以需要一些常用的命令进行操作
命令:
cd 改变文件路径
mk dir 创建文件夹
pwd 查看当前所在路径
cat 查看文件内容
rm 删除指定文件
创建版本库
git init
初始化版本库操作,使得git在指定的目录下创建版本库,并对其中个的内容进行监视.(尽量不要用中文目录)
版本库会存在三个文件区域:
工作区:当前文件夹,可以对文件进行各种操作
缓冲区:文件提交之前的区域,用于提交前对比工作区
存储区:版本确定提交的区域(类似仓库入库货物并且登记)
添加文件
git add 文件名
将指定的文件提交到缓冲区.
提交文件
git commit -m “版本信息”
将缓冲区的文件提交到版本中记录
查看仓库状态
git status
查看仓库状态,主要用于对比工作区和缓冲区文件的修改,提交状态
查看文件修改
git diff 文件名
检测工作区中指定文件和缓冲区文件的区别,用于确认文件是否是要提交的版本
git diff HEAD --文件名
检测工作区中指定文件和版本库中文件的区别
检测版本日志
git log
获取所有仓库中已经提交的版本信息
git log --pretty=oneline4
获取所有仓库中已经提交的版本信息,一行输出,信息简写
退回指定版本
git reset --hard HEAD^
退回上一个版本
git reset --hard HEAD~5
退回倒数第五个版本 ,数字表示退回的版本序号(倒数)
git reset --hard 序列号
退回指定版本号的版本,只需写出前几位即可自动查找
查询所有的历史版本号
git reflog
如果之前回滚了版本,可以通过该命令获取所有的版本号历史记录
撤销操作
git restore-- 文件名
将工作区中指定的文件使用版本库中的文件覆盖,撤销之前的操作
git reset HEAD 文件名
将工作区中指定的文件使用缓冲区中的文件覆盖,撤销之前的操作,HEAD表示最新的版本
如果你的文件提交到版本库,可以通过版本回退操作,但是如果你提交到了服务器,那就跑路吧!
删除文件
git rm 文件名
从版本库和工作区域删除文件! 只删除工作区的文件是没用的.别忘记commit
远程版本库的创建
配置本地账户信息:
$ git config --global user.name “John Doe”
$ git config --global user.email johndoe@example.com
本地库与远程库进行关联操作
git remote add 远程库的名字 git库的git地址
此处的远程库的名字是提供给本地的git使用的github远程库的名称,类似昵称,默认是origin
将本地库推送到远程库
git push -u 远程库的名字 master
-u关联本地和远程的所有分支,没有-u仅仅推送当前的master分支
git push 远程库的名字 master
第一次使用-u推送后 以后就可以使用该简化命令
删除远程库
git remote rm 远程库的名字
查看远程库
git remote -v
远程关联本地
git clone 远程的git地址
分支管理
查看当前分支情况
git branch
创建分支
git checkout -b 分支名称
相当于执行2个命令
git branch 分支名称 新建分支
git checkout 分支名称 指定当前分支
删除分支
git branch -d 分支名称
合并分支
git merge 分支名称
switch
git switch -c 分支名称 创建分支
git switch 分支名称 切换分支
新的switch 就是分支专用的新命令 用于替换checkout而已,用哪个都行
解决冲突
当存在两个以上的分支 但是同一个文件内容有差异的情况下无法进行合并的,这个时候就需要找出差异的部分人工解决问题,再进行合并操作
冲突出现
创建分支1,修改文件-> 添加->提交 分支1结束
master分支,修改文件-> 添加->提交 master结束
合并操作
此时合并因为分支1和master对同一文件进行修改,版本管理无法合并产生冲突,如果仅一个分支修改,是可以合并的,被认为是增加内容而已!
冲突内容
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:直接再工作区中可以看到冲突文件被标记.
修改解决完冲突内容(2选1),完成之后再次提交就可以合并了.
查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
分支管理策略是指如何对分支进行管理能够是的开发程序,开发人员,版本发布互不干扰协同管理的一种方案,通常遵循以下原则:
- master分支只用于软件成品的分发布,不用于直接开发
- 新建dev分支用于开发内容,多人员提交所使用的分支
- 为每个开发人员在dev上单独设立分支,负责不同部分的内容
- 开发完成就提交到dev分支用于测试
- 测试确定软件没有问题可以使用,提交到master分支
紧急bug修复策略
紧急bug修复就是指在已经发布的软件版本中出现bug需要放下目前工作区的内容进行master分支操作.
这个时候使用git stash的时候到了:
- 先用git status 检查工作区是否有没被git管理的文件
- 确定没有之后使用git stash命令存储工作区域
- 进入master分支 ,创建bug修复分支,例如bug 110,
- 在bug110分支上进行修复,修复完成进行合并并删除bug110分支
- 切换回之前的开发分支,找出暂存的工作区内容 git stash list查看
- 使用git stash pop 将暂存工作区内容返回当前工作区,此方式回删除stash list
- 再次查看工作区git stash list 无内容
- 因为master的分支是开发分支提交而来,所以bug也存在开发分支,如果需要将修复的分支也提交到开发分支, git cherry-pick bug分支名称
多人写作(需要服务器)
查看远程库名称
git remote
查看远程库详细信息
git remote -v
推送分支
git push 远程库名称 分支名称
推送规则
1. master分支,必须时刻与远程同步
2. 开发分支,团队协作开发,需要远程同步
3. bug分支.基本不用
抓取分支
git pull 从远程库中将冲突分支下载到本地用于合并之后再推送上去
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!