Gluegent Blog

Gluegent Blog

綺麗なコミットにするために 1 ~git add -pというオプション~

  • 技術
綺麗なコミットにするために 1  ~git add  -pというオプション~

みなさんこんにちは! せしょうです。

突然ですが、エンジニアの皆さんは綺麗なコミットとは何だと思いますか?

エンジニアの方それぞれ綺麗なコミットの定義があったりだとかあったりするのではないでしょうか?

その中でも私が思う綺麗なコミットの定義の一つとして、コミットメッセージとコミット内容が一致している。ということを思っています。

実際、コミットメッセージ以外の内容が入ったコミットはレビュー者にとって見にくく、どこを変更したのかが分かりにくくレビューの時間もかかってしまうものだと思っています。

そのため、私はレビュー者に分かりやすい そんなコミットが出来るように意識しています。

本日は、そんなコミットを綺麗にするために役立つ知識の一つとして、git add . -pというオプションを使ったステージング方法について書かせていただきます。

git addのコマンドを使って、変更ファイルをステージングに上げる際、 色々なオプションを使用することが出来ます。

以下、git add -h(--help)で出た オプション一覧です。

この中で、今回は-p(--patch)オプションに絞って説明させていただきます。

目次

  1. -pオプションを使うタイミング

  2. git add -pとは?

  3. -pオプションの使い方

  4. -pオプションを使うあるある

  5. まとめ

‐pオプションを使うタイミング

 コードを書いているときに、同じファイル内に異なるコミットの内容を修正・追記してしまい、ステージングする際に分けたいのに.. 困ったなということはありませんか?

こういった、変更した一部分だけをステージングしたいなという時に役立つのが-p(--patch)オプションです。

git add -pとは?

-p(--patch)オプションの説明としては、helpの中の説明文では select hunks interactivelyと書かれています。

hunksは、変更点の塊を指しています。

なので、-p(--patch)は 「変更点の塊を選択して ステージングすることができる」オプションになります。

-pオプションの使い方

オプション一覧

今回は、以下のREADME.mdを例に説明していきます。

修正前

修正後

変更点

git add . -pをすると、以下のような出力がされます。

変更点が表示され、その変更点に対して このhunkをステージングしますか?と聞かれています。

以降、この変更点に対して各コマンドの説明とコマンドを打った時にどうなるかを書いていきます。

【y】表示されている 変更点をステージングする

変更点は一つのみなので、この変更点をステージングしたら終了

  ステージング内容

【n】表示されている 変更点をステージングしない

変更点を分割して、1つ目の変更点はステージングにあげ、2つ目はステージングしない

  ※ 変更点の分割は、【s】, 【e】を参照

  ステージング内容

【q】現時点でのステージングで終了

   ※ まだ決定していないステージングが残っている状態でも終了する

【a】以降の変更点を全てステージングする

   ※ まだ決定していないステージングが残っている場合は、その変更点へ移動 (変更点の保留は、j, J, K)を参考に

  ステージング内容

【d】以降の変更点を全てステージングしない

【g】変更点の一覧が出され、選択した変更点に移動する

【/】検索したいワードを元に該当する変更点に移動

【j】今の変更点は最後に残しておいて、次のステージングしていない変更点に移動

※既にステージングするかしないかが決まっている変更点には移動しない ➡ 移動したい場合は J

【J】今の変更点は最後に残しておいて、次の変更点に移動

※ステージングするかどうかが決まっている変更点に移動したくない場合は j

【K】今の変更点はそのままに、前の変更点に移動

【s】変更点を分割する

変更点を自動的に分割してくれる (fugafugaを起点に上下を変更点として分割)

【e】変更点を手動で分割する

   ※設定してある、エディターが開かれる

   

  修正内容: piyopiyo⇨ piyoの修正はせず、機能追加2だけを行う

修正前

修正後

  ステージング内容

【?】今の変更点に置いて使用できるオプションの説明が一覧で表示される

-pオプション紛らわしい部分の説明

オプション

説明

q

現在の変更点以降ステージングを行わない(強制終了)

a

現在の変更点以降全ての変更点をステージングする

※ 保留中の変更点は再度、決定を行う

d

現在の変更点以降全ての変更点をステージングはしない

※ 保留中の変更点は再度、決定を行う

オプション

説明

j

現在の変更点は保留したままで、次のステージングするか決まっていない変更点へ移動する

※ (1/3)にいた際、 (2/3)がすでにステージングすることが決まっていた場合, (3/3)へ移動する

J

現在の変更点は保留したままで、次の変更点へ移動する

※ (1/3)にいた際、(2/3)へ移動する

K

現在の変更点は保留したままで、前の変更点へ移動する

※ (2/3)にいた際、(1/3)へ移動する

オプション

説明

e

「-」がついているものを削除したい場合は、 半角スペース「 」に置き換える

「+」がついているものを削除したい場合は、 その行を削除する

コメントアウト「#」されているものは、無視される

※ vs codeで editを行うと、失敗することがあるようです。 issue

-pオプションを使うあるある

  • フォーマットの修正と今回の修正内容が混ざる!

  • LOG デバッグを書いたけど、その部分の修正はステージングには含めたくない

【修正前】

【修正後】 log.debug(f"parents1: {parents1}")をステージングに含めない

まとめ

いかがだったでしょうか?

今回は、綺麗なコミットを作るのに、こんな方法が役立つよということで git add -p (--patch)オプションについて、書かせていただきました。

私は、過去 -p(--patch)オプションを知らなかった際は、フォーマットと修正内容が同じファイルになってしまい困ったことが多々ありました。自分の環境で、フォーマットが自動的に修正されるような設定になっていたんですね。

そうしたときに、一旦修正内容を全てコピーしてフォーマットだけが修正された状態に戻して、それをコミットしてから、先ほどコピーした内容をペーストするってことをしてました。。。

(綺麗なコミットを意識するが、そのコミットを分けるのがとてもめんどうくさい... 工数かかる..)

そのため、 -p(--patch)オプションを知ったときは、目から鱗でした。 周りにもgit 触り始めたり、困っている方がいたらぜひ紹介してあげてください。

みなさんも、自分が一度調べて知識として持っているものがあったらぜひ教えてください。

では、また次回の記事でお会いしましょう。

(せしょう)