很多時候,對於一個大的文件,可能有的同學改完之后不想一次提交,想分批提交。但這個時候由於git add的機制往往add之后就是整個一個文件被放到stage區了,這個時候肯定會想能不能對一個文件可以進行分開的快區域提交概念呢?
答案其實是有的,就是
git add -p [filename]
filename為可選操作,如果不指定,git就會對所有的unstage文件進行一次遍歷。
那么如何使用呢?
比如我們一個文件a.txt的內容如下
hello
world
此時我將a.txt的內容改成了
11111111 hello 222222
此時運行git diff可以看到如下
+1111111111 hello -world +2222222
這個時候問題來了,我想先提交”把2222222增加“的提交,然后再提交”刪除world,然后再”增加1111111新行“的提交怎么做呢?
首先進行命令
git add -p
它會提示你輸入什么命令,有
State this hunk? [y,n,q,a,d,/,s,e,?]?
具體的命令同學可以自己去查,在這里我們輸入'e'進入手動選擇模式
出現了如下內容
# Manual hunk edit mode -- see bottom for a quick guide @@ -1,2 +1,3 @@ +11111111 hello -world +22222222 # --- # To remove '-' lines, make them ' ' lines (context). # To remove '+' lines, delete them. # Lines starting with # will be removed. # # If the patch applies cleanly, the edited hunk will immediately be # marked for staging. If it does not apply cleanly, you will be given # an opportunity to edit again. If all lines of the hunk are removed, # then the edit is aborted and the hunk is left unchanged.
終於到了這一步,好了,英文好的同學可以看提示操作,不會的你只要知道我總結的兩條原則就行
1 對於增加的內容(+),如果你在這個提交中不想放進去,就把整行刪除 2 對於減去的內容(-),如果你在這個提交中不想刪除,就把前面的‘-’刪除,替換為一個空格
那么,按照我們之前的邏輯就應該改成這樣
@@ -1,2 +1,3 @@ hello world +22222222
這個時候wq,此時你輸入
git diff --cached
就會和stage區的文件進行diff對比,你可以看到只是簡單的22222被加進去了,
這個時候你commit,就完成了僅僅針對增加22222222的補丁形式的提交。
那么接下來就很簡單了,按照之前的邏輯進入到git add -p中的e手動模式,變成如下格式即可完成這次的所有需求
原來的是這樣
@@ -1,3 +1,3 @@ +11111111 hello -world 22222222
改成這樣
@@ -1,3 +1,3 @@ hello -world 22222222
那么,這次的提交就沒有包括1111111的增加,只是簡單的對world進行刪除,最后commit即完成了world的刪除,但是此時的1111111還沒有加進去。
最后一個提交“111111111111加進去”其實已經很簡單了,也不需要再用到git add -p了,只需簡單的add和commit,即分別完成了對一個文件所做的三次提交。
參考鏈接: http://stackoverflow.com/questions/10731269/git-hunk-edit-mode-how-to-remove-a-line