Edited at

初心者から一歩抜け出すためのGitの業 〜 git add -p

More than 5 years have passed since last update.

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