1、名词解释
- 克隆(clone):从远程仓库URL加载创建一个与远程仓库一样的本地仓库
- 提交(commit):将暂存文件上传到本地仓库(我们在Finder中对本地仓库做修改后一般都得先提交一次,再推送)
- 检出(checkout):切换不同分支
- 添加(add):添加文件到缓存区
- 移除(remove):移除文件至缓存区
- 暂存(git stash):保存工作现场
- 重置(reset):回到最近添加(add)/提交(commit)状态
- 合并(merge):将多个同名文件合并为一个文件,该文件包含多个同名文件的所有内容,相同内容抵消
- 抓取(fetch):从远程仓库获取信息并同步至本地仓库
- 拉取(pull):从远程仓库获取信息并同步至本地仓库,并且自动执行合并(merge)操作,即 pull=fetch+merge
- 推送(push):将本地仓库同步至远程仓库,一般推送(push)前先拉取(pull)一次,确保一致
- 分支(branch):创建/修改/删除分枝
- 标签(tag):给项目增添标签
- 工作流(Git Flow):团队工作时,每个人创建属于自己的分枝(branch),确定无误后提交到master分枝
- 终端(terminal):可以输入git命令行
2、基础配置
git config --list // 查看基础配置
git 配置有system级别、global(用户级别)、local(当前仓库)级别三种 设置先从 system ==> global ==> local,底层配置会覆盖顶层配置
- git config --system --list
- git config --global --list
// 用户配置信息
user.name=name
user.email=email
// 配置命令
git config --global user.name "name"
git config --global user.email "email"
- git config --local --list
// 当前仓库配置信息
core.repositoryformatversion=0 # 标识存储库格式和布局版本的内部变量
core.filemode=true # 检查文件权限
core.bare=false # 默认不创建裸仓库
core.logallrefupdates=true # log 所有 ref 的更新
core.ignorecase=true # 忽略文件名大小写
core.precomposeunicode=true # Mac专用选项,开启以便文件名兼容其他系统
3、commit 备注规范
- feat 增加一个功能
- fix 修复bug
- hotfix 修复线上紧急bug
- docs 只修改了文档
- style 做了不影响代码含义的修改,空格、格式化、缺少分号等等
- refactor 代码重构,既不是修复bug,也不是新功能的增加
- perf 改进性能的代码
- test 增加测试或者更新已有的测试
- chore 构建或者辅助工具或者依赖库的更新
4、开发流程
5、简化版Git命令
<master> git pull origin master # 远端master拉取分支
<master> git checkout -b name/V1.0 # 从master切出名为 name/V1.0 的分支
<name/V1.0> git add . # 跟踪所有文件,未被跟踪文件->已跟踪文件,处于暂存状态
<name/V1.0> git commit -m 'V1.0 describe' # 提交至本地 name/V1.0
<name/V1.0> git commit --amend # 修改commit注释信息,会进入vim编辑器,修改完成你要的注释后保存即可。
<name/V1.0> git reset --soft HEAD^ # 撤回commit,并保留工作区的改动代码(撤销commit,不撤销add file)
# HEAD^ 表示上一个版本,即上一次的commit,也可以写成HEAD~1
<name/V1.0> git reset --hard HEAD^ # 撤回commit,并撤销工作区的改动代码(撤销commit,撤销add file)
<name/V1.0> git push origin name/V1.0 #提交至远端 name/V1.0
<name/V1.0> git checkout master #切换回 master 分支
<master> git merge name/V1.0 # master分支合并 name/V1.0
<master> git merge --abort # master分支合并 name/V1.0出现冲突,需要暂时撤销合并
<master> git push origin --delete name/V1.0 # 在master上删除远端分支 name/V1.0 (若此分支在提pr时已被删除,此处无需处理)
<master> git branch -d name/V1.0 # 在master上删除本地分支 name/V1.0
6、线上回滚
git reset 慎用,容易丢失代码
可以不操作分支,先用上一个版本的包紧急上线
若当前代码要废弃。在master上使用 git reset 回到指定版本上,再 git push -f 至远端。
若当前代码不确定是否废弃。首先在master上拉一个新分支old-master,然后回到master上使用 git reset 回到指定版本上,再 git push -f 至远端。
7、git rebase
git rebase 能够将分叉的分支重新合并
场景一:本地与远程同一分支 提交历史不一致
多人在同一分支上协作时,出现冲突很正常
方式一:合并分叉的分支
eg:现在有一个项目由我 和 A 同时开发
我在修复一个bug之后准备提交
HowiedeiMac:ganlin howie$ git add models/paper.go
HowiedeiMac:ganlin howie$ git commit -m 'fix a bug'
[master 8b76654] fix a bug
1 file changed, 3 insertions(+), 3 deletions(-)
现在准备推送到远端
HowiedeiMac:ganlin howie$ git push origin master
To https://gitee.com/greenhn/ganlin.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://gitee.com/greenhn/ganlin.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
push失败了,说明A在我之前修改了代码并且已经提交;
我本地master分支的提交历史已经落后远端了,需要先pull一下,与远端同步后才能push
HowiedeiMac:ganlin howie$ git pull
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From https://gitee.com/greenhn/ganlin
a1bc60a..b91f711 master -> origin/master
Merge made by the 'recursive' strategy.
controllers/deal_local_data.go | 14 +++++++++++---
controllers/rtu_interface.go | 8 ++++----
models/instrument_type.go | 3 +++
models/rtu_interface.go | 3 +++
4 files changed, 21 insertions(+), 7 deletions(-)
pull成功,现在git log看一下提交历史
HowiedeiMac:ganlin howie$ git log --oneline --graph
* f63ecbf (HEAD -> master) Merge branch 'master' of https://gitee.com/greenhn/ganlin
|\
| * b91f711 (origin/master, origin/HEAD) 修正bug,优化内置通道配置
* | 8b76654 fix a bug
|/
* a1bc60a 完善日报接口
* 9f73b5e 增加内置通道设置功能
* a0d464e ...
发现分叉了!
由于我本地master的提交历史和远端的master分支的提交历史不一致,所以git为我进行了自动合并,然后生成了一个新的提交历史(f63ecbf Merge branch 'master' of)
对于部分强迫症来说这个不能接受的,不想看到分叉。
这个时候用git rebase就可以解决
HowiedeiMac:ganlin howie$ git rebase
First, rewinding head to replay your work on top of it...
Applying: fix a bug
现在再查看一下提交历史:
HowiedeiMac:ganlin howie$ git log --oneline --graph
* 2e2b995 (HEAD -> master) fix a bug
* b91f711 (origin/master, origin/HEAD) 修正bug,优化内置通道配置
* a1bc60a 完善日报接口
* 9f73b5e 增加内置通道设置功能
* a0d464e ...
完美解决,现在再push推送到远端:
HowiedeiMac:ganlin howie$ git push origin master
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 394 bytes | 394.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Powered By Gitee.com
To https://gitee.com/greenhn/ganlin.git
b91f711..2e2b995 master -> master
再次查看提交历史
HowiedeiMac:ganlin howie$ git lg --oneline --graph
* 2e2b995 (HEAD -> master, origin/master, origin/HEAD) fix a bug
* b91f711 修正bug,优化内置通道配置
* a1bc60a 完善日报接口
* 9f73b5e 增加内置通道设置功能
* a0d464e ...
现在远端master,远端head,本地master全部统一,问题解决。
方式二:合并分叉的分支
git pull --rebase // 效果跟上边是一致的