'git reset --hard HEAD~1' 和 'git reset --soft HEAD~1' 之间有什么区别?

2024-01-30

我试图撤消 git 中的提交。使用有危险吗git reset --hard HEAD~1?

不同选项之间有什么区别git reset?


git reset确实知道五种“模式”:软、混合、硬、合并和保留。我将从前三种开始,因为这些是您通常会遇到的模式。之后你会发现一个不错的小奖励,所以请继续关注。


假设您有一个具有类似于以下历史记录的存储库:

7e05a95  (HEAD -> main) Update a
e62add5  Update b
ca9ae0a  Update a
9b6060d  Add c
eebe372  Add b
947586a  Add a

其中最新提交(7e05a95) 包含这些更改:

diff --git a/a b/a
index b66ba06..28b68e2 100644
--- a/a
+++ b/a
@@ -1 +1 @@
-new content
+new new content

现在当你跑步时会发生什么git reset与各种不同的模式?让我们来看看吧!

soft

使用时git reset --soft HEAD~1您将从当前分支中删除最后一次提交,但文件更改将保留在您的工作树 https://craftquest.io/articles/what-is-the-working-tree-in-git。此外,更改将保留在您的索引中,因此以下是git commit将创建一个与您之前“删除”的提交具有完全相同更改的提交。

这在实践中会是什么样子?像这样:

> git reset --soft HEAD^ # Assuming HEAD points at 7e05a95
> git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   a

正如您看到文件中的更改a已在索引上,并准备再次提交。

mixed

这是默认模式,与软模式非常相似。当“删除”提交时git reset HEAD~1您仍会将更改保留在工作树中,但不会保留在索引中;因此,如果您想“重做”提交,则必须添加更改(git add)在提交之前。

实际上,结果可能如下所示:

> git reset --mixed HEAD^ # Assuming HEAD points at 7e05a95
> git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   a

no changes added to commit (use "git add" and/or "git commit -a")

文件的变化a仍然存在,但不在索引中。

hard

使用时git reset --hard HEAD~1你会丢失所有未提交的更改和所有未跟踪的文件除了上次提交中引入的更改之外。这些更改不会保留在您的工作树中,因此git status命令将告诉您存储库中没有任何更改。

小心对待这个。如果您不小心删除了从未跟踪过的未提交的更改git(说:已提交或至少添加到索引中),您无法使用git.

一个实际的例子可能如下所示:

> git reset --hard HEAD^ # Assuming HEAD points at 7e05a95
> git status
On branch main
nothing to commit, working tree clean

如您所见,没有任何变化。假设您在文件中还有一些未提交的更改b这些也会丢失!

> echo 'some uncommitted changes' > b
> git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   b

no changes added to commit (use "git add" and/or "git commit -a")

> git reset --hard HEAD^ # Assuming HEAD points at 7e05a95
> git status
On branch main
nothing to commit, working tree clean

Bonus

keep

git reset --keep HEAD~1是一个有趣且有用的。它仅重置之间不同的文件current HEAD和给定的提交。如果其中一个或多个文件有未提交的更改,它会中止重置。它基本上充当一个更安全的版本hard.

让我们回顾一下之前的示例,其中您有一些未提交的更改b:

> echo 'some uncommitted changes' > b
> git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   b

no changes added to commit (use "git add" and/or "git commit -a")

> git reset --keep HEAD^ # Assuming HEAD points at 7e05a95
> git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   b

no changes added to commit (use "git add" and/or "git commit -a")

您删除了文件中的更改a但保留了文件中未提交的更改b!

所以重申一下:“硬”将消除all更改,而“keep”仅从重置提交中删除更改。


这些模式中的每一种都在git 重置文档 http://git-scm.com/docs/git-reset.

Note
做的时候git reset要删除提交,该提交并没有真正丢失,只是没有指向它或其任何子项的引用。您仍然可以恢复已“删除”的提交git reset通过查找它的 SHA-1 密钥,例如使用以下命令git reflog.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

'git reset --hard HEAD~1' 和 'git reset --soft HEAD~1' 之间有什么区别? 的相关文章

随机推荐

  • Java 和 Python 一起出现在单个 Google App Engine 项目中

    我目前有一个在 Google App Engine 上运行的 Java 应用程序 但我想添加 Python 模块的 SearchableModel 提供的功能 当然是搜索功能 是否可以在与 Java 代码相同的项目中运行 python 代码
  • Pyinstaller.exe 未产生预期结果

    这是我第一次使用 pyinstaller 在 Windows 机器上构建 py 的 exe 我已成功生成 exe 但是当我运行代码时 它不会生成我的代码应生成的 csv 文件 附带说明一下 当我在 IDE 中运行脚本时 它成功生成了我期望的
  • OpenGL 渲染器不适用于冰淇淋三明治

    您好 我正在使用 OpenGL ES 1 0 构建 Android 游戏 一切都工作正常 直到我的 Transformer 平板电脑更新为冰淇淋三明治 现在 任何使用 OpenGL 渲染的内容都不会显示在屏幕上 我环顾四周 发现了Textu
  • 后期绑定与多态性 - 有什么区别?

    我见过两者互换使用 但它们真的意味着相同吗 根据我的理解 多态性延伸了这样一个事实 即您可以通过子类的实例交换类的实例 而后期绑定意味着当您调用实例的方法时 类型决定调用哪个方法 子类 超类 维基百科有一篇关于此的非常好的文章 http e
  • Ajax woocommerce 在弹出窗口中跟踪订单,无需重新加载页面

    我通过短代码将订单跟踪放在弹出窗口中 但问题是单击并发送请求后 页面将重新加载并且弹出窗口关闭 我希望通过 Ajax 在同一个弹出窗口中显示请求的结果 并且不重新加载页面 我搜索了整个网络 但找不到方法 如果有人知道如何做到这一点 请指导我
  • 在 Swift 中创建 UIView 的副本

    因为对象是引用类型 而不是值类型 如果您设置UIView等于另一个UIView 视图是同一对象 如果您修改其中一个 您也会修改另一个 我有一个有趣的情况 我想添加一个UIView作为另一个视图中的子视图 然后我进行一些修改 并且这些修改不应
  • c# 更改AD密码Directoryservices

    我试图让下面的代码工作 问题是 有时可以 有时不可以 当失败时 会出现错误 0x800704F1 系统无法联系域控制器来服务身份验证请求 我想说大约 90 的情况都会失败 我尝试通过将其添加到 contexttype 后面来给它一个静态 D
  • 什么是“.”和 Windows 目录中的“..”?

    我正在编写一个程序来列出 Windows 目录中的所有文件 我只是使用提供的文件管理功能 但我对结果很好奇 Target file is The first file found is The next file found is The
  • 触发问题,更新面板不起作用?

    我创建动态 LinkBut ton 并将 LinkBut ton 的单击触发器添加到 UpdatePanel 现在 当我第一次单击任何一个链接按钮时 触发器运行良好 并显示我的选择 没有回发 之后 我单击其他 LinkBut ton 所有页
  • 哪种做法更好 - 全球导入或本地导入

    我正在 django 中开发一个应用程序 我怀疑在全局级别导入库是否比在本地 每个函数 级别导入库对内存或性能有任何影响 如果按功能或视图导入 则导入单独需要的模块可以节省空间 对吗 或者这样做有什么负面影响吗 您肯定已经注意到 几乎所有
  • Data.Map / Data.IntMap 是否存在 monad 实例?

    我有一个在 IntMap 上运行的算法 我认为最好以命令式的方式表达它 也就是说 我想说的是 在地图中查找值 X 如果它符合条件 则从地图中删除该值 循环直到地图中不再存在任何值 用两行递归来表达是相当简单的 但实际的算法有点复杂 涉及多次
  • 在 bash 中从 YAML 文件解析嵌套变量

    一个复杂的 yaml文件来自这个链接 https docs projectcalico org v3 3 getting started kubernetes installation hosted kubernetes datastore
  • Jmeter线程组中的RAMP UP

    我在 jmeter 中设置启动时遇到问题 我的测试场景如下所述 有3个线程组 Thread Group1 2 Users Ramp up 10 Thread Group2 3 users Ramp up 15 Thread Group3 5
  • 如何从子目录加载 Latex .sty 文件?

    我使用一些不属于 texlive 的 sty 文件 并希望将它们放在我的 main tex 文件夹的子目录中 我使用以下行来加载包 usepackage sty prettythesis 这是可行的 但是用 xelatex 编译 main
  • Ember数据:保存失去了belongsTo关系

    我有以下问题 带有选择字段的表单 用于选择帖子的类别 假设该帖子的类别为 100 在 Ember 检查器中 显示如下 category
  • 收缩网格项目就像 CSS 中的 Flex 项目一样

    是否可以像 CSS 中的 Flex 项目一样缩小网格项目 网格项目 container display grid grid gap 10px grid template columns repeat auto fill minmax 200
  • 使用 matlab/octave 将图像从 rgb 转换为 hsv 回 rgb

    我正在尝试将彩色图像从 RGB 转换为 HSV 进行更改 然后再转换回 RGB 作为测试 我编写此代码只是为了测试如何从 rgb 到 hsv 返回到 rgb 但是当我查看图像时 它只是显示为黑色 我缺少什么 PS我使用的是octave 3
  • PyQt5 信号和线程

    我在 youtube 上观看了有关 PyQt4 信号的简短教程 但在运行一个小示例程序时遇到了问题 如何将从线程发出的信号连接到主窗口 import cpuUsageGui import sys import sysInfo from Py
  • ./executable 和 ./executable 之间的区别可执行文件

    在 shell 中 有什么区别 executable and executable 在第一个中 点是快捷方式source http linux about com library cmd blcmdln source htm正确的 那么两者
  • 'git reset --hard HEAD~1' 和 'git reset --soft HEAD~1' 之间有什么区别?

    我试图撤消 git 中的提交 使用有危险吗git reset hard HEAD 1 不同选项之间有什么区别git reset git reset确实知道五种 模式 软 混合 硬 合并和保留 我将从前三种开始 因为这些是您通常会遇到的模式