2012-05-05 37 views
1

我是新来的源代码控制git。我想确保我尽可能地理解所有事情,并且很早就碰到了一些看起来很奇怪的事情。为什么我必须在提交之前添加正在跟踪的文件?

下面是我在做什么:

  1. 创建GitHub上一个新的存储库。它提供了一个“标准的”C#.gitignore文件,听起来不错,所以我说是的。
  2. 我看到有一个使用存储库创建的Readme和.gitignore。
  3. 我克隆此回购使用git clone [repo location] [local folder]
  4. 我编辑的.gitignore文件来添加一些额外的忽略文件和文件夹在我的机器。
  5. 我输入git commit,这会产生一条消息,指出“更改未提交进行提交”,但将.gitignore列为被修改。

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

这有点令我困惑。如果.gitignore没有被追踪,那么在世界上如何使用git clone来拉下?为什么我必须手动添加它才允许我提交更改?

回答

8

这是视图,如何混帐你的资料库:

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你可以承诺任何上演。

+0

这是一个很好的解释,文章帮了我很多忙(这个和我有关于'git reset'的问题) –

+0

我知道,对吧? 'git reset'会变得非常混乱,但是这篇文章使它非常简单。 – Shahbaz

+0

特别来自没有临时区域的svn背景。但非常酷。 –

相关问题