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其实是用版本库里的版本替换工作区的版本,所以无论工作区是修改还是删除都可一键还原


相关推荐
天远Date Lab2 小时前
构建金融级信贷审批系统:Java Spring Boot 集成天远借贷行为验证 API 全指南
java·大数据·spring boot·金融
-拟墨画扇-2 小时前
Git | 版本控制操作
大数据·git·gitee·github
一条闲鱼_mytube2 小时前
GitHub K8S CI/CD 部署指南
github
LJ97951112 小时前
智能连接:Infoseek如何重新定义媒体发布效率
大数据·人工智能
安达发公司2 小时前
安达发|赢在智造赛道:给新能源汽车,装上“自动排产软件”导航
大数据·人工智能·汽车·aps高级排程·aps排程软件·安达发aps·自动排产软件
易营宝2 小时前
运营海外社交媒体平台的KPI设置与预算分配模板
大数据·人工智能·媒体
DX_水位流量监测2 小时前
城市易涝点水位雨量监测设备技术体系与实践应用
大数据·运维·服务器·网络·人工智能
2501_921649493 小时前
日本股票 API 对接,接入东京证券交易所(TSE)实现 K 线 MACD 指标
大数据·人工智能·python·websocket·金融
lyx_20163 小时前
尝试理清楚Github fork, tag, release和PR
github