git add -p と git reset -p はセットで覚えたら捗る話

はじめに

Gitのコマンドはたくさん種類がありますが、 git add コマンドは誰でも知っていると思います。
そして、オプションの1つに git add -p があって、使ってる方も多いと思います。
私は日常的に頻繁に使っています。
今回は、 git add -p をよく使うなら git reset -p も知っておくと色々と捗るかもしれないという話です。

git add -p

git add -p とは何ぞやということで、知っている方も多いと思いますが、一応説明しておきます。
-p オプションは --patch のことで、 指定したファイルの全てではなく一部だけをaddすることができます。
1つのコミットに異なるコンテキストの変更を含めることは厳格に禁止されている(ような気がする)ので、ファイルの変更は1つのコンテキストだけにとどめ git add する際はそのファイルだけを指定するのを徹底する必要があります。
しかし、これだと大変なので、苦労してそれを徹底するか、1つのコミットに複数のコンテキストに関する変更を含めるという禁忌を犯してしまうことになります。

そこで、1つのコミットに1つのコンテキストの変更しか含めないように git add するために重宝するのが、 -p オプションです。
git add -p filename とすると、filenameの変更箇所のうちどの塊(hunk)をaddするかを1つ1つ指定できます。
addしたいならy(yes)、したくないならn(no)、hunkをより細かくしたいならs(split)、より詳細に指定したいならe(edit)など、hunkごとに指定するだけです。
詳しくは他のブログ様をご覧ください。

git reset -p

ただ、日常的に git add -p を使っている方ならわかると思いますが、しばらくyが続いて調子に乗って連打していたら、ついnにすべきhunkでyを打ってしまって残念な気持ちになることが稀によくあります。
このとき、「ま、いっか」と結局コミットに含めてしまう(絶許)か、全体的に git reset して改めて git add し直すか、どちらかで妥協している方が多いように感じています。

長々とした前置きになってしまいましたが、このようなときに便利なのが git reset -p です。
もはやだいたい予想はできてしまうわけですが、addされたファイルのうちどのhunkをresetするかを1つ1つ指定できます。 git add -p のときと同じようなモードに移行するので、resetしたいならy、そのままならnなどをhunkごとに指定するだけです。

コマンドを実行してみたらわかりますが、 git add -p の際には、

Stage this hunk [y,n,q,a,d,s,e,?]?

などと出ていた表示が、

Unstage this hunk [y,n,q,a,d,s,e,?]?

に変わっていることがわかります。
editモードの場合、先頭の記号を除去するのか、1行丸ごと削除するのか、逆になっていて多少ややこしいかもしれませんが、慣れれば簡単です。

メインである git reset -p の章と補足のための git add -p の章の分量が同じくらいになってしまいましたが、 git add -p をよく使っていて調子に乗ってaddしすぎてしまうことがあるなら git reset -p を使うと多少楽になるよという話でした。

まとめ

変更ファイルの一部だけを使うなら git add -p ( git add --patch ) を使うと良い。
addしすぎてしまったら「ま、いっか」でコミットせず git reset -p ( git reset --patch ) で一部だけresetすると捗る。