まだ続くgitの誤解要因

まとめをしたが → gitの理解を妨げる要因のまとめ - (新) 檜山正幸のキマイラ飼育記 メモ編 、まだ続く。

誤解要因は:

  • 最高のメカニズムを最低のコマンドとして提供している。
  • 最低のコマンドに誑〈たぶら〉かされている。例: git merge --squash, git rm, git amend, git rm --cached
  • merge = マージする、amend = 改正/修正する、rm = 削除する などが言霊となって誤認誘導する。その他不適切、曖昧な用語が山盛り。

事実とは異なる間違った認識による説明がなされる。gitの誤認例:.gitignore, --squash - (新) 檜山正幸のキマイラ飼育記 メモ編 も参照。

間違い 正しい
ファイル保存方式 差分を保存 まるのままスナップショット
変更可能性 変更可能 変更不可
保存の単位 ファイル ファイルツリー
グラフ形状 ツリー DAG
空ディレクトリ あり 無し

言葉のあや:

  • ファイルを削除する。→ ファイルを管理対象から外すように指示する。
  • コミットメッセージを書き換える。→ 別なコミットメッセージを持つコミットを新規に追加する。
  • 歴史を改変する。→ コミットオブジェクトを追加して、履歴の可視性をコントロールする。
  • ブランチを削除する。→ ブランチラベルを削除する。

最重要概念を表す用語が曖昧:

  • コミット
    • commitオブジェクト
    • commitオブジェクトのファイルツリー
    • commitオブジェクトとファイルツリーを一緒にしたオブジェクトグラフ
    • 概念的なリビジョン、<rev> として使うリビジョン式〈revision expression〉
  • ブランチ
    • ブランチラベル
    • ブランチラベルが指すコミット〈commitオブジェクト〉、ブランチヘッド
    • ブランチの全履歴サブグラフ
    • ブランチの固有履歴フラグメント
  • リモート
    • リモートのリポジトリ
    • リモートのブランチ
    • ローカルにあるリモート追跡ブランチ〈フラグメント〉
    • ローカルに登録されたリモートリポジトリの設定
  • マージ
    • 概念的なマージング
    • マージコミットオブジェクト
    • 狭義のマージ=マージコミットオブジェクトを作るマージ
    • git merge コマンド
      • 狭義のマージ
      • ffマージ(狭義のマージではない)
      • スカッシュマージ(狭義のマージではない)

マズいことは:

  • gitのメカニズム/振る舞いを、言葉からの印象・類推で考えて誤認する。
  • コマンド実行の意図・目的(ココロ)と実際の振る舞いを区別しない。
説明改善のために

データベース/ストレージと考える。

関係データベース gitリポジトリ
テーブル ファイルツリー(+メタデータ)
行〈レコード〉 ファイルとフォルダ
テーブル達は離散的 コミット達はグラフ構造
行達はリスト構造 ファイルとフォルダはツリー構造

save/restore ができるが:

  1. saveで上書きはできない。
  2. saveはファイルツリーの新規追加になる。
  3. 単一のファイルだけはsaveできない、必ずファイルツリーとして追加する。
  4. (初期コミット以外は)必ず基底コミットを必要とする。
  5. 次のコミットは、現在の基底コミットの次のコミットとなる。ただし、次が一意とは限らない。
  6. 次のコミットの計画・準備のためにステージングのメカニズムがある。

ステージングでは、基底コミットと比較して、次のコミット(であるファイルツリー)を作成する。

  1. 継続: 基底コミットのファイルをそのまま使用する。
  2. 非継続: 基底コミットにあるファイルだが、次は使用しない。
  3. 内容新規: 基底コミットにあるファイル名で、ファイル内容は別にする。
  4. 名前・内容新規: 基底コミットにはないファイル名を新たに追加する。

言葉のあやで次のように言う:

  1. 非継続: 既存ファイルを削除する。
  2. 内容新規: 既存ファイルを変更する。
  3. 名前・内容新規: 新規ファイルを追加する。

ステージングと実際のコミッティングには、ワーキングツリーとインデックスを使う。

読み出しに関しては:

  1. 読み出しはリポジトリから。
  2. 任意のファイルを(バイトストリームとして)読み出せる。
  3. 読み出したファイルをどうするかは勝手。
  4. ファイルツリー=ディレクトリ単位で読み出せるが、通常はワーキングツリーへの変更として読み出す。
  5. ワーキングツリーへの変更はupdateなので、既存のファイルの上書き破壊はあり得る。
  6. ファイルツリーをtarやzipのストリームとして読み出すとかもあり得るだろう。どうするか知らんが。
  7. git restore . がよく使う読み出しコマンド、ワーキングツリーを変更する。

gitは最初から連合データベースになっている。連合は、フラグメント転送で実行される。

  1. リポジトリAからリポジトリBに向かってフラグメントが転送される。
  2. フラグメントを受け取ったリポジトリBは、フラグメントをグラフティングする。

連合手法はこれだけ。グラフティングはグラフを成長させるが、新たに成長した“ブランチ”をどう扱うかは自由。コンベンションやノウハウはあるが。