Git | 文件修改操作

概述

Git 与其他版本控制系统的本质区别在于 ------ Git 跟踪并管理的单元是修改(增/删/改/重命名)而非整个文件

验证
  • 第一次修改并添加 ------ readme.txt 加一行内容,通过 git add 添加

    sh 复制代码
    $ git add readme.txt
    sh 复制代码
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
          modified:   readme.txt
  • 第二次修改但不添加 ------ readme.txt 加一行内容,但是不通过 git add 添加

  • 提交修改 ------ 通过 git commit 提交修改。通过输出信息可知,第二次修改没被提交

    sh 复制代码
    $ git commit -m "git tracks changes"
    [master 519219b] git tracks changes
     1 file changed, 1 insertion(+)
    sh 复制代码
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
    	modified:   readme.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
  • 流程 ------ 第一次修改 -> git add -> 第二次修改 -> git commit

  • 原因 ------ 因为在工作区的第二次修改并没有放入暂存区 ,所以 git commit 只负责把暂存区的第一次修改提交。

    这说明,一次提交的是放入暂存区的修改 ,而不是整个 readme.txt 文件


指令介绍

恢复文件、切换分支 git checkout
  • 两种主要模式

    主要模式 语法 用途 特点
    切换分支 git checkout <分支> 切换工作分支 更新工作目录,改变 HEAD 指向
    恢复文件 git checkout <提交> <文件> 恢复文件到历史版本 不改变 HEAD,仅替换文件内容
  • 文件恢复 ------ 丢弃工作区未暂存的修改、从历史提交或其他分支恢复文件

    • 从历史提交恢复文件

      sh 复制代码
      git checkout <commit> -- <file>     # 恢复文件到指定版本
      sh 复制代码
      git checkout main -- README.md      # 示例:从 main 恢复文件
    • 从索引恢复文件(撤销工作区修改)

      sh 复制代码
      git checkout -- <file>              # 撤销工作区的修改(未暂存)
      git checkout HEAD -- <file>         # 同上,显式指定 HEAD
    • 处理合并冲突

      sh 复制代码
      git checkout --ours <file>          # 使用当前分支版本解决冲突
      git checkout --theirs <file>        # 使用合并分支版本解决冲突
      git checkout -m <file>              # 恢复原始冲突标记
      git checkout -f <file>              # 强制覆盖未合并的文件
  • 分支管理

    • 切换分支

      sh 复制代码
      git checkout [<branch>]						# 切换到<branch>分支
    • 创建分支

      sh 复制代码
      git checkout -b <new-branch> [<start-point>]    	# 创建新分支(分支不存在时报错)
      git checkout -B <branch> [<start-point>]        	# 强制创建/重置分支(分支存在则重置)
    • 分离 HEAD 模式

      sh 复制代码
      git checkout --detach [<branch>]    			# 分离 HEAD 到分支尖端
      git checkout <commit>               			# 分离 HEAD 到指定提交
版本回退 git reset
  • 语法

    sh 复制代码
    git reset [<mode>] [<commit>]
    参数 mode HEAD 移动 暂存区 工作区 适用场景
    --soft ✅ 回退 ❌ 保持不变 ❌ 保持不变 回退 HEAD<commit>
    --mixed(默认) ✅ 回退 ✅ 重置(撤销 git add ❌ 保持不变 撤销暂存区
    --hard ✅ 回退 ✅ 重置 ✅ 完全回退 撤销暂存区和工作区
专用恢复文件 git restore
  • 功能 ------ Git 2.23 引入的 文件状态恢复命令 ,用于精准撤销工作区或暂存区的修改,替代部分 git checkoutgit reset 功能

    • 撤销工作区修改 --- 即丢弃未暂存的更改
    • 撤销暂存区修改 --- 即取消 git add
    • 从历史提交恢复文件 --- 即覆盖工作区/暂存区
  • 语法

    sh 复制代码
     git restore [<options>] [--source=<branch>] <file>...
    参数 说明
    -s <commit> / --source=<commit> 指定从哪个版本恢复(默认:暂存区或 HEAD
    -S / --staged 暂存区中撤销文件的修改,但不影响工作区
    -W / --worktree 工作区中撤销文件的修改 - 把暂存区 的内容恢复到工作区 - 如果文件不在暂存区,则恢复到最新提交状态
    -SW / --staged --worktree 同时恢复暂存区和工作区(覆盖所有修改)
  • 具体示例

    • 参数 --staged ------ 从最新提交恢复到暂存区

      sh 复制代码
      git add readme.txt					# 1、添加文件到暂存区
      git restore --staged readme.txt		# 2、从暂存区移除(取消暂存)
      # 此时 readme.txt 的修改
      # - 在工作区还在
      # - 但不在暂存区(需要重新 git add)
    • 参数 --worktree

      sh 复制代码
      # 1、修改 readme.txt(未暂存)
      git restore --worktree readme.txt		# 2、从暂存区恢复到工作区
      # 此时 readme.txt 的修改已完全被撤销

撤销修改

相关指令
  • git checkout ------ 切换分支/恢复文件
  • git restore ------ 精准撤销工作区或暂存区的修改(Git 2.23+ 推荐,专用于文件恢复)
  • git reset ------ 移动 HEAD 或重置暂存区/工作区(功能更通用)
场景一:仅工作区修改,未add,需撤销修改
  1. 初始状态 ------ 假设 readme.txt 在版本库中的最新提交(HEAD)内容为:

    txt 复制代码
    Hello, Git!

    工作区Hello, Git!(和 HEAD 一致)

    暂存区Hello, Git!(和 HEAD 一致)

  2. 修改文件但不添加 ------ 修改工作区的文件内容,但是未添加未添加

    txt 复制代码
    Hello, Git! This is a new line.

    工作区Hello, Git! This is a new line.(已修改)

    暂存区Hello, Git!(未 git add,暂存区未更新)

    HEADHello, Git!(未 git commit,版本库未变化)

  3. 撤销修改 ------ 输入命令 git checkoutgit restore,拉取暂存区的修改,恢复到之前的状态

    sh 复制代码
    git checkout -- readme.txt
    或
    git restore readme.txt  	# 缺省用 --source=HEAD 和 --worktree
    • 检查状态 ------ readme.txt 在工作区有修改,但未暂存(即暂存区的内容和 HEAD 一致)
    • 恢复策略 ------ 因为修改未暂存,所以用 HEAD 指向的当前版本 (最近一次提交的内容 HEAD)覆盖工作区

    工作区 :被还原为 Hello, Git!

    暂存区Hello, Git!

    HEADHello, Git!
    注意git checkout -- file 命令中 -- 很重要。没有--,就变成切换到另一个分支 命令,后续分支管理会再次使用它

场景二:已 add,未 commit,需撤销修改
  1. 初始状态 ------ 假设 readme.txt 在版本库中的(HEAD)内容为:

    复制代码
    Hello, Git!

    工作区Hello, Git!(和 HEAD 一致)

    暂存区Hello, Git!(和 HEAD 一致)

  2. 修改并添加到暂存区

    • 修改工作区的文件内容: Hello, Git! This is a new line.
    • 添加到暂存区:git add readme.txt

    工作区Hello, Git! This is a new line.(已修改)

    暂存区Hello, Git! This is a new line.(已暂存)

    HEADHello, Git!(未提交 git commit,版本库未变化)

  3. 撤销暂存区修改 ------ 输入命令 git reset ,将暂存区的内容撤销( unstage)为 HEAD 的状态

    sh 复制代码
    git reset HEAD readme.txt

    工作区Hello, Git! This is a new line.(修改仍在)

    暂存区 :恢复为 Hello, Git!(和 HEAD 一致)

    HEADHello, Git!

  4. 撤销工作区修改 ------ 输入命令 git checkout,丢弃工作区修改(即场景一情况)

    sh 复制代码
    git checkout -- readme.txt

    工作区 :被还原为 Hello, Git!(和 HEAD 一致)

    暂存区 :仍为 Hello, Git!

    HEAD : 仍为 Hello, Git!

场景三:已 add,已 commit,需撤销修改
  1. 初始状态 ------ 假设 readme.txt 在版本库中的最新提交(HEAD)内容为:

    sh 复制代码
    Hello, Git!

    工作区Hello, Git!(和 HEAD 一致)

    暂存区Hello, Git!(和 HEAD 一致)

  2. 修改、添加、提交文件

    • 修改工作区的文件内容: Hello, Git! This is a new line.
    • 添加到暂存区:git add readme.txt
    • 提交到HEADgit commit -m "add new line"

    工作区Hello, Git! This is a new line.(最新提交)

    暂存区Hello, Git! This is a new line.(与 HEAD 一致)

    HEADHello, Git! This is a new line.(与 HEAD 一致)

  3. 撤销修改 ------ 输入命令 git reset --hard 指令,将当前分支回退到上一个提交,并强制更新工作区和暂存区

    sh 复制代码
    git reset --hard HEAD^
    • 重置 HEAD:将 HEAD 指针指向上一次提交 HEAD^(即 Hello, Git!
      • 覆盖暂存区和工作区:--hard 强制将 暂存区工作区 的内容回退到 HEAD^ 的状态

    工作区Hello, Git!(强制回退)

    暂存区Hello, Git!(强制回退)

    HEADHello, Git!(指针指向上一次提交)
    注意:该操作强制回退所有文件(包括提交、暂存区和工作区)到上一个版本

    • 对于已提交的修改,可以通过 reflog 恢复
    • 对于未提交的修改(在暂存区和工作区的修改),将永久丢失

删除文件

相关指令
  • git rm ------ 在工作区删除文件,并提交删除操作到暂存区,以便下一次提交时在分支生效
  • git checkout ------ 恢复文件
场景一:工作区中删除文件
  • 删除工作区文件 ------ 运行命令 rm 删除工作区的文件

    sh 复制代码
    rm test.txt
场景二:版本库中删除文件
  • 删除暂存区文件 ------ 运行命令 git rm 删除工作区和暂存区的文件

    sh 复制代码
    git rm test.txt
  • 删除版本库文件 ------ 运行命令 git commit 提交修改到分支上

    sh 复制代码
    git commit -m "remove test.txt"
场景三:误删恢复文件
  • 恢复文件 ------ 误删文件,恢复到最新版本

    sh 复制代码
    git checkout -- test.txt

    git checkout其实是用版本库里的版本替换工作区的版本,所以无论工作区是修改还是删除都可一键还原


相关推荐
专注数据的痴汉2 分钟前
「数据获取」全国民用运输机场吞吐量排名(2006-2024)
java·大数据·服务器·数据库·信息可视化
和你一起去月球22 分钟前
Agent 应用开发与落地学习总结
大数据·ai·大模型·agent·agentic
JZC_xiaozhong29 分钟前
分析型数据库 ClickHouse 在数据中台中的集成
大数据·数据库·clickhouse·架构·数据一致性·数据孤岛解决方案·数据集成与应用集成
说私域31 分钟前
基于AI智能名片链动2+1模式预约服务商城小程序的数据管理与系统集成研究
大数据·人工智能·小程序
secondyoung35 分钟前
Git使用:rebase用法
c语言·经验分享·git·vscode
AC赳赳老秦36 分钟前
技术文档合著:DeepSeek辅助多人协作文档的风格统一与内容补全
android·大数据·人工智能·微服务·golang·自动化·deepseek
安达发公司1 小时前
安达发|煤炭行业APS高级排产:开启高效生产新时代
大数据·人工智能·aps高级排程·安达发aps·车间排产软件·aps高级排产
中科天工1 小时前
如何实现工业4.0智能制造的自动化包装解决方案?
大数据·人工智能·智能
沃达德软件1 小时前
警务指挥情报中心建设
大数据·数据仓库·数据库开发
董厂长1 小时前
前置RAG意图召回解决的问题
大数据·llm·agent·rag·意图识别