10 年了,你还在用 2005 年的 Git 命令吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Need4more
V2EX    程序员

10 年了,你还在用 2005 年的 Git 命令吗?

  •  4  
  •   Need4more 113 天前 6615 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    观帖子 https://fast.v2ex.com/t/1139495 有感

    说实话,很多人(包括曾经的我)可能还停留在 Git 上古时期的用法上,就像它停留在 2005 年一样。但 git 这些年也在变化,在这里分享一些有用的 modern git 命令,帮你把 Git 用得更溜更省心,或许有些人还没用过。

    git switch (2019 年, Git 2.23+)

    干啥的? 专治切换分支!取代了部分 git checkout 的功能。

    香在哪?

    git switch other-branch: 干净利落地切换分支。

    git switch -: 瞬间切回上一个分支,跟 cd - 一样方便。

    git switch remote-branch: 直接切换到远程分支并自动跟踪。

    关键优势:

    比万能的 git checkout 更专注、更安全!它会进行额外的检查,比如如果切换会导致本地未提交的改动丢失,它会中止操作,避免误操作悲剧。再也不用担心 checkout 的迷惑行为了。

    git restore (2019 年, Git 2.23+)

    干啥的? 专门负责恢复文件状态!分担了 git checkout 和 git reset 的部分职责。

    git restore --staged some-file.py: 把暂存区的文件撤回来(取消 add ),

    等效 git reset HEAD some-file.py

    git restore --staged --worktree some-file.py: 不仅取消暂存,还直接丢弃工作区的修改(慎重),

    等效 git checkout -- some-file.py

    git restore --source HEAD~2 some-file.py: 直接把文件恢复到前两次提交时的版本。

    关键优势:

    语义更清晰!命令名字 restore 就告诉你它在“恢复”东西。不再需要死记硬背 checkout 和 reset 在各种场景下的复杂参数组合,职责分离,不易出错。

    git sparse-checkout (2020 年, Git 2.25+)

    干啥的?

    解救深陷超大 Monorepo 的开发者!只检出你需要的部分目录/文件。

    克隆时跳过初始检出:git clone --no-checkout repo-url

    初始化稀疏检出配置(锥形模式):git sparse-checkout init --cone (初始只检出根目录)

    检出特定目录:git sparse-checkout set service/common

    git checkout main 后,神奇的事情发生了:只有你设置的部分目录/文件出现在工作区!

    关键优势:

    本地开发:git status, checkout 等命令快如闪电!尤其适合微服务架构的庞大仓库。

    CI/CD: 大幅提升流水线效率!只拉取构建部署所需的部分代码,省时省资源。简直救命神器。

    git worktree (2018 年)

    干啥的?

    让你在同一个仓库的不同目录下,同时并行处理多个分支!

    假设你在 dev 分支开发,突然要紧急修复 master 的线上 Bug 。 无需 stash 或提交半成品:

    git worktree add -b hotfix ./hotfix master

    瞬间在 ./hotfix 子目录得到一个干净的 hotfix 分支工作副本(基于 master )。 进去修改、测试、提交、推送一气呵成。 搞定后,回到原目录继续 dev 分支的开发。

    查看所有工作树:git worktree list

    关键优势: 完美解决多任务切换痛点!告别分支来回切换的麻烦和干扰,实现真正的并行开发。

    1. git bisect (虽不新,但强力安利!)

    干啥的? 二分查找神器!帮你精准定位引入 Bug 的那个提交。

    香在哪? git bisect start: 开始二分查找。

    git bisect bad HEAD: 标记当前提交(或已知的坏提交)是坏的。

    git bisect good v1.0: 标记一个已知的好提交(比如上一个稳定版本标签)。

    Git 会自动切到一个中间提交,你需要测试这个提交是好是坏:

    坏的输入 git bisect bad

    好的输入 git bisect good

    重复步骤 4 ,Git 会自动缩小范围,直到定位到第一个引入 Bug 的提交。

    git bisect reset: 结束查找,回到起点。

    关键优势: 面对茫茫提交历史,手动排查 Bug 来源无异于大海捞针。bisect 用算法帮你快速缩小范围,精准打击罪魁祸首,调试效率暴增。强烈建议每个开发者都掌握。

    最后一点感想:

    很多时候,我们在 StackOverflow 搜 Git 问题,看到的最高赞答案可能已经是 10 年前的了。虽然它可能依然有效,但很可能已经不是最优、最方便、最现代的做法了(比如还在大量教你用 checkout 切分支、恢复文件)。

    39 条回复    2025-06-19 12:24:55 +08:00
    profchaos
        1
    profchaos  
       113 天前
    第一条 git switch
    THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
    minami
        2
    minami  
       113 天前 via Android
    还是习惯用图形化工具搞定
    Need4more
        3
    Need4more  
    OP
       113 天前
    @profchaos 你的版本太老了?这个应该是固定的 feature 了
    Need4more
        4
    Need4more  
    OP
       113 天前
    @minami 不知道你用的是哪个 gui 操作,至少在 vscode 环境下,很多操作无法通过 ui 完成。
    这里的 git sparse-checkout 、git worktree 功能,idea 这样的 gui 我都没找到对应的
    pingdog
        5
    pingdog  
       113 天前 via Android
    @Need4more https://git-scm.com/docs/git-switch
    每个版本都带有这句话
    THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
    liuzhw
        6
    liuzhw  
       113 天前
    git 命令还是有必要的。当然大部分的操作都是在 idea 上完成的,但是有些特殊的操作还是命令比较好用,idea 找不到。
    比如 :删除远程分支文件保留本地文件 这个需求

    下面是我记录的比较常用的 git 命令:
    https://blog.share888.top/note/efficiency/gitHub/05-Git%E5%91%BD%E4%BB%A4.html
    lululau
        7
    lululau  
       113 天前
    magit 不香吗,再不济还有 Neogit
    sagaxu
        8
    sagaxu  
       113 天前   1
    idea 的 git 我不会用,2025 了我还只会用命令行
    darkhandz
        9
    darkhandz  
       113 天前
    magit 全搞定,一行命令都不用输
    Pete
        10
    Pete  
       113 天前 via Android   1
    2005 年距今是 20 年
    dvsilch
        11
    dvsilch  
       113 天前
    https://github.com/GitAlias/gitalias
    除了 diff 会用 IDE 以外,基本还是通过命令行 alias 完成 git 操作
    minami
        12
    minami  
       113 天前
    @Need4more #4 TortoiseGit
    james122333
        13
    james122333  
       113 天前 via Android   1
    没什么用 事实上这些多的功能很多已经超出版控需要的了 很不符合精简哲学
    这面我只有 restore 会用到 checkout 还是会检查改动 sparse-checkout/worktree/bisect 的目的都是配合外部工具就能实现的了
    sparse-checkout 这是 submodule 用途
    worktree 在大项目占空间也会搞混杂化目录结构
    bisect 也只是标记 外部弄脚本完全可以胜任
    我是不知道现在 git 维护者是谁 但这肯定偏鸡肋 说用途还很少用 在非自己的机器上却还有一定的价值 不用曝露太多
    zx900930
        14
    zx900930  
       113 天前   1
    neovim+lazygit ,基本不需要再打任何 git 命令,直接快捷键一把梭
    msg7086
        15
    msg7086  
       113 天前
    @liuzhw #6 删除远程分支文件保留本地文件 这个应该是基本需求了,不知道为什么 IDEA 没加上。我用的 GUI 上就可以一步搞定。
    msg7086
        16
    msg7086  
       113 天前
    顺便说一句,git 的 checkout 和 reset 算是最辣鸡的两个子命令了,不同的功能混杂在一起,根据对象是 ref 还是文件来执行完全不同的操作,也不知道怎么想的。新的 switch 和 restore 强太多了,可惜以前留下来的习惯完全改不掉了,抬手还是会去用 checkout 来 restore 文件。
    cpf
        17
    cpf  
       113 天前
    @profchaos 升级 git 版本就不会有这个提示了
    kneo
        18
    kneo  
       113 天前   11
    抄袭?说不定还是让 AI 抄的?搞技术的,会多少说多少,不会可以不发言,照着抄太没意思了。

    https://martinheinz.dev/blog/109
    balddonkey1
        19
    balddonkey1  
       113 天前 via Android
    巧了,这几个都有用,worktree 真的好用
    fredweili
        20
    fredweili  
       113 天前
    IDE 工具,用的简单,暂时不需要成为 git 专家
    lepig
        21
    lepig  
       113 天前
    以前一直使用 checkout -- <file> 恢复修改的文件,近半年一直使用新的 restore 命令来操作了
    wangtian2020
        22
    wangtian2020  
       113 天前
    从来不敲 git 命令行的,用了 5 年 sourcetree 了
    git worktree 用 sourcetree 的贮藏功能不就好了
    命令行用户真是擅长解决别人遇不到的问题
    theprimone
        23
    theprimone  
       113 天前
    worktree 用过,有个问题是结合 husky 实现的 git hooks 会出问题就没有再用了。不知道有没有大佬知道怎么简单直接的解决?
    chunhuitrue
        24
    chunhuitrue  
       113 天前
    magit 让我忘了那么多复杂的参数
    Need4more
        25
    Need4more  
    OP
       113 天前
    @kneo 不好意思,原文就是这篇。初衷是分享,没有必要这么大恶意
    SleepyRaven
        26
    SleepyRaven  
       113 天前
    sourcetree+1 ,git 命令只会最基础的那几个
    scyuns
        27
    scyuns  
       113 天前
    已经习惯了操作 VSCODE 了 很少用命令行
    yxd19
        28
    yxd19  
       113 天前   1
    @Need4more 你「有感」的「感」是什么?
    layxy
        29
    layxy  
       113 天前
    用的 idea 基本就不咋用命令了
    superrichman
        30
    superrichman  
       113 天前
    sublime merge 鼠标双击一下就切换分支了
    Need4more
        31
    Need4more  
    OP
       113 天前   1
    @yxd19

    这里面前两个命令属于用户体验增强型的,后两个是新功能解决用户痛点的。

    很多人会说:我用 GUI 工具也能一键切换分支、恢复文件啊,但是请记住,不是所有场景都有 GUI 给你点,比如服务器上有时候需要做些 git 操作,就像 @msg7086 说的,新增的 restore 、switch 命令解决了原来的老命令语义不清晰、职责不单一的问题,这是 git 产品设计上的进步,说明社区开始注重起用户体验。

    另外,idea 的 git 功能很强大,但依然没能解决切换分支导致 ide 索引失效的问题,当然,你可以在本地多次克隆来“笨拙”的处理掉这个问题,新加的 worktree 命令完美的解决了此痛点,每一个分支对应一个项目就行了,共享一份.git/objects 。sparse-checkout 对于一些大仓库或者 monorepo ,可以按需下载你需要的目录(模块),有时候我想本地调试下 spring 这样的又大又老的项目,实打实的提升了我的下载体验。

    所以我想说什么呢?不要被工具所局限,程序员的武器库应该兼容并包。在你需要的时候,知道这些新工具说不定就能帮到你。
    xiaoming1992
        32
    xiaoming1992  
       113 天前
    - “观帖子 v2ex/xxx 有感”
    - “不好意思,原文就是这篇(英文博客)。初衷是分享,没有必要这么大恶意”
    msg7086
        33
    msg7086  
       113 天前
    引用或翻译应该要加上原文链接。为原作署名是很基的要求。
    decken
        34
    decken  
       113 天前
    然而生产环境 centos 7 里面的 git 还是 1.8.3.1
    Need4more
        35
    Need4more  
    OP
       113 天前
    @msg7086
    @xiaoming1992
    感谢指出,是我的问题
    Leeeeex
        36
    Leeeeex  
    PRO
       113 天前   1
    楼上的一些发言让我想到了这段话
    “所有在我出生之前发明出来的东西都是理所当然的;所有在我 1535 岁之间发明的东西注定是要改变世界的;所有在我 35 岁之后的发明都是反人类的”
    SvenWong
        37
    SvenWong  
       113 天前
    感谢分享,worktree 对于我来说倒是挺好用的
    Twelveeee
        38
    Twelveeee  
       113 天前
    学到了
    liangch
        39
    liangch  
       113 天前
    明明是 20 年。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Soana     3101 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 11:06 PVG 19:06 LAX 04:06 JFK 07:06
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86