git勉強会メモ

gitメンテナの濱野さんという方の話を聞けるそうなので聞きにいってきました。

http://atnd.org/events/93

内容の詳細は、既にkinnekoさんが詳しくまとめてくださっているので、自分が感心したところなどを掘りさげてメモ。

git commitにvオプションをつけると、commitログを書く下の部分にdiffを表示してくれる。vimsvnプラグイン的な感じ。ちゃんとマニュアルを読めば書いてあることだけど気づいてなかった。さっそく~/.gitconfigで、

[alias]
  ci = commit -v

するようにした

git add -pオプションはインタラクティブにこの部分はインデックスに含める、含めないを決められる。conflictしたときに編集せずに元のやつとか、自分の変更を優先するとかできないかと思ったが、今のところはできないらしい。

git diff --cachedはインデックスを理解してないとなかなかとっつきにくい。何かのファイルを編集するとdiffがでるようになるが、git add modified_fileなどとすることで、modified_fileをindexに入れることができる。こうしておくと、git diffではindexとworking copyの差分を表示するのでmodified_fileのインデックスに入れるまでのdiffを見なくてもすむ。ただコミットするまえにはひととおり変更を確認したくなるので、そういうときにはgit diff HEADとすると、indexも含めたHEADとの差分がわかり、indexとHEADの差分を見るときは--cachedを使えばよいらしい。

git stash --keep-indexはコミットログを見てみると今年なので大夫新しめのコマンド。OSのパッケージとかだとまだ入ってないことも結構ありそう。

commit 7bedebcaad351108a8f6eab6a031f2be2c06b613
Author: SZEDER Gábor <szeder@ira.uka.de>
Date:   Fri Jun 27 16:37:15 2008 +0200

    stash: introduce 'stash save --keep-index' option
    
    'git stash save' saves local modifications to a new stash, and runs 'git
    reset --hard' to revert them to a clean index and work tree.  When the
    '--keep-index' option is specified, after that 'git reset --hard' the
    previous contents of the index is restored and the work tree is updated
    to match the index.  This option is useful if the user wants to commit
    only parts of his local modifications, but wants to test those parts
    before committing.
    
    Also add support for the completion of the new option, and add an
    example use case to the documentation.
    
    Signed-off-by: SZEDER Gábor <szeder@ira.uka.de>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>

これもインデックスを理解していないと使いかたがよくわからなさそう。git stashすると通常は、indexも含めて編集前の状態に戻すが、git stash save --keep-indexするとindexへの変更は残したまま元にもどすことができる。これは例えばバグが発生して、それをつきとめるためにdebugプリントを入れていって、原因をつきとめて修正してテストしたらうまく動いたが、debugプリントを消すとひょっとしたらバグが再発するかもしれないというようなケースでデバッグプリントだけ消した状態でもテストしたいときに有用らしい。使うまえにgit addでインデックスに修正部分を入れておかないと意味がない。

git blame -M -Cオプション。git blameはsvnなどと同様で、一行ごとの誰がどのリビジョンで変更したのかも含めて見れるようにしてくれるコマンド。-Mオプションをつけるとファイル名の変更も追跡してくれるようになり、-Cオプションをつけるとさらにファイル間の関数の移動のようなものも追跡してくれるようになるらしい。-Cオプションは若干CPUを食うのでオプション扱いらしい。

最初はほんとに入門的な内容なのかなと思っていたのですが、わりとコアな説明が聞けて行ってよかったです。個人的にはこの前のRails勉強会で岩松さんにオブジェクトの話をわかりやすい図つきで色々聞けていたので理解しやすかったです。興味のあるかたは、資料が公開される前に

http://www.ustream.tv/recorded/746377

を見るのがおすすめです。

機会を下さったid:kunitさんに感謝。

追記:

発表資料が
http://www.kernel.org/~junio/200810-tut.pdf

にアップされたようです。