每次提交代码时,我是否需要执行'git add'命令来添加文件?

9

我以前使用过Mercurial,但计划在不久的将来转换到Git。

所有我看过的解释Git工作原理的教程都显示需要在每次提交之前将文件添加到暂存区('git add'),无论它们以前是否被跟踪。

Mercurial也有一个类似的命令('hg add'),但据我所记,您只需要执行一次'add'。例如,新存储库的步骤如下:

hg init
hg add .
hg commit "Initial commit"
hg push

这个工作流程是否可以使用Git实现?如果不行,为什么要反复执行“git add”操作呢?这似乎是不必要的。

请注意,git add 并不一定是添加一个文件,它添加的是在最近一次提交中不存在的新的内容。对于新文件来说,在最近一次提交中,该文件默认为空。 - chepner
使用 git add 命令将文件从工作目录移动到暂存区,无论是新文件还是修改过的文件。 - tw1742
4个回答

9
Git中的两个阶段过程非常强大。特别是在编辑源代码时,您经常会并行进行几个不直接相关的更改。
通过暂存区,您可以选择要提交的文件,从而为每个逻辑更改创建一个提交。
如果您想一次提交所有更改的文件,可以使用git commit -a作为快捷方式。这将暂存所有已更改和删除的文件并将它们提交。请注意:它不会自动添加未跟踪的文件。您仍然需要事先完成这项工作。

没错。正如@dpkp所说,同样的工作流程应该没有问题。我倾向于按“模式”工作,并不会同时在多个文件上工作,但我可以看出那会很有用。 - Chris

6
是的,同样的基本工作流程也适用,但是“add”命令也可以更有选择性地使用,只向每个提交添加特定文件或特定部分。这使得更容易将逻辑上不同的补丁分开成不同的提交,这样更容易跟踪和与他人共享。
但是,你可以只输入“git add .”,所有内容都将进入暂存区以备提交。正如另一个答案中提到的那样,“git commit -a”是一个部分快捷方式(它不会添加新文件,但会提交对已跟踪文件的所有更改/删除)。尝试“git status”查看下一个提交将包含哪些内容,哪些不会。 更新:我还应该注意到,与git add相对应的是“git reset HEAD”,它将从下一次提交的暂存区中移除该文件。此外,如果您想将单个文件中的多个编辑分成多个提交,则使用“-p”标志来交互式地遍历文件,并选择要添加/重置的块。

这正是我想到的,但文档和看到人们实际使用Git并没有像它应该的那样清晰地表达这一点。就个人而言,我更倾向于在完成单个任务或功能时频繁提交。从Fog Creek教授DVCS的经验来看,很明显,由于您拥有代码的完整副本,“提交”是一个相对安全的操作,因为它只影响您自己。只要您注意如何以及何时推送到中央存储库,通常它就可以正常工作。 - Chris
使用 git checkout 文件名 而不是 git reset HEAD 可以让您更有选择性地撤销提交。 - domih

1

因为并不总是想要提交所有更改的文件,您可以(而且应该)选择要提交的文件。根据您所使用的项目架构,有时会进行额外的更改以进行测试或其他操作,但并非必须用于生产。


OP特别询问已更改的文件。 - Daniel Hilgarth
虽然我更倾向于创建单独的分支来处理那些我不想将特定功能放入中央存储库的情况,但这是我的工作方式。 - Chris
@Chris 是的,但是你可以将“feature”分支合并到当前分支中以进行构建,然后仅提交“非功能”更改。你也可以使用rebase,但是嘿!有成千上万种不同的工作流程。 - martriay

1
另一个应该在这里提到的快捷方式,不完全是git add .的重锤,而是git add -u。区别在于前者将暂存任何新添加的文件,而不是明确忽略的文件(即在git status输出中列出的所有“未跟踪的文件”),而后者仅暂存已经被跟踪的修改过的文件。

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