【Git】git add -p を使ってコミット単位を整理する

はじめに

この記事ではgit add コマンドのオプション -p (–patch)に関して説明します。

皆さん git を使って開発をしてますでしょうか。開発を進めていくなかで、このファイルのこの変更だけコミットしたい時ってありますよね。

こまめにコミットしていればいいのでしょうが、ついつい色んな変更をまとめて進めてしまったときって、あると思います。そんなとき、git add -p を使うと解決できます。

1つずつ変更を確認することができるため不要なコミットをせずに済むという利点もあったりします。以降、使い方について簡単に説明します。

想定ケース

●index.phpを編集しているとします。
●以下の変更を行いましたが、シングルクォートに修正した内容だけコミットしたい。といったケースを想定しています。
・ 並び順の修正
・ ダブルクォートをシングルクォートに修正
・ コメントの追加
				
					$ git diff
diff --git a/index.php b/index.php
index 27787aa..276a5f1 100644
--- a/index.php
+++ b/index.php
@@ -1,9 +1,9 @@
 <?php

// 並び順の修正
-use Illuminate\Http\Request;
 use Illuminate\Contracts\Http\Kernel;
+use Illuminate\Http\Request;

// シングルクォートに修正
-define("LARAVEL_START", microtime(true));
+define('LARAVEL_START', microtime(true));

 /*
 |--------------------------------------------------------------------------
@@ -24,9 +24,14 @@ if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php'))
 |--------------------------------------------------------------------------
 | Register The Auto Loader
 |--------------------------------------------------------------------------
// コメントの追加
+|
+| Composer provides a convenient, automatically generated class loader for
+| this application. We just need to utilize it! We'll simply require it
+| into the script here so we don't need to manually load our classes.
+|
 */

// シングルクォートに修正
-require __DIR__."/../vendor/autoload.php";
+require __DIR__.'/../vendor/autoload.php';

 /*
 |--------------------------------------------------------------------------
@@ -39,7 +44,7 @@ require __DIR__."/../vendor/autoload.php";
 |
 */

// シングルクォートに修正
-$app = require_once __DIR__."/../bootstrap/app.php";
+$app = require_once __DIR__.'/../bootstrap/app.php';

 $kernel = $app->make(Kernel::class);

				
			

使い方

git add -p <ファイル名> を実行すると、インタラクティブモードという状態になりコマンド入力の待ち状態になります。 各変更のかたまり(hunk)ごとにインデックスに追加するかしないかを選択することができます。 (ファイル名を省略すると変更がある全てのファイルに対して操作が行われます。)
				
					(1/3) Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]?
				
			
?を選択すると各操作の説明を見ることができます。
				
					(1/3) Stage this hunk [y,n,q,a,d,j,J,g,/,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
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
				
			
たくさんありますので、今回はよく使うであろうy, n, eの紹介をします。

(コマンド) y

変更をインデックスに追加する

(コマンド) n

変更をインデックスに追加しない

(コマンド) e

インデックスに追加する行を手動で選ぶ 表示されている変更のかたまりの中でさらにわけたい場合に便利です。 eを選択するとファイル上で下記のような内容が表示されます。
				
					# Manual hunk edit mode -- see bottom for a quick guide.
@@ -1,9 +1,9 @@
 <?php
 
-use Illuminate\Http\Request;
 use Illuminate\Contracts\Http\Kernel;
+use Illuminate\Http\Request;
 
-define("LARAVEL_START", microtime(true));
+define('LARAVEL_START', microtime(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.
				
			

「-」 で始まっているのが削除された行です。この変更をインデックスに追加したくない場合は「-」を「 」(半角スペース)に置き換えます

「+」 で始まっているのは追加された行です。この変更をインデックスに追加したくはい場合は「+」の行をまるっと削除します。

今回、シングルクォートの変更だけ追加したので以下の通りにファイルを編集するとよさそうです。

				
					# Manual hunk edit mode -- see bottom for a quick guide.
@@ -1,9 +1,9 @@
 <?php
 
// スペースに変更
 use Illuminate\Http\Request;
 use Illuminate\Contracts\Http\Kernel;
// 行を削除
 
-define("LARAVEL_START", microtime(true));
+define('LARAVEL_START', microtime(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.
				
			

インデックスに追加する行を選択し終えたら、ファイルを閉じます。
すると、手動で選択した結果が反映されます。

最後に

以上の操作を使って、コミットしたい箇所や行だけインデックスに追加していくことができます。あとは、コミットしてあげればいいだけですね。

興味ある方は他の操作内容に関しても試してみてください!

参考

https://tracpath.com/docs/git-add#patch

スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank