【问题标题】:`git rebase` vs `git reset --hard` ... are they the same for deleting the most recent N commits?`git rebase` vs `git reset --hard` ...它们对于删除最近的 N 次提交是否相同?
【发布时间】:2021-05-02 16:37:53
【问题描述】:

我知道,一般来说,git rebase -igit reset 用于非常不同的事情。

但是在删除最近的 N 次提交的情况下,在我看来它们是(或可以是)相同的。我什至做了一个实验(我的存储库有两个不同的本地副本),据我所知它们是相同的。我只是发布这个问题,以防有人可以指出我可能遗漏了什么。所以这就是我所做的。

我需要删除最近的 11 次提交(不管为什么)。

我尝试了两种方法,它们看起来完全一样;只是想知道我是否遗漏了什么,因为它们并不完全相同:

  1. git rebase -i HEAD~12
  • 从我不想要的 11 个提交中删除提交行,只保留它们之前的提交(交互式 rebase 文件顶部的那个)。
  • 变基成功
  1. git reset --hard HEAD~12

这两种方法似乎做了完全相同的事情。对吗?

非常感谢。只是想比我现在更深入地了解 git。

【问题讨论】:

  • 变基也可以让你做其他事情。如果您只是删除所有这些提交(显式或通过删除行),则与重置相同。
  • 一个区别是git rebase 必须编辑一个文件,如前所述,因此需要更多的输入。

标签: git git-rebase git-reset


【解决方案1】:

正如 12345ieee 指出的那样,如果存在未提交的更改,则命令的行为会有所不同(在极少数情况下,您有未提交的更改在删除最近的 11 次提交后仍将适用);但也许您更感兴趣的是,如果满足所有先决条件并且命令都继续移动分支指针,那么结束状态是否有任何差异?

在这方面,它们本质上是相同的。 reflogs 中的条目将记录发生事件的不同原因,但无论如何这是本地(和临时)问题。

做同样事情的另一种方法:

git checkout HEAD~12
git branch -f master
git checkout master

(这种方式取决于知道分支名称;这里我假设它是master。)这还没有进入管道命令 - 所以实际上还有更多方法。

在 git 中获得相同结果的方法不止一种,这并不罕见。你越了解 git 如何“思考”它存储的对象,就越容易找到它们。

【讨论】:

    【解决方案2】:

    一个不同之处在于它们对脏树的处理(文件已修改但未提交)。

    git reset --hard 会丢弃所说的更改,而git rebase -i 会要求您先存储它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2023-02-08
      • 2020-11-16
      • 2018-01-13
      • 2018-01-26
      • 2014-04-26
      • 2017-06-04
      相关资源
      最近更新 更多