概述
-
在
Git的日常使用中,开发者们最常面对的不是复杂的合并策略或精巧的分支模型,而是三个看似简单却至关重要的问题:- 当前状态如何?
- 历史记录怎样?
- 代码有何变化?
-
这些问题的答案决定了我们能否高效、安全地进行版本控制。本文将深入剖析
Git中四个构成开发者日常工作流的强大指令:git status------ 显示工作区和暂存区的当前状态git log------ 显示按时间倒序排列的当前分支提交记录git diff------ 比较不同版本、不同区域之间文件差异,显示代码的增删改变化情况git reflog------ 显示所有HEAD指针的移动轨迹
查询仓库状态 git status
-
功能 ------ 显示工作目录和暂存区的当前状态,帮助了解:
-
哪些文件被修改但未暂存
-
哪些文件已暂存准备提交
-
未被
Git跟踪的新文件 -
当前所在分支及其与远程分支的关系
-
-
语法
shgit status [<options>]参数 说明 --long详细格式(默认) -s或--short简洁格式 -b或--branch显示分支信息(包含本地/远程分支关联状态) --show-stash同时显示 stash中的变更记录-- <pathspec>显示指定路径下的状态 -
示例 ------ 详细模式查询
sh$ git status On branch main # 在分支 main 上 Your branch is up to date with 'origin/main'. # 已暂存的更改(待提交commit) Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: README.md # 已修改+未暂存的更改(待添加add) Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: index.html # 新文件,尚未被 Git 跟踪(待添加add) Untracked files: (use "git add <file>..." to include in what will be committed) new-file.txt格式说明:
-
Changes not staged for commit------ 已修改但未暂存的更改 -
Changes to be committed------ 已暂存的更改(在索引中) -
Untracked files------ 新文件,尚未被Git跟踪
-
-
示例 ------ 简洁模式查询
sh$ git status -s M README.md M index.html ?? new-file.txt格式说明 :
XY filename- 第一个字符
X------ 暂存区staged的状态 - 第二个字符
Y------ 工作区working directory的状态
代码 含义 代码 含义 (空格)无变化 ?未跟踪文件 M文件修改 U更新但未合并 A文件添加 R重命名 D文件删除 C复制 - 第一个字符
-
示例 ------ 显示分支信息
shgit status -b # 或 --branch -
示例 ------ 忽略子模块
shgit status --ignore-submodules
查询分支提交记录 git log
-
功能 ------ 按时间倒序排列显示当前分支的提交记录
-
语法
shgit log [options] [<revision-range>] [[--] <path>...] -
示例 ------ 查看项目的分支提交情况
sh$ git log commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 25 11:21:54 2024 +0800 append GPL commit e475afc93c209a690c39c13a46716e8fa000c366 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 25 11:01:13 2024 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 25 10:44:22 2024 +0800 wrote a readme file格式说明:
-
commit------ 唯一标识提交的40位SHA-1哈希值 -
Author------ 执行git commit配置的用户信息 -
Date------ 执行git commit的时间信息 -
Commit Message------ 提交信息
-
-
示例 ------ 简洁模式查询
sh$ git log --pretty=oneline 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL e475afc93c209a690c39c13a46716e8fa000c366 add distributed eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file -
示例 ------ 筛选显示
sh# 显示最近5条提交 git log -n 5 # 按作者筛选 git log --author="John" # 按时间筛选 git log --since="2023-01-01" --until="2023-12-31" git log --after="2 weeks ago" # 按提交信息筛选 git log --grep="bugfix"
查询历史记录 git reflog
-
功能 ------ 查看引用日志
reference log,记录HEAD和分支引用的所有移动-
恢复意外删除的分支或提交
-
找回误操作(如错误的
reset、rebase等)前的状态 -
查看本地仓库的所有操作历史
-
-
语法
shgit reflog [show] [<subcommand>] [<options>] [<ref>] -
示例 ------ 查询分支提交日志
sh$ git reflog e475afc HEAD@{1}: reset: moving to HEAD^ 1094adb (HEAD -> master) HEAD@{2}: commit: append GPL e475afc HEAD@{3}: commit: add distributed eaadf4e HEAD@{4}: commit (initial): wrote a readme file格式说明:每行的格式
<commit-hash> <ref-position> <action>: <description>commit-hash------ 提交的哈希值(前7位)ref-position------HEAD指针的位置action------ 执行的操作类型description------ 操作描述
如记录:
eaadf4e HEAD@{4}: commit (initial): wrote a readme fileeaadf4e------ 提交哈希值HEAD@{4}------ 这是HEAD指针在历史中的第4个位置(从当前往前数)commit (initial)------ 执行提交操作,这是初始提交wrote a readme file------ 提交信息/描述
如记录:
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL(HEAD -> master)------ 当前HEAD指向master分支,并指向这个提交
-
示例 ------ 限制条件查询
shgit reflog -n 20 # 显示最近20条记录 git reflog --date=iso # 显示具体时间 -
区别
git log显示结果,是当前可见的提交历史git reflog显示过程,是如何到达当前状态的所有步骤方面 git loggit reflog查看内容 提交历史 commits引用变更历史 reference changes显示范围 当前分支的提交链 所有 HEAD/分支的移动"丢失"提交 不显示(已被 reset/rebase移除的)显示(所有操作记录) 操作记录 只记录 commit记录 所有操作 ( commit、reset、checkout等)主要用途 查看项目发展历史 恢复误操作、查看完整操作日志 假设执行以下操作:
sh1.提交 A → 提交 B → 提交 C 2.执行 git reset --hard HEAD^^(回到提交 A) 3.提交 D-
git log显示:sh提交 D (commit) 提交 A (commit) -
git reflog显示:sh提交 D (commit) 回退到A (reset: moving to HEAD^^) 提交 C (commit) 提交 B (commit) 提交 A (commit)
-
比较差异 git diff
-
功能 ------ 比较不同版本、不同区域之间文件差异,显示代码的增删改变化
-
比较工作区 与暂存区 ------ 未
git add的修改 -
比较暂存区 与最新提交 ------ 已
git add但未git commit的修改 -
比较不同提交的差异 ------ 查看历史版本变化
-
比较不同分支的差异
-
显示文件的详细修改内容 ------ 行级变化
-
-
语法
shgit diff [<options>] [<commit>] [--] [<path>...]参数 说明 [<options>]控制输出格式的选项(如 --color、--stat)[<commit>]可指定提交哈希、分支名或 HEAD[--]分隔符,表示后面的参数是文件路径(而非分支/提交) [<path>]文件名、目录名或通配符模式 -
示例 ------ 工作区 vs 暂存区 ,查看工作区的修改(即未
git add的变更)sh$ git diff diff --git a/readme.txt b/readme.txt index 0b52c0d..2041fdf 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,3 @@ Hello word! -Hello git! \ No newline at end of file +Hello diff! \ No newline at end of file格式说明:
*shdiff --git a/readme.txt b/readme.txt- 比较的是两个版本的
readme.txt文件 a/表示旧版本(修改前)b/表示新版本(修改后)
shindex 0b52c0d..680c068 1006440b52c0d..680c068------ 两个版本的Git对象哈希值100644------ 文件模式(普通文件,可读写)
sh--- a/readme.txt +++ b/readme.txt--------- 旧版本文件的标记+++------ 新版本文件的标记
sh@@ -1,2 +1,3 @@-1,2------ 旧版本从第1行开始,共2行+1,3------ 新版本从第1行开始,共3行
shHello word!- 无变化:这一行在两个版本中都存在,且内容相同
sh-Hello git!- 删除标记 :
-表示这一行在旧版本中存在,但在新版本中被修改
sh+Hello diff!- 添加标记 :
+表示这一行是新版本中添加的
sh\ No newline at end of file- 文件结尾标记:两个版本的文件末尾都没有换行符
- 比较的是两个版本的
-
示例 ------ 暂存区 vs 最新提交,查看已暂存但未提交的变更
shgit diff --cached # 或 git diff --staged -
示例 ------ 工作区 vs 最新提交,查看所有未提交的变更(包括未暂存和已暂存的)
shgit diff HEAD -
示例 ------ 比较两个不同提交的差异
shgit diff abc123 def456 # 比较两个提交 git diff HEAD~1 HEAD # 比较前一次提交和当前提交 git diff HEAD~3..HEAD # 比较最近3次提交的变更 -
示例 ------ 比较两个不同分支的差异
shgit diff main..feature # 比较main和feature分支 -
示例 ------ 比较特定文件的差异
shgit diff -- README.md # 仅查看 README.md 的变更