小编典典

git reset --mixed、--soft 和 --hard 有什么区别?

all

我正在寻找拆分提交,但不确定要使用哪个重置选项。

我在看页面用简单的英语,“git
reset”是做什么的?
,但我意识到我并不真正了解 git 索引或暂存区是什么,因此解释没有帮助。

此外,该答案中的用例--mixed--soft对我来说看起来相同(当您想要修复并重新提交时)。有人可以进一步分解吗?我意识到--mixed可能是选择,但我想知道
为什么 。最后,怎么--hard办?

有人可以给我一个工作流程示例,说明如何选择 3 个选项吗?


阅读 138

收藏
2022-02-28

共1个答案

小编典典

当您修改存储库中的文件时,更改最初是未暂存的。为了提交它,您必须将它暂存——也就是说,将它添加到索引中——sing git add。当您进行提交时,提交的更改是那些已添加到索引中的更改。

git reset至少会改变当前分支 ( HEAD)
指向的位置。--mixed和之间的区别在于--soft您的索引是否也被修改。所以,如果我们在master这一系列提交的分支上:

- A - B - C (master)

HEAD指向C和索引匹配C

当我们运行时git reset --soft Bmaster(因此HEAD)现在指向B,但索引仍然具有从C;开始的变化。git status将它们显示为已上演。因此,如果我们git commit在这一点上运行,我们将获得一个新的提交,其更改与C.


好的,所以从这里重新开始:

- A - B - C (master)

现在让我们做git reset --mixed B。(注:--mixed是默认选项)。再次指向 B
masterHEAD但这次索引也被修改为 match B。如果我们git commit在这一点上运行,因为索引匹配,什么都不会发生HEAD。我们仍然在工作目录中有更改,但由于它们不在索引中,因此将git status它们显示为未暂存。要提交它们,您需要git add然后像往常一样提交。


最后,--hard--mixed(它改变你的HEAD和索引)相同,除了它--hard也会修改你的工作目录。如果我们在C并运行git reset --hard B,那么在 中添加的更改C以及您拥有的任何未提交的更改都将被删除,并且您的工作副本中的文件将与 commit
匹配B。由于您可以通过这种方式永久丢失更改,因此您应该始终git status在执行硬重置之前运行以确保您的工作目录是干净的,或者您可以丢失未提交的更改。


最后,一个可视化: 在此处输入图像描述

2022-02-28