为什么我必须在提交之前添加被跟踪的文件?

时间:2012-05-05 01:04:25

标签: git github gitignore

我是git for source控件的新手。我希望确保我能够理解所有内容,而且很早就发现了一些看似奇怪的东西。

这就是我正在做的事情:

  1. 在GitHub上创建一个新的存储库。它提供了一个“标准”C#.gitignore文件,听起来不错,所以我说是的。
  2. 我看到存储库中创建了自述文件和.gitignore。
  3. 我使用git clone [repo location] [local folder]
  4. 将此repo克隆到我的机器上
  5. 我编辑.gitignore文件以添加一些其他被忽略的文件和文件夹。
  6. 我输入git commit,这会产生一条消息,上面写着“未提交更改的更改”,但会将.gitignore列为已修改。
  7. 所以最终我添加它,提交并推回原点,它显示了我对GitHub的更改。一切都很好。

    这对我来说有点混乱。如果.gitignore没有被跟踪,那么世界上是如何使用git clone将其拉下来的?为什么我必须在允许我提交更改之前手动添加它?

2 个答案:

答案 0 :(得分:8)

这就是git查看您的存储库的方式:

repository  ---  staging area  ---  working directory

在存储库中,您将获得所有本地分支或fetch远程分支中提交的所有内容。在工作目录中,您可以从一些提交中检出所有可能已修改的文件。暂存区域是您添加要提交的文件的位置,但尚未提交。这是因为在git中你可以选择要提交的内容(例如,与svn不同,你提交了任何被修改的内容)。

我强烈建议您阅读this article虽然专注于git reset,但它可以很好地概述git的工作原理。

以下是一张小图片:

repository  ---  staging area  ---  working directory
    |                  |                    |
    |                  |                    |
    |              Check out                |
    |-------------------------------------->|
    |                  |                    |
    |                  |         add        |
    |                  |<-------------------|
    |                  |                    |
    |      commit      |                    |
    |<-----------------|                    |

结账非常明显。第二个意味着您有选择地将文件添加到暂存区域然后提交它们。例如:

$ touch file1 file2 file3 file4  # modify files
$ git add file1
$ git add file2
$ git commit

仅提交file1file2,即使file3file4也已修改。

有时候,你想要的就是提供你所拥有的一切。它有一个捷径:

$ touch file1 file2 file3 file4  # modify files
$ git commit -a

git commit给定-a选项会自动将所有已修改的文件添加到提交中。

您甚至可以暂存部分文件,这些文件由git add -p完成,它基本上显示了提交补丁的各个部分,并允许您选择进行哪些更改以及不进行哪些更改。之后,使用git commit,您可以提交任何已上演的内容。

答案 1 :(得分:6)

这不是.gitignore特有的。除非您使用git add自动提交所有更改,否则您必须先使用git commit -a暂存已修改的文件。

More information about tracking and staging in the Git book.