超详细的前端程序员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_initfix_some_bugstyle_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 的运用

撤回提交之resetrevert

开发中频繁运用 git 拉取推送代码,不免会有误操作。这个时分不要慌,git 支持绝大多数场景的撤回方案,咱们来总结一下。

撤回主要是两个指令:resetrevert

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值是9b47ddtest第二次提交的值是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 dd4e49git 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…