Git的使用
一. Git使用
Git是一种记录变化的代码管理工具。
1. 工作流程
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
#mermaid-svg-YtU9CgMJ54f32Vv6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .error-icon{fill:#552222;}#mermaid-svg-YtU9CgMJ54f32Vv6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YtU9CgMJ54f32Vv6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .marker.cross{stroke:#333333;}#mermaid-svg-YtU9CgMJ54f32Vv6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YtU9CgMJ54f32Vv6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .cluster-label text{fill:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .cluster-label span{color:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .label text,#mermaid-svg-YtU9CgMJ54f32Vv6 span{fill:#333;color:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .node rect,#mermaid-svg-YtU9CgMJ54f32Vv6 .node circle,#mermaid-svg-YtU9CgMJ54f32Vv6 .node ellipse,#mermaid-svg-YtU9CgMJ54f32Vv6 .node polygon,#mermaid-svg-YtU9CgMJ54f32Vv6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YtU9CgMJ54f32Vv6 .node .label{text-align:center;}#mermaid-svg-YtU9CgMJ54f32Vv6 .node.clickable{cursor:pointer;}#mermaid-svg-YtU9CgMJ54f32Vv6 .arrowheadPath{fill:#333333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YtU9CgMJ54f32Vv6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-YtU9CgMJ54f32Vv6 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-YtU9CgMJ54f32Vv6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YtU9CgMJ54f32Vv6 .cluster text{fill:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 .cluster span{color:#333;}#mermaid-svg-YtU9CgMJ54f32Vv6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YtU9CgMJ54f32Vv6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
克隆流程
编辑添加删除文件
更新操作
查看文件状况及修改情况
提交及推送操作
推送操作
修改及推送
推送操作
资源库
工作副本
修改工作副本
检查修改
提交修改
修改错误
2. 仓库区域划分
Git仓库主要分为了以下几种“区域”:
- 工作区(workspace):就是你在电脑里能看到的目录。所有的代码修改都发生在工作区。
- 暂存区/缓存区(staging area):英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。修改过的工作区的文件先被添加到了这里,然后在被commit后记为一次提交。
- 版本库或本地仓库(local repository):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。暂存区最终提交到的地方,也是版本历史记录存储的地方,被分为多个分支branch。
- 远程仓库(remote repository):Git服务器地址,远程仓库-项目存储地址。#mermaid-svg-b8Z48FdoPfTAHf57 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 .error-icon{fill:#552222;}#mermaid-svg-b8Z48FdoPfTAHf57 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-b8Z48FdoPfTAHf57 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-b8Z48FdoPfTAHf57 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-b8Z48FdoPfTAHf57 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-b8Z48FdoPfTAHf57 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-b8Z48FdoPfTAHf57 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-b8Z48FdoPfTAHf57 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-b8Z48FdoPfTAHf57 .marker.cross{stroke:#333333;}#mermaid-svg-b8Z48FdoPfTAHf57 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-b8Z48FdoPfTAHf57 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 .cluster-label text{fill:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 .cluster-label span{color:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 .label text,#mermaid-svg-b8Z48FdoPfTAHf57 span{fill:#333;color:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 .node rect,#mermaid-svg-b8Z48FdoPfTAHf57 .node circle,#mermaid-svg-b8Z48FdoPfTAHf57 .node ellipse,#mermaid-svg-b8Z48FdoPfTAHf57 .node polygon,#mermaid-svg-b8Z48FdoPfTAHf57 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-b8Z48FdoPfTAHf57 .node .label{text-align:center;}#mermaid-svg-b8Z48FdoPfTAHf57 .node.clickable{cursor:pointer;}#mermaid-svg-b8Z48FdoPfTAHf57 .arrowheadPath{fill:#333333;}#mermaid-svg-b8Z48FdoPfTAHf57 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-b8Z48FdoPfTAHf57 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-b8Z48FdoPfTAHf57 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-b8Z48FdoPfTAHf57 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-b8Z48FdoPfTAHf57 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-b8Z48FdoPfTAHf57 .cluster text{fill:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 .cluster span{color:#333;}#mermaid-svg-b8Z48FdoPfTAHf57 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-b8Z48FdoPfTAHf57 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}addpullcheckoutfetch/clonecommitpush 工作区 暂存区/缓存区 远程仓库 版本库/本地仓库
3. 基础设置
设置本地Git使用的账户,本地Git账户需要与Github账户对应。
git config --global user.name "xxxx"git config --global user.email [email protected]
4.仓库命令相关
1)git init
将所在文件夹初始化为一个Git仓库,在指令后添加一个名称则首先会创建该名称的文件夹,并将 该文件夹作为代码仓库。如果拷贝已创建好的仓库则使用下方指令。
git init
2)git clone
拷贝已创建好的Git仓库,支持本地与远程,远程支持http格式与ssh格式的仓库地址,推荐使用ssh仓库地址。
git clone /path/to/repository # 本地仓库git clone [email protected]:xxxxxx/xxxxxx.git # 远程仓库 ssh格式地址git clone https://github.com/xxxxxx/xxxxxx.git # 远程仓库 http格式地址
3)git add
添加文件修改到缓冲区(stage),可以添加文件或目录。
gitadd path/to/filename # 添加一个文件到缓冲区gitadd path/to/directory # 添加一个目录中所有文件到缓冲区gitadd.# 添加当前目录所有文件到缓冲区
4)git commit
将缓冲区的修改提交到本地仓库HEAD,这一步仅修改本地仓库的HEAD而远程仓库还没有任何变更。添 加-m后缀可以直接添加提交信息。提交信息(commit message)格式请参考:约定式提交,在 本项目中还需要添加Agile开发对应的消息头。
git commit # 提交,git会自动调用文本编辑器允许你来编写提交信息,保存退出编辑器继续进行提git commit -m"message"# 提交,后面直接指定提交信息git commit -a# 添加所有修改到缓冲区并提交(相当于这两个指令一起使用)
5)git push
提交本地修改到远程服务器
git push
6)git pull
获取远程修改到本地,使用–rebase选项当远程有其他更新提交时会自动将远程提交放在本地提交的前面,并将本地的提交追加到远程提交的后方。
git pull --rebase
7)git stash
使用暂存的好处是,提交时不会产生 merge合并的 日志,且安全可靠,会尽量避免将错误提交到服务器上面。
git stash -m"massage"# 暂存(存储在本地,并将项目本次操作还原)git stash pop # 使用上一次暂存,并将这个暂存删除,使用该命令后,如果有冲突,终端会显示,如果有冲突需要先解决冲突(这就避免了冲突提交服务器,将冲突留在本地,然后解决)git stash list # 查看所有的暂存git stash clear# 清空所有的暂存git stash drop [-q|--quiet][<stash>]# 删除某一个暂存,在中括号里面放置需要删除的暂存IDgit stash apply # 使用某个暂存,但是不会删除这个暂存
8)git reset
版本回退,可以指定退回到某一次提交的版本
git reset HEAD^ # 回退所有内容到上一个版本 git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本 git reset 052e # 回退到指定版本
9)git 提交日志
git log # 查历史提交记录git blame <file># 以列表形式查看指定文件的历史修改记录
5. 仓库分支管理
1)git branch
git branch -a# 查看所有分支,查看所在分支
2)git checkout
拉去分支,切换分支,新建分支。
# checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支git checkout -b dev origin/dev
# 切换到其他分支(branch),使用-b加新分支名可以创建新分支并切换到新分支git checkout dev
git checkout -b branchname
3)git branch
删除一个分支。
git branch -d<branchname># branchname:分支名称
4)git merge
将另一个分支和现在所在的分支进行合并。
git merge branchname # branchname:分支名称
在分支合并过程中如果有冲突,查看冲突文件的区别,并使用文件编辑器手动解决冲突。
gitdiffgitdiff sourcebranch targetbranch
gitadd<filename># 冲突解决完毕之后再添加修改到缓冲区
在搞乱一个文件的情况下,将文件退回到上次提交的状态。
git checkout -- <filename>
在搞乱许多项目文件的情况下,将所有项目所有文件退回到远程仓库上次提交的状态。
git fetch origin
git reset --hard origin/master
二. Git提交规范
1. Commit message的格式规范
Commit message 包括三个字段:type(必需)、scope(可选)和subject(必需)。
<type>(<scope>): <subject>
1). type
type用于说明 commit 的类别,规范使用以下标识。
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改bug的代码变动)
- test:增加测试
- chore:构建过程或辅助工具的变动
- revert:回滚到上一个版本
- merge:代码合并
- sync:同步主线或分支的Bug
2). scope
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。(如果涉及具体模块以模块名称为具体内容进行填写)
3). subject
subject是 commit 目的的简短描述,不超过50个字符。
最佳案例
git commit -m"docs(README.md):分支修改项目说明文档"
格式化Commit message的好处
1). 快速预览历史
git log <last tag> HEAD --pretty=format:%s
2). 快速过滤查找
git log <last release> HEAD --grep feature
3). commit生成Change log
Change Log 是发布新版本时,用来说明与上一个版本差异的文本内容。
参考:
Commit message 和 Change log 编写指南
2. 代码提交流程
先在本分支提交 然后切换至dev分支 在pull拉取dev最新代码 将开发分支合并至dev分支 将dev提交push到远程仓库上。
3. 分支开发主干发布模式
1) 分支介绍
开发新的模块从 主干分支 拉取新的 users分支 进行开发。禁止在 主干分支(生产)直接修改代码,需在 开发分支 开发并在 测试环境 测试通过之后由相关人员同步到 主干分支(生产)。
users分支:从master进行拉取
命名方式 dev-<开发模块>-<开发者>-<功能名称>
例如:dev-message-xxxx-邮件通知
dev分支:开发分支,用于功能的整体测试
test分支:测试分支,用于开发测试完全分支的合并实现
prod分支:生产分支,实际的代码使用
2) 代码分支流转图
#mermaid-svg-4Zt9pCorA65ZRhMQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ .error-icon{fill:#552222;}#mermaid-svg-4Zt9pCorA65ZRhMQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4Zt9pCorA65ZRhMQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-4Zt9pCorA65ZRhMQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4Zt9pCorA65ZRhMQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4Zt9pCorA65ZRhMQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4Zt9pCorA65ZRhMQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4Zt9pCorA65ZRhMQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4Zt9pCorA65ZRhMQ .marker.cross{stroke:#333333;}#mermaid-svg-4Zt9pCorA65ZRhMQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4Zt9pCorA65ZRhMQ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4Zt9pCorA65ZRhMQ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-4Zt9pCorA65ZRhMQ .actor-line{stroke:grey;}#mermaid-svg-4Zt9pCorA65ZRhMQ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ .sequenceNumber{fill:white;}#mermaid-svg-4Zt9pCorA65ZRhMQ #sequencenumber{fill:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ .messageText{fill:#333;stroke:#333;}#mermaid-svg-4Zt9pCorA65ZRhMQ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4Zt9pCorA65ZRhMQ .labelText,#mermaid-svg-4Zt9pCorA65ZRhMQ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-4Zt9pCorA65ZRhMQ .loopText,#mermaid-svg-4Zt9pCorA65ZRhMQ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-4Zt9pCorA65ZRhMQ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-4Zt9pCorA65ZRhMQ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-4Zt9pCorA65ZRhMQ .noteText,#mermaid-svg-4Zt9pCorA65ZRhMQ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-4Zt9pCorA65ZRhMQ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4Zt9pCorA65ZRhMQ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4Zt9pCorA65ZRhMQ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4Zt9pCorA65ZRhMQ .actorPopupMenu{position:absolute;}#mermaid-svg-4Zt9pCorA65ZRhMQ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-4Zt9pCorA65ZRhMQ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4Zt9pCorA65ZRhMQ .actor-man circle,#mermaid-svg-4Zt9pCorA65ZRhMQ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-4Zt9pCorA65ZRhMQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
users
dev
test
prod
拉取新分支,进行新功能模块的开发
功能开发
功能测试
新功能开发完成
功能测试
功能出现bug
功能bug修复
功能测试
功能测试完毕
开发功能测试完成
测试环境测试完成
拉取新分支,进行新功能模块的开发
users
dev
test
prod
代码提交开发流转规范
3) 最佳案例
# 在 master 分支下 拉取 新的users分支[master]>git checkout -b dev-<开发模块>-<开发者>-<功能名称>[users]>gitadd.[users]>git commit -m"docs(README.md):分支修改项目说明文档"[users]>git push origin users# 从 users 分支切换到 dev 分支[users]>git checkout dev
[dev]>git merge users# 合并 用户分支[test]>git commit -m"sync:合并代码"[dev]>git push origin dev # 提交至dev分支# 从 dev 分支切换到 test 分支[dev]>git checkout test[test]>git merge users# 合并 用户分支 [test]>git commit -m"sync:合并代码"[test]>git push origin test[test]>git checkout master
# 从 test 分支切换到 master 分支[master]>git merge test[master]>gitadd.[master]>git commit -m"sync:主干同步分支"[master]>git push origin master
# 在 master 分支下 拉取 新的users分支[master]>git checkout -b dev-<开发模块>-<开发者>-<功能名称>
版权归原作者 Along在学 所有, 如有侵权,请联系我们删除。