重置--soft和--mixed之间的区别

时间:2014-06-14 21:31:46

标签: git dvcs

我是GIT的新手,并试图理解git reset --softgit reset --mixed之间的区别。我知道后者会重置索引,而前者则没有,但我试图理解材料的不同之处:我何时会使用其中一个?

我已阅读this Stack Overflow post,这似乎表明mixed有助于在重新提交之前进行一些更改,而soft则有助于立即重新提交。我正在使用SourceTree,关闭了暂存窗格,并努力想知道为什么会这样;我不能为我的生活看到任何实际的真正的差异。

我能看到的唯一区别是,我重置的新添加的文件显示为添加了软重置,但混合不是这样。但在任何一种情况下,我都可以成功地对新添加的文件进行更改,然后重新提交。当然,我对现有文件所做的任何新更改都会无缝地添加到我当前未提交的更改中,随时可以提交。

我是否必须使用源树的暂存窗格来查看任何实际差异,或者我只是遗漏了什么?要清楚,现在我已经设置了工具,我看到了未提交的更改,我只需一步即可完成。

2 个答案:

答案 0 :(得分:6)

首先,阅读上面@Ant P建议的链接。

Whats the difference between git reset --mixed, --soft, and --hard?

让我用一些模型来补充这一点。

' git reset'适用于三种不同的事情。

  1. HEAD参考。这表明了参考点。这有几个用途,但也许与您最相关的是,这将是您下一次提交的父级(假设您不再对其进行更改)。
  2. 你的工作树。
  3. 指数。 (SourceTree中的" Staging"窗格)。这是git用于构造下一个提交的内容。它实际上并不直接从您的工作树创建提交。这就是为什么你需要做的事情' git add'。
  4. 因此,如果你创建一个包含两个文件的git repo,foo.txt和bar.txt。

    在您的第一次修订中,将' v1'在每个文件中。 在你的第二次修订版中,放置了' v2'在每个文件中。 现在,把' v3'在每一个中,然后添加foo.txt'。

    此时,您改变主意,并决定重置为第一个修订版。你最终想进入哪个州?

    • ' git reset --hard HEAD ^':重置所有内容。您的树返回到第一个修订版,没有任何更改排队到索引。
    • ' git reset --soft HEAD ^':只需重置HEAD指针即可。索引仍然具有重置前的状态。这意味着第二次提交中的所有更改,加上您已经添加的任何内容。所以它有' v3'你输入了foo.txt和' v2'你在第二次提交时第一次尝试就犯了。
    • ' git reset --mixed HEAD ^':这只是重置索引,用当前版本填充它。实际上,它已撤消任何&#g; git add'你可能已经完成了(或者' git rm')。

    那你为什么要做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 diffgit status显示他们在那里。

通过软重置,如果您创建了重置,那么您重置的所有内容都将保证包含在提交中。

实际上,其中任何一种都可能是您需要的方式,这就是GIT中两种方法(以及对索引本身的显式访问)的原因。