我正在寻找拆分提交,但不确定要使用哪个重置选项。
我在看页面用简单的英语,“git reset”是做什么的?,但我意识到我并不真正了解 git 索引或暂存区是什么,因此解释没有帮助。
此外,该答案中的用例--mixed和--soft对我来说看起来相同(当您想要修复并重新提交时)。有人可以进一步分解吗?我意识到--mixed可能是选择,但我想知道 为什么 。最后,怎么--hard办?
--mixed
--soft
--hard
有人可以给我一个工作流程示例,说明如何选择 3 个选项吗?
当您修改存储库中的文件时,更改最初是未暂存的。为了提交它,您必须将它暂存——也就是说,将它添加到索引中——sing git add。当您进行提交时,提交的更改是那些已添加到索引中的更改。
git add
git reset至少会改变当前分支 ( HEAD) 指向的位置。--mixed和之间的区别在于--soft您的索引是否也被修改。所以,如果我们在master这一系列提交的分支上:
git reset
HEAD
master
- A - B - C (master)
HEAD指向C和索引匹配C。
C
当我们运行时git reset --soft B,master(因此HEAD)现在指向B,但索引仍然具有从C;开始的变化。git status将它们显示为已上演。因此,如果我们git commit在这一点上运行,我们将获得一个新的提交,其更改与C.
git reset --soft B
B
git status
git commit
好的,所以从这里重新开始:
现在让我们做git reset --mixed B。(注:--mixed是默认选项)。再次指向 B master,HEAD但这次索引也被修改为 match B。如果我们git commit在这一点上运行,因为索引匹配,什么都不会发生HEAD。我们仍然在工作目录中有更改,但由于它们不在索引中,因此将git status它们显示为未暂存。要提交它们,您需要git add然后像往常一样提交。
git reset --mixed B
最后,--hard与--mixed(它改变你的HEAD和索引)相同,除了它--hard也会修改你的工作目录。如果我们在C并运行git reset --hard B,那么在 中添加的更改C以及您拥有的任何未提交的更改都将被删除,并且您的工作副本中的文件将与 commit 匹配B。由于您可以通过这种方式永久丢失更改,因此您应该始终git status在执行硬重置之前运行以确保您的工作目录是干净的,或者您可以丢失未提交的更改。
git reset --hard B
最后,一个可视化: