Gitはとても便利だけど、一歩踏み込むと人外魔境だったりしてちょっとこわい。
ので、俺がGitを勉強していて「これは超便利」と感じたものをTIPS的にまとめておくことにする。
git add -p
↓こんな感じで起動する。
$ git add [ファイルパス] -p
で、何が出来るのかっていうと、 これからコミットする変更内容を取捨選択したり、編集したりする ことができる。
たとえば、
diff --git a/git-add.md b/git-add.md
index 356ee59..dbf3428 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1 +1,5 @@
 # git-add
+
+- add line-a
+- add line-b
+- add line-c
っていう変更があったとして、通常なら全部コミットするか、vimで開いて編集して別のコンソールでコミットした後、編集をロールバックするとか、そういうアナログな感じのことをやらなきゃいけないし、実際俺も最初の頃はそうしていた。
ところがどっこい、Gitにはちゃんとそれを回避する方法がある。
試しにgit add . -pしてみよう。すると、以下のように表示されるはずだ。
diff --git a/git-add.md b/git-add.md
index 356ee59..dbf3428 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1 +1,5 @@
 # git-add
+
+- add line-a
+- add line-b
+- add line-c
Stage this hunk [y,n,q,a,d,/,e,?]? 
この時?と入力してReturnすることで、簡易的なヘルプを見ることができる。今回は真ん中の- add line-bだけをコミットしたかったと仮定する。どうするかというと、おもむろにeと入力してReturnするのだ。
すると、突然エディタが立ち上がる。俺の環境だとVimだ。
  1 # Manual hunk edit mode -- see bottom for a quick guide
  2 @@ -1 +1,5 @@
  3  # git-add
  4 +
  5 +- add line-a
  6 +- add line-b
  7 +- add line-c
  8 # ---
  9 # To remove '-' lines, make them ' ' lines (context).
 10 # To remove '+' lines, delete them.
 11 # Lines starting with # will be removed.
 12 #
 13 # If the patch applies cleanly, the edited hunk will immediately be
 14 # marked for staging. If it does not apply cleanly, you will be given
 15 # an opportunity to edit again. If all lines of the hunk are removed,
 16 # then the edit is aborted and the hunk is left unchanged.
この状態で例えば5行目と7行目を削除して、保存してみる。すると、おもむろにgit-addを抜けて、通常のコンソールに戻るはずだ。そして、改めてgit diff --cachedを覗いてみよう。
diff --git a/git-add.md b/git-add.md
index 356ee59..577a4b4 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1 +1,3 @@
 # git-add
+
+- add line-b
なんと、さっき消した2つの行が消えているではないか!
じゃぁどこに消えたのか?安心して欲しい、ちゃんと編集内容は残っている。git diffを見てみよう。
diff --git a/git-add.md b/git-add.md
index 577a4b4..dbf3428 100644
--- a/git-add.md
+++ b/git-add.md
@@ -1,3 +1,5 @@
 # git-add
 
+- add line-a
 - add line-b
+- add line-c
つまり、さきほどeでやったことは、 これからコミットしたいものだけを残して保存することで、それらだけを Changes to be committed にする ということだったのだ。
この業を上手く使いこなせば、コミットの効率が飛躍的に伸びるはずだ。
(後大事なのは、Gitを使いこなしてる感があって「俺SUGEEEEE」できるという自己満足に浸れるという点である)