在不提交的情况下进行暂存(git)

3

We know that, in git, when we stage a file with

git add readme.txt

“readme.txt”文件没有提交,直到我们使用

git commit readme.txt -m "..."

但我无法想象这种情况有什么用处。在什么情况下我们需要暂存一个文件而不提交呢?


2
你可以逐步构建你的提交吗? - Doon
2
基本上,暂存区是一个你在真正提交之前用来构建你的提交的地方。你可以添加多个文件、文件的部分、选择行,查看你的更改... - njzk2
1
一旦你已经明确地暂存了 readme.txt,通常不需要git commit 命令中提及它或任何其他文件。原因是如果你在运行 git commit 时列出了某些文件,它会默认使用 git commit --only,即忽略你已经暂存的文件。 - torek
1
听起来你真正想问的是“暂存区有什么用”或者“为什么要使用索引”。确实,索引/暂存区并不是必需的:例如Mercurial就没有。然而,索引提供了很多愚蠢的Git技巧,同时也包含了一些陷阱(包括--only vs --include以及我最近回答的一个长答案),所以不使用它肯定会有所改变。另请参见http://stackoverflow.com/a/36242914/1256452。 - torek
@torek,你的评论对我来说非常有意义。非常感谢。 - zell
1
我认为我的提交大约有70%都包含了多个文件。同时,我经常不会整个文件进行提交,而是只提交其中的一部分(使用--patch)。我的工作流程是浏览所有更改并首先添加我要提交的那些部分。像这样逐步构建提交使得我的提交历史比逐个提交文件清晰得多。请注意,在你使用git add之后,你不需要在git commit中命名文件。 - Peter
1个回答

3

如果您希望稍后提交,这将非常有用。

例如,您可以在今天暂存它,并在明天继续项目工作(您认为修改后的文件还可以,但仍需修复其他文件并添加单元测试)。暂存文件会给您一个“保存点”。然后,您可以执行诸如与暂存版本进行差异比较之类的操作。

通常的工作流程是立即暂存新文件(即使它们仍为空),以便它们显示为“已修改”,而不是“未跟踪”,并且您不会忘记在提交时将它们包括在内。许多IDE在创建新源代码文件时会自动执行此操作。

git commit readme.txt -m "..."

实际上,您可能不会说“commit readme.txt”。您可以在不列出任何文件的情况下提交,它将提交之前暂存的所有内容。


谢谢。但是你也可以在git-commit级别上完成所有操作。使用你的例子,我们可以提交今天的更改,在工作目录中继续工作,比较已提交快照与工作目录之间的差异,最后将多个提交合并为一个。 - zell
当然。有不止一种方法可以做到这一点。有些人有一个规则,即提交应该是“完整的”。Git允许您拥有“私有分支”以实现非常灵活的操作。还有“存储”机制。 - Thilo
有些人可能会对此持不同意见:在某种程度上,似乎 "git add" 是多余的。相比于它为学习者和用户引入的额外复杂性,拥有 "git add" 的好处似乎微不足道。 - zell
如果你只打算提交工作副本中已经存在的文件,那么我想你可以不用 git add 。但是我喜欢逐个检查变化(添加它们),这个过程有时需要时间。而且,有时我只提交文件的一部分(我认为没有 git add 将会很困难)。 - Thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接