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」できるという自己満足に浸れるという点である)