
上周,我们组里来了个新同事,看我噼里啪啦地在黑窗口里敲git
命令,他很好奇地问我:
"哥,现在VS Code自带的Git工具那么好用,还有Sourcetree、GitKraken这些,你为什么还坚持用命令行啊?不觉得麻烦吗?"
这个问题问得很好。
我完全承认,现代的Git GUI工具做得非常出色,它们直观、易上手,尤其是在处理简单的提交和查看分支时,确实很方便。我甚至会推荐刚接触Git的新人,先从GUI开始,至少能对Git的工作流程有个直观的感受。
但用了8年Git,我最终还是回到了纯命令行。
这不是因为我守旧,也不是为了显得自己多"牛皮"。而是因为我发现,命令行在三个方面,给了我GUI无法替代的价值:速度、能力 和理解。
这篇文章,就想聊聊我的一些观点。
速度
对于我们每天要用上百次的工具来说,零点几秒的效率提升,累加起来也是巨大的。在执行高频的、重复性的操作时,键盘的速度,永远比"移动鼠标 -> 寻找目标 -> 点击"这个流程要快。
-
一个最简单的
commit
&push
流程:- 我的命令行操作 :
git add .
->git commit -m "..."
->git push
。配合zsh/oh-my-zsh的自动补全和历史记录,我敲这几个命令可能只需要3-5秒,眼睛甚至不用离开代码。 - GUI操作:我需要在VS Code里切换到Git面板 -> 鼠标移动到"更改"列表 -> 点击"+"号暂存全部 -> 鼠标移动到输入框 -> 输入信息 -> 点击"提交"按钮 -> 再点击"同步更改"按钮。
- 我的命令行操作 :
这个过程,再快也快不过我的肌肉记忆。
-
更高效的别名(Alias):
~/.gitconfig文件是我的宝库。我在里面配置了大量的别名,把那些长长的命令,都缩短成了两三个字母。
sh[alias] st = status co = checkout br = branch ci = commit lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
现在,我只需要敲
git st
就能看状态,git lg
就能看到一个非常清晰的分支图。这种个性化定制带来的效率提升,是GUI工具无法给予的。
深入Git
GUI工具做得再好,它本质上也是对Git核心功能的一层"封装"。它会优先把最常用的80%功能,做得非常漂亮。但Git那剩下20%的、极其强大的、但在特定场景下才能发挥作用的高级工具,很多GUI工具并没有提供,或者藏得很深。
而命令行,能让你100%地释放Git的全部能力。
-
git rebase -i (交互式变基):
这是我认为命令行最具杀手级的应用之一。当我想清理一个分支的提交记录时,比如合并几个commit、修改commit信息、调整顺序,git rebase -i提供的那个类似Vim编辑器的界面,清晰、高效,能让我像做手术一样精确地操作提交历史。
-
git reflog (你的后悔药):
reflog记录了你本地仓库HEAD的所有变化。有一次,我错误地执行了git reset --hard,把一个重要的commit给搞丢了。当时有点慌,但一句git reflog,立刻就找到了那个丢失的commit的哈希值,然后用git cherry-pick把它找了回来。这个救命的工具,很多GUI里甚至都没有入口。
-
git bisect (二分法查Bug):
当你想找出是哪个commit引入了一个Bug时,git bisect是你的神器。它会自动用二分法,不断地切换commit让你去验证,能极大地缩小排查范围。这种高级的调试功能,几乎是命令行用户的专属。
会用到理解
这一点,是我认为最核心的。
GUI工具,把Git包装成了一系列按钮,它在帮你隐藏细节。
你点击"拉取(Pull)",它可能在背后执行了git fetch
+ git merge
,也可能是git fetch
+ git rebase
。你不清楚,也不需要清楚,点就完事了。
这在一切顺利时没问题。但一旦出现复杂的合并冲突,或者你需要回滚一个错误的操作,按钮就不够用了。因为你不理解按钮背后的原理,你不知道Git的HEAD
、工作区、暂存区到底处于一个什么状态,你就会感到恐慌,甚至会因为误操作,把仓库搞得一团糟。
而命令行,强迫你去学习和理解Git的每一个动作和它背后的模型。
你输入的每一个命令,git reset --hard
和git reset --soft
的区别是什么?git merge
和git rebase
的数据流向有什么不同?每一次的输入,都在加深你对Git三区(工作区、暂存区、版本库)模型的理解。
这种对底层模型的深刻理解,才是一个资深工程师真正需要具备的。它能让我在遇到任何复杂情况时,都心里有底,知道该用哪个命令去精确地解决问题。
我从不要求我们组里的新人都用命令行,但我会鼓励他们,在熟悉了GUI之后,一定要花时间去学习一下命令行。
这不仅仅是一个工具选择的问题,更是一个思维方式的选择。
对我来说,用命令行,让我感觉我是在和Git这个工具直接对话。这种掌控感和确定性,是任何漂亮的UI都无法带给我的。
也许,这就是一个程序员的执念吧😀。