【问题标题】:git reset --soft seems to change indexgit reset --soft 似乎改变了索引
【发布时间】:2015-05-09 14:07:15
【问题描述】:

阅读Mark Dominus's articleScott Chanon's article 后,我认为git reset abcd --soft 不会影响索引,但是,以下显示它确实。

重置前

c1.txtc2.txtc3.txt 在 repo 中,c4.txt 在索引中。全部在工作目录中:

历史:

$ git log --oneline --decorate
b91d91b (HEAD, master) C3
231a5df C2
7e7b2d7 C1

索引:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   c4.txt

工作目录:

$ ls
c1.txt  c2.txt  c3.txt  c4.txt

轻柔地重置为 C2 提交

$ git reset 231a --soft

$ git log --oneline --decorate
231a5df (HEAD, master) C2
7e7b2d7 C1

索引已更改

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   c3.txt
        new file:   c4.txt


$ ls
c1.txt  c2.txt  c3.txt  c4.txt

我认为会发生的事情

从 Scott 的文章中,他说:

reset 要做的第一件事就是移动 HEAD 指向的东西……如果你添加标志 --soft,这是它唯一会做的事情。使用 --soft,reset 将简单地停在那里。

所以,我认为索引(我希望我已经理解为上面的git status 输出中显示的内容)不会改变,也就是说,它仍将包含c4.txt。上面的输出显示它实际上包含c3.txtc4.txt

c3.txt 似乎已与c4.txt 一起移入索引中。

【问题讨论】:

  • “但是,以下显示它确实如此”——不,它没有,坦率地说,我很难理解你为什么认为它会这样。你能更详细地解释一下吗? (请记住,索引不变的事实意味着如果它等于旧提交树,并且旧提交树和新提交树不同,那么索引不能等于新提交树。 )
  • 我假设这是我不明白的东西,我会补充一些问题。
  • 你应该已经提供了所有的 git 命令以使其非常容易重现

标签: git git-reset


【解决方案1】:

根本的误解似乎是关于索引是什么。索引不是一组差异,而是一组文件。 git status 显示的不是索引,而是上次提交和索引的差异。

在您的git reset --soft 之前,索引包含文件c1.txtc2.txtc3.txtc4.txt。所以在你的git reset --soft 之后,索引仍然包含那些相同的文件。 git status 会以不同的方式报告这一点,但这不是因为索引发生了变化,而是因为提交发生了变化。

【讨论】:

  • 好的,所以,在提交之后处,索引等于前一个提交。因此,向后移动,git status 将报告索引中有新文件,这些文件不在上一次提交中。
  • 是的,对于只添加文件的提交,这实际上就是结果。
  • 那是缺少的链接。现在说得通了。
  • 那么什么命令显示索引?假设我做了一个提交,我一直认为清除索引,因为 git status -s 显示它很清晰,但也许索引不清楚,只是索引中没有文件不在提交。所以,也许一次提交会清除索引,但是什么命令会帮我做到这一点?似乎 git status -s 不会。
  • @barlop git ls-files 显示索引中的文件。
【解决方案2】:

引用自 git 文档:

根本不接触索引文件或工作树(但将头部重置为 ,就像所有模式一样)。 这会使您所有更改的文件都“提交更改”,就像 git status 所说的那样。

这意味着您的提交将被删除,但仅限于“要提交的更改”。所以你必须再次运行git reset &lt;file&gt; 才能完全删除它们。对于未来的提交,您可能需要--mixed 模式(git reset --mixed 231a)。文档:

重置索引但不重置工作树(即,更改的文件被保留但未标记为提交)并报告尚未更新的内容。这是默认操作。

【讨论】:

  • 谢谢,我只是想了解它对--soft--mixed--hard 的作用。我所期望的行为不是我所理解的那样。
  • 请记住,索引只是路径名索引内容的列表。当您git add 时,您将添加的内容放入存储库,并且 git 更新索引以说明现在这就是您到目前为止所获得的与该路径相符的内容。当前提交又名HEAD 是一个带有 id 的小文件或对具有提交 id 的分支的引用。 git reset --soft 更改该 ID,仅此而已。 git reset --mixed 更改 id 并从新提交重新加载索引 - 所以现在你的工作树和索引内容之间存在差异(当然还有头部提交)
猜你喜欢
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2019-06-23
  • 2019-03-11
  • 2020-06-22
  • 2020-02-16
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多