まとめをしたが → 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 ができるが:
- saveで上書きはできない。
- saveはファイルツリーの新規追加になる。
- 単一のファイルだけはsaveできない、必ずファイルツリーとして追加する。
- (初期コミット以外は)必ず基底コミットを必要とする。
- 次のコミットは、現在の基底コミットの次のコミットとなる。ただし、次が一意とは限らない。
- 次のコミットの計画・準備のためにステージングのメカニズムがある。
ステージングでは、基底コミットと比較して、次のコミット(であるファイルツリー)を作成する。
- 継続: 基底コミットのファイルをそのまま使用する。
- 非継続: 基底コミットにあるファイルだが、次は使用しない。
- 内容新規: 基底コミットにあるファイル名で、ファイル内容は別にする。
- 名前・内容新規: 基底コミットにはないファイル名を新たに追加する。
言葉のあやで次のように言う:
- 非継続: 既存ファイルを削除する。
- 内容新規: 既存ファイルを変更する。
- 名前・内容新規: 新規ファイルを追加する。
ステージングと実際のコミッティングには、ワーキングツリーとインデックスを使う。
読み出しに関しては:
- 読み出しはリポジトリから。
- 任意のファイルを(バイトストリームとして)読み出せる。
- 読み出したファイルをどうするかは勝手。
- ファイルツリー=ディレクトリ単位で読み出せるが、通常はワーキングツリーへの変更として読み出す。
- ワーキングツリーへの変更はupdateなので、既存のファイルの上書き破壊はあり得る。
- ファイルツリーをtarやzipのストリームとして読み出すとかもあり得るだろう。どうするか知らんが。
- git restore . がよく使う読み出しコマンド、ワーキングツリーを変更する。
gitは最初から連合データベースになっている。連合は、フラグメント転送で実行される。
- リポジトリAからリポジトリBに向かってフラグメントが転送される。
- フラグメントを受け取ったリポジトリBは、フラグメントをグラフティングする。
連合手法はこれだけ。グラフティングはグラフを成長させるが、新たに成長した“ブランチ”をどう扱うかは自由。コンベンションやノウハウはあるが。