もっとよいGitチートシート

世の中にGitのチートシートはいくつかあるけど「Gitを知らない人に渡して最初に読んでもらうのに適したもの」が見つからない。チートシートじゃなくてチュートリアルと呼ぶべきかもしれないけど、とにかく印刷してA4で1枚になるくらいの資料が必要だ。Gitに触れた技術者が軒並み同じ落とし穴でコケるのは正しい状態ではない。「Gitには、indexっていう『コミットする前にワークツリーで行った変更のうちのどの部分をコミットするか整理するための場所』があるんだよ」とか「git revertはsvn revertと違っていきなりリポジトリに変更を加えるから気をつけて」とか最初に言ってもらえればもっとスムーズに進めたはずだ。

というわけでどういうチートシートが必要かに関して考えてみる。

登場人物

http://www.ndpsoftware.com/git-cheatsheet.html

このチートシートがいいなと思ったのは「stash」「workspace」「index」「local repo」「remote repo」という登場人物がはっきりしている点。indexの存在を説明せずに「とりあえずaddしてcommitしろ、もしくはcommit -a」なんて書いてあるチートシートで理解が出来るはずがない。

一方でこのチートシートの良くない点が次:

変更がどこに起きるか

各々のコマンドで、どこが変更されるか。svn revertのつもりでgit revertをして悲劇が起こるのは「どこが変更されるか」に関してのユーザの認識と現実にミスマッチがあるからに他ならない。で、何も変更されないコマンド、例えばgit statusとgit diffを間違えて逆に覚えていても悲劇は起きない。だから強調すべきなのは「このコマンドは何を変えるか」なんだ。「何かを参考にして何かを変える」を矢印で表現するのは悪く無いと思う。しかし、だったら矢印の根元は変わっちゃ駄目だろ、と。

変更をどうやってundoするか

いっそgit undoで何でもundoできればいいのに。まあそれはさておき、問題が複雑になる原因は「失敗をした!」ってときにundoする方法がわからなくて、試行錯誤した結果さらに間違えて「二段重ねの失敗」に進化してしまった場合がほとんど。git revertとかね。ならば各操作にはundoの仕方を併記するべきじゃないか。

git init, git clone ⇔ rm -r .git
git add <file> ⇔ git rm --cached <file>
git commit ⇔ git reset HEAD^, 直前でなければrebase -i

みたいな感じ。

レベルわけ

http://www.textdrop.net/doc/git-cheat-sheet-ja/

bisect, fsch, gcはそんなに重要?rebaseやcherry-pickよりも?このチートシートはもちろん「初めて使うユーザ」をターゲットにしていないのかも知れない。今ここで考えているのは「初めて使うユーザ」をターゲットにしたチートシートなので、そういう人がどこに躓くか、に基づいてコマンドを選ぶべき。git revertでさえ、そもそも載せなくていいんじゃないの、と思わない??

僕の考えたレベル分け

  • レベル0: clone
  • レベル1: 操作: init, add, commit, 情報: status, diff, log, show
  • レベル2: reset, rebase, branch, checkout, tag, タグとはなにか、ブランチとはなにか、HEADとは何か
  • レベル3: format-patch, am
  • レベル4: push, fetch, merge, originとは何か
  • レベル5: それ以外

まとめ

とにかく「初めてGitを使うユーザ」が落とし穴に落ちないようにするための、A4一枚くらいの解説が必要だと思う。しかし一人で創り上げられる気がしないのでご意見ご感想(あと自分はここでつまずいた、という体験談)など、なんでもフィードバック頂ければ幸いです!

フィードバック

僕は「Gitを使う」を主に自分のソースコードの管理に使うイメージでいたので「リモートリポジトリを考え始める前にまずはローカルだろう」とcloneをレベル4にしていたのだけども、現実的にはその手前に「ソースコードの管理はどうでもいいから最新版をチェックアウト(svn的な意味で)したい」というニーズがあるのかもね。というわけでcloneをレベル0にしてみた。