Git 常用排查指令详解
Git 常用排查指令详解前言当合并后出现问题编译报错、代码被意外修改等需要通过 Git 命令追溯问题来源。本文整理了排查过程中常用的指令按使用场景分类讲解。注博客https://blog.csdn.net/badao_liumang_qizhi一、查看提交历史git log查看提交历史记录。# 基本用法查看当前分支的提交历史gitlog# 查看指定分支的历史gitlog dev# 单行显示简洁模式gitlog--oneline# 自定义格式gitlog--format%h %ai %an %s# %h 短SHA# %ai 作者时间ISO格式# %an 作者名# %s 提交说明按时间范围过滤# 查看某个时间之后的提交gitlog--after2026-05-20 16:00# 查看某个时间之前的提交gitlog--before2026-05-21 17:00# 组合使用查看时间段内的提交gitlog--after2026-05-20 16:00--before2026-05-21 17:00# 完整示例查看 dev 分支在某时间段内的提交gitlog dev--format%h %ai %an %s--after2026-05-20 16:00--before2026-05-21 17:00只看合并提交# --merges 只显示合并提交gitlog--merges--oneline# 查看 dev 分支上的合并记录gitlog dev--oneline--merges|head-10二、查找谁修改了某段代码git log -Spickaxe 搜索搜索引入或删除了某段文本的提交。# 搜索哪个提交引入了 Long count 这段文本gitlog--oneline-SLong count# 在指定分支上搜索gitlog dev--oneline-SLong count# 限定文件范围gitlog dev--oneline-SLong count--*.java# 使用通配路径匹配任意目录层级gitlog dev--oneline-SLong count--**/UserService.java# -m 参数让搜索也覆盖 merge commit 的变更gitlog dev--oneline-m-SLong count--**/UserService.java注意-S默认不搜索 merge commit 中的变更加-m才会搜索。git blame查看文件中每一行最后是被谁、在哪个提交中修改的。# 查看某文件的逐行归属gitblame path/to/File.java# 查看指定分支上的文件gitblame dev -- path/to/File.java# 配合 grep 只看关心的行gitblame dev -- path/to/File.java|grepselectCount输出格式9568a283 (张三 2026-01-16 17:17:17 0800 981) Long count mapper.selectCount(wrapper);含义这行代码最后一次修改是在提交9568a283由张三在 2026-01-16 修改位于第 981 行。git log -L行级历史追踪追踪某个文件中指定行的完整变更历史。# 追踪第 100 行的历史gitlog-L100,100:path/to/File.java# 追踪第 100-110 行的历史gitlog-L100,110:path/to/File.java# 在指定分支上追踪gitlog dev-L100,100:path/to/File.java三、查看提交内容git show查看某个提交的详细信息和改动内容。# 查看某次提交的完整信息gitshow abc1234# 只看统计信息改了哪些文件gitshow abc1234--stat# 只看某个文件的改动gitshow abc1234 -- path/to/File.java# 使用通配路径gitshow abc1234 --**/File.java# 配合 grep 过滤gitshow abc1234 --**/File.java|grep-A3-B3关键词# -A 3 显示匹配行之后3行# -B 3 显示匹配行之前3行查看 merge commit 的改动普通git show对 merge commit 默认只显示冲突解决部分。要看完整改动需要加-m# -m 参数分别对比两个父提交显示 diffgitshow abc1234-m# 只看某个文件gitshow abc1234-m--**/File.java# 看统计信息gitshow abc1234-m--stat查看某个提交时文件的完整内容# 语法git show commit:file_pathgitshow abc1234:src/main/java/com/example/UserService.java# 配合 grep 查找特定内容gitshow abc1234:src/main/java/com/example/UserService.java|grepcount# 配合 grep -n 显示行号gitshow abc1234:src/main/java/com/example/UserService.java|grep-ncount注意这里的文件路径不能用通配符必须是完整的相对路径。四、对比差异git diff对比两个版本之间的差异。# 对比两个提交之间的差异gitdiffabc1234 def5678# 只看某个文件的差异gitdiffabc1234 def5678 -- path/to/File.java# 使用通配路径gitdiffabc1234 def5678 --**/pom.xml# 只看文件名列表不看具体内容gitdiffabc1234 def5678 --name-only# 看统计信息gitdiffabc1234 def5678--stat# 配合 grep 过滤gitdiffabc1234 def5678 --**/pom.xml|grep-imybatis对比 merge commit 的父提交merge commit 有两个父提交用^1和^2引用# ^1 第一个父提交当前分支合并前的状态# ^2 第二个父提交被合并分支的状态# 对比合并前后的变化gitdiffabc1234^1 abc1234# 看合并带入了什么对比当前分支合并前 vs 合并后gitdiffabc1234^1 abc1234 --**/File.java五、查找分支关系git merge-base找到两个分支的共同祖先分叉点。# 找两个分支的共同祖先gitmerge-base feature dev# 分支名包含特殊字符时用引号gitmerge-basefeature/my-branchdev用途确定你的分支是从哪个状态拉出来的从而判断合并时的基准。git branch --contains查看哪些分支包含了某个提交。# 查看哪些分支包含了提交 abc1234gitbranch--containsabc1234# 包括远程分支gitbranch-a--containsabc1234用途确认某个修改是否已经存在于某个分支中。git reflog查看分支的操作历史包括创建、切换、reset 等。# 查看当前分支的 refloggitreflog# 查看指定分支的 refloggitreflog show feature# 通常最后一条会显示分支创建信息gitreflog show feature|tail-5输出示例abc1234 feature{5}: branch: Created from dev这说明 feature 分支是从 dev 创建的。六、搜索文件git ls-tree列出某个提交中的文件树。# 列出某个提交中的所有文件gitls-tree-rabc1234 --name-only# 配合 grep 查找文件gitls-tree-rabc1234 --name-only|grepUserService# 查看某个分支上的文件gitls-tree-rdev --name-only|grepUserService用途确认文件的完整路径避免路径写错导致其他命令输出为空。git grep在 Git 仓库中搜索文本内容。# 在当前工作区搜索gitgrepselectCount# 在指定分支上搜索gitgrepInteger.*selectCountdev# 限定文件类型gitgrepInteger.*selectCountdev --*.java七、综合排查流程示例场景合并后编译报错需要找出是谁引入的问题第一步确定时间范围# 查看出问题时间段内的提交gitlog dev--format%h %ai %an %s--after2026-05-20 16:00--before2026-05-21 17:00第二步确认文件路径# 找到报错文件的完整路径gitls-tree-rdev --name-only|grepUserService第三步查看谁最后修改了报错的那行# 用 blame 定位gitblame dev --src/main/java/com/example/UserService.java|grepcount第四步查看那次提交的详情# 查看提交信息gitlog-1--format%H%n作者: %an%n时间: %ai%n说明: %sabc1234# 查看具体改了什么gitshow abc1234 --**/UserService.java第五步对比合并前后# 找到合并提交gitlog dev--oneline--merges--after2026-05-20|head-5# 对比合并前后文件的变化gitshowmerge_sha^1:path/to/File.java|grepcount# 合并前gitshowmerge_sha:path/to/File.java|grepcount# 合并后第六步确认分支来源# 找共同祖先gitmerge-basefeature-branchdev# 查看共同祖先时的代码状态gitshowmerge_base_sha:path/to/File.java|grepcount八、常用参数速查表参数用途示例--oneline单行显示提交git log --oneline--stat显示文件修改统计git show abc --stat--format自定义输出格式git log --format%h %an %s--after时间之后git log --after2026-05-20--before时间之前git log --before2026-05-21--merges只看合并提交git log --merges-S搜索引入/删除文本的提交git log -S text-m对 merge commit 也做 diffgit log -m -S text-n限制显示数量git log -5显示5条--name-only只显示文件名git diff --name-only-A ngrep 显示匹配后n行grep -A 3 text-B ngrep 显示匹配前n行grep -B 3 text^1第一个父提交git show abc^1^2第二个父提交git show abc^2--contains包含某提交的分支git branch --contains abc-r递归列出文件树git ls-tree -r dev九、注意事项文件路径要准确很多命令输出为空是因为文件名或路径写错了先用git ls-tree确认分支名有特殊字符要加引号中文、空格等需要用双引号包裹-S搜索默认不含 merge commit需要加-m参数git show对 merge commit 默认只显示冲突部分需要加-m看完整 diffgit show commit:path不支持通配符必须用完整路径--after和--before是基于提交时间不是合入时间一个提交可能很早创建但很晚才合入十、总结排查 Git 合并问题的核心思路定位时间范围→git log --after --before找到相关提交→git log -S/git blame查看提交内容→git show/git diff理解分支关系→git merge-base/git branch --contains对比前后状态→git show commit:path掌握这些命令的组合使用就能追溯任何合并问题的根源。