當使用Git時,我的工作流通常包括啓動TortoiseGit並選擇我想提交的文件。將文件添加到git索引而不提交
這(我假設)運行git add(?)並將這些更改提交到本地回購。
我的問題是 - 爲什麼將文件添加到索引和提交它們需要分離?
是否有任何用例只是簡單地將文件添加到索引而不同時提交它們?
當使用Git時,我的工作流通常包括啓動TortoiseGit並選擇我想提交的文件。將文件添加到git索引而不提交
這(我假設)運行git add(?)並將這些更改提交到本地回購。
我的問題是 - 爲什麼將文件添加到索引和提交它們需要分離?
是否有任何用例只是簡單地將文件添加到索引而不同時提交它們?
將文件添加到索引稱爲分段。分段提供了要提交的內容和提交之外的內容之間的分離。如果您進行了一些更適合於不同提交的更改,則可以將它們保留在那裏而不進行登臺,並對添加到索引的內容進行提交。
所以,從本質上講,它可以幫助您準備簡單,連貫的提交。
我使用索引/臨時區域相當多。它可以被認爲有點像購物車。它可以讓你漫遊你的項目,隨時添加東西,填滿你的購物車。一旦你有了你想要的東西,你就承諾(即購買這些變化並離開商店)。
此功能的一個重要特徵是增補程序。 git add -p
aka git add --patch
可讓您從文件中選擇特定的宏塊,因此您可以實際提交各種文件的各個部分。我每天都這樣做,儘管我爲Vim使用了病原體插件,這使得它非常容易和可視化地在變化和變化之間跳來跳去,在工作副本和索引副本之間來回移動。一旦我只有部分精美的細粒度提交添加到購物車中,我就可以通過一個明智的,細緻的提交消息將其提交給50個字符或更少的字符。這讓我的歷史令人難以置信,一小時後讓我改變了主意,並通過交互重組來推動提交,並將它們重新排列成更明智的流程,有時在每次提交時都會進行單元測試,所以我有乾淨,安全,回滾點在我的歷史中無處不在。
我也使用補丁添加,以幫助我找出一個文件的哪些部分合理。在Vim中,我做了,gs
,在一個新的分割窗口中彈出打開當前文件的repo的git狀態。我使用<C-n>
和<C-p>
來在狀態消息的各行上跳過實際的文件。我在這些行上使用D
來在一組拆分窗口中對它們進行vimdiff處理,然後使用dp
(diff put)和do
(diff obtain)將]c
和c[
從跳轉到頂層跳轉,以便將更改移到當前緩衝區或從當前緩衝區從任一分割工作,並且<C-w>h
和<C-w>l
在緩衝器之間來回跳轉)。一旦我喜歡我爲該文件演出的內容,我將:w
保存起來,然後<C-w>k
直到狀態再次分裂,以選擇以這種方式播放的新文件,或者在的任一集合中將文件切換到並完全脫離舞臺,或者cc
實際提交,於是它要求提交提交消息。在進行提交之前,我可以通過這些方式審查所有事情,並且在此時我會意識到我忘記了某些事情,或者添加了一些我不應該做的事情,並且糾正它。因此,我的承諾是相當原始的。如果我想要commit --amend
,我可以登臺並使用cA
而不是cc
或ca
,如果我還想重新提交提交消息。
簡而言之,提交整個文件 - 就像我以前在SVN中所做的那樣 - 現在對我來說感覺非常粗糙和不正確。在工作中很難改變一個問題,但通過索引的力量補丁增加了我們在一次提交中梳理出了有意義的實際變化。
您不必提交添加到索引/暫存區域的所有文件。
git add fileA
git add fileB
git add fileC
使用案例1:僅提交的fileA和FILEB:
git commit -m "fileA, fileB added." fileA fileB
使用案例2:將它們添加到臨時區域後跟蹤文件的變化。這將向您顯示工作副本和上次將文件添加到暫存區域的時間差異。
登臺幾乎就像一個文件的小型提交。您可以在實際提交之前進行階段,重新階段,查看所做的更改,甚至可以恢復到最近的階段。做幾次微型提交可以幫助你組織,就像做幾次完整的提交一樣。
本質上它是更精細的粒度級別。
此外,它可以讓你在提交之前在本地玩弄一下 - 它實際上與創建操場分支並進行一堆提交一樣,然後在最終提交之前合併回來。比所有更輕量化。
在SmartGit中,您可以在文件上單擊鼠標右鍵,然後選擇舞臺。
到階段一個文件(將文件添加到git索引)僅僅是爲了提交而準備好它。 Git及其索引允許您僅提交自上次提交以來所做更改的某些部分。假設您正在研究兩個功能 - 一個已完成,另一個仍需要完成一些工作。你想做一個提交併回家(終於5點鐘了!),但不想提交第二個功能的部分,這還沒有完成。您將您知道屬於第一個功能的部分放置並提交。現在您的提交是完成第一項功能的項目,而第二項工作仍在工作目錄中進行中