1. 程式人生 > >快取檔案,瞭解git add對同一個檔案分多次提交的騷操作

快取檔案,瞭解git add對同一個檔案分多次提交的騷操作

場景: 我們在專案開發過程中, 有時候會遇到經理開始說了兩個需求, 我們在專案的基礎上直接將兩個需求做完了, 正當我們沉浸於提交一天的成果感覺人生已經達到了巔峰的氣氛中時, 經理說先上一個一個需求, 另一個需求暫時先不上. 暫且不提心情的落差, 放下了2米4的大砍刀之後,仔細分析了索要提交的檔案發現兩個需求有幾個檔案都涉及到了,這可怎麼辦?

遇到上述場景, 那麼git add將是你的重要利器


場景重現

vim a.txt

使用vim命令編輯(也可以自己手動建立檔案然後編輯)內容如下並儲存

initial a.txt

然後我們將初始化的檔案提交到遠端倉庫.

git add --all
git commit -m "initial a.txt"
git push origin master

這裡為什麼要先初始化檔案呢? 是因為這裡多次提交的騷操作只是針對modify檔案, 而不是新增的新檔案,新增的新檔案是沒有這種騷操作的.

然後編輯a.txt檔案內容如下並儲存, 注意上一次的初始化的內容已經被替換了.

change1
change2
change1
change2

然後使用如下命令

git add -p a.txt #或者採用 git add --patch a.txt

出現如下內容

diff
--git a/a.txt b/a.txt #這裡表示對比修改前後的是哪兩個檔案 index 6ea572d..cfe5e28 100644 #這這裡表示對比修改前後的HEAD指標指向變化 --- a/a.txt +++ b/a.txt @@ -1 +1,4 @@ -initial a.txt #'-'表示刪除 '+'表示新增 +change1 +change2 +change1 +change2 Stage this hunk [y,n,q,a,d,e,?]?

這裡我們輸入 ? 並回車檢視一下每一種情況代表什麼意思

y - stage this hunk #代表直接快取每一個區塊
n - do
not stage this hunk #代表不快取每一個區塊 q - quit; do not stage this hunk or any of the remaining ones #不做任何操作直接退出 a - stage this hunk and all later hunks in the file #代表直接快取這個檔案 d - do not stage this hunk or any of the later hunks in the file #代表不快取這個檔案 e - manually edit the current hunk #編輯將要快取的部分!! 就是這個我們可以選擇式的提交檔案 ? - print help

我們輸入 e 並回車

# Manual hunk edit mode -- see bottom for a quick guide.
@@ -1 +1,4 @@
-initial a.txt
+change1
+change2
+change1
+change2
# ---
# 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.

大概的意思就是要是移除減號對應的行使其為空, 那麼被刪除的行將不會被執行刪除. 要是移除加號所在的行,那麼這行不會新增的快取中.所以這裡我們要做的就是移除掉change2所在的行. 執行完之後我們提交然後推到遠端倉庫,那麼就會發現change1被提交了. change2被留下了.

git commit -m "push change1" #注意不要在重複git add 了,因為change1已經被快取了直接提交即可 
git push origin master
#結束只有我們可以使用 git status 檢視a.txt的內容是否達到了我們的目的

結束.