Git 常规使用和执行流程
给新人做 Git 使用培训,整理此篇文章。旨在快速入门、熟练使用最常规的操作。Git 的详细介结、Git 与 SVN 的区别,可从网上了解。
Git 使用相关教程资源Git 中文网, Git 官网中文教程, 廖学峰 Git教程, Runoob Git教程, git - 简明指南。
Git 是开源的分布式版本控制系统,这里的分布式主要体现在各个开发工程师都有项目的本地仓库,在做修改后,先是提交到本地仓库,再推送到远程共享仓库,即使远程仓库断开,仍可以基于本地仓库继承更新开发和跟踪,不会丢失元素数据。
Git 即是客户端,也是服务器;不同于 SVN 有个中心服务器。Git 可以使用四种主要协议来传输数据:本地传输、SSH 协议、Git 协议、HTTP协议。 GitHub 是基于 Git 技术的最大的开源项目托管平台。
Git 安装
- 安装
1
apt install git
- 查看版本
1
git --version
- 可通过help查看命令使用,子命令同样可查看帮助
1
2
3
4
5
6
7
8
9
10
11
12//查看命令使用帮助
git
git --help
//简要帮助说明
git log -help
//详细帮助说明,Windos会弹帮助页面,Linux相当于:man git-log
git log --help
//Linux 下使用
man git-reset
Git 配置
使用 Git,配置作者相关信息,git config
如果加上 --golobal
参数,则是设置全局配置。
查看 git 配置
1
git config --list
查看 git 用户名,密码,邮箱配置
1
2
3git config user.name
git config user.password
git config user.email设置 git 用户名,密码,邮箱
1
2
3git config user.name "Tom"
git config user.password "123456"
git config user.email "tom@163.com"设置 git 用户名,密码,邮箱 的全局配置
1
2
3git config --global user.name "Your Name"
git config --global user.password "Your Password"
git config --global user.email "Your Email Address"设置 git 区分文件名大小写,默认不区分
1
git config core.ignorecase false
仓库管理
版本库又名仓库,英文名 repository, 可理解为操作系统中的一个目录,该目录下的所有资源都将被 Git 管理起来,每个文件的增、删、改都将被跟踪并记录历史,可以追踪历史和还原。
创建本地仓库
将一个空目录创建为本地仓库
1 | git init |
克隆远程仓库
从远程共享仓库拉取项目到本地
1
2git clone https://xxx/xxx-project.git
git clone git@github.com:your-name/xxx-project.git查看远程仓库信息
1
2
3git remote
git remote -v //显示详细信息
//默认会有 fetch 和 push 两个分支。
从远程仓库更新
1 | //拉取远程仓库更新的内容, 默认拉取最新的版本 |
推送到远程仓库
git commit 提交到本地仓库后,还需要推送到远程仓库以作备份,或供给项目团队多人协作
1 | //默认推送本地的 origin 分支到远程的 master 分支上 |
Git 空间
创建仓库后,文件所在的目录是工作区
,隐藏目录.git
是 Git 版本库,Git 的版本库中还有暂存库
和随仓库创建而自动创建的master
分支,以及指向master
的HEAD
指针。
在把修改的文件添加到 Git版本库时,分两步执行:
- 使用
git add
将工作区的修改的文件添加到暂存区(index)。 - 使用
git commit
将暂存区的所有内容提交到当前分支。
修改提交
对比差异
对比已修改待提交的文件与当前版本的差异,可看到详细的差异内容
1 | //对比所有差异 |
查看状态
查看工作区和暂存区的状态,此命令可看到哪些修改已被暂存(add), 哪些没有暂存。
1 | git status |
添加修改
提交已修改的文件到本地仓库的暂存区。 git add
后面跟.
表示当前目录修改的文件, 后面跟文件名则是添加指定的文件。
每次提交成功后都会生成一个40位长度 commit id来作为本次提交的版本号,该版本号是用 SHA1 计算得出,十六进制表示。
1 | //添加新文件和编辑过的文件,不包括删除文件 |
提交修改
给本次提交添加说明,内容以描述修改为佳,易于阅读。git commit只对已执行git add的文件执行提交。
1 | //提交并添加说明 |
查看历史
- 查看提交历史
1
2
3
4
5查看提交历史,显示是按从最近到最远的提交日志来排序。每个版本号是以
git log
查看每个版本的大致变动情况
git log --stat --summary - 指定版本查看细节
1
2
3
4
5
6
7
8
9
10
11
12//查看当前版本
git show
git show HEAD
//查看上一个版本
git show HEAD^
//查看前第4个版本
git show HEAD~4
//指定commit_id查看
git show dfb02
撤销修改
撤销工作区的修改
1
2//checkout 检出版本库中的文件到当前工作区覆盖不需要的修改达到撤销修改的目录
git checkout -- filename撤销添加到暂存区的修改
撤销暂存区中的修改,默认是回到 HEAD 版本1
2
3
4
5
6
7//默认撤销所有已添加到暂存区但未提交的修改
git reset
git reset HEAD
//指定当前版本中的文件撤销
git reset filename
git reset HEAD filename
删除文件
1 | //删除文件并提交 |
删除目录
1 | //切换到分支 |
版本回退
Git 使用 HEAD
表示当前版本,上一个版本用HEAD^
表示,上上一个版本用HEAD^^
表示,若要往上50个版本,可用HEAD~50
表示。git reset
即可以用来撤销添加到暂存区的修改,也可用于回退版本。
- 回退到上一个版本
1
git reset HEAD^
- 回退到指定版本 注意:执行回退版本前,最好记录最新的版本号,以便于还原到最新的版本;因为回退版本后,比回退到的版本更新的版本都不再显示,但实际存在。
1
2
3
4//先使用 **git log** 查看历史版本,并记录要回退到的版本号
git reset commit_id
示例:$ git reset a238 - 还原版本和回退版本是同样的操作
1
git reset "还原到的版本号"
- Git 对版本号的变更保存了操作记录,可使用git reflog查看, 当要还原版本又不记得版本号时有用。
1
git reflog
分支管理
项目开发过程会创建很多分支来区分定制版本或稳定版本与开发中的版本的区别。
master:主分支是非常稳定的,仅用来发布新版本,时刻要与远程主分支同步。
dev:开发分支是不稳定的,在 dev分支上工作。在团队协作时,每个人有自己的分支,往dev
分支上合并。
bug 分支:用于在本地修复Bug, 若修复的是线上Bug, 修复后是需要发布版本,就需要推送到远程仓库。
查看分支
列出所有分支,master 是主分支,分支前面带星号(*)的是当前分支
1 | git branch |
创建分支
1 | git branch <branch_name> |
切换分支
1 | git checkout <branch_name> |
合并分支
1 | //切换到主分支,要全并到某个分支,就切换到这个分支作为当前分支,再把其它分支合并到当前分支上 |
推送分支
推送分支到远程仓库
1 | git push --set-upstream origin <branch_name> |
拉取远程分支
1 | //将自动创建一个本地分支,并与远程分支关联 |
删除分支
1 | // -d 选项只能删除已经合并过的分支,未合并的分支无法删除。 |
Bug分支
需要从在线版本的分支上创建修复Bug分支来修复Bug, 而正在开发的分支还未完成不能提交,Git 提供了一个把当前工作区收藏起来的功能(stash
),相当于把当前工作区进行隔离,这样当前工作区变成干净的了,就可以放心创建分支来修复Bug,又不影响之前未提交的工作区。
- 收藏(隔离)当前工作区
1
git stash
- 查看收藏的工作区
1
git stash list
- 恢复收藏的工作区
1
2
3
4
5
6//恢复内容但不删除
git stash apply
git stash drop //删除工作区
//恢复同时删除工作区
git stash pop - 若有多次
stash
,可指定stash进行恢复。1
2
3
4
5
6
7git stash list
//输出
stash@{0}: WIP on test: d59518b merger
stash@{1}: WIP on dev: 2259e12 add ffff
//恢复指定的工作区
git stash pop stash@{0}
标签管理
分支的ID不容易记住,所以提供了给分支打标签的功能,实际使用一般将人为定义的版本号作为标签来操作。
通常在master
分支发布线上版本时打标签,以标签发布的版本。
打标签
打标签, 默认是打在最新 commit 上
1
2
3git branch master
git tag v1.0
git tag -a v1.0 -m "v1.0 released" cf810a1 //给标签添加说明给指定的 commit_id 打标签
1
2
3
4
5//查看 commit log
git log --pretty=oneline --abbrev-commit
//给指定的 commit_id 打标签
git tag v1.0.1 cf810e4
查看标签
- 查看所有标签
1
git tag
- 查看标签详细信息
1
git show v1.0
推送标签
创建的标签都只存储在本地,不会自动推送到远程,若要将本地某签推送到远程,可使用如下命令:
1 | git push origin <tagname> |
拉取标签版本
拦取打了标签的版本源码,实际和拉取分支是同一个操作
1 | //根据标签名检出源码 |
删除标签
标签一般不会执行删除操作,除非打错了标签
1 | //删除本地标签 |
Git 使用流程
Git 的使用要确保 master 分支的稳定,主分支只与发布版本有关;提交冲突控制在最小分支范围内。
遵循以下两和要原则:
master 发布分支确保稳定,即确保为发布的最低版本。
严禁把 master 往开发分支合并的操作。
分支合并,必须遵从单向合并,即 feature > develop > test > release > master 合并。
修复Bug分支
使用
git stash
暂存当前工作区拉取 master 分支,创建 hotfix 分支,在此分支上修复 Bug
在 hotfix 分支上打包测试
测试通过,把 hotfix 分支合并到 master 分支,发布生产
同时把 hotfix 分支合并到 develop 分支
使用
git tash pop
恢复工作区
多feature分支
一个大的项目,有多个小团队并行开发,有先发布,后发布。
- 项目领导从 master 上创建 develop 分支
- 小团队分别从 develop 分支创建各自的 feature 分支
- 各个 feature 分支开发完,只能往 develop 上合并,合并可能出现冲突,谨慎解决
- develop 打包给测试,测试通过,develop 合并到 release 预发布分支
- 即发布环境没问题,release 往 master 合并,生布生产