Pro Git を読みました

 
読み終えたメモを残そうとしたら、
私が読んでいたのは第1版で、2014年に第2版が出たことを先ほど知って
少しショックを受けています。
 
Git2.0対応しているらしいですが、まぁ基本そこまで違いはないはずなので
初めて知った点などをメモしておきます。第2版はそのうち読むかも。

結構な量があるので、とりあえずGit触りたい人向けではないですが、 Gitを正しく知るという点では、是非とも読んでおいて損はないでしょう。
何しろ無料ですし。

知らなかったことなど

commitに近いタグとそのタグからのコミット数、sha1の一部を使った名前を作成

git describe

トリプルドット

git log master...experiment # experimentからはたどれるが、masterからはたどれない全てのcommit (masterに含まないexperimentログ)
git log experiment...master # 逆
git log --left-right master...experiment # それぞれのコミットがどちら側に存在するのかを表示する

git log master..experiment

ステージ処理も再適用してstash applyする

git stash apply --index 

stash applyの取り消し

git stash show -p stash{0} | git apply -R #

stash aipply時にコンフリクトが発生する時の対応

git stash branch を実行すると、新しいブランチを作成し、作業をスタックに隠した時のコミットをチェックアウトし
スタックにある作業を再適用し、それに成功すればスタックからその作業を削除する。

git stash branch <some_branch>

コピーされたコード片を探す

こんなことできるんですね。

git blame -C -L 141,153 <some_file>

問題を2分探索で調べる

Git - Git によるデバッグ これも、すごい。

git bisec start         # 開始
git bisec bad           # 現在の状態が壊れていることをgitに知らせる
git bisec good v1.0     # v1.0の状態は問題がないことを伝える

# すると現在の状態からv.1.0の中間地点をcheckoutしてくれるので
# ここで問題が再現するか確認する。問題が再現しなければ git bisec good を実行すると
# 再度、現在の状態とcheckoutした地点の中間地点をcheckoutしてくれる。
# 問題が再現すれば、git basic bad を実行すると、コミット情報(sha1)を表示する。

git bisec reset # 問題特定が完了したらresetする

問題特定のためのスクリプトを作成すれば自動化も可能。
問題がなければ0を返し、問題があれば0以外を返すスクリプトを作成する。

git bisec start HEAD v1.0
git bisec run test-error.sh

git gcの設定

gc.auto gc.autopacklimitで可能。

git gc -auto

履歴から削除する

Git - メインテナンスとデータリカバリ
filter branchで取り除き、reflogを削除して gc
git prune --expire で残っているobjectを削除。