2016-06-10 124 views
1

我正在學習Git命令。爲什麼我們需要git add命令中的文件名?

我混帳的理解添加和git的承諾如下:git的補充「文件名」採取項目(整個工作目錄)的快照和階段,。 git commit將分階段快照保存到存儲庫。

我也明白,從混帳SVN等的不同之處保存文件的根本途徑。雖然SVN在單個文件中保存增量更改,但git會保存整個工作目錄的快照。如果文件沒有改變,git快照將包含前一個快照中的文件引用。

我在這裏有一個問題。如果git add爲整個工作目錄拍攝快照,爲什麼我們需要在命令中提供單個文件名?無論如何,Git會拍攝整個項目的快照。

+1

'git add file [file ...]'只添加*指定的文件*,而不是整個工作目錄。但它確實允許你指定一個目錄,這意味着「目錄中的所有文件」;如果您位於工作樹的頂部並指定'.',則相當於「工作樹中的所有文件」。這裏有一些例外,由於'.gitignore'文件等,但它涵蓋了大部分。 – torek

+0

您可以使用'git add -u'添加所有以前跟蹤的文件。 – o11c

+0

我想知道爲什麼沒有人提到'git add -A'。 – user3159253

回答

2

因爲你可能不希望添加一個已經添加或更改每一個文件。例如,假設您已經修改了xyzzy.c文件,但您還下載了一張非常漂亮的圖片taylor_swift.jpg到當前目錄(並且還沒有機會將其移動到其他地方)。

希望後者文件,以找到自己的方式進入回購,那麼你只需做:

git add xyzzy.c 

ABD,增加了只有你想要添加的文件。

在任何情況下,如果你想在當前目錄下的所有文件,你可以簡單地做:

git add . 

我傾向於認爲它是在三個方面。

首先,你的工作區,讓您有一個特定的「快照」簽出,你做了什麼變化。

然後保存用於下一次提交的文件的暫存區域。

最後,保存所有提交更改的git-proper區域。

如果你認爲這些條款,add然後複製單個東西從工作到分期,commit複製從分期到git適當的一切。

+0

所以它意味着當git拍攝項目快照時,快照將包含git add命令中提到的修改過的文件,而對於其他文件,它只會鏈接到先前存儲的相同文件(即使文件已更改)。 – Mandroid

+0

@Mandroid,我傾向於認爲它是三個領域。你有一個特定的「快照」的工作區域簽出,無論你做了什麼改變,暫存區域保存下一次提交的文件,以及保存所有提交的更改的git-proper區域。 'add'然後將單獨的東西從工作複製到分段,提交將所有內容從分段複製到git-proper。 – paxdiablo

+0

該解釋有助於在可視化的事情。 – Mandroid

0

結帳git的文檔約git add

簡單,你可以使用。

您可以使用git add .這需要整個目錄/新文件/修改的文件 - 準備提交。

1

你對git中快照的理解是錯誤的。如git網站文檔[Snapshots, Not Differences]所示,項目快照是您在存儲庫中添加的每個文件的快照聚合。這就是您需要在git add命令中指定文件名的原因。

當您告訴git應該由git add <filename>管理哪個文件後,您可以使用git add -u來進行修改,在這種情況下,文件名不是必需的。

+0

感謝您的鏈接。我對git中快照的理解是錯誤的。 – Mandroid