SourceTree、実際どんなコマンド叩いてるかわからなくて怖い問題

怖いので調べた。
差分確認とか変更ファイルの一部分だけaddしたい時とか便利だよね、SourceTree。便利ってことは、そのぶんSourceTreeさんが内部でいろんなことを良しなにやってくれてるわけで、その何やってるのかについて調べたのでまとめ。ちな調べた当時のSourceTreeさんのバージョンは2.7.1です。


SourceTreeのコマンド履歴の見方

SourceTree操作時に実行されるコマンドの確認は「コマンド履歴」で確認できるらしい。2年ぐらい使ってて初めて知った…Macだと「control + command + W」押すと画面下にニュッとコマンドラインが出てきます。



SourceTree操作毎に実行されてるコマンドについて

毎回設定してる長々しいコマンド

SourceTree上で何か操作すると
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin
とか
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree add -f -- 【対象ファイル】 
 って具合に、コマンド毎に 「-c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree」が実行されている。何してるの?

diff.mnemonicprefix=false

git-diffのドキュメントにはdiff.mnemonicprefixについて以下のような説明があった。
diff.mnemonicPrefix 設定されている場合、 'git diff'は、比較対象によって標準の "a /"および "b /"とは異なるプレフィックスペアを使用します。この設定が有効になっていると、逆差分出力もプレフィックスの順序を入れ替えます。
(゚д゚ )
マジでこんな顔になった。全然わからない、俺たちは雰囲気でgitをやっている…?
なんとか理解するに、この設定をtrueにすると、diff使うときに比較対象を表すために割り振られてた意味のないa,bとかって文字を、意味のあるi(インデックスのi)とかw(ワーキングツリーのw)とかに変更できるようになるけどSourceTreeではfalse設定してできないようにしてる…とかそんな感じ…

core.quotepath=false

日本語ファイル名の文字化け防止用の設定

credential.helper=sourcetree

認証情報にSourceTreeの設定を適用


ファイル変更系コマンドに毎回付いてる「--」

ファイルの状態を変更する系のコマンドでは毎回「--」を指定してる。誰だよ。
gitさんがコマンドオプションと間違える可能性のあるファイル名(ハイフン始まりのファイル名とか)を識別するために設定するらしい。
【例】
$ git add -foo.txt # gitさんがファイル名をコマンドオプションと間違えて失敗する
$ git add -- -foo.txt # こういう時にはこうじゃ!で成功



実行されるコマンド内容解説

ステージング

SourceTree上の操作:ワーキングツリー上の変更ファイルのチェックボックスをチェック
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree add -f -- 【対象ファイル】
実行されたコマンド:
「add」 変更内容をワーキングツリーからインデックスへ反映
「-f」 .gitignoreに書いてある管理対象外のファイルも強制的にaddする(えぇ…)
「--」 コマンドオプションとファイル名を識別する
ちなみにファイル内を部分的にステージ移動した時はコマンド履歴に何も出ず…


ステージング取り消し

SourceTree上の操作:インデックス上の変更ファイルのチェックボックスのチェックを外す
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree reset -q -- 【対象ファイル】
実行されたコマンド:
「reset」
インデックスにある変更内容をワーキングツリーへ戻す
「-q」
エラーがあれば表示
「--」
コマンドオプションとファイル名を識別する


変更を破棄

SourceTree上の操作:ワーキングツリー上のファイル名を右クリック→リセット
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree checkout -- 【対象ファイル】
実行されたコマンド:
「checkout」
ワーキングツリー上のファイルの変更を破棄
「--」
コマンドオプションとファイル名を識別する


コミット

SourceTree上の操作:コミットボタンをクリック
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree commit -q -F 【関連ディレクトリ】/SourceTreeTemp.【ランダム文字列の拡張子】
実行されたコマンド:
「commit」
インデックス上のファイルをローカルへ反映
「-q」
コミットメッセージを要約するメッセージを設定しない
「-F」
ファイルからコミットメッセージを取得する。入力したコミットメッセージはこのオプションの次のファイルに格納されていた


プッシュ

SourceTree上の操作:プッシュボタンをクリック
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/【現在のブランチ】:refs/heads/【現在のブランチ】
実行されたコマンド:
「push」
ローカル上のコミットをリモートへ反映
「-v」
push進捗情報を表示
「--tags」
ローカルのタグもすべて反映
「refs/heads/〜」
Refspec(参照仕様)の指定。1行ではちょっと説明できないので適宜ググるように。
これとかわかりやすかった→5分で分かるgitのrefspec


プル

SourceTree上の操作:プルボタンをクリック
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin
実行されたコマンド:
「fetch」
リモートのデータを取得

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree pull --no-commit origin 【現在のブランチ】
実行されたコマンド:
「pull」
リモートのデータを取得してローカルにマージ
「--no-commit」
マージ後のコミットを実行せず、ワーキングツリーとインデックスを更新したところで中断する
pullってfetch+mergeなのでは…?って思ったんだけどSourceTreeさんにも何か考えがあるのかな。


マージ

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree merge --no-commit 【対象ブランチ】
実行されたコマンド:
「merge」
対象ブランチのデータをローカルにマージ
「--no-commit」
マージ後のコミットを実行せず、ワーキングツリーとインデックスを更新したところで中断する
ちなみにマージの確認アラートで「すぐにマージした変更をコミットする」チェック入れると--no-commitが入らない


ブランチ変更

SourceTree上の操作:移動したいブランチ名をダブルクリック
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree checkout 【移動先ブランチ】
「checkout」
ブランチを切り替える

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree submodule update --init
実行されたコマンド:
「submodule」
サブモジュールの操作を行う
「update」
サブモジュールを更新
「--init」
サブモジュールを初期化


スタッシュ

SourceTree上の操作:スタッシュボタンをクリック
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree stash save 【スタッシュメッセージ】
実行されたコマンド:
「stash」
スタッシュ(ワーキングツリーの作業内容を一時的に退避する)する
「save」
スタッシュを保存


スタッシュ適用

SourceTree上の操作:スタッシュ名を右クリック→退避した変更を適用
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree stash pop stash@{【スタッシュのインデックス】} 
実行されたコマンド:
「stash」
スタッシュ(ワーキングツリーの作業内容を一時的に退避する)する
「pop」
退避した作業内容をワーキングツリーへ戻す
「stah@{~}」
戻すスタッシュのインデックス