Git 常用命令速查手册
一、基础命令
| 命令 | 说明 |
|---|---|
git clone <url> | 克隆远程仓库到本地 |
git status | 查看工作区/暂存区状态 |
git add <file> | 将文件添加到暂存区 |
git commit -m "message" | 提交暂存区内容到本地仓库 |
git log --oneline | 查看简洁的提交历史 |
git diff | 查看工作区与暂存区的差异 |
git diff --staged | 查看暂存区与最新提交的差异 |
二、回滚操作(Undo / 撤销)
1. 工作区修改撤销(未 add)
bash
git checkout -- <file> # 丢弃某个文件的修改
git restore <file> # Git 2.23+ 推荐写法
git checkout . # 丢弃所有工作区修改(危险!)
2. 暂存区撤销(已 add,未 commit)
bash
git restore --staged <file> # 将文件移出暂存区(保留修改)
git reset HEAD <file> # 旧写法,作用同上
git reset HEAD . # 全部移出暂存区
3. 本地提交撤销(已 commit,未 push)
① 修正最近一次提交(不产生新提交)
bash
git commit --amend -m "新的提交信息" # 修改提交信息
git add <遗漏的文件> && git commit --amend # 追加文件到上次提交
② 回退到某个历史版本(reset)
--soft:保留工作区和暂存区修改(相当于撤销 commit,但修改还在)--mixed(默认):保留工作区,清空暂存区--hard:彻底删除所有后续修改(危险!)
bash
git reset --soft HEAD~1 # 撤销最后一次 commit,代码保留
git reset --mixed HEAD~1 # 撤销 commit 和 add,代码保留
git reset --hard HEAD~1 # 彻底删除最后一次 commit 的修改
git reset --hard <commit-id> # 回滚到指定 commit(丢弃之后所有修改)
注意:
reset会改变历史,若已经push到远程,请用revert或强制推送(谨慎)。
③ 安全撤销已 push 的提交(revert)
revert 会生成一个反向提交,不破坏历史,适合公共分支。
bash
git revert HEAD # 撤销最近一次提交(生成新 commit)
git revert <commit-id> # 撤销指定的某个提交
git revert HEAD~3..HEAD # 撤销最近 3 个提交(需按顺序)
4. 恢复被删除的分支或提交(reflog)
只要没有执行 git gc,所有操作都可以找回:
bash
git reflog # 查看所有 HEAD 变动记录
git checkout -b <新分支名> <commit-id> # 基于某 commit 创建新分支
git reset --hard <commit-id> # 直接恢复到某 commit(慎用)
三、远程仓库操作
1. 管理远程仓库别名
bash
git remote -v # 查看所有远程仓库及地址
git remote add <别名> <url> # 添加远程仓库,如 git remote add origin https://...
git remote remove <别名> # 删除远程仓库别名
git remote rename <旧名> <新名> # 重命名,如 git remote rename origin upstream
git remote set-url <别名> <新url> # 修改远程仓库地址
2. 拉取远程内容
bash
git fetch <远程名> # 下载远程最新对象,但不合并
git fetch --prune # 拉取时删除本地已不存在的远程分支引用
git pull <远程名> <分支名> # fetch + merge(等价)
git pull --rebase # fetch + rebase(保持历史线性)
3. 推送本地内容
bash
git push <远程名> <本地分支>:<远程分支> # 完整语法
git push origin main # 将本地 main 推送到远程 origin/main
git push -u origin main # 推送并建立上游跟踪(后续可直接 git push)
git push --all origin # 推送所有本地分支到远程
git push --tags # 推送所有本地标签(默认不自动推送)
4. 删除远程分支 / 标签
bash
# 删除远程分支
git push --delete origin <分支名>
git push origin :<分支名> # 旧语法
# 删除远程标签
git push --delete origin <tag名>
git push origin :refs/tags/<tag名>
# 删除本地标签
git tag -d <tag名>
5. 跟踪远程分支(本地创建与远程同名的分支)
bash
git checkout -b <本地分支> <远程名>/<远程分支> # 旧写法
git checkout --track origin/feature # 自动创建同名本地分支并跟踪
git branch -u origin/feature # 为现有本地分支设置上游
6. 查看远程分支与本地分支关系
bash
git branch -a # 查看所有分支(含远程)
git branch -vv # 查看本地分支与远程分支的跟踪关系
git remote show origin # 显示远程仓库的详细信息(包括过期分支)
四、常用组合场景
场景1:提交后发现漏了文件,不想增加新 commit
bash
git add <遗漏文件>
git commit --amend --no-edit # 追加到上一次提交,不修改信息
场景2:误提交到错误分支,需要移动提交
bash
git log --oneline # 找到刚提交的 commit-id
git reset HEAD~1 --soft # 撤销最后一次提交(保留修改)
git stash # 暂存修改
git checkout <正确分支>
git stash pop
git add && git commit
场景3:远程分支被误删,本地还有该分支
bash
git push origin <本地分支名>:<远程分支名> # 重新推送上去即可
场景4:强制覆盖远程分支(慎用,会覆盖他人提交)
bash
git push --force origin <分支名> # 强制推送(可能覆盖他人代码)
git push --force-with-lease origin <分支名> # 更安全的强制推送(若远程有新提交则拒绝)
场景5:删除本地已不存在的远程分支引用(清理 git branch -a 里的幽灵分支)
bash
git remote prune origin # 删除本地 origin/xxx 但远程已不存在的引用
git fetch --prune # 拉取时自动修剪
五、实用小技巧
| 需求 | 命令 |
|---|---|
| 临时保存工作区,切分支 | git stash / git stash pop |
| 复制某几个 commit 到当前分支 | git cherry-pick <commit-id> |
| 合并多个 commit 为一个 | git rebase -i HEAD~n 然后 squash |
| 生成补丁文件 | git format-patch -1 <commit-id> |
| 查找哪次提交引入了某个 bug | git bisect start |
注意事项
- 永远不要对已经推送到公共仓库的提交执行
reset --hard再push --force,除非你是唯一使用者。 - 使用
revert代替reset来撤销公共分支上的变更。 git push --force前建议先git fetch并确认没有其他人基于当前分支工作。- 定期执行
git fetch --prune或git remote prune origin保持本地远程分支列表整洁