首先,阅读@Ant P上方建议的链接。
git reset --mixed、--soft和--hard有什么区别?
让我补充一下正在进行的模型的一点内容。
'git reset'使用三个不同的东西。
- HEAD引用。这表示参考点。这有几个用途,但也许最相关的是这将是您下一个提交的父级(假设您不再次更改它)。
- 您的工作树。
- 索引。(SourceTree中的“暂存”窗格)。这是git用来构建下一个提交的方式。它实际上不是直接从您的工作树创建提交的。这就是为什么您需要执行'git add'的原因。
因此,如果您使用两个文件foo.txt和bar.txt创建了git repo。
在第一个修订版中,将'v1'放入每个文件中。
在第二个修订版中,将'v2'放入每个文件中。
现在,在每个文件中放入'v3',并执行'git add foo.txt'。
此时,您改变主意,决定重置到第一个版本。您想要结束在什么状态下?
- 'git reset --hard HEAD^':重置所有内容。您的树回到了第一个版本,没有任何更改排队到索引中。
- 'git reset --soft HEAD^':只重置HEAD指针。索引仍然具有重置之前的状态。这意味着第二次提交中的所有更改以及您已经添加的任何内容。因此,它具有您放入foo.txt中的“v3”以及您在第二次提交的第一次尝试中提交的“v2”。
- 'git reset --mixed HEAD^':这只是重置索引,用当前修订版填充它。实际上,它正在撤消您可能进行的任何“git add”(或“git rm”)操作。
那么为什么要执行git reset --soft呢?
假设您创建了一个提交,并且决定在推送之前对其进行修正。(重要!一旦推送,您希望将提交视为永久性,否则您会为其他人造成麻烦)
你可以进行更改,然后执行'git commit --amend'。但这只适用于最后一次提交。或者你可以执行'git rebase --interactive',对特定的提交进行更改,合并提交等操作。
或者你可以执行'git reset --soft',添加、更改、删除或重置任何文件,直到达到你想要的状态,然后将其作为新提交进行提交。
'git reset --mixed'(或不带--mixed;它是默认值)仅适用于撤消'git add'或'git rm'。
总之,在我看来,你在交互式使用中可能不想使用--soft。使用它没有问题,但'git commit --amend'或'git rebase --interactive'可能更直观地实现你想要的结果。
你会经常使用'git reset --mixed'。