有時候我們開發上會遇到
同一支程式
可能裡面包含了A功能及B功能的程式碼
若我們想要明確的控管commit
只要包含A功能,而不要包含B功能的程式碼片段
這時候可以利用git add --patch 這個指令
假設現在有個網頁 index.html ,內容如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>
接著我們開發了一個段落,內容如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>first page</title>
</head>
<body>
<div>func01</div>
<div>func02</div>
<div>func03</div>
</body>
</html>
此時可以發現我改了兩個地方,分別是
<title>first page</title>
及<body>內多了3個div
<div>func01</div>
<div>func02</div>
<div>func03</div>
假設title內容的變更是為了A功能
body內容的變更是為了B功能
這時候我們可以透過互動指令來完成
$ git add --patch index.html
diff --git a/index.html b/index.html
index dead1b9..6b2356c 100644
--- a/index.html
+++ b/index.html
@@ -2,9 +2,11 @@
<html>
<head>
<meta charset="UTF-8">
- <title>Document</title>
+ <title>first page</title>
</head>
<body>
-
+ <div>func01</div>
+ <div>func02</div>
+ <div>func03</div>
</body>
</html>
Stage this hunk [y,n,q,a,d,/,s,e,?]?
這邊回問號可以查看縮寫代表的意思
Stage this hunk [y,n,q,a,d,/,s,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
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
這時候git是問你是否要把這兩個區塊都放到暫存區以供commit
但因為我們不希望這兩個功能的程式混在一起commit
所以我們選擇s,s表示split the current hunk into smaller hunks
也就是請git把幫你選擇的異動區塊再切小一點
Stage this hunk [y,n,q,a,d,/,s,e,?]? s
Split into 2 hunks.
@@ -2,6 +2,6 @@
<html>
<head>
<meta charset="UTF-8">
- <title>Document</title>
+ <title>first page</title>
</head>
<body>
選了s之後,可以發現git顯示「Split into 2 hunks.」,這就是表示他再切小一點之後會分為兩個區塊
第一個區塊就是title那塊
假設他就是我們要的功能A的程式碼片段,我們就可以選y,讓git將它加入暫存區等待commit
接下來的區塊就是body內的div
@@ -6,5 +6,7 @@
</head>
<body>
-
+ <div>func01</div>
+ <div>func02</div>
+ <div>func03</div>
</body>
</html>
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? n
這邊我們選n,因為我們不希望功能B的程式碼片段隨著功能A,commit出去
選完之後確認狀態會發現是一個MM的狀態
$ git status -s
MM index.html
commit 上去
$ git commit -m "2nd commit"
[master 66a9576] 2nd commit
1 file changed, 1 insertion(+), 1 deletion(-)
commit上去之後,查git status會發現狀態是M
$ git status -s
M index.html
再來我們就可以把功能B的異動也加進暫存區,並且commit上去
這樣我們就會得到2個commit,而且是可以區分為功能A跟功能B的commit