V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Need4more
V2EX  ›  程序员

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

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

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

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

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

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

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

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

    所以我想说什么呢?不要被工具所局限,程序员的武器库应该兼容并包。在你需要的时候,知道这些新工具说不定就能帮到你。
    xiaoming1992
        32
    xiaoming1992  
       76 天前
    - “观帖子 v2ex/xxx 有感”
    - “不好意思,原文就是这篇(英文博客)。初衷是分享,没有必要这么大恶意”
    msg7086
        33
    msg7086  
       76 天前
    引用或翻译应该要加上原文链接。为原作署名是很基本的要求。
    decken
        34
    decken  
       76 天前
    然而生产环境 centos 7 里面的 git 还是 1.8.3.1
    Need4more
        35
    Need4more  
    OP
       76 天前
    @msg7086
    @xiaoming1992
    感谢指出,是我的问题
    chanChristin
        36
    chanChristin  
    PRO
       76 天前   ❤️ 1
    楼上的一些发言让我想到了这段话
    “所有在我出生之前发明出来的东西都是理所当然的;所有在我 15–35 岁之间发明的东西注定是要改变世界的;所有在我 35 岁之后的发明都是反人类的”
    SvenWong
        37
    SvenWong  
       76 天前
    感谢分享,worktree 对于我来说倒是挺好用的
    Twelveeee
        38
    Twelveeee  
       76 天前
    学到了
    liangch
        39
    liangch  
       76 天前
    明明是 20 年。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2840 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:45 · PVG 22:45 · LAX 07:45 · JFK 10:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.