Git 版本回退/撤销/重置:CheckOut VS Revert VS Reset

文章目录

  • [一、Git 中的常见操作](#一、Git 中的常见操作)
  • 二、不同情况的使用场景
    • [1. 有改动,未 add、未 commit、未 push](#1. 有改动,未 add、未 commit、未 push)
    • [2. 有改动,已 add,未 commit、未 push](#2. 有改动,已 add,未 commit、未 push)
    • [3. 有改动,已 add 和 commit,未 push](#3. 有改动,已 add 和 commit,未 push)
    • [4. 有改动,已 add、commit 和 push](#4. 有改动,已 add、commit 和 push)
  • [三、Revert vs Reset:何时使用](#三、Revert vs Reset:何时使用)
  • 四、总结

在 Git 版本控制中,如何有效地管理代码修改至关重要。特别是当代码出现问题或需要回退时,Git 提供了多种方法来撤销、回退和重置代码状态。常见的操作有 CheckOutRevertReset,它们的应用场景和效果各不相同。本文将对这三个命令的异同进行详细分析,并根据不同的代码状态提供相应的使用建议。


一、Git 中的常见操作

1. CheckOut

CheckOut 主要用于切换分支或恢复文件的状态。它可以帮助我们丢弃未提交的修改,并恢复到上一次提交的版本。

适用场景:

  • 有改动,但未 add、未 commit、未 push :本地修改了文件,但并未将其加入暂存区(git add)或提交(git commit)。此时,你可以使用 git checkout 来恢复文件到上次提交的状态,撤销本地修改。
  • 切换分支 :如果需要切换到其他分支进行工作,使用 git checkout 即可。

示例:

bash 复制代码
# 恢复文件到上次提交的状态
git checkout -- <file-name>

# 切换到其他分支
git checkout <branch-name>

2. Revert

Revert 用于撤销已经提交的更改。不同于 resetrevert 创建一个新的提交来反转前一个提交的修改,因此不会破坏提交历史。这是一个非常安全的撤销方式,尤其适用于已经推送到远程仓库的更改。

适用场景:

  • 已提交并推送到远程仓库的更改 :如果你已经推送到远程仓库,但需要撤销某次提交,git revert 是最安全的选择。它通过创建一个新的提交来反转之前的更改,而不会修改历史记录。
  • 撤销某次提交 :如果你想撤销某个已提交的更改,可以使用 git revert

示例:

bash 复制代码
# 撤销某次提交,创建一个新的提交来反转修改
git revert <commit-id>

3. Reset

Reset 是 Git 中最强大的命令之一,用于重置当前分支的指针到某个指定提交。reset 可以分为三种模式:--soft--mixed--hard,每种模式的行为有所不同。reset 可以修改本地的提交历史,甚至丢弃本地的修改。

适用场景:

  • 有改动且已 add,但未 commitpush :如果你已经将文件添加到暂存区(git add),但尚未提交(git commit),可以使用 git reset 来撤销 add,将文件从暂存区移除,保留修改。
  • 已提交但未推送的修改 :如果你已经进行了提交,但还未推送,可以使用 git reset 来撤销提交,并根据需要决定是否保留修改。reset 会重写历史记录,适用于清理本地提交。
  • 彻底重置 :如果你需要完全丢弃所有修改,可以使用 git reset --hard,它会清除暂存区和工作区的所有更改,恢复到某个提交的状态。

示例:

bash 复制代码
# 撤销最近的提交,但保留修改在暂存区
git reset --soft HEAD~1

# 撤销最近的提交,并将更改移出暂存区
git reset --mixed HEAD~1

# 完全撤销最近的提交,丢弃所有更改
git reset --hard HEAD~1

二、不同情况的使用场景

1. 有改动,未 add、未 commit、未 push

  • 使用 CheckOut 恢复文件到上次提交的状态:

    bash 复制代码
    git checkout -- <file-name>

2. 有改动,已 add,未 commit、未 push

  • 使用 Reset 将文件从暂存区移除:

    bash 复制代码
    git reset <file-name>


  • 或者使用 CheckOut 恢复文件:

    bash 复制代码
    git checkout -- <file-name>

3. 有改动,已 add 和 commit,未 push

  • 使用 Reset 撤销提交并保留修改:

    bash 复制代码
    git reset --soft HEAD~1
  • 使用 Reset 完全撤销提交并丢弃修改:

    bash 复制代码
    git reset --hard HEAD~1

4. 有改动,已 add、commit 和 push

  • 使用 Revert 撤销已经推送的提交:

    bash 复制代码
    git revert <commit-id>

然后再次push


三、Revert vs Reset:何时使用

Revert

  • 适用场景:撤销已提交并推送到远程仓库的修改。不会修改历史记录,而是创建一个新的提交来反转修改。
  • 优点:非常安全,不会破坏公共仓库的历史。
  • 缺点:会在历史记录中添加新的提交。

Reset

  • 适用场景:撤销本地修改或未推送的提交,适用于需要修改本地历史的情况。
  • 优点:可以撤销多个提交,完全修改本地历史。
  • 缺点:会改变历史记录,尤其是在多人协作时需要小心使用,避免丢失重要的提交。

四、总结

  • CheckOut:适用于恢复本地未提交的修改或切换分支,通常用于撤销工作区的修改。
  • Revert:适用于撤销已推送到远程的提交,不会修改历史记录,适用于公共仓库。
  • Reset:适用于撤销本地提交或修改历史,特别适合尚未推送的修改。

根据不同的场景,选择合适的命令来管理你的代码历史,确保代码库的清晰与一致性。

相关推荐
荔枝梅梅5 小时前
新手程序员 SSH 第一课:从 Git 仓库连接失败理解 SSH 协议与密钥配置
git
玄芯散人5 小时前
【筑基·057】Git代码时光机:版本控制入门到分支管理
git·版本控制·嵌入式开发
szephyr8 小时前
Git 分支管理实战:feature/release/hotfix 怎么用才不乱
git·分支管理·团队协作·工作流·hotfix
一木 之林8 小时前
手搓家庭服务器:二手装机、Docker部署、端口映射与frp内网穿透
服务器·人工智能·git·编辑器
烛之武9 小时前
Git教程笔记
git·gitee
Sharewinfo_BJ9 小时前
PBIP项目结构与文件解析
git·powerbi·智信bi·上北智信
Hvitur21 小时前
Linux安装Git【离线安装】
git
howard20051 天前
6.4 Git安装与配置
git·安装配置
tryCbest1 天前
git实现前后端分离项目提交同一个仓库
git·gitee
Mr.朱鹏1 天前
Git 仓库同时推送到 Gitee 与 GitHub 配置指南
git·gitee·开源·github