はじめに
git add
を使うときに「変更ファイル全体ではなく、一部だけコミットしたい」と思ったことはありませんか?
そんなとき便利なのが git add -p
です。変更を部分ごとに確認しながら、対話的にstageに追加できます。
僕は以前、tig
というツールをよく使っていましたが、公式のGitコマンドだけで同等のことができた方がかっこいいのではないかと思い、git add -p
を使ってみることにしました。
tig
については以前紹介しておりますので、もし興味がございましたら下記よりご覧ください。
git add -p
の基本
git add -p
を実行すると、以下のような差分とプロンプトが表示されます。
diff --git a/functions.php b/functions.php
--- a/functions.php
+++ b/functions.php
@@ -97,11 +97,11 @@ function include_help_content_in_search($query) {
}
if ($query->is_search) {
- $query->set('post_type', array('help'));
+ $query->set('post_type', array('article'));
$query->set('search_excerpt', false);
$query->set('sentence', false);
- $query->set('exact', false);
+ $query->set('exact', true);
}
}
(1/1) Stage this hunk [y,n,q,a,d,s,e,?]?
現在の状態で選べる選択肢は下記になります。選択した操作内容に応じて、追加で表示される選択肢もありますが、今回はあくまで e
についての説明をメインにしたいので、割愛させていただきます。
-
y
: この変更をStageに追加する -
n
: この変更をStageに追加しない -
q
: 処理を中断する -
a
: 以降の変更をすべてStageに追加する -
d
: 以降の変更をすべてStageに追加しない -
s
: この変更をより小さな変更に分割する -
e
: この変更を手動で分割する -
?
: ヘルプを表示する
行単位で編集できる e
オプション
git add -p
では Git が自動的に差分をある程度の塊としてまとめてくれます。
ですが、1つの変更の単位に「Stageに追加したい行」と「Stageに追加したくない行」が混ざっていることも少なくありません。
そんなときに役立つのが e
オプションです。
tig
のように行ごとにStageできるだけでなく、さらに細かいコントロールも可能です。
▼使い方
-
git add -p
を実行し、対象の差分が出たらe
を入力します。 - 設定しているエディタが開くので、後述する編集ルールに従い、Stageに追加したい分だけが含まれるように調整します。
# Manual hunk edit mode -- see bottom for a quick guide.
@@ -97,11 +97,11 @@ function include_help_content_in_search($query) {
}
if ($query->is_search) {
- $query->set('post_type', array('help'));
+ $query->set('post_type', array('article'));
$query->set('search_excerpt', false);
$query->set('sentence', false);
- $query->set('exact', false);
+ $query->set('exact', true);
}
}
# ---
# 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.
▼編集ルール
-
削除(
-
)行をStageに追加しない場合
→ 行頭の-
を半角スペース
に置き換える -
追加(
+
)行をStageに追加しない場合
→ その行を 丸ごと 削除する、または行頭に#
を付ける
※保存してエディタを閉じれば、その編集内容だけがStageされますので、適宜コミットしてください。
※Stageしなかった内容もローカルには差分として残ります。
ここで私がハマったのは、削除行と追加行の扱い方の違いです。
削除行(-
)をStageに追加しない場合は、-
を 半角スペースに置き換えるだけで済みます。
しかし、追加行(+
)をStageに追加しない場合は、+
の記号を消すだけでは不十分で、その行全体を削除しないといけません。
しかし、先に「削除行の編集ルール」を読んだことで、記号だけを変えればいいという先入観が生まれ、追加行をStageから外したいときに、うまくできずにとても悩んでしまいました。
あともう一点、行を削除する #
も削除行を無効にする意味で使えるように思えますが、+
がある行でしか使えませんでした。。。
▼例
if ($query->is_search) {
- $query->set('post_type', array('help'));
+ $query->set('post_type', array('article'));
$query->set('search_excerpt', false);
$query->set('sentence', false);
- $query->set('exact', false);
+ $query->set('exact', true);
}
この差分の下のブロックのみをStageに追加したい場合は、下記の様にしてください
if ($query->is_search) {
$query->set('post_type', array('help'));
#+ $query->set('post_type', array('article'));
$query->set('search_excerpt', false);
$query->set('sentence', false);
- $query->set('exact', false);
+ $query->set('exact', true);
}
まとめ
git add -p
の e
オプションを使えば、コミットをより細かく、意図通りにコントロールできます。
tig
のようなツールも便利ですが、純正コマンドだけで粒度を調整できるのはツールの導入の手間も省けますし、なんだかかっこいい感じがします。(主観です)
ぜひ次回のコミット整理で「e
」を試してみてください!
私の様にハマってしまった人がいるかはわからないですが、この記事を読んだどなたかの役に立てれば幸いです。