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:适用于撤销本地提交或修改历史,特别适合尚未推送的修改。

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

相关推荐
jayaccc12 小时前
Git命令大全:从入门到精通
大数据·git·elasticsearch
论迹14 小时前
【Git】-- Git安装 & 卸载(ubuntu)
git·ubuntu·elasticsearch
论迹15 小时前
【Git】-- Git基本操作
git·ubuntu
wxr061619 小时前
GIT学习
git·学习
猫头虎21 小时前
2026最新|GitHub 启用双因素身份验证 2FA 教程:TOTP.app 一键生成动态验证码(新手小白图文实操)
git·开源·gitlab·github·开源软件·开源协议·gitcode
爱学英语的程序员1 天前
让AI 帮我做了个个人博客(附提示词!)
人工智能·git·vue·github·node·个人博客
liu****1 天前
git工具
git·python·算法·机器学习·计算机基础
wxr06161 天前
git无法克隆
git
cooldream20091 天前
Git 拒绝推送(Push Rejected)问题全解析与解决方案实战指南
git