git reset --soft HEAD~修改分阶段快照?

时间:2016-05-28 21:09:26

标签: git

从我读过的关于 git reset --soft 的内容中,我了解到它没有修改暂存区域或索引。但在下面的示例中,您可以清楚地看到暂存区域/索引是由于 git reset --soft 而修改的。为什么呢?

mkdir test;cd test;git init;
touch a;
echo 1 >>a;git add a;git commit -m"1" a;
echo 2 >>a;git commit -m"2" a;

git diff --cached; <NO OUTPUT>
git reset --soft HEAD~;
git diff --cached;<See the below output>

--- a/a
+++ b/a
@@ -1 +1,2 @@
 1
+2

3 个答案:

答案 0 :(得分:4)

git reset --soft保持索引/暂存区未经修改的说法是正确的。

请注意git diff总是比较两件事。它比较了哪两件事?对于git diff的完全一般形式,答案有点复杂,但您使用的是git diff --cached,它会比较the git diff documentation`中提到的两件事:

  

git diff [--options] --cached [<commit>] [--] [<path> ...]

     

此表单用于查看您为下一次提交相对于指定的 <commit> 而进行的更改。通常,您希望与最新提交进行比较,因此如果您不提供 <path> ... ,则默认为<commit>。 [剪断]

因此,被比较的两件事是<commit>和索引。

除此之外:文档具有误导性

以上暗示索引存储更改,这不是真的!如果您现在进行了提交,那么索引/暂存区域只是下一次提交中的内容。因此,在提交之后,索引和当前提交是相同的 - 至少,它们代表相同的工作树(索引省略了提交的重要部分,即作者和提交者名称+电子邮件+日期,父指针和提交消息 - 或者更简单地说,索引只有 一个工作树,它是一个不寻常的形式,更适合作为索引/缓存而不是提交。 / p>

返回HEADHEAD

git reset修改git diff --cached。它不会修改索引。首先将git reset --soft与索引进行比较,然后看不到输出。然后你改变HEAD。现在,您将已更改的HEAD与索引进行比较,并查看输出。

改变了什么原因导致输出变化?好吧,HEAD已经改变了。

通过省略HEAD步骤并提供特定提交,您可以看到同样的事情:

HEAD

这会将commit git reset --soft与索引进行比较,并显示相同的输出。

答案 1 :(得分:3)

提交具有特定内容。索引索引特定内容。 def equip(item, bag): if item in bag: print "You can't have 2 {}s equipped!".format(item) else: bag.append(item) def main(): bag_sword = [] print bag_sword equip("iron sword", bag_sword) print bag_sword equip("iron sword", bag_sword) if __name__ == '__main__': main() 将索引内容与命名提交进行比较。重置def equip(item, slot, inventory): if inventory[slot] == item: print 'Already equipped.' else: inventory[slot] = item print item.capitalize(), 'equipped.' def main(): inventory = { 'weapon': None, 'gloves': None, } equip('iron sword', 'weapon', inventory) print inventory equip('iron sword', 'weapon', inventory) if __name__ == '__main__': main() 后,您更改了提交git diff --cached比较。

答案 2 :(得分:2)

关于git索引的文档有点误导。事实上, git index 非常像提交,但没有像提交时间戳或提交者的电子邮件之类的东西。 Git索引包含您文件的某些状态。当您执行git checkout master或进行新提交时,git index包含对您刚签出或制作的提交中的相同文件/ blob的引用。如果您尝试git commit现在什么都不会发生,因为git会看到git索引引用与上次提交相同的文件,因此没有任何提交。当index与提交HEAD不同时,此时会发生新提交,记录新提交中索引中的内容。第二次提交后,您的存储库看起来像这样

      index
      |
#1 -> #2
      ^
      master
      ^
      HEAD

当您执行git reset --soft HEAD~时,您的仓库将会是这样的

      index
      |
#1 -> #2
^     ^
|     master
|
HEAD

请注意,您的本地文件也会显示为提交#2,因此git diff应该不显示任何内容。但index现在与HEAD指向的提交不同。因此git diff --cached显示了提交#1#2之间的有效差异。