2012-05-05 56 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背景。但非常酷。 –

相關問題