更好的使用git add的方法?

8
作为一个尝试在Rails项目上使用git的新手,我想知道在每次提交之前是否使用"git add ."(添加当前目录)是不好的做法。我看过的入门教程都是最初添加当前目录,然后再使用"git add new_file"来添加文件。如果我要从许多不同的目录中添加一堆文件,这似乎太麻烦了。
基本上,如果要添加超过一两个文件,每次想提交时使用"git add ."是否可以?使用"git add ."是否相当于显式地对自上次提交以来创建的每个文件都进行"git add new_file"操作?
6个回答

12

git add . 会把整个目录结构下的所有内容都添加进来,包括新建的文件。如果你想追踪所有在目录中的文件,那这样做没问题。

另一种(也许更常见的)用法是执行 git commit -a,它只会添加在上次提交之后发生变化的文件,而不包括任何新文件。

编辑:git add . 不会删除自上次提交以来被删除的任何文件。如果你正在删除文件,我建议使用 git rm <myfile>,这样git就知道了删除的文件,而且你也不会忘记告诉git这个文件被删除了。正如另一个评论所提到的,git commit -a将注意到已经被删除的文件。


谢谢James。所以使用git add .而不是逐个添加文件,不会导致效率低下或冗余吗?重新添加已经添加的文件,不会有什么问题吧? - Nick Stamas
重新添加一个没有更改的文件对任何事情都没有影响,所以不,它并不是坏的。我不知道是否低效--当我使用<code>git add .</code>时,它是瞬间完成的,但我不知道在一个大的文件夹层次结构中是否仍然如此。 - James Cassell
然而,git add .会添加一些不应该被添加的文件,比如编辑器备份和其他随意的临时文件。 - Phil Miller
git commit -a 会包括未跟踪的文件!你想要的是 git add -u,它只添加已跟踪的文件更改,而不是未跟踪的文件。 - Sukima
这就是为什么存在 git add -A 的原因。它也会考虑到已删除的文件。 - datashaman

8
如果你的.gitignore已经更新,并且你确定不会添加任何意外的文件,那么使用“git add .”是没有问题的。在此之前,可以先运行“git status”来检查一下。
但我不建议在每次提交之前都这样做,因为大多数情况下(至少对于大多数用例),你只会修改现有文件并只添加一个或两个全新的文件。在这些情况下,“git add -u”和“git add ”通常比“git add .”或“git add -A”更加省事,因为你总是需要检查一下是否意外添加了应该被忽略或删除的临时文件。
“git add .”最有用的地方是当你知道在当前目录层级结构中添加了许多新文件,而又不想逐个指定它们时。你需要确保所有不想添加的文件都被正确忽略了。

4
也许 git-commit -a 就是你想要的?它将暂存并提交所有已修改和/或已删除的在版本控制下的文件。

4

你可以使用git commit -a命令将所有已经加入源代码控制的文件进行提交(这类似于Subversion的commit命令)。


需要解释一下 git commit -agit add -u 之间的区别。使用 git commit -a 可能会不知不觉地添加不想要的文件。 - Sukima
@Sukima:git commit -a 只会提交已经被追踪的文件,而不会添加新的未被追踪的文件。 - knittl

3

此外,您可能会喜欢 交互模式('git add -i'),如果您需要选择性地添加一堆文件,它可以加快速度。您可以在这个GitCast视频中看到它的实际应用。


已经移动或被替换。请使用以下链接:http://blip.tv/scott-chacon/c3-add-interactive-4113507 - a different ben
谢谢@adifferentben——发现了问题。我会用你的更正更新我的答案。 - ewall
@ewall:但是答案还没有更新?链接仍然是404。 - Sukima
1
@adifferentben:你的链接也是404错误。看来blip.tv不是一个适合链接的好网站。 - Sukima
有人在YouTube上存档了这些视频,所以我已经更新了链接,指向这里:http://youtu.be/i2D2HYFlOuU。 - ewall

0

如果你的进度是“单线程”或单分支的,那么没有固有问题,尽管其他人提出了各种优点的选择。然而,如果在此分支中有多个“功能”,您可能希望在某些相关分支中选择性地合并它们,那么这种“每次都提交所有内容”的方法将会在那时增加更多的工作量。可能还有其他类似的优点(例如使用git bisect)。如果正在进行的工作有多个逻辑线程,则在提交时将它们分开可能会在以后产生丰厚的回报。


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