`git rebase` 与 `git reset --hard` ... 删除最近的 N 次提交是否相同?
`git rebase` vs `git reset --hard` ... are they the same for deleting the most recent N commits?
我知道,一般来说,git rebase -i
和 git reset
用于非常不同的事情。
但是在删除最近的 N 次提交的情况下,在我看来它们是(或可能是)相同的。我什至做了一个实验(使用我的存储库的两个不同的本地副本)并且据我所知它们是相同的。我只是发布这个问题,以防有人指出我可能遗漏了什么。这就是我所做的。
我需要删除最近的 11 次提交(不管为什么)。
我尝试了两种方法,它们看起来完全相同;只是想知道我是否遗漏了什么,因为它们并不完全相同:
git rebase -i HEAD~12
- 从我不想要的 11 个提交中删除 提交行,只保留它们之前的提交(交互式变基文件顶部的那个)。
- 变基成功
git reset --hard HEAD~12
这两种方法似乎完成了完全相同的事情。对吗?
非常感谢。只是想比现在更深入地理解 git。
一个区别在于他们对脏树的处理(文件已修改但未提交)。
git reset --hard
会丢弃所说的更改,而 git rebase -i
会要求您先将它们隐藏起来。
正如 12345ieee 指出的那样,如果有未提交的更改,命令的行为会有所不同(在不太可能发生的情况下,您有未提交的更改在删除最近的 11 次提交后仍然适用);但也许您更感兴趣的是,如果满足所有先决条件并且命令都继续移动分支指针,那么结束状态是否有任何差异?
在这方面,它们本质上是相同的。 reflogs 中的条目将记录发生的事情的不同原因,但无论如何这是一个本地(和临时)问题。
做同样事情的另一种方法:
git checkout HEAD~12
git branch -f master
git checkout master
(这种方式取决于知道分支名称;这里我假设它是 master
。)而且没有进入管道命令 - 所以实际上还有更多方式。
在 git 中获得相同结果的方法不止一种,这并不罕见。您越了解 git 如何“思考”它存储的对象,就越容易找到它们。
我知道,一般来说,git rebase -i
和 git reset
用于非常不同的事情。
但是在删除最近的 N 次提交的情况下,在我看来它们是(或可能是)相同的。我什至做了一个实验(使用我的存储库的两个不同的本地副本)并且据我所知它们是相同的。我只是发布这个问题,以防有人指出我可能遗漏了什么。这就是我所做的。
我需要删除最近的 11 次提交(不管为什么)。
我尝试了两种方法,它们看起来完全相同;只是想知道我是否遗漏了什么,因为它们并不完全相同:
git rebase -i HEAD~12
- 从我不想要的 11 个提交中删除 提交行,只保留它们之前的提交(交互式变基文件顶部的那个)。
- 变基成功
git reset --hard HEAD~12
这两种方法似乎完成了完全相同的事情。对吗?
非常感谢。只是想比现在更深入地理解 git。
一个区别在于他们对脏树的处理(文件已修改但未提交)。
git reset --hard
会丢弃所说的更改,而 git rebase -i
会要求您先将它们隐藏起来。
正如 12345ieee 指出的那样,如果有未提交的更改,命令的行为会有所不同(在不太可能发生的情况下,您有未提交的更改在删除最近的 11 次提交后仍然适用);但也许您更感兴趣的是,如果满足所有先决条件并且命令都继续移动分支指针,那么结束状态是否有任何差异?
在这方面,它们本质上是相同的。 reflogs 中的条目将记录发生的事情的不同原因,但无论如何这是一个本地(和临时)问题。
做同样事情的另一种方法:
git checkout HEAD~12
git branch -f master
git checkout master
(这种方式取决于知道分支名称;这里我假设它是 master
。)而且没有进入管道命令 - 所以实际上还有更多方式。
在 git 中获得相同结果的方法不止一种,这并不罕见。您越了解 git 如何“思考”它存储的对象,就越容易找到它们。