IntelliJ IDEA 下玩转 Git !

有一天我看见我们公司的同事在讨论合并代码怎么怎么不舒服,不方便。就是每次合并都很难搞的样子。

3de66eee1015df29249f3791ff6cf6b7.png

我说 这不是用 Idea 很简单就处理好了吗。后面我了解到,他们在处理代码冲突的时候都是通过手动处理冲突的。我惊了!

89aa5cfc5f3d60e800b59181c12e95b9.png

2019 年的时候 我在知乎回答过一篇 关于 Idea 技巧的一篇文章。不过那个时候更多是一些快捷键操作的一些奇淫技巧。

83b9654cfd5c834faac5438b808f4c00.png

对 Git 版本管理这块讲的不多。在 2 年后的今天,被我们现在的同事刺激了一下,自己决定完善一下 Idea 下 Git 版本的操作他们。

Git 派系介绍

其实在公司里面 Git 管理这块也是分为几大派系的

黑窗

9e0533dddf0a7802078d63a4fdc945f6.png

一个黑窗走天下,任何工具都是花里胡哨。

44ec1a253ffe49308d7262e3df396365.png

所有的操作都是通过命令行完成。

个人愚见:这种方式虽然很酷很帅,但是毕竟只有一个黑窗,在某些场景下还是比较难处理,比如 历史代码查看,代码合并,变更文件详细内容查看。

虽然很帅但是不适合我这种菜鸡。

9376fb3828a45d088985e37cf31a0b0e.png

source tree

8b376918096bbe10b5201be85140ce36.png

source tree 是我见过用的人最多的,很多同事都是使用这个。而且还可以安装 git flow 插件,可以在里面直接使用 git flow 的工作流。

我也在用,不过用的不多,每个人喜好不同,有的同事喜欢代码版本管理和代码编写分开,我自己的话恰恰喜欢放在一起。哈哈哈哈哈 萝卜青菜 各有所爱。

功能很全面,但有一个问题,可能就是查看单文件或者文件夹的 历史不是很方便

fa7876e96d043e3ab181f452e493e596.png

Github Desktop

beacd78252874acb0095a81adaffd7b4.png

Github Desktop 俗称 Github 亲儿子。很早之前用过 跟 Source Tree 差不多,偶尔看到一个同事在使用这个。还是那个版本管理与代码编写的问题。如果平常使用 Github 查看源码比较多的还是推荐,因为安装了这个软件之后,可以直接在 Github 上有一个按钮 Open in Github Desktop。

亲儿子才有的待遇

然后才是使用 Idea 管理版本

afd26ce26e361a04276932349baf01e2.png

我自己感觉 Idea 的版本管理挺好用的,但是在工作中,除了我自己,我还没有看见其他人使用过。

b67799244e10b1df4b6e8eeb2dbcd0a0.png

不过工具本来就没有最好的,只有最适合你自己的,我个人使用 Idea 下的版本管理比较顺手一点,就在这里简单介绍一下。

查看这行代码是谁改的

42b61e1eeab2a4e95ccf4e8a7fc0a93b.png

在编辑器左侧右键,选择 Annotate with Git Blame

2f75a2fb846987579f6c7f57b2483e3e.png

cd0a7521d434e6f33f9042b07610d19e.png

点击 左侧时间会在弹出的子窗口中显示这次修改的 hash,提交评论,和同步修改的文件有哪些

复现代码冲突

这里需要重点讲一下,因为我最近居然发现我们的同事居然还是用非常原始的方式解决冲突,就是一个文件一个文件的删除 ======= 这个。当时我看见的时候,我自己都惊呆了。

我们先手动的制造一个冲突

mkdir test; 
cd test;
git init -y;
echo 'console.info("one line")' > index.js;
git add .; git commit -m 'init';
git checkout -B feature/two;
vim index.js; # 在第二行添加 console.info("two line")
git add index.js; git commit -m 'feat: two line';
git branch master;
# 创建分支 3 
git checkout -B feature/three;
vim index.js; # 在第二行添加 console.info("three line")
git add index.js; git commit -m 'feat: three line';

git checkout master
# merge feature/two
git merge feature/two # 这个时候不会发生冲突

git merge feature/threee # 冲突发生

79f842f7f73c40377d060174cc07b23b.png

上图展示了发生冲突的所有过程

解决冲突

上面我们已经制造出了一个冲突,这个时候我们通过 Inteillj Idea 自带的 Version Controller 的功能来处理这个冲突。

直接在编辑器中打开冲突文件夹

ae9874f47bdbc91b29a570871a9abca4.png

这里会有一个问题,就是在真正的项目场景下,项目文件非常的多。

42194627dc37bbcf08b2d46b46349063.png

在项目文件上右键,选择 Git,选择 Resolve Conflicts

d465479e0fd57f7f19686e1bc011bf2e.png

点击之后会弹出一个处理冲突的弹窗。接下来好好介绍一下这个弹窗

  • 1. 待合并分支

  • 2. 当前分支

  • 3. 冲突的文件列表

  • 4. 全部以当前分支「master」为准,丢弃待合并「feature/three」分支冲突文件

  • 5. 全部以待合并分支「feature/three」为准,丢弃当前分支「master」冲突文件

  • 6. 点击 merge 会打开一个子窗口合并明细

  • 7. 双击文件和打开一个子窗口进行代码 merge 明细

  • 8. 显示了合并分支文件状态,上图标识合并的两个分支 文件都是更新状态

  • 9. 以分组列表的形式展示

a8132769a098e0ebe063bd32f6d8ef1c.png

这里就进入到详细的单文件合并步骤了

  • 1️⃣ 当前分支的修改

  • 2️⃣ 合并区域

  • 3️⃣ 待合并分支的修改

  • 4️⃣ 显示本次合并的明细,就是看除了当前文件还有哪些文件需要合并

  • 5️⃣ 将左侧 console.info("two line") 合并

  • 6️⃣ 将右侧 console.info("three line") 合并

  • 7️⃣ 直接接受左侧的代码

  • 8️⃣ 直接接受右侧的代码

  • 9️⃣ 引用合并的内容

查看代码历史

bd3b7268f745655ac0ca9c1251098192.png

点击 Show History

d505cae358d02447e5c93df28c186b56.png

点击 Show History 之后底部会弹出当前项目的历史提交记录

  • 1️⃣ 这里显示的当前项目的提交记录

  • 2️⃣ 可以指定想要查看历史记录的分支

  • 3️⃣ 可以选择只看某个人的提交记录

  • 4️⃣ 时间赛选

  • 5️⃣ 选中左侧的提交记录,这里会展示此次变更了哪些文件,双击文件会在弹出的新窗口中显示代码变更情况

上面是直接选中的整个项目查看整个项目的历史提交记录,有的时候我们只想查看某个文件夹,或者是某个文件的代码变更记录。整个时候我们只需要在对应的文件夹或者文件上右键悬着即可。

分支创建

根据实际工作场景出发,先列举一下会创建分支的集中情况。在实际的应用场景来看如果用 Idea 来解决。

  • 开发新功能,我们需要从现有分支创建新的 feature 分支

  • 我们正在开发 feature 分支,但是此时线上出 Bug,我们需要从 master 分支创建 hotfix 分支来修复

  • 我们在浏览源代码,我们浏览代码历史上某个版本的代码

从现有分支创建新的 feature 分支,这是最简单的,甚至都不需要用 idea 了,代码也是一行搞定 git checkout -B feature/xxx

85b8e206f067a8b353ac2168908c8e39.png

直接从项目上直接右键创建即可

  • 我们正在开发 feature 分支,但是此时线上出 Bug,我们需要从 master 分支创建 hotfix 分支来修复

这种情况其实是正式项目中的常态吧,毕竟线上环境是复杂的,问题随时都会发生。但是问题就是可能我们现在开发的 feature 分支还没有开发完成,我们自己也不想用 commit 进行提交。这个时候就需要用到 git 的 stash 功能了。

3d37969bb9c7bfc713a47f372d4e3d3a.png

在切换前先 Stash Changes,将目前修改的代码暂存

b6bc7dd412f51c5b47e7085773adefd3.png

在弹窗中给这次暂存添加 备注 然后点击 create stash

在处理好 stash 之后我们需要切回到 master 分支去创建对应的 hotfix 分支

0b9398de857cf5554ae143f988a5b49c.png

点击 Branchs

ed56068258fc115a4967e5a41d266b19.png

选择 master 分支进行切换,切换后创建对应hotfix 分支,在修复好 hotfix 分之后,我们需要回到对应的 feature 分支继续开发未开发完成的功能。

57f7bde3ce1f33293d6a732d742daf1e.png

选择 Unstash Changes

a4f6050e5680ee7ff7f54ff91bbb551f.png

这里会有自己存储的 stash 历史,点击 apply stash 进行恢复

  • 我们在浏览源代码,我们浏览代码历史上某个版本的代码

b2617172816ba5729e4c16d4e53305d3.png

添加修改「git add xxx」

我们每次新增的代码需要通过 git add xxx 命令将代码从工作区添加到缓存区

8c3d5642dbbec9e7e175396804ee3034.png

上面的 add.js 文件是我们新添加的文件

06863778cadb73dc131d57ef6d69c273.png

提交修改「git commit xxx」

f7dfce1c2eb5c1df47302c3e058cbf6e.png

点击 Commit Directory

8015120b7152495684d1a9b897c50edc.png

🐶 本次 commit 的文件列表

🐱 文件修改了,但是没有在缓存区的文件

🐭 修改列表,我们可以为某个代码文件集合专门命名 change list

🐹 作者

🐰 Amend commit

🦊 Sign off commit

🦝 在提交之前 格式化代码

🐻 Rearrange 代码

🐼 优化 imports,在代码中没有使用的 package 会自动删除

🦘 分析代码,如果有代码异常会提示

🦡 简单代码有没有 TODO 没有完成会提示

🐨 优化代码

🐯 更新 copy right

🦁 提交的message

🐮 上下选择看其他文件的变动

🐷 选中文件的代码变动

🐽 commit

推送代码 「git push」

79163d44a40f22a739cd5bcb908f9417.png

拉取代码「git pull xxx」

8ecbd1afa95f2b92d5b7fa3bb91c2f56.png

在便捷一点

其实上面介绍的基本上就涵盖了我们日常项目中大部分使用的功能了,但是可以看到我们在上面演示的操作基本上不是在文件夹上右键菜单来选择,但是说实话不是太跟手,用起来很麻烦。

其实 Jetbrains 的开发人员应该也是考虑到了这一点,其实在软件的界面中有很多位置可以操作 Git

fe5f3f4581b7082518011d6806e79151.png

❤️ 拉取代码

🧡 提交代码

💛 推送代码

💚 查看历史

💙 rollback

1fdfb53840f9e0a1d8dd7ef0fc78d79a.png

点击下方的版本号,也可以看到所有本地的分支和远程的分支,可以在这里进行分支合并,和远程代码更新。

在快一点 VCS Operations

代码的更新与提交提示是一个非常高频的操作,它值得拥有更加便捷的方式,Jetbranins 也提供了更加编辑的方式

808f147b21359e7d3ef2636d88d8ca5e.png

Mac: ctrl + v

上面提到的所有的操作 在这里都提供了便捷的操作方式

  • Commit

  • Rollback

  • Show History

  • Annotate With Git Blame

  • Show Diff

  • Branches ...

  • Push ...

  • Stash Changes ...

  • UnStash Changes ...

这里不仅可以用 Git 的功能,还有 Idea 自己的 Local History 也背展示在了这里

一些快捷键

正常编码的情况下 使用快捷键的方式肯定更快,一下是针对 Git 操作整理的快捷键

名称

对应 Git 操作

快捷键「Mac」

将文件添加到工作区

git add xxx

Option + Command + A

将工作区文件添加至缓存区

git commit xxx

Command + K

拉去远程代码

git pull xxx

Command + T

推送代码到远程仓库

git push xxx

Command + Shift + K

暂存文件

git stash xxx

Ctrl + V -> Stash

恢复暂存

git stath pop

Ctrl + V -> Un Stash

删除掉缓冲区修改

git reset --hard ^

Command + Shift + Z

解决冲突


Ctrl + V -> Resolve Conflicts...

若有收获,就点个赞吧

本文由作者 胡川港 投稿,如果你在 CSDN、博客园、掘金等平台有写技术博客的习惯,想让自己的原创博客被更多人看到,可以来 Java后端 投稿。


【END】

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「web_resource」,关注后回复「进群」或者扫描下方二维码即可进入无广告交流群。

↓扫描二维码进群↓

c581cfd3883f7d51522b7ce0adde8277.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值