首先,阅读上面@Ant P建议的链接。
git reset --mixed、--soft 和 --hard 之间有什么区别? https://stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard
让我用一些正在发生的事情的模型来补充这一点。
“git reset”适用于三种不同的东西。
- HEAD 参考。这表明了参考点。这有多种用途,但也许与您最相关的是,这将是您下一次提交的父项(假设您不再更改它)。
- 你的工作树。
- 索引。 (SourceTree 中的“Staging”窗格)。这就是 git 用来构建下一次提交的内容。它实际上并不是直接从您的工作树创建提交。这就是为什么你需要执行“git add”。
因此,如果您创建一个包含两个文件 foo.txt 和 bar.txt 的 git 存储库。
在您的第一个修订版中,将“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”,添加、更改、rm 或重置任何文件,直到获得新提交所需的状态,然后将其作为新提交提交。
'git reset --mixed'(或没有 --mixed;这是默认值)仅对于撤消 'git add' 或 'git rm' 有用。
最重要的是,在我看来,您可能不想在交互式使用中使用 --soft 。使用它没有任何问题,但是“git commit --amend”或“git rebase --interactive”可能是获得您想要的内容的更直观的方式。
'git reset --mixed' 你会经常使用。