git - 对已添加 git 然后 git 提交的文件进行更改似乎工作得很好
问题描述
我终于学习了git,我有点困惑。从我读过的内容来看,可能被误解了,你必须在对文件进行更改之后“git add”(在你的 ide 中本地保存文件?)然后再“git committing”。
当我在工作目录中“git add”我的所有文件,进行更改并将它们保存在 ide 中,然后“git commit”,所有更改都被提交就好了。为什么我需要在保存和提交之间使用“git add”重新分期?它似乎没有任何区别,我很困惑为什么我读到你需要考虑到它似乎没有任何区别。抱歉,如果这是重复的,我确实看过但找不到我的问题的答案。
哦,如果我正在制作一个新文件,我会理解,因为这需要用“git add”添加,因为它还不知道,但我不明白什么时候我正在更改我已经更改的文件添加。
我对此的测试是运行“git add”更改文件并保存它,尝试提交以查看它是否在没有新的“git add”的情况下注册更改,它会输出一条消息,通知我所做的更改。我必须在我的理解中遗漏一些东西。谢谢你的帮助。
解决方案
一些 IDE 会git add
为你做这些。你的可能就是其中之一——我们无法确定,因为你没有命名它。
有些 IDE不适合你git add
。在这种情况下,您必须自己做。
哦,如果我正在制作一个新文件,我会理解,因为这需要用“git add”添加,因为它还不知道,但我不明白什么时候我正在更改我已经更改的文件添加。
在我看来,您的心智模型与 Mercurial 的实际模型相匹配。在 Mercurial 中,您hg add
用来告诉 Mercurial:此文件应该在提交中。 从那时起,使用工作树hg commit
中该文件的版本进行新的提交。
(工作树是您工作的地方。这与提交相反,提交是只读的:您实际上无法更改存储在提交中的文件。它们通常也是高度压缩的,并且形式有用仅适用于版本控制系统。这在 Mercurial 和 Git 中都是如此。)
Git 与 Mercurial 不同。当 Git 进行新的提交时,Git不会使用工作树中的内容。 Git 使用它调用的东西,不同的(取决于谁在调用),index,staging area,甚至是cache。对于使用过 Mercurial 或者几乎所有其他版本控制系统的人来说,这种特殊的策略似乎很古怪和疯狂,但这就是 Git 的工作方式。
当 Git提取提交时,它会将提交的内容复制到索引和工作树中。索引中每个文件的版本与提交中只读存储的版本相匹配;但是可以覆盖索引中的副本。然后 Git 使用索引副本(现在与提交的副本匹配)以正常的未压缩格式制作工作树副本,以便您可以使用它。
当你运行时,Git 将正常的、未压缩的工作树文件复制回索引(也称为暂存区)。这将替换该文件的先前版本,并将提交索引版本,该版本现在与工作树版本匹配。git add file
git commit
因为 Git 从索引中的任何内容进行提交,所以您或您的 IDE 必须不断地将工作树中所做的任何修改复制到索引中。索引版本已经是特殊的、仅 Git 的压缩格式,这一事实使得git commit
运行速度非常快——代价是需要所有这些额外的复制步骤。在包含大量文件的大型存储库中,这实际上产生了巨大的差异:hg commit
可能需要几秒钟,而git commit
几乎是瞬时的。
(在一个小型存储库中,Git 的奇思妙想大多只是烦人。但是,您可以对索引玩一些特殊的技巧,以便提交与先前提交和工作树中的内容不同的内容!这实际上非常有用在某些情况下。这也是非常令人困惑的,如果可以避免的话,不要随便做。)
推荐阅读
- jwt - 我可以强制注销或过期 JWT 令牌吗?
- c# - 如何从另一个应用程序的文本框中获取插入符号的位置?(不是坐标,而是文本框内的实际索引)
- github - 如何使用 Github API 打开草稿拉取请求?
- python - CCXT / python - 自定义请求?
- mysql - 在 Go 中创建 MySql 接口的正确方法
- c# - 使用所有用户的另一个列表合并两个单独的用户列表
- python - 如何用 seaborn 绘制阴影误差带?
- .net-core - MassTransit AzureServieBus InvalidOperationException
- sql - SQL拆分消费满月
- c++ - 为什么 gcc 对包含标头比 clang 更严格