注册

为什么我坚持用git命令行,而不是GUI工具?

image.png


上周,我们组里来了个新同事,看我噼里啪啦地在黑窗口里敲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文件是我的宝库。我在里面配置了大量的别名,把那些长长的命令,都缩短成了两三个字母。


    [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 --hardgit reset --soft的区别是什么?git mergegit rebase的数据流向有什么不同?每一次的输入,都在加深你对Git三区(工作区、暂存区、版本库)模型的理解。


这种对底层模型的深刻理解,才是一个资深工程师真正需要具备的。它能让我在遇到任何复杂情况时,都心里有底,知道该用哪个命令去精确地解决问题。




我从不要求我们组里的新人都用命令行,但我会鼓励他们,在熟悉了GUI之后,一定要花时间去学习一下命令行。


这不仅仅是一个工具选择的问题,更是一个思维方式的选择。


对我来说,用命令行,让我感觉我是在和Git这个工具直接对话。这种掌控感和确定性,是任何漂亮的UI都无法带给我的。


也许,这就是一个程序员的执念吧😀。


作者:ErpanOmer
来源:juejin.cn/post/7537238517698150451

0 个评论

要回复文章请先登录注册