# 简要
git是一个分布式版本管理系统,由Linux创始人使用C语言编写而成。分布式指的是每个开发者本地都是一个单独的仓库,在自己的仓库中就可以完成版本管理的操作(不需要联网)。
与之不同的是集中式版本管理系统svn,所有的管理请求都必须通过一台中央服务器(需要联网),处理的速度没有git快。
在团队开发中git也需要一个中央服务来进行多人开发的协作,此时的中央服务器只是充当一个临时存储的角色。比如A开发者想让别人看到自己的代码,可以将代码同步到中央服务器,而B开发者想要看到A开发者的代码,那么就可以通过中央服务器将代码拉取到自己的本地,然后进行版本的查看和操作。
# 安装
Git下载地址
安装步骤可傻瓜式安装,也可以自定义安装,不多做赘述。查看是否安装成功,可以在控制台使用git --version命令来查看。也可以在任意路径下单击鼠标右键看是否有Git GUI 和Git Bash。
# Linux常用操作命令
注意,因为目前各个平台上的git工具都是从Linux上移植过来的,在打开git bash命令行窗口时,使用的依然是Linux命令,虽然和windows系统的命令类似,但是实现的功能却截然不同
- ls //查看当前目录下的文件和文件夹列表
- 加 -l 后缀可列出详细信息
- 加 -a 可查看隐藏文件
- 加 -la 可查看隐藏文件并列出详细信息
- clear //清屏
- cd //切换路径
- cd ../ 返回上级目录
- cd ./ 返回当前目录
- cd / 返回根目录
- cd xxx 进入到指定路径中
- cd C: 进入到指定磁盘中
- mkdir xxx //创建文件夹
- touch xxx //创建文件
- vi xxx //指定文件进入编辑状态
- 进入后键盘敲击 i 进入插入内容状态
- 结束操作先按 esc 键
- :w //保存
- :q //退出
- :wq //保存并退出
- :q! //不保存并强制退出
- echo xxx内容 > xxx文件名 //编辑内容并创建文件
- 新的编辑会覆盖原有的,如果想要实现追加,则使用 >> 符号替代 > 符号
- cat xxx //查看文件内容
- cp xxx旧文件 xxx新文件 //拷贝旧文件为一个新文件
- rm xxx //删除文件
- 加 -r 后缀表示递归删除,将会递归遍历并删除文件夹内的文件
- 加 -f 后缀表示强制删除
- 加 -rf 表示全部强制删除,慎用不可修复
- cat xxx文件名 //查看文件内容
# Git工作原理和流程
# 基本概念
git是一个分布式版本管理系统,每一台客户端都是一个独立的git仓库,都拥有完整的管理功能
git分为三个工作区
- 工作区:编写代码的地方
- 暂存区:临时存储代码的地方
- 历史区:保存历史版本的地方
# 基本配置命令(只需配置一次)
- $ git config -l //查看当前配置清单
- $ git config user.name XXX --global //全局配置用户名称
- $ git config user.email XXX --global //全局配置用户邮箱地址
# 基本操作命令和流程
创建/初始化仓库
- $ git init //初始化后会生成一个默认不可见的.git文件夹,记录了暂存区和历史区的提交和修改
创建并配置.gitignore文件(可选)
.gitignore文件是用来排除不需要git进行提交作为版本记录的文件,例如常见的node_modules文件夹、.git文件夹等等。注意,该文件只有后缀名没有文件名,因windows不允许创建无名称文件,可用bash环境创建
- 编辑.gitignore文件,直接写入需要排除的文件或者文件夹(以换行隔开)。
工作区到暂存区操作
$ git status //查看当前工作区文件的状态
- 红色:在工作区中,还没有被提交到暂存区
- 绿色:在暂存区中,还没有提交到历史区
$ git add xxx文件名 //把具体的文件提交到暂存区
$ git add . //把所有修改的文件都提交到暂存区(新增和修改的会被提交,删除不会)
实践证明,删除操作也是可以被添加的,所以向工作区提交新增、修改、删除操作,都可以使用此命令。点表示全部,具体到某一个文件时,使用文件名称替换掉点即可
$ git add -u //把所有修改的文件提交(只会包含修改和删除的,不包含新增的)
$ git add -A //把所有的修改文件提交(修改、新增、删除都会被提交,是-u和.的结合体)
$ git rm --cached xxx文件名 -r //从暂存区把文件撤回到工作区(使用较少)
提示:无论是从工作区提交到暂存区,还是从暂存区提交到历史区,每一个区域的内容是一直保存下来的,不会消失
$ git checkout -- xxx文件名 //把工作区的文件返回到上一次add或者commit的状态内容,工作区被覆盖内容不可恢复。
$ git reset HEAD xxx文件名 //从暂存区移除文件,可用来清空暂存区
暂存区到历史区操作
$ git commit -m 'XXX版本描述信息'
$ git log //查看历史版本记录,在有版本回退的情况下,只能查看版本回退前的记录
可以加上后缀 --oneline 让日志信息单行显示可读性更高
$ git reflog //查看所有提交版本历史,包括版本回退的记录
$ git reset --hard HEAD^ //把历史区的记录回滚到上一次,其中^表示上一次,若干个^表示回退对应的版本次数。也可以用HEAD~100的格式来替代
当使用版本回退命令后,工作区和暂存区的内容将被指定版本的内容所覆盖
$ git reset --hard xxx版本号 //回滚到指定的版本号
可借助 $ git log来查看历史区的版本号来确定具体要回退到哪个版本,一般版本号只需要截取7位即可
# 其他常用命令
不同区域的差异比较
- $ git diff xxx文件名 //工作区和暂存区比较,查看修改的内容
- $ git diff master //工作区和历史区比较
- $ git diff --cached //暂存区和历史区进行比较
克隆仓库
- $ git clone xxx仓库地址 [可选的别名] //克隆远程仓库到本地,可另设项目文件夹名称,默认以远程仓库名称
创建远程分支并关联本地分支
- $ git branch -r //查看远程分支
- $ git checkout -b 分支名称 //创建并切换本地分支
- $ git push origin 分支名称 //向远程推送分支
- $ git branch --set-upstream-to origin/远程分支名 //把当前分支和远程的某一个分支关联
遇到紧急指派的任务,需要保留手头工作(存放暂存区)并切换新分支进行开发时,例如修复Bug
$ git stash //将暂存区的内容临时存储起来,因为在切换分支时如果有未提交文件会被阻止切换。存储后使用git status查看暂存区为干净的。可存储多次,会以不同的记录存储起来
$ git stash list //查看stash中存储的内容
$ git stash apply //恢复stash中存储的内容到暂存区
当存储了多次后,恢复指定的stash可以使用 $ git stash apply stash@{数字索引号}
$ git stash drop //stash中的内容恢复到暂存区后,通过git stash list发现stash中仍然存在,所以需要使用此条命令进行删除
$ git stash pop //stash中内容恢复到暂存区的同时删除stash中的内容
# 仓库的创建者
每个人的本地仓库都是一个独立且功能齐全的仓库,但是想要实现多人协作代码共享,还需要一个公共的仓库,也成为中央仓库。相比较个人独立开发,在团队协作开发下,流程还有有所区别的。
创建中央仓库,用于存储所有人的代码内容和版本信息。一般会建立在gitHub、Coding或者自己公司的git仓库服务平台、服务器等。创建完成后生成仓库地址。
作为仓库的创建者(一般为团队领导或指派人员),需要将项目的初始化文件提交到本地仓库
让本地仓库和远程仓库保持关联
可选择ssh免密登录地址和https有密登录地址。https需要再每次推送时输入用户名和密码,ssh免密登录则需要先在本地生成ssh私钥和公钥,并且把公钥在远程仓库中认证添加,成功后即可实现免密登录。git生成ssh公钥
- $ git remote add xxx变量名 xxx远程地址 //添加远程仓库地址,名称一般为origin
- $ git remote rm xxx //删除指定的远程仓库地址
- $ git remote -v //查看当前相关联的远程仓库地址
将本地仓库同步到远程仓库
- $ git push -u origin master //第一次推送默认的master主分支,使用-u参数可以同步并关联,后续推送即可不带-u
将团队成员设置为协同开发人员,可具有提交和更改的权限
# 基于分支的团队协作模式
作为团队的成员,我们要做的就是将已有的仓库给拉取到本地,然后各自开始feature开发。避免直接在master主分支上开发,因为进度和功能的不完整度可能会为团队的其他人造成困扰,需要在本地创建对应的开发分支。每次提交的进度和功能代码都会放在本地的开发分支上,知道功能完成后,才会向主分支上进行合并。
将已有的项目仓库clone到本地
clone操作会默认将远程master分支关联到本地上,并且自动声明origin为远程仓库地址
- $ git clone xxx地址 //开发人员clone项目仓库到本地
查看远程分支,并且和本地分支进行关联
- $ git branch //查看当前所有分支
- $ git branch -r //查看远程分支
- $ git branch xxx分支名称 //创建分支
- $ git checkout xxx分支名称 //切换分支
- $ git checkout -b xxx分支名称 //创建并切换分支
- $ git branch --set-upstream-to origin/dev //协作开发者将远程分支关联到当前分支
功能开发完毕后,需要将本地开发分支上的代码合并到master分支上,如果有冲突需要解决冲突,然后需要再次添加和提交
- $ git pull origin 远程分支 //将远程分支内容拉取到本地关联分支上(同步分支版本内容)
- $ git merge xxx分支名称 //将指定分支合并到当前分支,默认为Fast-forward快速合并,合并完不会生成新版本
- $ git merge --no-ff -m 提交信息 分支名称 //强烈建议使用关闭快速合并方法来进行合并。在合并的同时会提交新版本并且 -m 生成版本信息
分支合并完成后,即可删除功能分支
$ git branch -D xxx分支名称 //删除分支
-D 参数表示强制删除,-d表示常规删除。在需要摒弃一些无用分支时,针对分支上已做过提交操作但不需要合并,需要强制删除时使用-D,否则-d即可
$ git log --graph //查看分支合并图
推送分支(更新远程仓库内容)
一般需要关联远程和推送的分支只有master和dev。对于bug分支和feature分支,要不要推送取决于你的leader是否关心你的工作进度和内容
- $ git push origin 分支名称 //推送本地分支到远程仓库(同步远程仓库),如果没有和远程分支进行关联的话,则表示创建远程分支
删除远程分支
- $ git push origin --delete 远程分支名称 //当功能需求都完成后且不需要对应的远程分支,可通过此命令进行删除
算法 →