不要慌!了解Git的逆向操作,轻松撤回提交

一、什么是逆向操作?

Git 操作流程图:
在这里插入图片描述
对于正向操作来说,Git 操作是由 workspace进行add操作进入Index,再commitRepository,最后pushRemote

但有时候也需要一些逆向操作,比如数据文件已经由 workspace进行add操作进入Index了,但是发现本次提交的数据有些问题,想把它撤回来,即撤到workspace中;或者数据文件已经commitRepository了,但是,我们想把数据回退,将其回退到Indexworkspace,甚至删除提交记录等。这就需要逆向操作

逆向操作思维导图:
在这里插入图片描述

二、暂存区 到 工作空间

如果数据已经由工作空间(workspace)提交(add)到暂存区(Index)了,现在想要回退,应该怎么操作?

可以使用git restore -S 命令,它主要用于将某个文件的状态恢复为指定的状态。

git restore -S 的用途:

  • 恢复文件状态:可以将文件恢复到某个特定的提交(commit)状态。
  • 签名验证: 使用 -S 选项可以确保恢复的内容经过签名验证,符合安全标准。

使用示例:假设有一个文件 example.cc,可以使用以下命令将其恢复到指定的提交状态(例如 abc123)。

git restore -S example.cc

这样,原本在暂存区的example.cc数据将回退到Untracked files状态。

三、本地仓库 到 暂存区、工作区及清空

如果数据已经由暂存区(Index)提交(commit)到本地仓库(Repository)了,现在想要回退,应该怎么操作?

可以使用git reset --softgit reset --mixedgit reset --hard ,它们的区别在于它们对工作区、暂存区和提交历史的影响程度不同。

  1. git reset --soft:主要是回退到 暂存区。

    • 影响范围:仅影响 HEAD 的位置。
    • 效果:不更改工作区和暂存区的内容,仅仅移动 HEAD 指针。
    • 适用场景:适合于需要修改最近提交历史的情况,但不想丢失当前工作区和暂存区的变更。
  2. git reset --mixed:主要是回退到 工作区(workspace),--mixedgit reset命令的默认参数。

    • 影响范围:影响 HEAD 的位置和暂存区。
    • 效果:不更改工作区内容,但是会将 HEAD 移动到指定提交,同时将这个提交之后的修改放入暂存区。
    • 适用场景:当需要撤销提交并且希望保留更改但不立即提交时使用。可以重新选择要包含在下一次提交中的更改。
  3. git reset --hard:完全取消提交和相关更改,就像重来没提交过一样。

    • 影响范围:影响 HEAD、暂存区和工作区。
    • 效果:将 HEAD 指向指定的提交,同时重置暂存区和工作区到该提交,丢弃所有未提交的更改。
    • 适用场景:适合于需要完全撤销到某个提交的情况,且不关心之前的修改。

git reset --soft命令用于重置当前分支的 HEAD 到一个指定的提交(commit),但不会更改工作区的文件或暂存区的内容。这个命令主要用于在不丢失当前工作内容的情况下,调整提交历史。因此--soft的方式是一种比较温和的方式进行重置。

语法:

git reset <--soft or --mixed or --hard> <commit or HEAD>

选择 git reset --soft 的场景:

  • 修改最近的提交历史:当你需要修改最近的一个或多个提交时,可以使用 git reset --soft 将 HEAD 重置到相应的提交,然后重新组织和提交更改。

  • 保留当前工作内容:如果你希望保留当前工作区和暂存区的内容,并在之后再次提交它们,git reset --soft 是一个不会丢失更改的选择。

  • 合并多次提交:可以用 git reset --soft 将多个小的提交合并成一个更大的提交,这样可以保持提交历史的整洁性和可读性。

四、工作区清空

要将工作区的数据清空,可以使用git checkout命令。主要用于在不同的分支之间切换、恢复文件或提交状态,以及创建新分支。

git checkout命令可以丢弃未暂存的更改,但是不会删除新文件。例如:

# 丢弃所有未暂存的更改:
git checkout .
# 丢弃自上次提交以来对文件的所有未暂存更改
git checkout <file>

git checkout -f 是 Git 中用于强制切换分支或者恢复文件到某个状态的命令。

基本用法:

  • 切换分支:当你想要切换到另一个分支,而当前分支上有未提交的更改时,执行 git checkout -f <branch> 会强制你切换到指定的 <branch>,并丢弃当前分支上的所有未保存的更改。也就是说,未提交的更改会被清除。

  • 恢复文件:如果你想要恢复某些文件到最后一次提交的状态,可以使用 git checkout -f <file>。这也会丢弃该文件在工作区中的更改,恢复为上次提交的状态。但是不会删除新文件。

例子:

# 强制切换到分支 `feature-branch`
git checkout -f feature-branch

# 强制恢复文件 `example.txt` 到最后一次提交的状态
git checkout -f example.txt

五、总结

在Git中,逆向操作是管理版本的重要部分,它帮助开发者在发现错误时及时纠正。通过使用不同的命令,如git restoregit reset,我们可以将文件或提交状态恢复到之前的状态,以应对各种情况。具体来说,git restore -S可用于恢复文件至特定提交,而git reset可实现从本地仓库到暂存区或工作区的灵活回退。此外,命令中的不同参数提供了多样化的选择,使得用户可以根据实际需求调整其操作的影响范围。掌握这些逆向操作技巧,有助于维护代码的稳定性和可管理性,确保开发过程的顺利进行。
在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值