git最常用 git showgit show a15c6cbad7c0b8211444867842558370542468e7 --name-status显示在提交这个版本时有哪些文件发生了修改。commit a15c6cbad7c0b8211444867842558370542468e7(HEAD -main, origin/main)M file.txt M test.txtgit show a15c6cbad7c0b8211444867842558370542468e7 – file.txt显示在提交这个版本时指定文件进行了哪些修改。$gitshow a15c6cbad7c0b8211444867842558370542468e7 -- file.txt commit a15c6cbad7c0b8211444867842558370542468e7(HEAD -main, origin/main)diff--gita/file.txt b/file.txt index 02fd7ac..7fe8e02100644--- a/file.txt b/file.txt -4,4 4,8 userding version:2 userding -2026年7月1日23:57:08\No newline at end offile2026年7月1日23:57:08 version:3 userding 2026年7月2日00:34:40\No newline at end offilegit show 版本号 --stat只看修改了哪些文件不看代码细节那就用这个$gitshow a15c6cbad7c0b8211444867842558370542468e7--statcommit a15c6cbad7c0b8211444867842558370542468e7(HEAD -main, origin/main)file.txt|6- test.txt|8-2files changed,12insertions(),2deletions(-)git show 版本号作用自动对比 这个版本 和 前一个版本直接显示改了哪些文件、加了什么、删了什么如$gitshow a15c6cbad7c0b8211444867842558370542468e7 commit a15c6cbad7c0b8211444867842558370542468e7(HEAD -main, origin/main)diff--gita/file.txt b/file.txt index 02fd7ac..7fe8e02100644--- a/file.txt b/file.txt -4,4 4,8 userding version:2 userding -2026年7月1日23:57:08\No newline at end offile2026年7月1日23:57:08 version:3 userding 2026年7月2日00:34:40\No newline at end offilediff--gita/test.txt b/test.txt index 700ea95..cac4170100644--- a/test.txt b/test.txt -1,3 1,9 test.txt v1: -2026C4EA7D4C22C8D500:15:39\No newline at end offile2026C4EA7D4C22C8D500:15:39 v2 2026C4EA7D4C22C8D500:17:58 v3 2026C4EA7D4C22C8D501:53:33\No newline at end offilegit loggit log -p file 查看文件在哪些版本中具体进行了哪些修改的变更记录$gitlog-pfile.txt commit a15c6cbad7c0b8211444867842558370542468e7(HEAD -main, origin/main)version:32026年7月4日01:17:07diff--gita/file.txt b/file.txt index 02fd7ac..7fe8e02100644--- a/file.txt b/file.txt -4,4 4,8 userding version:2 userding -2026年7月1日23:57:08\No newline at end offile2026年7月1日23:57:08 version:3 userding 2026年7月2日00:34:40\No newline at end offilecommit ab31aee0fe54bfc583de2e53ba9803ff99c032dc v2,2026年7月2日00:16:21diff--gita/file.txt b/file.txt index e013349..02fd7ac100644--- a/file.txt b/file.txt -1,3 1,7 version1 userding -2026年7月1日21:30:19\No newline at end offile2026年7月1日21:30:19 version:2 userding 2026年7月1日23:57:08\No newline at end offilecommit 02f58927dad47ad07c21fd2a4b3b18ba453d1c80 version:1,2026年7月1日21:31:49diff--gita/file.txt b/file.txt newfilemode100644index 0000000..e013349 --- /dev/null b/file.txt -0,0 1,3 version1 userding 2026年7月1日21:30:19\No newline at end offile证明1git checkout c – file 会直接把 c 版本的文件覆盖到工作区 暂存区$gitcheckout ab31aee0fe54bfc583de2e53ba9803ff99c032dc -- file.txt AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(m $gitdiff--cacheddiff--gita/file.txt b/file.txt index 7fe8e02..02fd7ac100644--- a/file.txt b/file.txt -4,8 4,4 userding version:2 userding -2026年7月1日23:57:08 --version:3-userding -2026年7月2日00:34:40\No newline at end offile2026年7月1日23:57:08\No newline at end offile$gitdiffAdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiffHEADdiff--gita/file.txt b/file.txt index 7fe8e02..02fd7ac100644--- a/file.txt b/file.txt -4,8 4,4 userding version:2 userding -2026年7月1日23:57:08 --version:3-userding -2026年7月2日00:34:40\No newline at end offile2026年7月1日23:57:08\No newline at end offile证明步骤初始状态$gitlog--oneline--graph* a15c6cb(HEAD -main, origin/main)version:32026年7月4日01:17:07 * ab31aee v2,2026年7月2日00:16:21 * 02f5892 version:1,2026年7月1日21:31:49工作区版本 a15c6cb暂存区版本 a15c6cb本地仓库所有 提交执行 git checkout ab31aee0fe54bfc583d – file.txt这条命令等价两步从提交 ab31aee 取出文件覆盖工作区file.txt同时把该文件写入暂存区暂存区直接变成 ab31aee 此时工作区ab31aee 暂存区ab31aee HEAD 还在 a15c6cb也可以从指令返回结果中斧正git diff 无输出证明wd和index内容一致。git diff --cached 和 git diff HEAD 有输出且输出一致证明wd和本地仓库最新提交不一致index和本地仓库最新提交不一致。以上证明了git checkout ab31aee0fe54bfc583de2e53ba9803ff99c032dc – file.txt会直接把 commit 版本的文件覆盖到工作区 暂存区。证明2git reset HEAD file # 本地仓库最新提交覆盖暂存区gitstatus On branch main Your branch is up todatewithorigin/main.Changes to be committed:(usegit restore --staged file...to unstage)modified: file.txt AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiffAdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiff--cacheddiff--gita/file.txt b/file.txt index 7fe8e02..02fd7ac100644--- a/file.txt b/file.txt -4,8 4,4 userding version:2 userding -2026年7月1日23:57:08 --version:3-userding -2026年7月2日00:34:40\No newline at end offile2026年7月1日23:57:08\No newline at end offileAdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitreset HEAD file.txt Unstaged changes after reset: M file.txt AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiff--cachedAdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiffdiff--gita/file.txt b/file.txt index 7fe8e02..02fd7ac100644--- a/file.txt b/file.txt -4,8 4,4 userding version:2 userding -2026年7月1日23:57:08 --version:3-userding -2026年7月2日00:34:40\No newline at end offile2026年7月1日23:57:08\No newline at end offileAdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiffHEADdiff--gita/file.txt b/file.txt index 7fe8e02..02fd7ac100644--- a/file.txt b/file.txt -4,8 4,4 userding version:2 userding -2026年7月1日23:57:08 --version:3-userding -2026年7月2日00:34:40\No newline at end offile2026年7月1日23:57:08\No newline at end offile以上实验证明git reset HEAD file # 暂存区回Agit reset HEAD file.txt 之前git diff 无输出。git diff --cached 有输出。git reset HEAD file.txt 之后git diff --cached 无输出。git diff 有输出。reset之后index和Head内容已经一致了。但是wd和index不一致了。证明git reset HEAD file 只是恢复了暂存区的内容。证明3git checkout – file 暂存区覆盖了工作区$gitstatus On branch main Your branch is up todatewithorigin/main.Changes not stagedforcommit:(usegit add file...to update what will be committed)(usegit restore file...to discard changesinworking directory)modified: file.txt no changes added to commit(usegit addand/orgit commit -a)AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitcheckout -- file.txt AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitstatus On branch main Your branch is up todatewithorigin/main.nothing to commit, working tree clean AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)$gitdiffHEAD AdministratorDETOP-20240519Y MINGW64 /d/selfgit/dinglx/testgitcmd/testGitCmd(main)以上实验证明git checkout – file.txt # 暂存区覆盖了工作区git checkout – file.txt之前git status 有输出。git checkout – file.txt 之后git status 无输出。git diff HEAD 无输出。git checkout – file.txt 之后index和wd内容已经一致了。并且wd和HEAD也一样了。总结git checkout 提交ID – file 从仓库取文件同时覆盖暂存区工作区git checkout – file 只从暂存区恢复到工作区不动仓库git reset HEAD file 把暂存区恢复成当前最新提交A不动工作区。补充易混点git checkout c 没有 – file 切换整个仓库到c提交所有文件全部回退到c不要混淆– 的作用区分「提交哈希」和「文件名」防止文件名刚好和commit简写重名导致命令歧义。