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

Bra*_*ton 1 git github gitignore

我是git for source control的新手.我想确保我能够理解一切,但是很早就发现了一些看起来很奇怪的东西.

这是我正在做的事情:

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

所以最终我添加它,提交并推回原点,它显示了我对GitHub的更改.一切都很好.

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

Sha*_*baz 8

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

repository  ---  staging area  ---  working directory
Run Code Online (Sandbox Code Playgroud)

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

我强烈建议您阅读本文,虽然重点关注git reset,但它非常好地概述了git的工作原理.

这是一张小图片:

repository  ---  staging area  ---  working directory
    |                  |                    |
    |                  |                    |
    |              Check out                |
    |-------------------------------------->|
    |                  |                    |
    |                  |         add        |
    |                  |<-------------------|
    |                  |                    |
    |      commit      |                    |
    |<-----------------|                    |
Run Code Online (Sandbox Code Playgroud)

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

$ touch file1 file2 file3 file4  # modify files
$ git add file1
$ git add file2
$ git commit
Run Code Online (Sandbox Code Playgroud)

只提交file1,file2即使file3并且file4也被修改.

有时候,你想要的就是提供你所拥有的一切.它有一个快捷方式:

$ touch file1 file2 file3 file4  # modify files
$ git commit -a
Run Code Online (Sandbox Code Playgroud)

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

您甚至git add -p可以暂存部分文件,这样做基本上可以显示提交补丁的各个部分,并允许您选择进行哪些更改以及不进行哪些更改.之后,git commit您可以承诺上演的任何内容.


ham*_*mar 6

这不是特定的.gitignore.git add除非您使用git commit -a自动提交所有更改,否则您必须在提交修改后的文件之前使用它们.

有关在Git书中跟踪和暂存的更多信息.