超详细的前端程序员git指北
git是团队开发必备东西之一,本期教程咱们从一个开发人员开发新功用,然后兼并到主分支上的一整个流程进行演示解说,而不是只是告诉你这个指令的效果是什么,区别是什么,究竟程序员始终得贯穿“学以致用”这条硬道理,最终再对不同的常见指令及逆行解说。
一个git小demo
这是这个比方要演示的整体节点图,接下来的demo便是依照如下流程进行演示的
注:preonline => main
这儿没有画出来,理论上和feat_login => preonline
共同也会进行一次fast-forward merge
step1:开端
为了方便了解,这儿咱们不深入git的原理,它是怎么追寻的,它是怎么在多个分支中切换的这些都不谈,本篇文章的目的也主要是带咱们真正会运用git,真正成为咱们手上的东西
首要这儿我在github创立了一个库房来演示这个过程:
然后咱们克隆这个库房,当然条件是你现已安装了git并配置了根本信息:
git clone git@github.com:Justin3go/test-git.git
运转效果如下:
目前,这个项目只要main
一个分支,但一般来说,一个线上项目至少都会还有一个preonline
的分支,当然,详细到各个项目或许主要分支状况又不相同,这儿介绍一种比较常见的状况,后续遇到不同的分支结构类比并参阅contributing.md
这类文档开发就应该没什么问题了。
所以咱们简略创立一个根本结构,多创立一个preonline
分支:该分支的效果便是一切其他功用分支就只能兼并进入preonline
分支,没什么问题之后才会集入main
分支进行上线;
git checkout -b preonline # 创立并切换分支
step2:开发分支
接下来咱们就能够开发分支了,一般来说,看咱们团队自己的标准,比方要求一切开发分支有必要以dev
作为前缀,而还有些是要求以分支详细状况作为分支名,比方feat_init
、fix_some_bug
、style_botton
等等,这和咱们往常的commit
信息的前缀是共同的,而详细来说有如下的前缀:
-
build
:表明构建,发布版别可用这个 -
ci
:更新 CI/CD 等自动化配置 -
chore
:杂项,其他更改 -
docs
:更新文档 -
feat
:常用,表明新增功用 -
fix
:常用:表明修正 bug -
perf
:性能优化 -
refactor
:重构 -
revert
:代码回滚 -
style
:款式更改 -
test
:单元测试更改
比方咱们现在需求新增一个登录功用,咱们就创立咱们自己的分支:
git checkout main # 切换到主分支
git checkout -b feat_login # 创立并切换到咱们自己的分支
然后咱们就能够进行开发了:
首要我先开发完了根本上一切的功用,下面是我新增的代码,然后准备提交
根本来说,你能够直接运用vscode的可视化指令,也能够运用如下的git
指令进行操作
git add . # 暂存一切更改的文件
git commit -m "feat: 完结登录功用" # 提交并增加提交信息
然后咱们点击分布分支就会在长途库房里边创立一个相同的分支:
然后走查的时分产品司理说button款式不对,所以你持续进行修正:
然后你接着和之前相同提交代码git add .
,git commit -m "style: login button color"
,再然后便是你就需求推送到长途分支了git push
step3:兼并多次提交
前面一末节的内容几乎都是在自己的分支上操作,所以都是一些比较简略的指令,接下来便是要和团队对齐了,比方一般来说为了最终主分支上的commit信息简洁和可读性,每个功用分支上面的多个commit都需求兼并成一个commit,比方咱们方才的feat_login
分支就有两个commit,所以现在咱们进行兼并:
git rebase HEAD~2 # 兼并最近两次提交
这儿还是先将整个流程走完,某些经典指令比方这儿的
rebase
的详细运用指南能够检查后续的章节
然后咱们修正其间的提交信息如下:
这儿发现我这儿的git默许运用的是nano编辑器,但我比较熟悉vim,所以设置一下git的默许编辑器:
git config --global core.editor vim
之后修正信息为如下这个姿态然后esc wq
保存退出就能够了:
再然后咱们输入git log --oneine
检查提交信息就能够发现修正成功了,如下图,之前的两次提交兼并成为了一次提交:
step4:同步preonline分支
在团队开发时,咱们根本都并行开发,每周根本都有几个需求会在同一个项目中进行修正,不可避免的便是在提交兼并请求时(github叫做pull request
,gitlab叫做merge request
)这儿简称为MR
,需求同步最新的代码,假如有抵触,还需求解决抵触,之后才能提交MR
为了演示,我直接在github上面修正了preonline
分支上的内容如下,假设是其他人进行了开发,并在咱们之前兼并到了preonline
然后咱们在本地先拉取最新的preonline
分支
git pull
然后咱们就需求切换到自己的分支进行同步操作了
git checkout feat_login
git rebase preonline # 同步最新的:将自己新开发的提交变基到最新的preonline分支上
很好,咱们遇到抵触了,咱们点击在兼并编辑器中打开,你也能够直接在这儿操作,不过我喜欢美观一点的兼并编辑器:
然后就需求你手动选择要兼并的代码,这儿你要和别人商量一下要谁的登录页,这个比方或许不太好,实际中一般不会两个人开发同一个按钮,这儿只是为了演示。
然后你点击accept
其间一个,最终点承受兼并就能够了
持续方才的rebase
操作,在此之前你或许还需求git add .
一下
git add .
git rebase --continue
假如你在处理完抵触后不想持续当时的
rebase
操作了,比方抵触处理错了等等,你能够git rebase --abort
还要记得git push
一下,本地推送到长途,而且需求-f
参数,由于咱们修正了曾经的提交的信息,注意由于这是在咱们自己的分支上操作,所以-f
是可行的。
git push -f
之后咱们在github上面操作,去提交MR
然后项目的负责人或许核心成员就能够对你的代码进行CR
了(code review
)
CR
完结之后,便是项目负责人同意兼并请求,你的代码就成功兼并到了preonline
,不同项目有不同的周期,等到上线当天,preonline
里边的代码就会被项目负责人兼并到main
分支上完结上线。
git log
介绍
检查提交信息,一般会用git log --oneline
简略检查之前的提交;
官网快速进口
git log 的运用
撤回提交之reset
与revert
开发中频繁运用 git 拉取推送代码,不免会有误操作。这个时分不要慌,git 支持绝大多数场景的撤回方案,咱们来总结一下。
撤回主要是两个指令:reset
和 revert
git reset
reset 指令的原理是依据 commitId
来康复版别。由于每次提交都会生成一个 commitId,所以说 reset 能够帮你康复到前史的任何一个版别。
这儿的版别和提交是一个意思,一个 commitId 便是一个版别
reset 指令格式如下:
git reset [option] [commitId]
比方,要撤回到某一次提交,指令是这样:
git reset --hard cc7b5be
上面的指令,commitId 是怎么获取的?通过之前介绍的git log
指令即可检查
这儿的 option 用的是 --hard
,其实共有 3 个值,详细意义如下:
-
--hard
:吊销 commit,吊销 add,删除作业区改动代码 -
--mixed
:默许参数。吊销 commit,吊销 add,复原作业区改动代码 -
--soft
:吊销 commit,不吊销 add,复原作业区改动代码
除了运用 commitId 康复,git reset 还供给了康复到上一次提交的方便方法:
git reset --soft HEAD^
HEAD^
表明上一个提交,可多次运用。
其实平日开发中最多的误操作是这样:刚刚提交完,忽然发现了问题,比方提交信息没写好,或许代码更改有遗失,这时需求撤回到前次提交,修正代码,然后从头提交。
这个流程大致是这样的:
# 1. 回退到前次提交
git reset HEAD^
# 2. 修正代码...
...
# 3. 参加暂存
git add .
# 4. 从头提交
git commit -m 'fix: ***'
针对这个流程,git 还供给了一个更便捷的办法:
git commit --amend
这个指令会直接修正当时的提交信息。假如代码有更改,先履行 git add
,然后再履行这个指令,比上述的流程更方便更方便。
reset 还有一个非常重要的特性,便是真正的后退一个版别。
什么意思呢?比方说当条件交,你现已推送到了长途库房;现在你用 reset 撤回了一次提交,此刻本地 git 库房要落后于长途库房一个版别。此刻你再 push,长途库房会拒绝,要求你先 pull。
假如你需求长途库房也后退版别,就需求 -f
参数,强制推送,这时本地代码会覆盖长途代码。
git revert
revert 与 reset 的效果相同,都是康复版别,可是它们两的实现方法不同。
简略来说,reset 直接康复到上一个提交,作业区代码天然也是上一个提交的代码;而 revert 是新增一个提交,可是这个提交是运用上一个提交的代码。
因而,它们两康复后的代码是共同的,区别是一个新增提交(revert),一个回退提交(reset)。
正由于 revert 永远是在新增提交,因而本地库房版别永远不或许落后于长途库房,能够直接推送到长途库房,故而解决了 reset 后推送需求加 -f
参数的问题,提高了安全性。
说完了原理,咱们再看一下运用办法:
git revert -n [commitId]
git rebase
介绍
官网快速进口
常见操作:
-
git rebase -i head~2
:兼并最近两次提交 -
git rebase -i head~3
:兼并最近三次提交 -
git rebase -i [commitId]
:兼并[commitId]
之前的一切提交,不包括[commitId]
对应的提交 -
git rebase master
:同步到主分支:将我在功用分支新的提交尝试提交到最新的master
分支上
根本原理:
如上图:
- 我在
前史提交3
部分创立了功用分支并开发新增了两个提交 - 其他人在主分支上提交了新的代码
更新提交1
与更新提交2
- 咱们本地拉取最新的
master
分支 - 然后咱们在咱们自己的功用分支上
git rebase master
就能够得到图中下半部分
逐渐操作演示可参阅
git merge
介绍
将两个或多个开发前史兼并在一起
官网进口
根本原理:
merge
会将功用提交和更新提交兼并并创立一个新的提交,会有更丰富的提交信息。当然,这个“丰富”在某些状况又能够称为“杂乱”,详细用什么看咱们自己的团队标准了。
git cherry-pick
介绍
这个指令非常好用而且简略,它的功用是把现已存在的commit进行选择,然后从头提交
比方:
在master
的基础上,test
进行了2次提交,normal
进行了1次提交。现在想把test
的第2次提交 (只是是第2次提交,不包含第1次提交)和normal
的第1次提交兼并到master分支,直接merge分支是行不通的,这样会把两个分支的悉数提交都兼并到master
,用cherry-pick
即可完美的解决问题, 假如normal
第一次提交的SHA-1
值是9b47dd
,test
第二次提交的值是dd4e49
,履行如下指令即可把这两个提交兼并到master
git cherry-pick 9b47dd dd4e49
假如有抵触,则需求修正抵触文件,然后增加修正文件到暂存区,指令如下:
git add main.js
最终履行
git cherry-pick --continue
cherry-pick后
最终要说明的是:
- 履行完
git cherry-pick --continue
后不需求commit了,该指令会自动提交 -
git cherry-pick --abort
能够抛弃本次cherry-pick
-
git cherry-pick 9b47dd dd4e49
和git cherry-pick dd4e49 9b47dd
这两个的结果或许会不相同,顺序很重要
其他方便操作
通过git alias
简化指令
github.com/commitizen/…
最终
本篇文章对原理并没有研究,只是演示了运用,而且对一些细节部分也没有逐个演示验证,如有了解过错,欢迎友善指出🎉
参阅
- git-scm.com/docs
- /post/702404…
- backlog.com/git-tutoria…
- /post/706413…
- /post/684490…
- /post/684490…