`git-rebase`vs`git-reset--hard`。。。删除最近的N个提交是否相同?

`git-rebase`vs`git-reset--hard`。。。删除最近的N个提交是否相同?,git,git-rebase,git-reset,Git,Git Rebase,Git Reset,我知道,一般来说,git-rebase-I和git-reset用于非常不同的事情 但是在删除最近的N个提交的上下文中,在我看来它们是(或者可以是)相同的。我甚至做了一个实验(使用我的存储库的两个不同的本地副本),据我所知,它们是相同的。我只是把这个问题贴出来,以防有人能指出我可能遗漏了什么。这就是我所做的 我需要删除最近的11次提交(不管为什么) 我尝试了两种方法,它们看起来完全相同;只是想知道我是否遗漏了什么,因为它们并不完全相同: git-rebase-i头~12 从我不想要的11个提交中

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

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

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

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

  • git-rebase-i头~12
    • 从我不想要的11个提交中删除提交行,只保留在它们前面的提交行(位于交互重新基准文件顶部的那一行)
    • 重设基址成功
  • git复位——硬头~12
  • 这两种方法似乎做了完全相同的事情。对吗


    多谢。我只是想比现在更深入地理解git。

    一个区别在于他们对脏树的处理方式(文件已修改但未提交)


    git reset--hard
    将丢弃所说的更改,而
    git rebase-i
    将要求您首先隐藏这些更改。

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

    在这方面,它们基本上是相同的。回流日志中的条目将记录所发生事件的不同原因,但无论如何,这是一个局部(和临时)问题

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

    git checkout HEAD~12
    git branch -f master
    git checkout master
    
    (这种方法取决于知道分支名称;这里我假设它是
    master
    ),而这不需要进入管道命令-因此实际上还有更多的方法


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

    重定基址也允许你做其他事情。如果您只是删除所有这些提交(无论是显式的还是删除行),这与重置是一样的。区别在于,对于
    git-rebase
    ,您必须编辑一个文件,如前所述,因此需要更多的键入。