Git | 状态查看操作

概述

  • Git 的日常使用中,开发者们最常面对的不是复杂的合并策略或精巧的分支模型,而是三个看似简单却至关重要的问题:

    • 当前状态如何?
    • 历史记录怎样?
    • 代码有何变化?
  • 这些问题的答案决定了我们能否高效、安全地进行版本控制。本文将深入剖析 Git 中四个构成开发者日常工作流的强大指令:

    • git status ------ 显示工作区和暂存区的当前状态
    • git log ------ 显示按时间倒序排列的当前分支提交记录
    • git diff ------ 比较不同版本、不同区域之间文件差异,显示代码的增删改变化情况
    • git reflog ------ 显示所有 HEAD 指针的移动轨迹

查询仓库状态 git status

  • 功能 ------ 显示工作目录和暂存区的当前状态,帮助了解:

    • 哪些文件被修改但未暂存

    • 哪些文件已暂存准备提交

    • 未被 Git 跟踪的新文件

    • 当前所在分支及其与远程分支的关系

  • 语法

    sh 复制代码
    git 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 复制
  • 示例 ------ 显示分支信息

    sh 复制代码
    git status -b  	# 或 --branch
  • 示例 ------ 忽略子模块

    sh 复制代码
    git status --ignore-submodules

查询分支提交记录 git log

  • 功能 ------ 按时间倒序排列显示当前分支的提交记录

  • 语法

    sh 复制代码
    git 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 ------ 唯一标识提交的 40SHA-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 和分支引用的所有移动

    • 恢复意外删除的分支或提交

    • 找回误操作(如错误的 resetrebase 等)前的状态

    • 查看本地仓库的所有操作历史

  • 语法

    sh 复制代码
    git 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 file

    • eaadf4e ------ 提交哈希值
    • HEAD@{4} ------ 这是 HEAD 指针在历史中的第 4 个位置(从当前往前数)
    • commit (initial) ------ 执行提交操作,这是初始提交
    • wrote a readme file ------ 提交信息/描述

    如记录:1094adb (HEAD -> master) HEAD@{2}: commit: append GPL

    • (HEAD -> master) ------ 当前 HEAD 指向 master 分支,并指向这个提交
  • 示例 ------ 限制条件查询

    sh 复制代码
    git reflog -n 20  			# 显示最近20条记录
    git reflog --date=iso  		# 显示具体时间
  • 区别

    git log 显示结果,是当前可见的提交历史

    git reflog 显示过程,是如何到达当前状态的所有步骤

    方面 git log git reflog
    查看内容 提交历史 commits 引用变更历史 reference changes
    显示范围 当前分支的提交链 所有 HEAD/分支的移动
    "丢失"提交 不显示(已被 reset/rebase 移除的) 显示(所有操作记录)
    操作记录 只记录 commit 记录 所有操作commitresetcheckout 等)
    主要用途 查看项目发展历史 恢复误操作、查看完整操作日志

    假设执行以下操作:

    sh 复制代码
    1.提交 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 的修改

    • 比较不同提交的差异 ------ 查看历史版本变化

    • 比较不同分支的差异

    • 显示文件的详细修改内容 ------ 行级变化

  • 语法

    sh 复制代码
    git 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

    格式说明:
    *

    sh 复制代码
    diff --git a/readme.txt b/readme.txt
    • 比较的是两个版本的 readme.txt 文件
    • a/ 表示旧版本(修改前)
    • b/ 表示新版本(修改后)
    sh 复制代码
    index 0b52c0d..680c068 100644
    • 0b52c0d..680c068 ------ 两个版本的 Git 对象哈希值
    • 100644 ------ 文件模式(普通文件,可读写)
    sh 复制代码
    --- a/readme.txt
    +++ b/readme.txt
    • --- ------ 旧版本文件的标记
    • +++ ------ 新版本文件的标记
    sh 复制代码
    @@ -1,2 +1,3 @@
    • -1,2 ------ 旧版本从第1行开始,共2行
    • +1,3 ------ 新版本从第1行开始,共3行
    sh 复制代码
    Hello word!
    • 无变化:这一行在两个版本中都存在,且内容相同
    sh 复制代码
    -Hello git!
    • 删除标记- 表示这一行在旧版本中存在,但在新版本中被修改
    sh 复制代码
    +Hello diff!
    • 添加标记+ 表示这一行是新版本中添加的
    sh 复制代码
    \ No newline at end of file
    • 文件结尾标记:两个版本的文件末尾都没有换行符
  • 示例 ------ 暂存区 vs 最新提交,查看已暂存但未提交的变更

    sh 复制代码
    git diff --cached
    # 或
    git diff --staged
  • 示例 ------ 工作区 vs 最新提交,查看所有未提交的变更(包括未暂存和已暂存的)

    sh 复制代码
    git diff HEAD
  • 示例 ------ 比较两个不同提交的差异

    sh 复制代码
    git diff abc123 def456	# 比较两个提交
    git diff HEAD~1 HEAD	# 比较前一次提交和当前提交
    git diff HEAD~3..HEAD	# 比较最近3次提交的变更
  • 示例 ------ 比较两个不同分支的差异

    sh 复制代码
    git diff main..feature  	# 比较main和feature分支
  • 示例 ------ 比较特定文件的差异

    sh 复制代码
    git diff -- README.md  	# 仅查看 README.md 的变更

相关推荐
码灵2 小时前
Git相关软件常用操作
git
FIT2CLOUD飞致云2 小时前
喜报|DataEase开源BI工具获颁Gitee 2000 Star荣誉奖杯
gitee·开源·dataease·bi·飞致云
-拟墨画扇-3 小时前
Git | 简介与安装
大数据·git·elasticsearch
junlaii3 小时前
Windows Claude Code Git Bash 依赖修复教程
windows·git·bash
白完就是肥3 小时前
Git基本使用
git
HelloGitHub3 小时前
《HelloGitHub》第 117 期
开源·github
Joy T12 小时前
【Git 团队协作】从 Fork 到 PR:企业级开发标准作业程序 (SOP)
git
最贪吃的虎13 小时前
Git: rebase vs merge
java·运维·git·后端·mysql
charlie11451419119 小时前
Git团队协作完全入门指南(上)
笔记·git·学习·教程·工程