项目
入职第二周,我接到了一些或大或小的项目,这些项目大多都是有明确需求的一些项目,可以帮我熟悉我们现在的系统。
我现在有一个主线的项目,那就是“标品”版本迭代开发,我负责其中的几个模块。
关于标品项目,实际上我已经有了一份具体的开发内容,具体到我应该修改哪些接口,需要修改哪些数据库表,前辈已经都调研完成了。
不过在执行时,我发现之前的开发内容不是很准确,少考虑了一些东西,不过好在我在实施之前发现了这个问题,啃代码总结出了实际需要开发的工作量,跟前辈商量后,才得以继续实施。
其他的项目,我接到了两个零散的工作,一是对接第三方公司的一个接口,二是简单地修改销售同学所使用的后台。
产出
至于产出,那首先就是做项目带来的产出了,这些产出还处于半成品,还没办法量化。
除此之外,产出还没有,我想的是再出一些公共文档,介绍介绍最近两天所用到的公司内部的平台、工具等内容,不过项目使用的时间比较饱和,所以……还没写x
习得的新知识
入职到这家公司后,每天我都能学到新东西,最近一个星期,了解了一个git“高级”的操作、了解了log的应用场景
git 合并无用的 git commit
新的公司,对git仓库的要求远高于我原来的公司,我挺喜欢这一点的,不过这也导致我对git使用的熟悉程度不足以满足当前公司的要求。
事情的起因是我提交了太多的 commit,(每一个提交都分的太细了),导致合并时的git log显得过于臃肿,在此事由下,我需要学会如何合并已提交了的commit信息。
具体应该分这么几步:
假设我们切出的分支后,第一次提交为 n
,最后一次提交则为 n+x
,我们要做的是将 n~n+x
这 x 个commit,合并到一个 commit 中。
git commit -m "你最新的代码,在此记作 n+x"
- commit 后不要 push!
git log
- 在gitlog中,查找你的历史提交,即找到你 n 提交的 hash 值
git rebase -i "n的hash"
你会被代入 vim/nano 编辑器中
它看起来长这样:pick hashVal_1 commitInfo pick hashVal_2 commitInfo pick hashVal_3 commitInfo
-
你需要将你想合并的分支 前面的
pick
改成s
。s 代表 squash:将该commit和前一个commit合并
修改后文件应该是这样的(假设我要将 hashVal_2、hashVal_3 这两个提交合并到 hashVal_1 中 )
pick hashVal_1 commitInfo s hashVal_2 commitInfo s hashVal_3 commitInfo
- 修改后,将文件保存退出(vim:
:wq
) - 随后,你会被代入一个新的文件中,这个文件是合并后的
git commit
,你可以往这个文件里写你具体的 git commit 信息。 - 修改后,将文件保存退出(vim:
:wq
) git push
将新的,已经合并了的 commit 推送到远程
如果你已经合并了的部分 commit 已经被push过了,那么你可以用
git push -f
强行将新的commit推送到远程。
【严禁在 master/main 分支 使用git push -f
命令!】,除非是你自己娱乐用的项目。
log 的使用场景
在开发 对接第三方服务的接口 项目中,我犯了一点经验性上的错误,导致项目工期需要被延后一天,所以,这个学习也算一种经验教训吧。
场景复现:
我对接的这个接口是一个新接口(对于我们双方而言),我按照第三方公司给的 接口文档,开发完了需求,然而我的log打的位置非常不好。
(错误示例)我最初写的代码是这样的:
// 伪代码,意思大概是这样的
...
resp, err := http.GET("URL")
if err != nil {
log("resp err" + "请求地址:%s" + "请求参数:%s" + "err:%s" + ".....")
return err
}
body := resp.GetBody()
err := json.Unmarshal(body, &resultStruct)
if err != nil {
log("json err" + "请求地址:%s" + "请求参数:%s" + "err:%s" + ".....")
return err
}
if resultStruct.Code != 0 {
log("result err" + "请求地址:%s" + "请求参数:%s" + "err:%s" + ".....")
return err
}
...
线下环境我测试的时候,整条流程都是可以跑通的,到联调环境测试的时候,报错了,从现有的log来看,只知道是 json.Unmarshal 出错了,为什么出错,不知道。
在联调环境中 我打的log,体现不出 第三方接口传回的body是什么,这导致我没办法判断问题出错在哪里。
总的来说,我打的log就是废话,能体现错误,但是无法通过现有的log体现解决方案
又因为与第三方对接的时候,我们在本地开发,是没有办法直接调用对方的接口的,
所以我陷入了僵局,要想重新找到错误的地方,必须改进log,重新发版,才能知道对方的接口具体的返回值。
改进
一句话总结 需要打log的地方:调用对方接口前,调用对方接口后。两条log。
一句话总结 打log的内容:http请求结果(200,400,500),httpBody。
经过改进后,我这段代码改成了这样:
// 伪代码,意思大概是这样的
...
log("已发起请求,http://xxx/yyy?query=zzz","参数:query=zzz")
resp, err := http.GET("URL")
body := resp.GetBody()
log("http://xxx/yyy?query=zzz http.StatusCode:%v err:%s body:%s")
if err != nil {
return err
}
err := json.Unmarshal(body, &resultStruct)
if err != nil {
return err
}
if resultStruct.Code != 0 {
return err
}
...
两条log让我可以明确知道是哪里出现了错误,出错的原因是什么,清晰,直观。
而且我可以根据现有的log,模拟复现当时的请求,以此来进行bug修复。
文章评论
很偶然地看到了这个网站,非常感谢您的分享。