基本アイディアと機能は秀逸だが、コマンドライン・インターフェースの分かりにくさ、説明の曖昧さは悪評が絶えない。
名前が不適切。
- HEAD は CURRENT だろう。
- push, pull が対称ではない。send, fetch と push, pull だろうが、対称化した push = send and merge だから、実際には使えない。pull = fetch and merge が不要だったかも。
- add, reset も stage, unstage で良かった。
- プルリクエスト(GitHub)はマージリクエスト(GitLab)だろう。
- ブランチの生成に git checkout -b BRANCH も変。これは利用者側の問題だろうが(git branch がある)。
- ステージングエリアとインデックスは同じもので、--cached オプションなどから見ると、キャッシュも同義語のようだ。
- コミットとリビジョンも同義語だが、微妙な区別があるのかも知れない。
用語・概念が曖昧で混乱している。
- コミットグラフとオブジェクトグラフとファイルツリーを区別する。オブジェクトグラフは、コミットグラフをたくさんのファイルツリーを含む大きなグラフ。
- マージは何をマージするのか; コミットノードの合流、ファイルツリーのマージ、ファイル内容のマージ
- ツリーは何を意味しているのか; treeオブジェクト全般、commitオブジェクトに付随したtreeオブジェクト、treeオブジェクトとitemリンク(後述)で構成されるツリー構造。コミットツリーとか言うと、また話が別。
- ブランチは何を意味しているのか; ブランチラベルが指すcommitオブジェクト、commitオブジェクトの祖先自分集合〈ancestor-or-self set〉、2つのブランチラベルが指す2つのcommitオブジェクトの祖先自分集合の差集合、ブランチラベルが指すcommitオブジェクトに対応する作業ツリー(作業環境)。
- コマンドの操作対象〈オペランド〉が不明瞭; ラベル操作、オブジェクト操作、作業ツリー〈working tree〉操作に分けるとよい。
- 早送りマージ〈fast-forward merge〉はマージではない。単にラベルの付替え。
commit-ish, tree-ish に関する概念が曖昧。
- コミットノードとコミットグラフ、コミットノードに付随するリポジトリ内ファイルツリー、リポジトリ内ファイルツリーのノード(treeオブジェクトとblobオブジェクト)、それとファイルシステムのファイルツリーを区別する。
- グラフのノードを参照する式〈expression〉を整理する。
コミットグラフのcommitノードを指す式は、SPECIFYING REVISIONS としてまとめられている。
- https://git-scm.com/docs/revisions/
- https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%81%AE%E5%8F%82%E7%85%A7
メカニズムと習慣・ノウハウの混乱、git機能とgithub機能の混乱もある。
オペレーション〈動詞〉とオペランド〈目的語〉で分ければクリアになる。オペレーションは CRUD に分類されるが、オブジェクトは変更不可追記式だから、CR のみ。ラベルは CRUD ができる。
- オブジェクトグラフ(オブジェクトとリンク)
- コミットグラフ(commitオブジェクトとリンク)
- ツリーグラフ(treeオブジェクトとblobオブジェクトとリンク)
- ラベルシステム(ラベル)
- HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD, CHERRY_PICK_HEAD
- タグ・ラベル
- ブランチ・ラベル
- ステージングエリア〈インデックス〉(ファイル)
- 設定ファイル(設定項目)
- グローバル
- ローカル
- ワーキングツリー(ファイル、ディレクトリ)