可能是你见过的最全的git实战干货

2,030 阅读5分钟

git是基本是现在代码管理的必备工具了,作为程序员当然需要了解git的常规操作。

基础知识

git常用命令速查表

image.png

git生命周期

image.png

文件存储

image.png

常用分支命名

  1. 主分⽀(master)
  • 主分⽀上包含线上正在运⾏的代码,可以被视为稳定的分⽀,⼀般不允许直接往master分⽀提交代码, 只允许往这个分⽀发起merge request,只允许release分⽀和hotfix分⽀进⾏合流。
  1. 体验分⽀(release)
  • release分⽀从develop分⽀拉取,⽤于回归测试,完成后打tag并合⼊master和develop。
  1. 开发分⽀(develop)
  • 开发分⽀是基于主分⽀创建的分⽀,主要⽤户提交我们⽇常开发。
  1. 临时分⽀(feature/功能、bugfix/功能)
  • 临时分⽀ 是基于develop或者master分⽀创建的,在使⽤完成后可直接delete的分⽀
  • 特性分⽀(feature) 特性分⽀是基于开发分⽀(develop)创建的开发分⽀,主要⽤于完成某个功能模块的开发,开发完成 后再次并⼊develop。

例如开发资讯功能,新建分⽀为: feature/information

修补Bug分⽀ 修补Bug分⽀是基于master创建的临时分⽀,主要⽤于修改线上的Bug,并要及时上 线。bugfix分⽀测试通过后直接并⼊master分⽀。然后develop分⽀同步master分⽀代码,其他 特性分⽀同步develop分⽀代码

通过了解以上内容,对git有一个初步的认识。

至于一些git提交规范其实网上已经有很多了,这里举两个比较常用的:

  • feat:新功能或功能变更相关
  • fix:修复bug相关

当然你也可以使用husk来校验git commit 的规范,这里不作重点叙述,请自行官方文档

应用场景及常见问题

S:当正在dev分⽀上开发某个项⽬,这时项⽬中出现⼀个bug,需要紧急修复,但是正在开发的内容只是完成⼀半,还不想提交(假设你的栈中只有一个stash)

A:使用git stashgit stash save '暂存说明' 将其暂存至栈中,然后切换分支修复完你的bug之后,再切回你原来的dev分支,使用git stash list查看暂存记录,再使用git stash pop 出栈即可

S:接上若你的栈中不只一个stash,比如有两个,你想应用第二个

A:git stash apply默认是使用第一个存储,即stash@{0},如要使用其他记录使用git stash apply stash@{$num},此场景下应为git stash apply stash@{1}

额外拓展 stash 用法大全

  1. git stash save "save message" 执⾏存储时,添加备注,⽅便查找,只有git stash 也要可以的,但查找时不⽅便识别。

  2. git stash list 查看stash了哪些存储

  3. git stash show 显示做了哪些改动,默认show第⼀个存储,如果要显示其他存贮,后⾯加stash@{$num},⽐如第 ⼆个 git stash show stash@{1}

  4. git stash show -p 显示第⼀个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} - p⽐如第⼆个:git stash show stash@{1} -p

  5. git stash apply 应⽤某个存储,但不会把存储从存储列表中删除,默认使⽤第⼀个存储,即stash@{0},如果要使⽤ 其他个,git stash apply stash@{$num} , ⽐如第⼆个:git stash apply stash@{1}

  6. git stash pop 命令恢复之前缓存的⼯作⽬录,将缓存堆栈中的对应stash删除,并将对应修改应⽤到当前的⼯作 ⽬录下,默认为第⼀个stash,即stash@{0},如果要应⽤并删除其他stash,命令:git stash pop stash@{$num} ,⽐如应⽤并删除第⼆个:git stash pop stash@{1}

  7. git stash drop stash@{$num} 丢弃stash@{$num}存储,从列表中删除这个存储

  8. git stash clear 删除所有缓存的stash


S:当你将你的功能分支合并到dev分支时,冲突文件过多,短时间内你又无法处理

A:先使用git log查询你上一次提交的记录的hash值

image.png

使用git reset --hard hash将本地回滚到上次提交的状态。

如果不小心提交了,则使用 git push -f 强推代码覆盖你的上一次push。

S:当你想让git的提交历史记录更加清晰明了如下图

image.png

A:

需要使用变基操作

先将你的代码提交到本地(比如dev分支)git commit -m 'xxx'

(切换至你要变基的分支(比如master)git checkout master 然后拉取(git pull)master最新代码,最后再切回dev分支进行变基(git rebase master))或 (直接变基到远程master分支(其实就是最新的master)git rebase origin/master),然后git pull,这时候你的dev分支就会是master的最新分支。

之后切回master分支,将dev代码合到master里,整个历史记录就会程线性,不会有交叉的痕迹,并且你新提交的代码是在最前面。

S:接着上面,git pull其实是默认使用git fetch + git merge去合并代码的,为了使记录更清晰,怎么破

A:全局修改git pull即可

git config --global --add pull.rebase true

或你只想在当前项目rebase

git config --local --add pull.rebase true

S:继续,若rebase时候有冲突了,怎么办

A:两个选择合并或放弃

先说合并冲突:

在你解决完冲突后先add冲突文件然后使用 git rebase --continue

这时候会进入vim编辑模式查看你的一些提交啥的,一般这里不需要修改什么,直接输入:wq保存退出即可。

放弃直接执行 git rebase --abort即可

S:我想提交指定文件(比如dev分支的dist下的文件)到指定分支(比如beta分支)

A:在dev分支执行git subtree push --prefix=dist origin beta

preifx='指定的文件夹' '分支名'

S:要基于tag拉取一个分支修复bug

A:

先使用git fetch origin 来获取远程更新

然后使用git branch <newbranch> <tag> 基于tag拉取分支

git checkout newbranch

修复完bug之后git push origin newbranch 提交到远程

S:GitHub拉取速度过慢怎么办

A:git config --local http.proxy 127.0.0.1:'port' IP地址一般是你自己的本地代理

S:拉取项目报错SSL certificate problem: certificate has expired

A:最快的解决方法就是关掉SSL验证,git config --global http.sslVerify false

S:在全局新增或删除一个配置项

A:

新增一项:

git config --local/--global/--system --add section.key value (默认是添加在local配置中)

删除一项:

git config --local/--global/--system --unset section.key

local(本仓库)、global(全局)、system(系统)

也可以手动编辑 git config --local/--global/--system -e/-edit

结尾

欢迎补充或者有什么问题直接留言,我会及时查看并修复,此篇也会持续更新,建议点赞收藏关注三连♥️