引言
在正式学习git之前,首先明确git是什么
git是一种 分布式 版本管理系统
首先介绍版本管理系统
版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。 说人话就是通过系统记录文件的每次改动并给出历史记录
那为什么是分布的,除了分布的还有哪些类型的版本管理系统呢
除了分布式管理系统,先前其实还存在集中式管理系统SVN,为了凸显出分布式的特点,我们先从集中式管理系统架构说起
集中式的版本库存放在中央服务器中,需要修改数据的时候需要先从服务器中取出代码,本地修改完成后上传至服务器,其需要链接网络才能工作,十分依赖中央服务器
集中式的特点就在于
- 必须有中央服务器且需要全程联网
- 创建新的分支则所有人都会有这个分支
鉴于其较为符合人的思维习惯且管理方便,集中式一般适合人数不多的项目开发
而分布式系统每个开发者电脑中都存在着完整的版本库,其开发过程中不需要一直联网且只需要在必要时将代码提交至中央管理机即可实现代码的管理
相对于集中式,分布式主要解决了这些痛点
- 相较于集中式的全程联网,分布式可在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 命令即可将改变提交至远程仓库。
- 对比集中式会将项目所有文件存储在中央服务器,分布式中的文件会以更小的元数据形式存储,该举措极大程度上缩小了存储文件的体积
综上,分布式虽然需要较高的学习成本,但是其灵活与快速的优点更适用于多人协同开发的场景
接下来,我们来详细了解git
工作区与暂存区
工作区为电脑中能看到的目录
工作区有一个隐藏目录 .git 为git的版本库,其中包含名为stage(index)的暂存区
Git简单操作
创建git仓库
git init //在当前目录创建一个git仓库,生成 .git 文件
将改动添加至仓库
git add file //将改动添加至仓库,使用 git add . 为添加所有文件
将改动提交到仓库
git commit -m "说明内容"
查看文件库状态
git status
查看文件修改内容
git diff
查看本地提交记录
git log //可以加上 --pretty=online 将信息整理成一行展示,--graph可展示分支合并图
版本回退
git reset --hard HEAD^ //其中 HEAD^代表回退上一个版本,HEAD^^为回退两个版本,HEAD~100为回退100个版本
版本回退后在当前命令行没有关闭的前提下还可使用gitId进行取消回退
git reset --hard (gitId) //gitId为前面的数字,只写前几位就可以了
当前命令行关闭后也可使用命令展示出以前的提交id
git relog //其为命令历史
提交后可使用命令查看工作区与版本库区别
git diff HEAD --file
使用命名丢弃工作区的修改,让该文件回归最近一次 git add 或是 add commit
git checkout --file//若没有暂存版本则回归至版本库状态,若有暂存版本则回归至暂存版本状态,file前的--用于区分切换分支命令
使用命令丢弃暂存区的修改
git reset HEAD <file> //可将目标文件在暂存区的修改全部撤销,回退至当前库中最新版本
当改乱了工作区文件内容还添加至暂存区,可使用命令分两步回退
git reset HEAD <file> //通过版本库重置目标文件在暂存区的修改
git checkout --file //丢弃工作区的修改并回归至库中最新版本
可使用命令将版本库中目标文件删除
git rm file
Git远程仓库
链接远程仓库
- 创建SSH Key
在用户主目录下生成.ssh目录下的id_rsa或id_rsa.pub
ssh-keygen -t rsa -C "youremail@example.com" //之后一路回车就可以
生成完成后id_rsa为私钥,不可泄漏,id_rsa.pub为公钥
- 登录GitHub、打开Account Setting、SSH Key,点击Add SSH Key,在文本框中粘贴id_rsa.pub文件内容
可将多设备的SSH Key添加至仓库,这样就可以在多设备上向一个仓库提交代码
添加远程仓库
登录后点击Create a new repo创建一个新的仓库
之后根据空仓库给出的步骤在本地进行操作
git remote add origin (SSH) //链接远程库
git push -u origin master//将本地push至远程,-u代表git会将本地master分支和远程master分支关联,简化push或pull命令
之后就可以通过命令进行提交
git push origin master //将本地版本库master内容推送至名为origin的远程仓库master分支上
删除远程仓库
可在本地使用命令查看远程库并将远程库“删除”
git remote -v //查看远程库信息
git remote rm <name> //解除与目标远程库的绑定关系
克隆远程仓库
git clone <ssh/https>
分支管理
git的分支操作本质上是修改指针指向的操作
创建分支
git checkout -b dev //创建并切换至dev分支,其为简写
git branch dev //创建名为dev的分支,新版本可使用git create 分支名称
git checkout dev //切换至dev分支
git branch //查看本地分支,加上-a为一起查看远程分支
切换分支
git checkout (目标分支) //新版本可使用git switch 目标分支
合并分支
//在合并分支上使用命令
git merge (被合并分支)
合并发生分支冲突后可通过命令检查冲突文件
git status
删除分支
git branch -d 分支名称
注:分支合并时git会默认采用 fast forward模式,这种情况下删除分支后会丢失分支信息,导致看不出来曾经做过合并,若要禁用该模式git会在mewge时生成一个新的commit
git merge --no-ff -m "merge with no-ff" dev //--no-ff为禁用操作符且由于自带一个commit,所以需要-m来描述
储藏当前工作区
git stash //该命令可将当前工作区储藏并生成一个干净的工作区
恢复储存的工作区
git stash list //查看储存的工作区列表
git stash apply //恢复暂存区内容,恢复后stash内容并不删除,需要手动使用git stash drop,可使用stash@{0}恢复指定内容
git stash pop //恢复暂存区内容的同时删除
强行删除分支
git branch -D (分支名称)
多人协作
查看远程库信息
git remote //加上-v可以查看更详细的内容
推送分支
git push origin (分支名称) //推送origin仓库的指定分支
当遇到提交冲突时
git pull //在冲突分支中将最新版本拉取到本地
//在本地将冲突解决完成后重新提交
当本地pull也失效时需要通过命令指定本地分支与远程分支的链接
git branch --set-upstream-to=origin/dev dev //示例,其将dev与远程origin/dev进行链接
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功! - 如果
git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
使用命令将本地未push的分支提交历史整理成直线
git rebase