これまで知らなかったGit機能を調べたまとめ


改めてGitで使えるコマンドのオプションを眺めて、便利そうだと思った機能をいくつか調べた。

$ git --version
git version 2.10.0

変更のdiffを見ながらコミットメッセージを書く

教えてもらってから活用してる。見ながら書いたほうが具体的に書けるような気がする。

余談...`diff`のシンタックスハイライト初めて使ったけど良い感じですね

$ git commit -v


変更のdiffを見ながらコミットメッセージを編集できます
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch commit-v
# You are currently bisecting, started from branch 'test-git-bisect'.
#
# Changes to be committed:
#>modified:   fruits.txt
#
# ------------------------ >8 ------------------------
# Do not touch the line above.
# Everything below will be removed.
diff --git a/fruits.txt b/fruits.txt
index 332fe39..5bd2686 100644
--- a/fruits.txt
+++ b/fruits.txt
@@ -1,7 +1,7 @@
 りんご
 いちご
 バナナ
-青リンゴ
+青りんご
 パイナップル
 キウイ
 ぶどう

-vオプションをつけなくても常にこの表示を有効にできるのをコメントにて教えていただき、設定してみたところ大変はかどっております!

$ git config --global commit.verbose true

別ブランチの特定のファイルの変更だけ欲しい

参照: Git 1ファイルだけ別のブランチから持ってくる
別のブランチで実装を済ませたモジュールとかがやはりこちらのブランチにも欲しい、というときにブランチを超えてcpしてくることができる。たまに使う。
commitの粒度の都合上、cherry-pickではうまくいかなそうな場合はこちらにする。

$ git checkout add-txt -- fruits.txt

add-txt というbranchから fruits.txt というファイルを取得(更新)できる。

不要な半角スペースをチェックする

空白のエラーやコンクリフトマーカーがdiffの中に存在した場合、git diff --checkで警告してくれる。
ただし、全角スペースはどうもひっかからない様子なので、日本語を扱うファイルについての確認時は頼らないほうがよさそう。

test.txt
行末半角スペース_
 行頭半角スペース
行末全角スペース
 行頭全角スペース
↓ 半角スペースだけの行
___
$ git diff --check test.txt

コンフリクトマーカー( <<<<<<< HEAD とか ) が残っていた場合はこんな感じになる。

1つのファイルに存在する複数の変更を分割してcommit

1つのファイルに性質の違う変更を含んでしまう場合がある。
その場合は下記コマンドで、インタラクティブにステージングする変更を選ぶことができる。

$ git add --patch fruits.txt

あとは参照先がとても詳しいのでそちらをご覧ください!
参照: 横着で神経質な私とあなたに贈るgit add -p

ステージ(add)済みのdiffだけをチェックする

$ git add --patch を常用するようになってからやたら下記の機能にお世話になり始めました。

$ git diff --cached

例えば上記の例で先に漢字のdiffをステージした場合、次のように確認できます。

ステージ(add)済みの変更を確認する
$ git diff --cached

diff --git a/fruits.txt b/fruits.txt
index f2c6477..2c62dc8 100644
--- a/fruits.txt
+++ b/fruits.txt
@@ -1,6 +1,6 @@
 りんご
 いちじく
-いちご
+苺
 バナナ
 青りんご
 ブルーベリー
(END)

まだ追加していないぶんを確認
$ git diff

diff --git a/fruits.txt b/fruits.txt
index 2c62dc8..195a136 100644
--- a/fruits.txt
+++ b/fruits.txt
@@ -10,4 +10,5 @@
 ぶどう
 柿
 スターフルーツ
+マスカット
 もも
(END)

commitを自動並び替えして統合 autosquash

今まで手動で頑張ってやってたことが自動でできる様子。
もっと早く知っていればよかった...
こちらも参照先がとても詳しいです。
参照: Gitで今作ったコミットを以前のコミットに半自動的に融合させる(rebase autosquash)

自分なりの使い方は以下。
commitを積み上げるとき、過去のcommitと将来的に統合したいcommitのメッセージは、fixup! +対象コミットメッセージの前半としておく。

こんな感じのlogになっているとする
260d10f fixup! フルーツ一覧
a7bc130 寿司一覧のファイルを作成
9b9acc9 fixup! パン一覧
c7a14f7 fixup! フルーツ一覧
d5fb55b フルーツ一覧のファイルを作成
f152daa パン一覧のファイルを作成

その後、整形したい歴史分だけrebase -i --autosquash をすると、

$ git rebase -i --autosquash testbranch~6

自動的に順番が並び替えられ、このままエディタを終了するとcommitの統合が実施される。

最終的にこうなる
df088ee 寿司一覧のファイルを作成
b2f841d フルーツ一覧のファイルを作成
b087b3e パン一覧のファイルを作成

fixup! を squash! にすると統合時にコミットメッセージの編集ができるので、適宜使い分けたい。

追記: こちらについても、 --autosquash のオプションを事前の設定で省くことができました。時々fixup!を書いててもrebase時にオプションを忘れてうまくいかないな?とうっかりしてしまう場合があったのですが、これで防げそうですね。

$ git config --global rebase.autosquash true
$ git rebase -i HEAD~3

pick 899d80b いくら追加
fixup d09c95c fixup! いくら追加
pick 47010ec カタカナに変換