开发者-导航 猿导航

Git 基础必背命令与高频奇技淫巧开发排错手册

发布时间:

分两部分:基础必背命令高频骚操作(奇技淫巧),适合日常开发排错、救回代码。

一、入门基础命令 #

1. 配置 #

# 设置用户名邮箱(全局)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

# 查看配置
git config --list

2. 仓库初始化 & 克隆 #

# 新建git仓库
git init

# 拉取远程仓库
git clone https://xxx.git
# 克隆指定分支
git clone -b dev https://xxx.git

3. 日常工作流(add / commit / status) #

# 查看状态
git status

# 添加文件到暂存区
git add filename
git add .        # 当前目录全部变更
git add -u       # 只追踪已被git管理的文件,不新增新文件

# 提交到本地仓库
git commit -m "feat: 新增xx功能"
# 提交同时把已经add的修改重新提交,不写新message
git commit --amend --no-edit
# 修改上一次commit注释
git commit --amend -m "新的提交信息"

4. 提交信息规范(commit message 怎么写) #

团队通用约定:一行标题 + 可选正文,标题格式 type(范围): 描述

git commit -m "feat: 新增登录页面"
# 带正文的完整写法(-m 可重复,第二段是正文)
git commit -m "fix: 修复登录偶发401" -m "原因是token过期后没有自动刷新,增加拦截器重新请求"

常用 type(类型):

type 含义 示例
feat 新功能 feat: 新增搜索功能
fix 修bug fix: 修复列表分页错误
docs 只改文档 docs: 更新README
style 代码格式(不影响逻辑) style: 统一缩进为2空格
refactor 重构(非新功能非修bug) refactor: 抽取公共请求函数
perf 性能优化 perf: 首屏加载减少500ms
test 增加/修改测试 test: 补充登录用例
chore 构建工具、依赖、杂务 chore: 升级webpack到5
revert 回滚某次提交 revert: 撤销feat: xxx

书写规则:

  1. 标题不超过 50 字左右,结尾不加句号
  2. 用一句话说清「改了什么」,而不是「做了什么」—— ❌ fix: 修改代码fix: 修复首页轮播图不自动播放
  3. 可选范围写在括号里标明模块:feat(user): 新增头像上传
  4. 正文(空一行后)写为什么改、怎么改的,复杂提交才需要
  5. 破坏性变更在标题加 ! 或正文写 BREAKING CHANGE:,关联issue用 Closes #123
# 完整示例
git commit -m "feat(api)!: 用户接口返回结构调整为分页格式" -m "BREAKING CHANGE: list接口由数组改为 {list, total}

Closes #42"

5. 分支操作 #

# 查看本地分支
git branch
# 查看本地+远程分支
git branch -a

# 创建分支
git branch dev
# 创建并切换到新分支
git checkout -b dev
# git 2.23+ 新写法
git switch -c dev

# 切换分支
git checkout main
git switch main

# 删除本地分支
git branch -d dev
# 强制删除(未合并)
git branch -D dev

# 合并分支,把dev合并到当前分支
git merge dev

6. 远程仓库 #

# 查看远程地址
git remote -v
# 添加远程源
git remote add origin https://xxx.git
# 修改远程地址
git remote set-url origin https://new.git

# 拉取远程更新(不自动合并)
git fetch
# 拉取并合并
git pull

# 推送本地分支到远程
git push origin main
# 推送并建立跟踪关系
git push -u origin dev
# 删除远程分支
git push origin --delete dev

7. 查看日志 #

git log
# 简洁单行日志
git log --oneline
# 图形化看分支走向
git log --oneline --graph --all
# 看某个文件的修改历史
git log filename
# 看某次提交具体改动
git show commit-id

8. 撤销、回滚基础 #

# 撤销工作区修改(未add)
git checkout -- filename

# 取消暂存(已经git add,还没commit)
git reset HEAD filename

# 回退到某个提交,保留改动在工作区
git reset --soft commit-id
# 回退,改动放到暂存区
git reset --mixed commit-id  # 默认
# 彻底回退,丢弃所有改动(危险!)
git reset --hard commit-id

9. 标签(tag) #

# 查看所有标签
git tag
# 查看某个标签的提交内容
git show v1.0.0

# 给当前提交打标签
git tag v1.0.0
# 给指定提交打标签
git tag v1.0.0 commit-id
# 打附注标签(推荐,带说明信息,可签名)
git tag -a v1.0.0 -m "发布1.0.0版本"

# 推送单个标签到远程
git push origin v1.0.0
# 推送所有本地标签
git push origin --tags

# 删除本地标签
git tag -d v1.0.0
# 删除远程标签(注意冒号写法)
git push origin :refs/tags/v1.0.0

10. 删除文件与取消追踪(git rm) #

# 删除文件(工作区+暂存区一起删,等于 rm + git add)
git rm filename
# 删除文件夹
git rm -r dir/
# 只从git追踪中移除,保留本地文件(常用于误提交了配置/日志后取消追踪)
git rm --cached filename

# 删除后记得提交才生效
git commit -m "chore: 删除误提交的文件"

误提交了文件怎么删(按场景选):

# 场景A:刚commit还没push → 删掉文件后合并进上一次提交,历史不留痕迹
git rm --cached config.local.json
echo "config.local.json" >> .gitignore
git add .gitignore
git commit --amend --no-edit

# 场景B:已经push到远程 → 用新提交删除(安全,公共分支推荐)
git rm --cached config.local.json
git commit -m "chore: 移除误提交的配置文件"
git push

# 场景C:本地直接不要这个文件了(工作区也删)
git rm filename
git commit -m "chore: 删除无用文件"

⚠️ 已经push的敏感文件(密码、密钥),光删文件不够,git历史里还能翻到,需要用 git filter-repo 重写历史并立即更换密钥

💡 git rm --cached 只是取消追踪,如果文件该被忽略,记得同步补进 .gitignore,否则下次 git add . 又会提交进去。


二、Git 奇技淫巧|救命骚操作 #

很多人踩坑场景:改错分支、提交错、误删代码、需要拿别的分支某一个提交、清理垃圾、找回丢失commit

🎯 1. 把某个分支的某一次提交挪到当前分支(cherry‑pick) #

只复制单个commit,不用合并整个分支

git cherry-pick <commit-id>
# 如果冲突,解决后继续
git cherry-pick --continue
# 放弃cherry‑pick
git cherry-pick --abort

🎯 2. 临时保存当前未提交代码:stash(储藏) #

改一半,要切分支,不想随便commit

# 储藏当前所有修改(工作区+暂存)
git stash
# 带备注储藏
git stash save "临时保存:正在做登录模块"

# 查看储藏列表
git stash list

# 恢复最新储藏,不删除储藏记录
git stash apply
# 恢复并删掉这条stash
git stash pop
# 指定恢复某一条 stash@{1}
git stash apply stash@{1}

# 删除储藏
git stash drop stash@{1}
# 清空全部储藏
git stash clear

🎯 3. 想把多次commit合并成一个提交(rebase squash) #

场景:本地一堆细碎提交,推远程前整理成干净的一条记录

# 交互式变基,最近 n 次提交,例如最近3次
git rebase -i HEAD~3

弹出编辑器:

pick abc123 commit1
pick def456 commit2
pick ghi789 commit3

把后面的 pick 改成 s(squash)

pick abc123 commit1
s def456 commit2
s ghi789 commit3

保存退出,编辑合并后的commit信息。

⚠️ 不要对已经push到远程的commit做rebase,会破坏别人的仓库!只改本地未推送提交

🎯 4. 找回已经 reset 掉丢失的提交:reflog(超级救命) #

hard reset丢了代码,不要慌!git不会立刻删除对象

git reflog
# 会列出所有HEAD变动记录,找到丢失commit id
git reset --hard 那个commit-id

reflog 是本地仓库的时光机,只存在本机,换电脑没用。

🎯 5. 只拿另一个分支的某个文件,不需要合并整个分支 #

# 从dev分支,把 config.js 文件拿过来覆盖当前分支
git checkout dev -- config.js

🎯 6. 撤销远程已经推送的提交(两种方案) #

❗ 团队协作优先 revert,不要 reset‑push,会搞崩队友

# 方案A:安全,生成新提交反向抵消改动,保留历史,推荐公共分支
git revert commit-id
git push

# 方案B:本地reset后强制推送(危险!多人共用分支禁止)
git reset --hard HEAD~1
git push -f origin main

🎯 7. 清理本地已经不存在的远程分支 #

远程删了分支,但本地 git branch -a 还能看到残留

git fetch --prune
# 简写
git fetch -p

🎯 8. 比较差异 #

# 工作区 vs 暂存区
git diff
# 暂存区 vs 上次commit
git diff --cached
# 两个分支对比
git diff main...dev
# 对比某个文件两个版本
git diff commit1 commit2 -- filename

🎯 9. 临时生成补丁文件 #

# 导出提交为patch文件
git format-patch commit-id
# 应用补丁
git am xxx.patch

🎯 10. 查看是谁改了这一行代码(追责神器 blame) #

git blame src/index.js

🎯 11. 跳过pre‑commit钩子(紧急提交,不推荐常态) #

git commit -m "xxx" --no-verify

🎯 12. 快速创建一个干净的临时分支 #

git checkout --detach
# 或者
git switch --detach HEAD

🎯 13. 查看哪些commit在A分支不在B分支 #

git log main..dev --oneline
# dev独有的提交

🎯 14. 仓库瘦身,清理大文件历史(慎用) #

如果曾经提交过大文件,后续删掉,git对象库还保存着

git gc --prune=now

三、避坑重点(非常重要) #

  1. git reset --hard 会丢掉工作区未提交代码,操作前优先stash
  2. 已经推送到远程共享分支,禁止 git rebase / reset -f,会导致其他人仓库错乱
  3. reflog 只在本机有效,换电脑找不回丢失提交
  4. cherry‑pick / rebase 容易冲突,冲突解决完记得 --continue

四、推荐别名,写进 ~/.gitconfig,简化命令 #

[alias]
    st = status
    co = checkout
    br = branch
    ci = commit
    lg = log --oneline --graph --all

之后直接 git lg 看漂亮日志。