git commit会将文件从登台区域移动/复制到本地分支

时间:2018-08-27 17:30:02

标签: git

我对临时区域感到困惑。 首先,Git Gud: The Working Tree, Staging Area, and Local Repo告诉我 git commit后临时区域将为空,这样,git commit可能会将文件移至本地分支而不是复制。

但是似乎无法解释这种做法:git reset --soft HEAD~ modifies staged snapshot?。在 git commit 之后 git reset --soft HEAD ^ ,然后是 git status ,看来临时区域和 HEAD之间存在差异^ ,不同之处在于在HEAD ^之后提交的文件。 这样,看来 git commit 之后临时区域不是空的,或者如果临时区域为空,如何解释当前 HEAD 与临时区域之间的区别? / p>


另一个问题是命令

  git diff --cached

用来比较临时区域和HEAD之间的差异。 What does 'stage' mean in git?告诉我暂存区仅存储文件更改。例如,我们git克隆了一个包含三个文件的项目:a.txt b.txt c.txt,然后我们修改了c.txt并 git add 。然后我们执行命令 git diff --cached 。现在,本地分支有3个文件,临时区域只有1个文件。为什么它只显示c.txt的变化,却不包括暂存区域不具有a.txt b.txt的信息(与本地分支相比)。


总之,我有两个问题:
1. git commit ,将文件从暂存区移动或复制到本地分支时会发生什么?
2. git diff --cached 会发生什么?只是比较暂存区包含的文件?

参考:

  

提交只是一个告诉git的检查点,它使用我们上一次的提交作为比较来跟踪到目前为止发生的所有更改。提交后,您的暂存区将为空。   来自 Git Gud: The Working Tree, Staging Area, and Local Repo

3 个答案:

答案 0 :(得分:1)

许多文章松散地谈论了阶段(或就此而言,一个提交)是什么/它包含什么。也许其中一些作者并不了解,或者他们只是认为他们的解释比更准确的解释更有用。无论出于何种原因,请当心:

如果有人告诉您索引包含更改,那么他们会误导您。

索引包含项目的快照。 (通常。在发生冲突的合并过程中,它会稍微复杂一些。)如果有人说它“包含阶段性更改”,则您应该理解,实际上它包含一个已应用了阶段性更改的快照 (相对到COMMIT指示的HEAD对象)。

因此,提交后,阶段不为空。确实没有分阶段的更改,因为上演的任何内容都刚刚提交(HEAD已移至新提交)。但这意味着索引和HEAD包含匹配的快照。

答案 1 :(得分:0)

暂存区包含您已指定为提交的一部分但尚未提交的更改。

执行git add时,所做的更改将添加到暂存中,直到您实际运行git commit为止。暂存要提交的文件后,可以进行其他更改,这些更改将显示在Changes not staged for commit:的{​​{1}}部分中。当您实际运行git status时,您已上演的更改将用于进行新的提交,而提交的阴影将成为新的HEAD。

对于git commit帮助文档中的第二个问题:

  

git diff [--options] --cached [] [-] [...]              此表单用于查看您为相对于named的下一次提交所做的更改。通常,您需要与最新版本进行比较              提交,因此,如果您不提供,则默认为HEAD。如果HEAD不存在(例如未出生的分支)并且未给出,则显示所有              阶段性的变化。 --staged是--cached的同义词。

添加修饰符可让您查看已准备提交的更改。

当您执行git diff时,您要告诉git将存储库的状态移至该存储库当前指向的提交之前的提交,但保留对文件的所有更改。因此,在运行此命令后,您的存储库将在提交后移回,执行git reset --soft HEAD~时将显示HEAD先前在提交中的所有文件。

答案 2 :(得分:0)

关于git diff --cached

这里讨论了使用diff比较工作空间,索引和远程仓库的情况: https://stackoverflow.com/a/41249720/4522186