Git使用技巧-规范总结版
发布于2022-09-25 23:57:09,更新于2024-07-07 22:43:13,标签:git 文章会持续修订,转载请注明来源地址:https://meethigher.top/blog首先,比较一下SVN与Git的根本区别
- SVN:集中式版本控制系统,所有历史记录都存储在中央服务器,提交和更新都依赖服中央服务器
- Git:分布式版本控制系统,每个开发者的工作目录都可以是一个完整本地仓库,可以独立离线工作。支持同步到远程仓库。
2019年整理的Git使用技巧有点粗糙,那时候也不懂得找官方文档,其实最好的学习方式,还是直接跟着官方学,这是最好的。
那时候,我自以为我已经把Git玩花了,其实不然,Git使用门槛低,但上限却是出奇的高,由此打算重新整理一份实用的,当然了,也还是偏向基础的。
我这次是有备而来,我准备了官方文档、官方电子版的书、京东购买的书。并且汲取了其中60%对我有用的价值吧。
一、 Git基本使用
1.1 仓库
理解Git三大区域
Git仓库下,分为工作区域(Working Directory)、暂存区域(Staging Area)、存储库(Repository)。
add是由工作区域提交到暂存区域。
commit是由暂存区域提交到存储库。
把文件交给Git管控
初始化仓库
1 | git init |
把文件交给Git暂存区
1 | # 添加单个文件 |
--all
与.
两个参数的区别是,--all
表示将git仓库下的所有变动都添加到git,而.
只处理当前目录下的变动。
如果我后悔提交到暂存区,可以通过如下命令撤回。
git restore –staged *
将暂存区内容,提交到存储库。
1 | git commit -m "提交描述" |
如果觉得,先git add –all,再git commit,太麻烦
可以 git commit -a -m “提交描述” 一步到位
但这个-a,只对于修改的文件有效,新增的是无效的。
通过如下命令,可以查看具体的commit
1 | git log |
远程仓库
以下示例是使用http,ssh个人习惯上感觉过于麻烦。
查看远程仓库连接信息
1 | git remote -v |
与远程仓库建立远程连接
1 | git remote add origin http://git.meethigher.top/wanxiang/test.git |
git remote 主要进行与远端Git有关的操作
origin 指的是远端Git的一个别名,而且默认就是origin
add、remove 可以删除本地连接的远端Git
从远程分支拉取
1 | git pull origin <远程分支>:<本地分支> |
将本地分支推送到远程分支
1 | git push origin <本地分支>:<远程分支> |
像使用Github时,会推荐git push -u origin master
-u就是upstream,此处可以理解成自动跟踪master分支。
也就是说,如果下次,我还是想推送到master分支,只需要执行git push即可。
不过个人不太喜欢这种方式。
删除远程分支
1 | git push origin --delete <分支名称> |
修补最新commit
如果commit之后,发现漏掉了某个文件,或者需要重新修改提交。
可以将修改暂存,然后执行如下命令,更新最新提交
1 | git commit --amend |
当你在修补最后的提交时,与其说是修复旧提交,倒不如说是完全用一个 新的提交 替换旧的 提交, 理解这一点非常重要。从效果上来说,就像是旧有的提交从未存在过一样,它并不会 出现在仓库的历史中。
修补提交最明显的价值是可以稍微改进你最后的提交,而不会让“啊,忘了添加一个文件”或 者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史。
如果是远程仓库,本地amend之后,强制推送更新即可。
eg:
git push --force origin dev
1.2 分支
分支只是指向某个commit的地址,就跟Java对象引用地址一样,我把对象清空,只是清空了指向,并没有将开辟的空间回收(回收那就是GC的事了)。
所以,分支(包括后面的标签),都是随意删除的,我甚至删一个aaa分支,再建一个aaa分支,都互不影响。
演示一下删除分支,我从master检出一个分支,并commit后,如图。
此时如果我把分支cat干掉,就变成了如下图。
由此也可知,分支是可以恢复的,只要你记住了commit地址即可,因为commit存在啊。
新增/重命名/删除/切换分支
查看分支列表
1 | git branch |
在当前分支内容上,新开辟一个分支
1 | git branch <分支名称> |
切换分支
1 | git checkout <分支名> |
git checkout -b dev 在当前分支内容上,新开辟一个分支,并切换到dev分支
git checkout --orphan dev
创建一个从0开始的分支,适用于拉取远程分支时使用
git checkout -b test --track origin/dev
从远程分支dev拉取最新内容到本地test分支
重命名分支
1 | git branch -m <现分支名> <新分支名> |
删除分支
1 | git branch --delete <分支名> |
切换commit
因为对于Git来说,分支本身也是指向的commit,所以checkout也可以直接指向commit
标签同理,标签也是指向commit,实际切换的还是commit
1 | git checkout <commitId> |
切换/回滚文件
将修改后的某个文件,回滚到指定的分支或者commitId
1 | git checkout [分支|commitId] -- 文件绝对或者相对路径,相对路径可以使用git status查看 |
合并分支并提交
比如我在master分支,此时我要将dev的分支合并过来
1 | git merge dev |
合并常见三种情况
- Fast-forward
- recursive strategy
- CONFLICT (content)
像Fast-forward,如下图,此时master分支要合并hotfix,是没有任何冲突的,master只需要指向前方的地址值C4即可。这种合并叫做Fast-forward。
像recursive strategy,如下图,一般是因为两个分支有共同的祖先,但是各自分支上进行了更改,并没有发生冲突。
像CONFLICT (content),如下图,一般是由于多人同时改了同一个文件,甚至同一行。git并不会提交commit,而是将冲突的内容保存在暂存区,等人工去纠正后再commit。
合并分支到暂存区
比如我在master分支,此时我要将dev的分支合并到当前暂存区
1 | git merge dev --no-ff --no-commit |
[Git - git-merge Documentation](https://git-scm.com/docs/git-merge#:~:text=With –no-commit perform,merges with –no-commit)
复制commit修改
cherry-pick,顾名思义,精心挑选。
与merge不同,它只合并指定的commit。
1 | # 表示将commit为111和222的合并到当前分支 |
回退commit
将当前分支的内容回退到指定的分支,指定分支之后的都被删除。
1 | # 硬删除,真实删除 |
跟踪分支
一开始我跟踪的是origin/h2-diy-api分支,所以会提示比远程分支多修改了内容,尽快提交。
我重新跟踪正确分支,问题解决。
在 Git 中,跟踪(track)是指建立一个分支与另一个分支之间的关联关系,使得它们可以相互追踪对方的提交记录。跟踪的作用是方便在推送和拉取代码时进行操作,并提供了一种简洁和直观的方式来管理分支之间的关系。
1 | # git branch -u 远程新分支 |
1.3 标签
新增/删除/切换标签
为commit为51d54ff的创建标签ava
1 | # 简洁版标签 |
切换标签
1 | git checkout ava |
如果我想再切换到最新的commit,只需要切换分支即可。
因为分支就是标识了最新的commit
创建了标签推送到远程分支
1 | git push origin --tags |
删除本地标签ava
1 | git tag -d ava |
删除远程标签
1 | git push origin tag -d ava |
标签与分支区别
标签与分支作用一样,只是起到指向的作用。标签与分支被删除都不会影响到实际的数据。
两者的作用是,分支会随着commit移动,但标签不会。
分支=会移动的标签,留下来的是标签,跟着走的是分支。
1.4 暂存区贮藏
如果我已经修改了代码,但是此时又未完成,不能提交,而此时比如我要切换分支。
可以使用stash,将修改add到暂存区,然后stash贮藏起来。
一定要存储到暂存区,否则stash也不会存储
1 | # 超简洁版 |
查看贮藏列表
1 | git stash list |
查看修改内容
1 | git stash show |
恢复并删除贮藏
1 | # 取出最新贮藏的到工作区域,理解成栈的后入先出 |
恢复并保留贮藏
1 | # 取出最新贮藏的到工作区域,理解成栈的后入先出 |
删除贮藏
1 | git stash drop |
清空贮藏
1 | git stash clear |
1.5 提交规范
在Git中,通常使用规范化的提交消息格式,其中包含一个关键字作为提交消息的前缀,用于表示提交的类型或目的。以下是常见的关键字及其含义:
feat
: 表示引入新功能(feature)。当你添加新的功能、模块或功能性改进时使用此关键字。fix
: 表示修复Bug。当你修复代码中的错误、修复功能缺陷或解决问题时使用此关键字。docs
: 表示文档更新。当你更新文档、注释或其他相关文档内容时使用此关键字。style
: 表示代码风格调整。当你对代码进行格式化、空格调整、命名调整或样式调整等不涉及功能修改的操作时使用此关键字。refactor
: 表示代码重构。当你对现有代码进行重构、优化或重组,而不是修复错误或添加新功能时使用此关键字。perf
: 表示性能优化。当你对代码进行优化、改进性能或提高效率的操作时使用此关键字。test
: 表示测试相关的修改。当你添加、修改或重构测试代码时使用此关键字。chore
: 表示杂项或琐碎的变更。当你进行一些不涉及源代码、测试或文档的变更时使用此关键字。例如,构建过程的改变、包管理器配置的修改等。revert
: 表示回滚操作。当你需要撤销先前的提交时使用此关键字。build
: 表示构建相关的修改。当你修改构建脚本、配置文件或依赖项时使用此关键字。
请注意,以上关键字只是一种常见的约定,并没有严格的规定,你可以根据团队或项目的具体要求进行调整和定义。重要的是保持提交消息的清晰、有意义,以便更好地理解和跟踪代码的变更历史。