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 refloggit 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/Agit 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 这三个字母。

评论

此博客中的热门博文

Claude Code 国内安装与配置全指南

GUI.for.SingBox 配置指南:告别 JSON,图形界面搞定一切

Claude Code 采用cc-switch配置第三方模型的完全指南