你以为自己会用 Git,其实只会 git add .:这 15 个功能,真正在拉开程序员差距

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我

老实说,Git 对大部分人来说, 一开始就像一个脾气很坏的上司: 一旦你命令敲错,它就用一大段英文吓你。

但神奇的是——当你真正吃透一小撮核心命令和工作流之后:

  • 提交不再手抖
  • 回滚不再流汗
  • 改需求、救线上、切分支都能游刃有余

下面这 15 个 Git 功能, 不是那种“看起来很高级但一年用不到一次”的冷门技巧, 而是每个在写真实项目的人,都应该熟到能闭眼敲出来的武器库

1. Git Branching:不给自己开分支,就等着在 main 上裸奔

分支的意义其实只有一句话:

在不污染主干代码的前提下,放心搞事。

最常用的一句:

git checkout -b feature/login

它会帮你:

  • 从当前分支拉出一个新分支
  • 让你在 feature/login 上放心改代码、乱提交

现代团队里的各种工作流—— Git Flow、trunk-based、feature 分支模式,全部都是围绕“分支”在设计。

不会用分支 = 在生产环境桌子上直接改 SQL。 危险程度差不多。

2. Git Stash:有人喊“快切一下分支”的时候,你的救命抽屉

场景你一定经历过:

  • 你在一个分支上改得飞起
  • 这时候有人说:“你先拉一下最新代码,我刚修了个线上 bug。”
  • 但你手上的改动还没写完,也不想现在就 commit

这时候,git stash 就是你的临时收纳箱:

git stash       # 把当前未提交的修改暂存起来
git stash pop   # 取回来,重新应用到当前工作区

你可以:

  1. git stash 暂存当前改动
  2. 切分支、拉代码、修问题
  3. 再切回原分支,git stash pop 把自己刚才的半成品捞回来

关键点:它不是帮你“提交”,而是帮你“先藏起来,稍后继续改”。

3. Git Rebase:把乱七八糟的历史,压成一条“假装自己一直很清醒”的直线

rebase 做的事情, 简单粗暴地说就是:

重写历史,让你的提交记录看起来干净、线性。

常见用法:

git rebase main

意思是:

  • 把你当前分支上的提交,
  • 按顺序“搬运”到 main 最新进度之后
  • 让历史看起来像是你从来就是在最新代码上进行开发的

好处:

  • 提交历史非常清爽、没有各种 merge commit 杂音
  • review 时更容易看清每一步改了什么

但也要记住:

千万别随便 rebase 已经推到远程、大家都在用的公共分支。不然,你会变成别人心目中那个“乱改历史的人”。

4. Git Merge:不想动历史?那就老老实实合并

如果说 rebase 是一个“历史整形医生”, 那 merge 就是一种比较老派、但非常稳的方式:

git merge feature/login

它会:

  • 保留两个分支的原始提交记录
  • 在合并点生成一个新的“合并提交”

适用场景:

  • 团队协作、大家都已经基于这些提交干了很多事情
  • 比起“历史整齐”,你更在意“绝对安全、不乱动大家的记录”

一句话:

  • 追求干净历史 → rebase
  • 追求绝对安全 → merge

5. Git Cherry-Pick:热修复专用的“点菜模式”

cherry-pick 就像是去提交历史菜单上点菜:

“我只要那一条,不要整个分支。”

用法:

git cherry-pick <commit-hash>

效果:

  • 把某个特定提交(通过 commit hash 找到)
  • 原封不动复制到当前分支上

最常见场景:

  • 你在一个开发分支上修了一个 bug
  • 线上版本也有同样问题,但你不想把整个开发分支合并上去
  • 这时候,只把那条修 bug 的 commit cherry-pick 到线上分支就行

救火的时候,真的很好用。

6. Git Reflog:所有开发者迟早会磕头感谢的一台“时间机器”

命令错敲、reset 乱用、分支删多了…… 总有那么一刻,你会想:

“完了,我刚刚把好几年的人生删了。”

https://wxa.wxs.qq.com/tmpl/ot/base_tmpl.html

然后就是眼前一黑。

这时候,git reflog 出场:

git reflog

它能帮你看到:

  • Git 在本地记录下的所有 HEAD 变动历史
  • 包括你 checkout、reset、rebase 的各种操作

你就可以:

  • 找到你“误删之前”的那一个状态
  • 用它的 hash 把自己救回来

非常多的人,在用 Reflog 之后都会发誓: 再也不乱说“Git 把我东西搞丢了”。

因为很多时候: 不是 Git 丢了,是你忘了怎么找。

7. Git Reset(Soft / Mixed / Hard):撤销提交的三种力度

reset 是一把锋利的刀。 用好了,爽; 用坏了,血压飙升。

它有三种常见模式:

git reset --soft HEAD~1   # 撤回上一次提交,但保留修改,且保持在暂存区
git reset --mixed HEAD~1  # 默认模式,保留修改,不在暂存区(unstaged)
git reset --hard HEAD~1   # 直接把代码和提交都回滚,改动彻底丢弃

简单理解:

  • soft: “我后悔这次 commit,但代码还想留着继续改。”
  • mixed(默认): “把提交撤了,改动还在,但不帮我暂存了。”
  • hard: “这一切都是梦,统统删掉,当我从没改过。”

警告一次:

--hard 真的要慎用。 用之前先确保:这些改动你真的不想要了。

8. Git Amend:最后一条 commit 打错字了?不用再多一条“修正提交”丢人

新手常见画面:

  • 刚提交完,发现少加了一个文件,或者 commit message 打错了
  • 然后又补一条:fix typoupdate 之类的没营养提交

其实,你完全可以优雅一点:

git commit --amend

它会让你:

  • 修改上一条提交内容(比如加上遗漏文件)
  • 或者只改提交信息

效果相当于:

“把上一条 commit 重新包装一下,别再多出一条丑丑的记录。”

注意: 已经 push 到远程的 commit,再用 amend 就会改历史,出了问题你自己扛。

9. Git Blame:查 bug 时的“谁动了我的代码”雷达

git blame 的名字很“搞事”, 像是专门用来找人背锅的。

实际上,它更像一个:

“这行代码是何时、为何、由谁写下的历史注脚。”

用法:

git blame file.js

你会看到:

  • 每一行是谁改的
  • 对应的 commit 是哪一个
  • 大概是什么时间

最常见用途:

  • 排查某个行为为什么这么设计
  • 想找到这块逻辑的“原作者”,去问清楚背景

用它查历史,而不是用它当“甩锅工具”。 这是团队和谐的基本素养。

10. Git Tag:认真做版本管理的项目,都离不开它

Tag 的意义,是在历史上插一面小旗:

“这里是一个稳定版本,可以给别人用。”

例子:

git tag v1.0.0
git push origin v1.0.0

常用于:

  • 标记发布版本(v1.0.0v2.3.1 等)
  • 给 CI/CD 用来触发构建和部署
  • 将来需要回滚时,有清晰的落点

认真对待你的 tag, 等你有一天要做紧急回滚时, 会发现这是你给自己种下的唯一一点温柔。

11. Git Diff:别再“凭感觉提交”,看看自己到底改了什么

git diff 是那种每天都该敲几次的命令。

git diff               # 当前工作区 vs 暂存区/最近提交
git diff main..feature # 两个分支之间的差异

它能帮你:

  • 在 commit 之前,确认自己改了哪些内容
  • 做 code review 前,先对改动有个全局认识
  • 查出哪些变更是“手滑带进去的”

不要盲目地 git add . 然后直接 commit。先 diff 一眼,是对自己和别人负责。

12. Git Log(带格式):谁都讨厌又长又丑的提交列表

https://wxa.wxs.qq.com/tmpl/ot/base_tmpl.html

默认的 git log,信息是全的, 就是——很难一眼看出重点。

解决方案:加点“美颜”:

git log --oneline --graph --decorate --all

效果:

  • 一行一个提交(--oneline
  • 带分支图结构(--graph
  • 显示分支、tag 等信息(--decorate
  • 查看所有分支的历史(--all

建议直接在 .gitconfig 里整一个 alias:

[alias]
  lg = log --oneline --graph --decorate --all

以后只要:

git lg

一整份提交历史就清清楚楚地挂在眼前。

13. Git Pull vs Git Fetch:别再以为它俩是一个东西

很多人用 Git 的时候, 所有“从远程拉代码”的动作,全靠一个:

git pull

但实际上:

  • git fetch = 把远程更新拉下来,但不合并
  • git pull = fetch + 自动合并(或者 rebase)

例子:

git fetch   # 先看看远程都更新了啥
git pull    # 一把拉下来并合并

为什么要区分?

  • fetch 给你喘息空间: 你可以先看清楚远程改动,再决定怎么合并
  • pull 适合你确认“我就是要直接同步最新”的场景

把控制权拿回来,别全丢给 pull

14. .gitignore:不想要的东西,就不要让 Git 看见它

如果你不写 .gitignore, 你的仓库会迅速被各种垃圾文件填满:

  • node_modules/
  • .env
  • 各种 .log 文件
  • IDE 配置(.vscode/.idea/ 等)

一个最基础的 .gitignore 可能长这样:

node_modules/
.env
*.log
.DS_Store

好处:

  • 仓库更干净
  • 拉代码更快
  • 不小心把密码、密钥、配置文件传上去的概率大幅下降

记住:该被忽略的,从一开始就别让它进 Git。

15. Git Hooks:让 Git 替你当“坏人”

Hook 是 Git 提供的一套“钩子系统”:

在某些 Git 行为发生“之前 / 之后”, 自动运行你写好的脚本。

你可以在这里做很多事:

  • 提交之前自动跑 lint / 测试
  • 拦截不合规范的 commit message
  • 提交前自动格式化代码(Prettier、ESLint 等)

它们都放在:

.git/hooks/

比如一个简单的 pre-commit

  • 每次 commit 前自动跑一遍 eslint 或 prettier
  • 不符合规范就直接阻止这次提交

在专业团队里,Git Hooks 往往是保证代码质量的第一道闸门。 你不用天天当坏人, 让 Git 替你说那句:

“哥们儿,这种改法过不了。”

写在最后:真正厉害的人,不是命令记得多,而是敢动“历史”也不慌

Git 看起来让人窒息, 但你真正需要掌握的核心东西,其实就是上面的这 15 个:

  • 会开分支,不在 main 上裸奔
  • 会 stash,不怕临时切活儿
  • 懂 rebase 和 merge 的取舍
  • 会 cherry-pick 精准点提交
  • 知道 reflog 能救命
  • 能用 reset、amend 优雅地改历史
  • 用 blame、diff、log 查清楚自己在干嘛
  • 用 tag 管版本、用 .gitignore 管垃圾
  • 用 hooks 自动帮自己守规矩

用 Git 的目标从来不是“命令背得多”, 而是——你知道自己每一次操作的后果。

当你不再怕它, 你才会真正开始享受那种: “我可以随便改,因为我随时能回去”的底气。全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

声明:来自JavaScript 每日一练,仅代表创作者观点。链接:https://eyangzhen.com/4600.html

JavaScript 每日一练的头像JavaScript 每日一练

相关推荐

关注我们
关注我们
购买服务
购买服务
返回顶部