在开发过程中经常用到git与github,对于一个稳定的项目常常就用到极少的命令操作,但是仍然会遇到一些奇奇怪怪的现象,就需要对git进行深入的了解。
0x01 git常用操作
0x02 git基础操作
初始化仓库
1 | git init 初始化仓库,新建一个Git仓库(新建了一个隐藏目录.git) |
0x03 git进阶操作
远程仓库别名
1 | 如果git clone一个远程仓库, Git会自动添加url,别名为origin |
日志回滚
1 | git log --name-only --oneline fileName |
分支
1 | git branch -v 每一个分支的最后一次提交. |
0x04 事件处理
合并冲突
xxx
寻找大文件的id1
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
查看文件
1 | git rev-list --objects --all |grep bc8880e2a3d3a4cb0f6a1661e8ce5ad65d3a95a3 |
删除文件
1 | git filter-branch --index-filter 'git rm --cached --ignore-unmatch DianpingCrawler/dianping.docx' |
垃圾回收
1 |
|
1 |
|
首先,里面最重要的两条命令是 git filter-branch 和 gc, filter-branch 真正在清理,但是只运行它也是没用的,需要再删除备份的文件,重新打包之类的,最后的gc命令,
用来收集产生的垃圾,最终清除大文件。
清空仓库
删除敏感文件
不小心上传了关于密码的代码,然后在几次commits中都有操作记录。
或者上传了一个很大的文件,并在几次commit中都有操作记录。
虽然删除了,但是在.git中保存了记录。
1 | 参考GitHub官网: https://help.github.com/articles/removing-sensitive-data-from-a-repository |
git rebase 提交干净的主分支
在开发的过程中,我们使用master主分支进行开发,在进行一次bug修改多次commit后,便产生了很多的无用的commit日志。这对我们来说不容易进行回滚或者快速定位到版本。
我们可以使用创建dev分支,当在分支中开发后,也许在dev提交了很多次的commit,这个时候我们如果在master直接mergen,那么在master主分支上也将产生许多的commit记录。这与我们的想法产生了分歧。我们希望在主分支上只进行版本发布推送,一个很干净
的master。
我们先拉取master分支
1 | git pull origin master |
在本地切换到dev分支,没有分支创建
1 | git checkout dev |
查看dev分支的提交日志1
git log --oneline
修改任意文件 做3次提交
1 | git commit -m"xxx" |
再次查看提交日志
1 | git log --oneline |
使用rebase合并commit
不太明白为啥是master
1 | git rebase -i master |
这会打开编辑器
1 | pick 32618c4 Start developing a feature |
pick就是使用commit
squash 将这次的commit合并到上一个commit中
fixup 和squash一样,但是不显示commit的log
使用fixup修改
1 | pick 32618c4 Start developing a feature |
然后wq保存
查看git 提交记录,只看到合并之后的commit了
1 | git log --oneline |
切换到主分支
1 | git checkout master |
将dev分支与master分支合并
1 | git merge dev |
查看master的日志
1 | git log --oneline |
1 | $ git log --oneline |
推送到github
1 | git push |
git commit 一个标题加一个描述
快速commit -m
方法一:1
git commit -m '' -m ''
方法二:1
2git commit -v
首行标题 次行换行 接着 描述
方法三:1
2git commit
直接回车
commit -m 的内容写错
git commit 提供了一个参数 –amend
可以修改最后一次提交的信息
写好一个commit的方法
格式
1
2
3类型 标题
// 空一行
描述详情类型
- init:初始化项目
- feat:新功能
- fix:修复bug
- docs:文档
- opt:优化与完善
- style:格式变动
- refactor:重构
- test:测试用例
- save:单纯保存
- other:难以分类
1
2e.g:
feat(#Student):增加学生数据库 --增加学生管理功能emoji
这个网站是一个很好的类型标识标签图。可以帮助我快速区分每次commit的变动。
https://gitmoji.carloscuesta.me/
常用的几个- :bug:
:bug:
修复错误。 - :fire:
:fire:
删除代码或文件。 - :zap:
:zap:
提高性能。 - :art:
:art:
改进代码的结构/格式。 - :sparkles:
:sparkles:
引入新功能。 - :pencil:
:pencil:
编写文档。 - :white_check_mark:
:white_check_mark:
更新测试。 - :lock:
:lock:
解决安全问题。 - :penguin:
:penguin:
在Linux上修复问题。 - :checkered_flag:
:checkered_flag:
在Windows上修复问题。 - :whale:
:whale:
关于Docker的工作。 - :wrench:
:wrench:
更改配置文件。 - :pencil2:
:pencil2:
修正错别字。 - :see_no_evil:
:see_no_evil:
添加或更新.gitignore文件 - :triangular_flag_on_post:
:triangular_flag_on_post:
添加,更新或删除功能标志 - :beers:
:beers:
干杯
- :bug: