你如何git添加一个新的文件而不进行分期?

时间:2012-06-18 16:32:13

标签: git staging git-index

为了有效地使用git(并且按照预期),我进行了小的原子提交,而我确实有更长的会话,我不仅改变了一件事。因此,我大量使用git add -p。但是,这不适用于全新的文件,因为我以后会忘记它们。

我想要做的是,告诉git 是一个新文件,我希望它能跟踪,但不会将其

示例:运行git status会产生:

# On branch my-current-branch
# Your branch is ahead of 'origin/my-current-branch' by 2 commits.
#
# Changes to be committed:
#
<<STAGED SECTION>> // A
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
<<UNSTAGED-YET-KNOWN SECTION>> // B
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
<<UNKNOWN SECTION>> // C

如果我在C部分有一个文件foo,我说git add foo它会转到A部分。如果我说git add -N foo它将同时转到A和B.但是,这意味着它将包含在下一次提交中,至少是因为存在新文件。

我希望它专门用于B部分,这样我以后可以使用git add -pgit add foo(或其他)将其添加到A中。

修改

关于add -N解决方案,这不起作用,因为如果我在说add -N没有正确添加之后尝试提交,git会抱怨,因为它没有我不知道如何处理空文件:

foo: not added yet
error: Error building trees

3 个答案:

答案 0 :(得分:24)

使用Git 2.5, git add -N/--intent-to-add 实际上是正确的解决方案 新文件不会成为下一次提交的一部分。

请参阅NguyễnTháiNgọcDuy的commit d95d728pclouds)(合并于d0c692263):

  

diff-lib.c:调整差异

中i-t-a条目的位置

问题:

  

git add -N”添加的条目会提醒用户,以便他们在提交前不要忘记添加它们。这些条目即使不是真实的,也会出现在索引中。他们在索引中的存在会导致令人困惑的“git status”,如下所示:

On branch master
Changes to be committed:
        new file:   foo

Changes not staged for commit:
        modified:   foo
  

如果您执行“git commit”,即使“foo”也不会包含在内   “status”将其报告为“to be committed”。

解决方案:

  

此修补程序将输出更改为

On branch master
Changes not staged for commit:
        new file:   foo

no changes added to commit

这意味着:

  

将这些路径视为“尚未添加到索引但Git已经知道它们”;   “git diff HEAD”和“git diff --cached HEAD”不应该谈论它们,“git diff”应该将它们显示为新的。   +文件尚未添加到索引中。

答案 1 :(得分:3)

也许您可以尝试编写一些预提交挂钩,如果您有未跟踪的文件,它会提醒您。这将要求你始终保持你的git目录清洁(显然你需要保持最新的.gitignore)。

同时尝试与git add -i类似的git add -p,但也有一个用于添加新文件的界面。

答案 2 :(得分:1)

在进行更改之前,您可以使用该路径提交空文件。如果您已经在那里写了东西,请将文件移开,制作一个空白文件,然后提交,然后正常添加-p和git commit --amend,这样就不会有“添加空白文件”提交。