Git 常用查询指令(自用)

98 阅读10分钟

一、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.txtgrep -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
    

    恢复操作

    1. 先用 git reflog 找到正确提交
    2. 再用 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✅ 保留✅ 保留❌ 移动

    ⚠️ 重要注意事项

    1. git reset --hard 会永久删除未提交的修改
    2. 强制推送前确保团队成员知晓
    3. 回滚共享分支时优先使用 git revert
    4. 操作前可使用 git reflog 查看历史记录
    5. 重要修改建议先创建备份分支
    # 操作前创建备份分支
    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 .:直接指定文件路径
  • 实际效果,两种写法都会:

    1. 放弃所有已跟踪文件的修改
    2. 恢复到最新提交的状态
    3. 不会影响未跟踪的文件
  • 🎯 使用示例

    # 以下命令效果完全相同:
    git checkout -- .
    git checkout .
    
    # 放弃特定文件的修改:
    git checkout -- file.txt
    git checkout file.txt
    
    # 放弃特定目录的修改:
    git checkout -- dir/
    git checkout dir/
    
  • 🔍 -- 的作用

    -- 在 Git 命令中用于:

    1. 明确分隔选项和参数
    2. 防止文件名与选项混淆
  • 什么时候必须使用 --

    当文件名可能被误认为是命令选项时:

    # 如果有一个文件叫 "-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
    
    • ⚠️ 重要提醒

    这两个命令都会永久丢弃工作区的修改!  操作前请确保:

    1. 使用 git status 确认要放弃的修改

    2. 使用 git diff 查看具体的更改内容

    3. 重要代码建议先备份或使用 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