一、Git 命令速查表
-
📊 基础查看命令
命令 说明 git status查看当前状态(最常用) git log --oneline -n 10简洁版单行提交历史(最近10条) git log --oneline --graph图形化显示分支结构(最直观) git log --oneline --graph -n 10图形化显示最近10条提交 git log --oneline --graph --all显示所有分支的图形化历史 git log --stat显示提交的详细信息和文件变更 -
🔍 高级查看与比较命令
命令 说明 git reflog查看HEAD和引用移动的历史(救命命令!) git reflog show branch-name查看特定分支的移动历史 git reflog show nvwang-dev查看nvwang-dev分支的移动历史 git log master..dev比较两个分支的差异(master有而dev没有的) git log dev..master比较两个分支的差异(dev有而master没有的) git diff查看文件内容差异(比较工作区和最新提交) git diff master dev比较两个分支的所有文件差异 git diff master dev -- path/to/file比较特定文件在两个分支的差异 git diff --staged显示暂存区与最新提交的差异 -
📋 分支相关查看命令
命令 说明 git branch查看所有本地分支 git branch -a查看所有分支(包括远程) git branch -v查看分支及其最后提交信息 git branch --merged查看已合并到当前分支的分支 git branch --no-merged查看未合并到当前分支的分支 git remote show origin查看远程分支信息 -
🔧 操作与恢复命令
命令 说明 git push origin master --force强制推送到远程(谨慎使用!) git push origin master --force-with-lease更安全的强制推送(推荐) git reset --hard commit-hash硬重置到指定提交(丢弃所有更改) git reset --soft commit-hash软重置(保留工作目录更改) git revert commit-hash撤销某个提交(创建反向提交) git revert -m 1 merge-commit-hash撤销合并提交 -
🕵️ 搜索与过滤命令
命令 说明 git log --author="username"按作者搜索提交 git log --since="2 weeks ago"按时间搜索提交(最近2周) git log --grep="keyword"搜索包含关键字的提交 git log --follow path/to/file显示某个文件的修改历史 git blame path/to/file显示某行的修改历史 -
📦 暂存与清理命令
命令 说明 git stash暂存当前修改 git stash list查看暂存列表 git stash pop恢复最近暂存的内容 git clean -n预览将要删除的文件 git clean -f实际删除未跟踪的文件 -
🎯 实用技巧组合
命令 说明 `git blame file.txt grep -i "functionName"` 查看谁最后修改了某行代码 git show commit-hash查看某次提交的具体内容 git show commit-hash:path/to/file查看某次提交中某个文件的变更 git log --pretty=format:"%h - %an, %ar : %s"优雅的日志显示(自定义格式) git remote -v查看远程仓库信息 -
⚠️ 危险命令(谨慎使用)
命令 说明 git push --force强制推送并覆盖远程历史 git reset --hard HEAD~3硬重置到某个点(会丢失工作区修改) git commit --amend修改最后一次提交信息 git push origin --delete branch-name删除远程分支 -
💡 使用场景建议
日常开发
git status git log --oneline --graph -n 10问题排查
git reflog git diff git log branchA..branchB代码审查
git diff --stat git show commit-hash恢复操作
- 先用
git reflog找到正确提交 - 再用
git reset --hard commit-hash
📝 温馨提示:
- 使用
--force推送前务必确认不会影响团队成员 - 执行危险操作前建议先备份重要代码
--force-with-lease比--force更安全
- 先用
二、撤销放弃
-
放弃工作区修改
命令 说明 git checkout -- file.txt放弃单个文件的修改(恢复到最新提交状态) git checkout -- .放弃所有文件的修改(恢复到最新提交状态) git clean -fd删除所有未跟踪的文件和目录 git clean -fd -n预览将要删除的未跟踪文件和目录 -
放弃暂存区修改
命令 说明 git reset HEAD file.txt将单个文件从暂存区撤回(保留工作区修改) git reset HEAD .将所有文件从暂存区撤回(保留工作区修改) git restore --staged file.txt将文件从暂存区撤回(Git 2.23+) -
代码回滚命令
命令 说明 git reset --hard HEAD回滚到最新提交(丢弃所有未提交的修改) git reset --hard HEAD~1回滚到上一个提交 git reset --hard HEAD~3回滚到前3个提交 git reset --hard commit-hash回滚到指定提交 git revert commit-hash撤销指定提交(创建新的反向提交) git revert --no-commit commit-hash撤销提交但不自动提交 -
分支回滚
命令 说明 git branch -f branch-name commit-hash强制移动分支指针到指定提交 git push origin branch-name --force强制推送分支回滚到远程 -
撤销合并
命令 说明 git merge --abort中止正在进行的合并操作 git revert -m 1 merge-commit-hash撤销合并提交 -
🎯 常用回滚场景示例
场景1:放弃所有本地修改
# 放弃所有已修改的文件 git checkout -- . # 删除所有未跟踪的文件 git clean -fd # 或者一步完成 git reset --hard HEAD && git clean -fd场景2:撤销最后一次提交但保留修改
# 撤销提交但保留修改在工作区 git reset --soft HEAD~1 # 撤销提交且保留修改在暂存区 git reset --mixed HEAD~1场景3:完全撤销最后一次提交
# 完全删除最后一次提交(慎用!) git reset --hard HEAD~1场景4:撤销多个提交
# 回滚到3个提交之前的状态 git reset --hard HEAD~3 # 或者回滚到特定提交 git reset --hard a1b2c3d场景5:安全撤销提交(推荐用于共享分支)
# 创建反向提交来撤销某个更改 git revert commit-hash # 撤销多个提交(从旧到新逐个撤销) git revert oldest-commit-hash..newest-commit-hash -
📊 重置模式对比
模式 命令 工作区 暂存区 提交历史 硬重置 --hard❌ 重置 ❌ 重置 ❌ 移动 混合重置 --mixed✅ 保留 ❌ 重置 ❌ 移动 软重置 --soft✅ 保留 ✅ 保留 ❌ 移动 ⚠️ 重要注意事项
git reset --hard会永久删除未提交的修改- 强制推送前确保团队成员知晓
- 回滚共享分支时优先使用
git revert - 操作前可使用
git reflog查看历史记录 - 重要修改建议先创建备份分支
# 操作前创建备份分支 git branch backup-branch # 或者使用标签标记当前状态 git tag backup-point💡 恢复技巧
如果误操作,可以通过
reflog恢复:# 查看操作历史 git reflog # 找到误操作前的提交哈希 git reset --hard HEAD@{1}
📝 安全建议:
- 执行危险操作前先
git status确认当前状态 - 使用
git diff查看将要丢失的更改 - 考虑使用
git stash临时保存修改 - 重要项目操作前创建备份分支
三、git checkout -- . 与 git checkout . 有什么区别
-
git checkout -- .和git checkout .在功能上完全一样,没有任何区别。git checkout -- .:--用于分隔命令选项和文件路径git checkout .:直接指定文件路径
-
实际效果,两种写法都会:
- 放弃所有已跟踪文件的修改
- 恢复到最新提交的状态
- 不会影响未跟踪的文件
-
🎯 使用示例
# 以下命令效果完全相同: git checkout -- . git checkout . # 放弃特定文件的修改: git checkout -- file.txt git checkout file.txt # 放弃特定目录的修改: git checkout -- dir/ git checkout dir/ -
🔍
--的作用--在 Git 命令中用于:- 明确分隔选项和参数
- 防止文件名与选项混淆
-
什么时候必须使用
--?当文件名可能被误认为是命令选项时:
# 如果有一个文件叫 "-f" git checkout -- -f # 正确:明确表示 -f 是文件名 git checkout -f # 错误:-f 会被认为是选项 # 如果有一个文件叫 "--help" git checkout -- --help # 正确 git checkout --help # 错误:显示帮助信息 -
📊 对比表格
场景 git checkout -- .git checkout .推荐 普通文件名 ✅ 可用 ✅ 可用 都可以 特殊文件名(如 -f)✅ 安全 ❌ 危险 使用 --可读性 🔸 更明确 🔸 更简洁 看个人习惯 安全性 ✅ 更高 🔸 一般 推荐使用 -- -
💡 最佳实践建议
推荐使用
--的写法:# 更安全,避免意外 git checkout -- . git checkout -- file.txt可以省略
--的情况:# 当确认文件名没有特殊字符时 git checkout . git checkout file.txt-
⚠️ 重要提醒
这两个命令都会永久丢弃工作区的修改! 操作前请确保:
-
使用
git status确认要放弃的修改 -
使用
git diff查看具体的更改内容 -
重要代码建议先备份或使用
git stash
-
🔄 相关命令对比
# 放弃工作区所有修改 git checkout -- . # 放弃所有已跟踪文件的修改 git clean -fd # 删除所有未跟踪的文件和目录 # 放弃暂存区的修改(保留工作区修改) git reset HEAD . # 将所有文件从暂存区撤回 git restore --staged . # Git 2.23+ 的新语法-
🎓 总结
- 功能相同:
git checkout -- .和git checkout .效果完全一样 - 安全选择:推荐使用
git checkout -- .,更安全明确 - 习惯问题:团队中可以统一选择一种写法保持一致性
-
四、强制覆盖使用某分支覆盖某分支
-
🎯 场景一:使用线上分支强行覆盖某个分支
操作步骤(以
dev覆盖feature分支为例)# 1. 确保本地有最新的线上分支代码 git fetch origin # 2. 切换到要被覆盖的分支 git checkout feature # 3. 使用线上分支强制重置本地分支 git reset --hard origin/dev # 4. 强制推送到远程仓库 git push origin feature --force-with-lease完整的一行命令
git fetch origin && git checkout feature && git reset --hard origin/dev && git push origin feature --force-with-lease⚠️ 重要警告
- 这会永久删除
feature分支上所有不在dev分支中的提交 - 确保团队成员都知道这个操作
--force-with-lease比--force更安全
- 这会永久删除
-
🎯 场景二:使用本地分支强行覆盖某个分支
操作步骤(以本地
dev覆盖feature分支为例)# 1. 首先确保本地分支是最新的 git checkout dev git pull origin dev # 如果需要同步远程 # 2. 切换到要被覆盖的分支 git checkout feature # 3. 使用本地分支强制重置 git reset --hard dev # 4. 强制推送到远程仓库 git push origin feature --force-with-lease完整的一行命令
git checkout dev && git pull origin dev && git checkout feature && git reset --hard dev && git push origin feature --force-with-lease
-
🎯 场景三:临时回到某个 Commit 查看代码,然后再切回来
方法一:使用
git checkout(推荐)# 1. 临时切换到某个提交(进入"分离头指针"状态) git checkout 475806d # 2. 查看代码、测试等操作... # 此时可以随意查看文件,运行代码 # 3. 切换回原来的分支 git checkout feature方法二:使用
git switch(Git 2.23+)# 1. 临时切换到某个提交 git switch --detach 475806d # 2. 查看代码... # 3. 切换回原来的分支 git switch feature方法三:创建临时分支(更安全)
# 1. 基于某个提交创建临时分支 git branch temp-branch 475806d # 2. 切换到临时分支 git checkout temp-branch # 3. 查看代码... # 4. 切换回原来的分支 git checkout feature # 5. 删除临时分支(可选) git branch -D temp-branch