gitのダメさ

基本アイディアと機能は秀逸だが、コマンドライン・インターフェースの分かりにくさ、説明の曖昧さは悪評が絶えない。

名前が不適切。

  1. HEAD は CURRENT だろう。
  2. push, pull が対称ではない。send, fetch と push, pull だろうが、対称化した push = send and merge だから、実際には使えない。pull = fetch and merge が不要だったかも。
  3. add, reset も stage, unstage で良かった。
  4. プルリクエスト(GitHub)はマージリクエスト(GitLab)だろう。
  5. ブランチの生成に git checkout -b BRANCH も変。これは利用者側の問題だろうが(git branch がある)。
  6. ステージングエリアとインデックスは同じもので、--cached オプションなどから見ると、キャッシュも同義語のようだ。
  7. コミットとリビジョンも同義語だが、微妙な区別があるのかも知れない。

用語・概念が曖昧で混乱している。

  1. コミットグラフとオブジェクトグラフとファイルツリーを区別する。オブジェクトグラフは、コミットグラフをたくさんのファイルツリーを含む大きなグラフ。
  2. マージは何をマージするのか; コミットノードの合流、ファイルツリーのマージ、ファイル内容のマージ
  3. ツリーは何を意味しているのか; treeオブジェクト全般、commitオブジェクトに付随したtreeオブジェクト、treeオブジェクトとitemリンク(後述)で構成されるツリー構造。コミットツリーとか言うと、また話が別。
  4. ブランチは何を意味しているのか; ブランチラベルが指すcommitオブジェクト、commitオブジェクトの祖先自分集合〈ancestor-or-self set〉、2つのブランチラベルが指す2つのcommitオブジェクトの祖先自分集合の差集合、ブランチラベルが指すcommitオブジェクトに対応する作業ツリー(作業環境)。
  5. コマンドの操作対象〈オペランド〉が不明瞭; ラベル操作、オブジェクト操作、作業ツリー〈working tree〉操作に分けるとよい。
  6. 早送りマージ〈fast-forward merge〉はマージではない。単にラベルの付替え。

commit-ish, tree-ish に関する概念が曖昧。

  1. コミットノードとコミットグラフ、コミットノードに付随するリポジトリ内ファイルツリー、リポジトリ内ファイルツリーのノード(treeオブジェクトとblobオブジェクト)、それとファイルシステムのファイルツリーを区別する。
  2. グラフのノードを参照する式〈expression〉を整理する。

コミットグラフのcommitノードを指す式は、SPECIFYING REVISIONS としてまとめられている。

メカニズムと習慣・ノウハウの混乱、git機能とgithub機能の混乱もある。


オペレーション〈動詞〉とオペランド〈目的語〉で分ければクリアになる。オペレーションは CRUD に分類されるが、オブジェクトは変更不可追記式だから、CR のみ。ラベルは CRUD ができる。

  • オブジェクトグラフ(オブジェクトとリンク)
    • コミットグラフ(commitオブジェクトとリンク)
    • ツリーグラフ(treeオブジェクトとblobオブジェクトとリンク)
  • ラベルシステム(ラベル)
    • HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD, CHERRY_PICK_HEAD
    • タグ・ラベル
    • ブランチ・ラベル
  • ステージングエリア〈インデックス〉(ファイル)
  • 設定ファイル(設定項目)
    • グローバル
    • ローカル
  • ワーキングツリー(ファイル、ディレクトリ)