发布时间:
分两部分:基础必背命令、高频骚操作(奇技淫巧),适合日常开发排错、救回代码。
一、入门基础命令 #
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 |
书写规则:
- 标题不超过 50 字左右,结尾不加句号
- 用一句话说清「改了什么」,而不是「做了什么」—— ❌
fix: 修改代码✅fix: 修复首页轮播图不自动播放 - 可选范围写在括号里标明模块:
feat(user): 新增头像上传 - 正文(空一行后)写为什么改、怎么改的,复杂提交才需要
- 破坏性变更在标题加
!或正文写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
三、避坑重点(非常重要) #
git reset --hard会丢掉工作区未提交代码,操作前优先stash- 已经推送到远程共享分支,禁止
git rebase / reset -f,会导致其他人仓库错乱 reflog只在本机有效,换电脑找不回丢失提交cherry‑pick / rebase容易冲突,冲突解决完记得--continue
四、推荐别名,写进 ~/.gitconfig,简化命令 #
[alias]
st = status
co = checkout
br = branch
ci = commit
lg = log --oneline --graph --all
之后直接 git lg 看漂亮日志。