Git常用命令速查-从入门到高效协作
无需死记硬背,按使用场景整理 Git 高频命令,覆盖日常开发 90% 的需求。每个命令附带实际用法示例,看完就能用。
一、写在前面:Git 不是你想象的那么难
很多人学 Git 的体验是:第一天记了 20 个命令,第二天就忘了 15 个。这不是你的问题。
Git 的设计理念是"面向场景",不是"面向命令"。你不该按字母顺序背命令,而应该按"我想做什么"来找命令。这篇文章就按这个思路组织。
读完这篇文章,你能搞定:
- 把本地代码推送到 GitHub
- 在团队中管理分支、合并代码、处理冲突
- 用 stash / reset / reflog 抢救翻车现场
- 看懂 git log 里那堆花里胡哨的输出
二、基础三板斧:从零到第一次 push
这是你装完 Git 后最先用到的几个命令,覆盖 80% 的单人开发场景。
2.1 初始化或克隆仓库
# 在已有项目目录里初始化 Git
git init
# 克隆远程仓库到本地
git clone https://github.com/user/repo.git
# 克隆指定分支
git clone -b develop https://github.com/user/repo.git
2.2 工作区 → 暂存区 → 本地仓库
Git 的文件流转有三个区域,理解了就不会被 git status 搞晕:
工作区 (Working Directory) 暂存区 (Staging Area) 本地仓库 (Local Repo)
│ git add │ git commit │
│ ──────────────────────────> │ ──────────────────────> │
│ │ │
└── 你正在编辑的文件 └── 准备提交的快照 └── 已保存的版本
# 查看当前状态(最常用,随时敲)
git status
# 添加文件到暂存区
git add filename.txt # 添加单个文件
git add . # 添加当前目录所有改动
git add -p # 交互式选择,逐块确认(推荐)
# 提交到本地仓库
git commit -m "feat: 添加用户登录功能"
# 一步到位:add 所有已追踪文件 + commit(新文件仍需先 add)
git commit -am "fix: 修复首页加载异常"
2.3 推送和拉取
# 推送到远程仓库
git push origin main
# 首次推送新分支需要设置上游
git push -u origin feature/new-dashboard
# 拉取远程更新(fetch + merge)
git pull
# 只拉取不合并(更安全,推荐先 fetch 看一眼再 merge)
git fetch origin
git diff origin/main # 看看远程改了什么
git merge origin/main # 确认没问题再合并
三、分支管理:多人协作的核心
3.1 分支基础操作
# 列出所有分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 全部
# 创建并切换到新分支
git checkout -b feature/payment-flow
# 切换分支
git switch main # Git 2.23+ 推荐用 switch,语义更明确
git checkout main # 老写法,也行
# 删除分支
git branch -d feature/old-branch # 安全删除(已合并的)
git branch -D feature/broken-branch # 强制删除(未合并的)
# 重命名分支
git branch -m old-name new-name
3.2 合并分支
# 将 feature 分支合并到当前分支
git merge feature/new-feature
# 终止正在进行的合并(冲突太复杂,先撤)
git merge --abort
# 合并但不生成 merge commit(保持历史线性)
git merge --squash feature/new-feature
git commit -m "feat: 合并新功能模块"
3.3 Rebase:让提交历史更干净
# 将当前分支变基到 main 最新提交之上
git rebase main
# 交互式 rebase,合并/修改/删除历史提交
git rebase -i HEAD~3 # 整理最近 3 次提交
# 冲突时继续 rebase
git rebase --continue
⚠️ Rebase 黄金法则:永远不要 rebase 已经推送到共享仓库的提交。只 rebase 自己本地的、还没 push 的提交。
3.4 合并 vs Rebase 选择指南
| 场景 | 推荐 | 原因 |
|---|---|---|
| 将 feature 合并到 main | merge |
保留完整合并历史 |
| 整理自己的 WIP 提交 | rebase -i |
让提交记录干净可读 |
| 同步远程 main 到本地分支 | rebase |
保持历史线性,避免无意义 merge commit |
四、查看历史:搞清楚发生了什么
4.1 日志查看
# 基本日志
git log
# 每条提交压缩成一行
git log --oneline
# 带分支图的紧凑日志(日常最实用)
git log --oneline --graph --all
# 按时间范围过滤
git log --since="2024-01-01" --until="2024-01-31"
# 按作者过滤
git log --author="张三"
# 按文件过滤
git log -- path/to/file.txt
4.2 差异对比
# 查看工作区未暂存的改动
git diff
# 查看暂存区与上次提交的差异
git diff --staged
# 对比两个分支
git diff main..feature/new-feature
# 只看某个文件的改动
git diff HEAD -- src/app.js
# 显示改动统计(不显示细节)
git diff --stat
4.3 谁动了哪一行
# 显示每行代码是谁、什么时候写的
git blame path/to/file.ts
# 只看指定行范围
git blame -L 10,50 path/to/file.ts
# 忽略空白改动
git blame -w path/to/file.ts
五、撤销与回退:翻车现场抢救指南
这是 Git 最让人害怕也是最能救命的部分。核心思路:出问题先别慌,Git 几乎从不真正删除数据。
5.1 撤销工作区改动
# 丢弃某个文件的所有未暂存改动(危险操作,无法恢复)
git checkout -- file.txt
# 或
git restore file.txt # Git 2.23+
# 丢弃所有未暂存改动
git restore .
5.2 撤销暂存区
# 把文件从暂存区退回工作区(不动文件内容)
git reset HEAD file.txt
# 或
git restore --staged file.txt
5.3 撤销提交
# 撤销最近一次提交,改动回到暂存区(推荐!)
git reset --soft HEAD~1
# 撤销最近一次提交,改动回到工作区
git reset --mixed HEAD~1
# 彻底丢弃最近一次提交的所有改动(高危操作!)
git reset --hard HEAD~1
# 用新提交覆盖旧提交(适用于已 push 的情况)
git revert HEAD # 安全!生成一个反向提交
场景速查表:
| 你的情况 | 命令 | 安全吗 |
|---|---|---|
| 改了还没 add,想丢弃 | git restore file.txt |
⚠️ 改动丢失 |
| add 了但想撤回暂存 | git restore --staged file.txt |
✅ 安全 |
| commit 了但没 push | git reset --soft HEAD~1 |
✅ 安全 |
| commit 并 push 了 | git revert HEAD |
✅ 安全 |
| 搞砸了一切想时光倒流 | git reflog → git reset --hard <sha> |
✅ 有救 |
5.4 Reflog:终极后悔药
# 查看 HEAD 的所有移动记录(包括已删除的分支和 reset)
git reflog
# 输出示例:
# abc1234 HEAD@{0}: commit: feat: 新增导出功能
# def5678 HEAD@{1}: reset: moving to HEAD~1
# ghi9012 HEAD@{2}: merge feature/payment: Merge made by...
# 回到任何历史状态
git reset --hard HEAD@{2}
reflog 本地默认保留 90 天。只要操作发生在本地,基本都能救回来。
六、暂存与储藏:临时切换任务
# 储藏当前工作区(不改动已 add 和未 add 的改动)
git stash
# 储藏时加备注(推荐,否则回头就忘了这笔是啥)
git stash push -m "WIP: 支付模块改到一半"
# 同时储藏未追踪的新文件
git stash -u
# 查看储藏列表
git stash list
# 取出最近的储藏(不删除)
git stash apply
# 取出最近的储藏(删除)
git stash pop
# 取出指定的储藏
git stash pop stash@{2}
# 删除指定储藏
git stash drop stash@{1}
# 清空所有储藏
git stash clear
典型工作流:正在 feature/A 上写代码 → 线上出了个紧急 bug → git stash → 切到 main 修 bug → 提交推送 → 切回 feature/A → git stash pop 继续干活。
七、远程仓库:和团队连接
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 修改远程仓库地址
git remote set-url origin https://github.com/user/new-repo.git
# 删除远程分支
git push origin --delete old-branch
# 清理本地已不存在的远程分支引用
git remote prune origin
# 设置上游分支
git branch --set-upstream-to=origin/main main
八、标签:给版本打记号
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐,含作者和时间)
git tag -a v1.0.0 -m "正式发布 v1.0.0"
# 推送标签到远程
git push origin v1.0.0
# 推送所有标签
git push origin --tags
# 查看所有标签
git tag -l
# 删除标签
git tag -d v1.0.0 # 本地
git push origin --delete v1.0.0 # 远程
九、配置优化:让 Git 更好用
9.1 必须设置的全局配置
git config --global user.name "你的名字"
git config --global user.email "your@email.com"
# 设置默认分支名为 main(GitHub 风格)
git config --global init.defaultBranch main
# 设置默认编辑器
git config --global core.editor "code --wait" # VS Code
# 开启颜色显示
git config --global color.ui auto
9.2 常用别名(强烈推荐)
# 一条命令设置全部别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.unstage "reset HEAD --"
git config --global alias.last "log -1 HEAD"
设置后效果:
git st # = git status
git co -b xxx # = git checkout -b xxx
git lg # = 漂亮的分支图
9.3 .gitignore 模板
在项目根目录创建 .gitignore 文件:
# 依赖
node_modules/
vendor/
# 编译产物
dist/
build/
*.class
# 环境变量
.env
.env.local
# 系统文件
.DS_Store
Thumbs.db
# IDE
.vscode/
.idea/
# 日志
*.log
十、常见问题速查
10.1 提交信息写错了
# 修改最近一次提交的信息(还没 push)
git commit --amend -m "新的提交信息"
# 修改后需要强制推送(如果已经 push 了)
git push --force-with-lease
10.2 漏了文件没提交
# 把漏掉的文件加进去,合并到上次提交
git add forgotten-file.txt
git commit --amend --no-edit
10.3 合并冲突怎么办
# 1. 冲突发生后,Git 会在文件中标记冲突区域:
# <<<<<<< HEAD
# 你的改动
# =======
# 别人的改动
# >>>>>>> feature/other
# 2. 手动编辑文件,删除标记,保留想要的代码
# 3. 标记冲突已解决
git add resolved-file.txt
# 4. 继续合并(如果是 merge)
git commit
# 5. 继续 rebase(如果是 rebase)
git rebase --continue
10.4 不小心提交了大文件
# 从历史中彻底删除(慎用!会改写历史)
git filter-branch --tree-filter 'rm -f huge-file.zip' HEAD
# 或用 BFG Repo-Cleaner(更快更安全)
十一、命令速查卡片
初始化:init clone
日常:status add commit push pull fetch
分支:branch checkout switch merge rebase
历史:log diff blame show
撤销:restore reset revert reflog
暂存:stash stash pop stash list
远程:remote push fetch clone
标签:tag tag -a
配置:config alias
📌 记住这条就够了:git reflog 是终极保险单。只要没执行 git gc,几乎所有"误删"都能用 reflog + reset --hard 救回来。翻车前先深呼吸,看一眼 git status,记住 reflog 这三个字母。
评论
发表评论