我是GIT的新手,并试图理解git reset --soft
和git reset --mixed
之间的区别。我知道后者会重置索引,而前者则没有,但我试图理解材料的不同之处:我何时会使用其中一个?
我已阅读this Stack Overflow post,这似乎表明mixed
有助于在重新提交之前进行一些更改,而soft
则有助于立即重新提交。我正在使用SourceTree,关闭了暂存窗格,并努力想知道为什么会这样;我不能为我的生活看到任何实际的真正的差异。
我能看到的唯一区别是,我重置的新添加的文件显示为添加了软重置,但混合不是这样。但在任何一种情况下,我都可以成功地对新添加的文件进行更改,然后重新提交。当然,我对现有文件所做的任何新更改都会无缝地添加到我当前未提交的更改中,随时可以提交。
我是否必须使用源树的暂存窗格来查看任何实际差异,或者我只是遗漏了什么?要清楚,现在我已经设置了工具,我看到了未提交的更改,我只需一步即可完成。
答案 0 :(得分:6)
首先,阅读上面@Ant P建议的链接。
Whats the difference between git reset --mixed, --soft, and --hard?
让我用一些模型来补充这一点。
' git reset'适用于三种不同的事情。
因此,如果你创建一个包含两个文件的git repo,foo.txt和bar.txt。
在您的第一次修订中,将' v1'在每个文件中。 在你的第二次修订版中,放置了' v2'在每个文件中。 现在,把' v3'在每一个中,然后添加foo.txt'。
此时,您改变主意,并决定重置为第一个修订版。你最终想进入哪个州?
那你为什么要做git reset --soft?
我们假设您创建了一个提交,并确定您没有做到正确,并希望在推送之前修复它。 (重要!一旦你推动,你想要将提交视为永久性的,或者你将为其他人做出努力)
您可以进行更改,并执行git commit --amend'。但这只适用于最后一次提交。或者您可以执行' git rebase --interactive',并对特定提交进行更改,合并提交等。
或者您可以执行' git reset --soft',添加,更改,恢复或重置任何文件,直到获得新提交所需的状态,然后将其作为新提交提交提交。
' git reset --mixed' (或者没有--mixed;它是默认设置)对于撤消&#g; git add'或者' git rm'。
根据我的观点,你可能不想在交互式使用中使用--soft。使用它并没有错,但是&gtt commit --amend'或者' git rebase --interactive'可能是一种更直观的方式来获得你想要的东西。
' git reset --mixed'你会用很多。
答案 1 :(得分:3)
如果您使用的.gitignore
未检入回购或在提交之间更改,则您无法在混合重置中添加被忽略的文件,除非是手动,否则将git diff
或git status
显示他们在那里。
通过软重置,如果您创建了重置,那么您重置的所有内容都将保证包含在提交中。
实际上,其中任何一种都可能是您需要的方式,这就是GIT中两种方法(以及对索引本身的显式访问)的原因。