首页 > 解决方案 > 对已添加 git 然后 git 提交的文件进行更改似乎工作得很好

问题描述

我终于学习了git,我有点困惑。从我读过的内容来看,可能被误解了,你必须在对文件进行更改之后“git add”(在你的 ide 中本地保存文件?)然后再“git committing”。

当我在工作目录中“git add”我的所有文件,进行更改并将它们保存在 ide 中,然后“git commit”,所有更改都被提交就好了。为什么我需要在保存和提交之间使用“git add”重新分期?它似乎没有任何区别,我很困惑为什么我读到你需要考虑到它似乎没有任何区别。抱歉,如果这是重复的,我确实看过但找不到我的问题的答案。

哦,如果我正在制作一个新文件,我会理解,因为这需要用“git add”添加,因为它还不知道,但我不明白什么时候我正在更改我已经更改的文件添加。

我对此的测试是运行“git add”更改文件并保存它,尝试提交以查看它是否在没有新的“git add”的情况下注册更改,它会输出一条消息,通知我所做的更改。我必须在我的理解中遗漏一些东西。谢谢你的帮助。

标签: gitgit-commitgit-add

解决方案


一些 IDE 会git add为你做这些。你的可能就是其中之一——我们无法确定,因为你没有命名它。

有些 IDE适合你git add。在这种情况下,您必须自己做。

哦,如果我正在制作一个新文件,我会理解,因为这需要用“git add”添加,因为它还不知道,但我不明白什么时候我正在更改我已经更改的文件添加。

在我看来,您的心智模型与 Mercurial 的实际模型相匹配。在 Mercurial 中,您hg add用来告诉 Mercurial:此文件应该在提交中。 从那时起,使用工作树hg commit中该文件的版本进行新的提交。

(工作树是您工作的地方。这与提交相反,提交是只读的:您实际上无法更改存储在提交中的文件。它们通常也是高度压缩的,并且形式有用仅适用于版本控制系统。这在 Mercurial 和 Git 中都是如此。)

Git 与 Mercurial 不同。当 Git 进行新的提交时,Git不会使用工作树中的内容。 Git 使用它调用的东西,不同的(取决于谁在调用),indexstaging area,甚至是cache。对于使用过 Mercurial 或者几乎所有其他版本控制系统的人来说,这种特殊的策略似乎很古怪和疯狂,但这就是 Git 的工作方式。

当 Git提取提交时,它会将提交的内容复制到索引工作树中。索引中每个文件的版本与提交中只读存储的版本相匹配;但是可以覆盖索引中的副本。然后 Git 使用索引副本(现在与提交的副本匹配)以正常的未压缩格式制作工作树副本,以便您可以使用它。

当你运行时,Git 将正常的、未压缩的工作树文件复制回索引(也称为暂存区)。这将替换该文件的先前版本,并将提交索引版本,该版本现在与工作树版本匹配。git add filegit commit

因为 Git 从索引中的任何内容进行提交,所以您或您的 IDE 必须不断地将工作树中所做的任何修改复制到索引中。索引版本已经是特殊的、仅 Git 的压缩格式,这一事实使得git commit运行速度非常快——代价是需要所有这些额外的复制步骤。在包含大量文件的大型存储库中,这实际上产生了巨大的差异:hg commit可能需要几秒钟,而git commit几乎是瞬时的。

(在一个小型存储库中,Git 的奇思妙想大多只是烦人。但是,您可以对索引玩一些特殊的技巧,以便提交与先前提交工作树中的内容不同的内容!这实际上非常有用在某些情况下。这也是非常令人困惑的,如果可以避免的话,不要随便做。)


推荐阅读