the life with git

svn に比べると細かい作業ができるんだけど色々覚えなきゃいけないことも多い。 TortoiseSVN から入ったおれにはちとつらいぜ。てか tutorial とか読んでても管理がしたいだけなのに仕組みについて説明されても…、と思わないでもないんだけど管理って行為自体が精度と手間に関して trade-off なのかもしれない。ここらへんもう少し user-friendly というか heuristic な感じでこなれた client が出てくると習得 cost も下がってもっと普及するのかもしれないなぁとか何とか。

とりあえず現在までの流れは大体以下のような感じみたいなので ( きちんとした ) TortoiseGit が作られないかなぁと思いつつ。

  1. 手動で source 管理
  2. 管理は software がやればいいじゃない ( CVS, subversion )
  3. 直感的な操作で管理するのおいしいです ( TortoiseCVS, TortoiseSVN )
  4. きめ細かい管理が可能 + 分散 repository で好き勝手し放題 ( git ) <-イマココ!!
  5. ( git の便利さと直感的な操作が両方そなわり最強に見える )

以下は自分用の glossary & cheatsheet 。これでとりあえず local をいじるだけなら生活できるようになった。

  • index ?
    • git で管理している file の list みたいなもの。 git ls-files で参照、 git add FILEPATH で追加、 git rm --cached FILEPATH で削除。 working tree を変更したり add/rm/mv なんかで index に対して変更を加えると git statusgit diff でどこが変わったのかがわかる。
  • working tree ?
    • index で管理している directory/file 群を指す、のかな。要は git の管理下にある作業用の directory 。
  • ある file の変更をなかったことにする
    • git checkout -- FILEPATH 。 checkout は対象が branch 名じゃない場合は指定された path の file を index に格納されてる file に戻すらしい。 "--" 指定をつけておくと既存の branch 名と同じ名前の file を指定できる、らしいんだけどまぎらわしさを排除するために変更破棄の意味で使う場合は常に "--" 指定をするのがよい、と。
  • いろいろなかったことにする
    • 主に git reset を使う。 git reset COMMIT のように巻き戻りたい commit を指定すると HEAD をそこに設定する ( = それ以降の commit はなかったことになる ) 。 commit hash を指定するよりは HEAD や HEAD^ なんかで相対指定した方が楽。 HEAD の位置変更と同時に index と working tree の変更もするらしく、上記のように何も option 指定がないと --mixed が指定されているとみなされて index のみ戻る。 git add なんかで index に加えた変更を破棄する際に使う ( git reset HEAD ) 。
    • git reset --soft COMMIT は index も working tree も変更せずに COMMIT 時点まで戻す。直前の commit log の記述を変更したい場合とかに使うらしい ( git reset --soft HEAD^ ) 。
    • git reset --hard COMMIT は index 、 working directory を巻き戻す。本当に以前の commit をなかったことにしたい場合 ( git reset --hard HEAD^ ) や、 working tree に加えた変更をなかったことにしたいんだけど git checkout で file をいちいち指定するのが面倒な場合に使う ( git reset --hard HEAD ) 。
    • 上記は local で自分の加えた変更をなかったことにする際の変更。 remote に対して行われた変更にケチつける場合は git revert COMMIT を使うらしい。まぁいきなりなかったことにされてもどういうリアクションとればいいのかわかんないしな…。
  • man git-* の表示がおかしいよ ?
    • .ft C とか \fB とかよくわからない文字が表示される。調べてみたら troff で処理されるべき request や escape sequence がそのまま出力されてるみたい。いろいろ試してみたんだけど治す方法わからなかった。他の man はちゃんと表示されるので git 付属の man file の書き方の問題なのかもしれない。