从我读过的关于 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
答案 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>
HEAD
和HEAD
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
之间的有效差异。