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

Ada*_*kis 4 git dvcs

我是新来的git,并试图了解之间的差异git reset --softgit reset --mixed.我知道后者重置索引,而前者没有,但我试图理解材料的不同之处:我何时使用一个与另一个?

我已经阅读了这篇Stack Overflow帖子,这似乎表明它mixed有助于在重新提交之前进行一些更改,同时还soft可以简单地重新提交.我正在使用SourceTree,关闭了暂存窗格,并努力想知道为什么会这样; 我不能为我的生活看到任何实际的真正差异.

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

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

Bob*_*rns 6

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

什么是git reset --mixed, - soft和--hard之间的区别?

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

'git reset'适用于三种不同的东西.

  1. HEAD参考.这表明了参考点.这有几个用途,但也许与您最相关的是,这将是您下次提交的父级(假设您不再更改它).
  2. 你工作的树.
  3. 该指数.(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'你会用很多东西.