Code Review 时能用上的一些 Git 操作

栏目: IT技术 · 发布时间: 5年前

内容简介:往日干活,都是自己代码一时爽,后人维护XXX。如果可以的话,还是要坚持 Code Review (CR),不仅团队内熟悉代码风格,更能在学习他人优秀的代码风格的同时补足自己的短板。但是第一次 CR 时,如果你不是一个 git 高手,肯定会有那么一些手足无措,比如提交代码如何增量更新、混乱分支后如何撤销变更等等,本文从只会 add/commit/push 三连的新手出发,看看 Code Review 时遇到的一些 Git 问题都要如何处理。首先是配置了 git 密钥,以及自己的用户名和邮箱,过于基础直接略过。

往日干活,都是自己代码一时爽,后人维护XXX。如果可以的话,还是要坚持 Code Review (CR),不仅团队内熟悉代码风格,更能在学习他人优秀的代码风格的同时补足自己的短板。

但是第一次 CR 时,如果你不是一个 git 高手,肯定会有那么一些手足无措,比如提交代码如何增量更新、混乱分支后如何撤销变更等等,本文从只会 add/commit/push 三连的新手出发,看看 Code Review 时遇到的一些 Git 问题都要如何处理。

首先是配置了 git 密钥,以及自己的用户名和邮箱,过于基础直接略过。

ssh-keygen // 生成 SSH Key

// ...

git config user.name "hijiangtao" // 配置用户名
git config user.email "hijiangtao@gmail.com" // 配置用户邮箱

当我完成代码的增删改,一次再正常不过的提交,所需要用到的 git 命令也就这些:

git add -A
git commit -m "MOD: Some changes"
git push origin dev

如果在处理 Code Review 过程中你使用的是类似 gerrit 的工具,那么你的 push 可能会需要稍作更改,比如在你的 .git/config 中自定义一个 push 到类似 HEAD:refs/for/dev 的命令,当然我们按照 GitHub 的标准流程往下走。

问题一:你本次提交的代码需要更改

你的 commit 被打回了,那你需要修改后继续 CR,如果你当前需要更改的 commit 就是本地最新 commit,那么如下代码即可

git add -A
git commit --amend

输入第二行命令后,你会进入一个文本编辑器界面,里面有你的 commit 信息,修改后保存退出即可,然后

git push origin dev

其实,以上 git commit --amend 的意思是告诉 git 在不增加一个新的 commit-id 的情况下将修改内容追加到上一次 commit-id 中。

问题二:很早之前的 commit 需要更改

当你已经迭代到N.0版本时,发现1.0上的代码需要修改怎么办?这时你的需求变成了修改最近一次提交以前的某次提交,这也是可以做的,不过当操作完成后,你的这次修改提交到最新提交之间的所有提交 hash 值都会改变。

这种操作在 git 中称为 变基 。你要小心操作变基,多用 git status 检查你是否还处于变基流程中,防止误操作会后续提交历史造成影响。

首先查看提交日志:

git log

找到你要修改的那次 commit,复制好它的前一次 commit hash 值以便确定修改范围。然后我们使用 rebase 操作:

git rebase -i [Commit-range]

以上 [Commit-range] 可以是具体的 commit hash 值,也可以是类似 commit~n 或者 commit^^ 这样的形式,前者表示当前提交到 n 次以前的提交,后者 ^ 符号越多表示的范围越大。命令中的 -i 参数表示进入交互模式。在输入命令后,你会进入一个文本编辑器,这时把你需要更改的 commit 中 开头的 pick 改为 edit ,然后保存退出。

其中,变基命令打开的文本编辑器中的commit顺序跟 git log 看到的顺序相反的;另外,变基命令也可以同时对多个 commit 进行修改,只需要修改将对应行前的 pick 都修改为 edit ,后续操作完 commit 多次即可,但是祖先 commit 是不能修改的,即你一共存在10次 commit,那么只能修改最近9次(重排、删除以及合并都适用此规则)。

更改完代码后利用如下命令提交代码,进入文本编辑器的时候修改对应 commit 信息即可:

git add -A
git commit --amend

确认修改完毕,即完成变基操作,这时候输入下面一行:

git rebase --continue

然后查看下日志,对比确认下变基前后的修改信息:

git log

这里,刚刚提到的 pick 变为 edit,还存在一些其他变数。

git rebase -i [Commit-range]

问题三:提交了错误的代码

当你对以上命令还不熟的时候,你可能在操作中会混用 git commit --amendgit rebase --continue ;那么当你发现把代码提交到了错误 commit 下,该怎么撤销呢?这个相对好办:

git revert [Commit-ID]

以上命令会补上一个提交将代码恢复到你上一次提交之前的状态,但注意这并不是抹去该 commit。

又或者你在 git rebase --continue 代码时发现了冲突,这个时候请按照如下步骤操作:

  • 首先,解决本地代码的冲突;
  • 然后, git add -A 提交变更;
  • 最后,记得不是 git commit --amend 而是 git rebase --continue ,防止错误提交代码;
  • 如果你没有按照第三步操作,那么就乖乖 revert 好了;

问题四:挑选合入其他分支的提交

比如我在 dev 分支提交了一个 commit A,这个时候我想起来 dev_2 分支也需要这个提交,那么我如何只“挑选” dev 分支的 A 到 dev_2 合入,而保持其他不变呢?此时, cherrt-pick 登场。 cherrt-pick 可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。

git checkout dev
git log --oneline -3

// A [Description]:dev commit 3
// B [Description]:dev commit 2
// C [Description]:dev commit 1

git checkout dev_2
git cherry-pick A
git log --oneline -3

// A [Description]:dev commit 3
// ...

当然,如果 cherry-pick 遇到冲突,手动解决完 git commit 一次即可。

问题零:远程 URL 变更

当然,还有一个小问题值得一提,你可能在克隆项目时用的是 HTTPS 方式,但却觉得每次输入用户名密码麻烦,最好的办法是将远程 URL 设置成 SSH 地址,这时就可以用到一个简单的命令解决问题:

git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

设置完成后,检查一下 remotes 是否更新生效即可。

git remote -v

// > origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
// > origin  git@github.com:USERNAME/REPOSITORY.git (push)

由于以上多个问题中涉及到的修改会直接对特定版本历史进行修改,在需要推送到远程仓库时,存在不成功的情况,所以你可以强行 push。但在多人协作的仓库中,你的修改会对其他人的远程操作也构成影响,故三思而后行。


以上所述就是小编给大家介绍的《Code Review 时能用上的一些 Git 操作》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人工智能产品经理——AI时代PM修炼手册

人工智能产品经理——AI时代PM修炼手册

张竞宇 / 电子工业出版社 / 2018-6 / 59

随着人工智能热潮的兴起,企业对人工智能领域产品经理的人才需求也开始井喷,人工智能产品经理成为顺应时代潮流的重要人力资源。实际上,人工智能确实给现有的产品和服务带来了全方位的升级,这也给产品经理从业人员提出了更高的要求,是关注人工智能产品的产品经理们面临的一次关键转型考验。 《人工智能产品经理——AI时代PM修炼手册》从知识体系、能力模型、沟通技巧等方面帮助大家系统地梳理了人工智能产品经理所必......一起来看看 《人工智能产品经理——AI时代PM修炼手册》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器