肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

git add -p のときの e(手動編集)

自分ではあまり add -p の e ってつかったことなかったんだけど友達がよくわからんってことだったので調べてみた。

以下のような diff を add -p して、 e してみます。

$ git add -p
diff --git a/fuga b/fuga
index 1a39df0..5bc676d 100644
--- a/fuga
+++ b/fuga
@@ -1,5 +1,5 @@
 //
 hoge
-fuga
 piyo
 hogera
+fugera
Stage this hunk [y,n,q,a,d,/,s,e,?]? e


で、エディタが起動するわけです。以下のような感じで書いてあります。

# Manual hunk edit mode -- see bottom for a quick guide
@@ -1,5 +1,5 @@
 //
 hoge
-fuga
 piyo
 hogera
+fugera
# ---
# 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.

ここで出てくる謎のメッセージ(いや、謎でもないんだけど)

# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.

これの意味がわかりづらいですね。先に結論を言うと、

  • - の行を add したくなかったら - を スペース (' ') にかえてください
  • + の行を add したくなかったらその行を削除してください
  • # から始まる行は、add されません

ということなんですが、'delete' が hunk からの削除 = diff からの削除、つまり、add する patch に含めない、つまり、add しない、ということです。

読み替えると、

  • 削除行 (-) を add しないなら、- をスペースにかえてください
  • 追加行 (+) を add しないなら、その行を削除してください
  • add したくない行は先頭に # って書いてください

ですかね。

実際にやってみる

エディタ上で、次のようにしてみます。 (- を ' ' に変更)

# Manual hunk edit mode -- see bottom for a quick guide
@@ -1,5 +1,5 @@
 //
 hoge
 fuga
 piyo
 hogera
+fugera

で、エディタを閉じると、次のようになります。

$ git status
# On branch master
# Changes to be committed:
#
#       modified:   fuga
#
# Changed but not updated:
#
#       modified:   fuga

$ git diff
diff --git a/fuga b/fuga
index 387b231..5bc676d 100644
--- a/fuga
+++ b/fuga
@@ -1,6 +1,5 @@
 //
 hoge
-fuga
 piyo
 hogera
 fugera

$ git diff --cached
diff --git a/fuga b/fuga
index 1a39df0..387b231 100644
--- a/fuga
+++ b/fuga
@@ -3,3 +3,4 @@ hoge
 fuga
 piyo
 hogera
+fugera

hunk から削除した「fugaの行の削除」という diff が add されてないですね。

つまりそういうことでした

まぁわかってしまえば簡単ですが最初はよくわからないかも。
+ の行の削除とかも、気になったら試してみてね。


多分自分では add -p の「e」は使わないと思うけどw