LoginSignup
0
0

More than 1 year has passed since last update.

git ワークツリー, ステージ, ローカルリポジトリ 関連

Last updated at Posted at 2023-03-22

前書き等

注意

 このページに書かれていることは、筆者の考え方になります。また、筆者のメモの意味合いが強いです。そのため、語句の意味が実際とは異なる可能性があります。

目次

  前書き等
    注意
    目次
    用語
  本文
    記号
   追加系
   削除系
   反映系
   復元系
   履歴改変系
   参照先変更系
  引用元、参照元、参考先

用語

<3つのエリア>
たぶん、大体、
・"ワークツリー"
   =ワーキングツリー
   =作業ディレクトリ
   =砂場
・"ステージ"
   =インデックス
   =キャッシュ
   ※ステージに上げること=ステージング
   ※ステージから降ろすこと=アンステージ
・"ローカルリポジトリ"
   =データベース
   =情報格納庫
   =コミット(=ファイルの情報群)を束ねたもの
※エリアは“領域”という意味で使っています
※ tree 構造(ディレクトリ・ファイル名)
※ blob オブジェクト(圧縮されたファイル本体)
※ tree オブジェクト(" tree 構造"+" blob オブジェクトのハッシュ値")
※ commit オブジェクト(" tree オブジェクトのハッシュ値"+"詳細情報の記録")
※コミット(ファイルの情報群)
 (Git において ”コミット” は名詞と動詞があるらしい "commit")
注:この記事では "コミット" は名詞とし、動詞は "git commit する" と表記します
注:『履歴』ー commit オブジェクトは、自身の親の commit オブジェクトのハッシュ値を含むため、結果として 最初~最新 すべての連綿とした繋がりを知ることが出来ます(=歴史とも)
注:『 :/ 』ー "リポジトリのルート"(単独なら、それぞれのエリアでの、まるごと全部)を表します。":/" のみを指定することは、コマンドのオプションで言えば "--all" を付けるみたいなものです。
 ( :"magic signature…":<pathspec>、:("magic word","・・・","・・・")<pathspec> )↓例
 ( :/:<pathspec>         、:(top)<pathspec> )
注:『参照先』ー 「"HEAD"」 → 「".git/refs/heads/ブランチ名"="Commit ID"」( HEAD はシンボリックリンクになっています)
注:『参照』ー 各ブランチが指す最新のコミットのこと(参照を辿る:各ブランチの先頭のコミットが指す親コミットを遡っていくこと)。さらに Git 自身が保持する参照履歴(reflog)もあります。

本文

この記事では各場所を記号で表します

⨇:work_tree(作業ディレクトリ)
⏢:stage(インデックスに記載されている状態)
⧉:ローカルリポジトリ(データベース:情報格納庫)
✖:削除
⏵⨇⟶⏢⟶⧉
⏴⨇⟵⏢⟵⧉

追加系

⏵⨇⟶⏢
git add -- <file>
 :ファイルを stage に上げる
 ・処理は、1 .git/objects に blob オブジェクトを作成(圧縮されたファイル本体)
       ※ひたすら追加、"rm -f .git/objects/dir/file か git gc --prune=now" しない限りたぶんなくならない
      2 .git/index に tree 構造(ディレクトリ・ファイル名)が記載される(追記
       ※ "--all" 、":/" 、"." を指定したときは上書き
 ※ cache は .git/index に残っている情報のこと

⏵⏢⟶⧉
git commit
 :ファイル情報をローカルリポジトリ(データベース)に記録する
 ・処理は、1 .git/index から、blob オブジェクトのハッシュ値も含めた tree オブジェクトを作成
      2 tree オブジェクトのハッシュ値を含めた、commit_id で管理される commit オブジェクトを作成(詳細情報を記録)

削除系

⏵⨇⟶✖
rm <file>
 ・処理は、1 work_tree のファイルを削除する

⏵⏢⟶✖
git rm --cached -- <file>
 :ファイルを stage から降ろす
 ・処理は、1 .git/index に残っている記載を削除する

⏵⏢⟶✖, ⨇⟶✖
git rm -- <file>
 :ファイルを stage から降ろし、work_tree から削除する
 ・処理は、1 .git/index に残っている記載を削除する
      2 work_tree のファイルを削除する

反映系

⏵⨇⟶⏢
git update-index --remove --stdin < <(git ls-files :/)
 ( git update-index --remove -- <file> は 「 . 」 で始まるものと 「 / 」 で終わるものが無視される)
 ( --stdin は空白ではなく改行をファイル名の区切りとする)
 :work_tree でのファイルの削除を stage にも反映する
 ・処理は、1 現在のディレクトリから再帰的に stage の情報を取得し、work_tree から削除したファイルのファイル名(+階層構造)を、.git/index から削除する

復元系

⏴⨇⟵⏢
git restore -- <file>
 (オプションなしの git restore は --worktree が付与され、かつ stage から復元)
git checkout-index --force -- <file>
 ( git checkout-index は "--prefix=directory/" で保存先を指定可能)
 :ファイルを stage から work_tree に復元する
 ・処理は、1 .git/index に記載されている tree 構造で blob オブジェクトを work_tree に展開し、指定されたファイルが上書きされる

⏴⏢⟵⧉
git restore --staged -- :/
 ( commit_id を指定しない場合 git restore は HEAD が指定される)
git reset -- :/
git reset
 (一切の引数がない git reset は "git reset --mixed HEAD" が実行される)
 :ローカルリポジトリにある最新のコミット(ファイルの情報群)を stage に戻す
 ・処理は、1 最新の commit_id から tree オブジェクト( blob オブジェクトのハッシュ値を含む)を指定し、内容を .git/index に記載(上書き、:/<file> にした場合はそのファイルのみ上書き他はそのまま

⏴⨇⟵⧉
git restore --source <commit id> -- :/
 (既定で --worktree が付与)
 ( --source を指定した場合は、既定で --no-overlay )
 :ローカルリポジトリの指定されたコミットから work_tree にファイルを復元する
 ・処理は、1 指定された commit_id から tree オブジェクト・blob オブジェクトを指定、コミットの持つ tree 構造に一致するように、work_tree の該当部分がすべて上書きされる( <file> を指定した場合はそのファイルのみ、サブディレクトリを指定した場合はサブディレクトリ全体のみ、上書き ; ファイルとディレクトリ両方において、未追跡一度もステージに上げたことがない管理除外対象に登録している)なものは削除されない。)

⏴⏢⟵⧉, ⨇⟵⧉
git restore --staged --worktree --source <commit id> -- :/
 (省略系: git restore -SW -s <commit id> :/ )
 ( --source を指定した場合は、既定で --no-overlay )
 :ローカルリポジトリの指定されたコミットから stage, work_tree にファイルを復元する
 ・処理は、1 指定された commit_id から tree オブジェクトを指定、内容を .git/index に記載(上書き、:/<file> にした場合はそのファイルのみ上書き他はそのまま
      2 指定された commit_id から tree オブジェクト・blob オブジェクトを指定、コミットの持つ tree 構造に一致するように、work_tree の該当部分がすべて上書きされる( <file> を指定した場合はそのファイルのみ、サブディレクトリを指定した場合はサブディレクトリ全体のみ、上書き ; ファイルとディレクトリ両方において、未追跡一度もステージに上げたことがない管理除外対象に登録している)なものは削除されない。)

履歴改変系

⏴⧉^⟵
git reset --soft HEAD^
 :一番最後の「git commit をした」という履歴を、ローカルリポジトリから消す
 ・処理は、1 最新の commit_id を HEAD から外し、1つ前の commit_id を HEAD とする

⏴⧉^⟵, ⏢⟵⧉^
git reset --mixed HEAD^
git reset HEAD^
 ( --mixed は既定値)
 :一番最後の「git commit をした」という履歴をローカルリポジトリから消し、1つ前のコミットから stage にファイルを復元する
 ・処理は、1 最新の commit_id を HEAD から外し、1つ前の commit_id を HEAD とする
      2 1つ前の commit_id から tree オブジェクトを指定、内容を .git/index に記載(上書き

⏴⧉^⟵, ⏢⟵⧉^, ⨇⟵⧉^
git reset --hard HEAD^
 :一番最後の「git commit をした」という履歴をローカルリポジトリから消し、1つ前のコミットから stage, work_tree にファイルを復元する
 ・処理は、1 最新の commit_id を HEAD から外し、1つ前の commit_id を HEAD とする
      2 1つ前の commit_id から tree オブジェクトを指定、内容を .git/index に記載(上書き
      3 1つ前の commit_id から tree オブジェクト・blob オブジェクトを指定、ディレクトリ構造ごと work_tree に展開され、指定されたファイル・ディレクトリのみの状態に work_tree 全体が上書きされる(ファイルとディレクトリ両方において、未追跡一度もステージに上げたことがない管理除外対象に登録している)なものは削除されない。)

参照先変更系

⏵⧉⟶⧉´
git update-ref refs/heads/$(git branch --show-current) <commit id>
git reset --soft <commit id>
 :現在のブランチの、ローカルリポジトリの履歴の参照先を書き換える
 ・処理は、1 "refs/heads/ブランチ名" の最新のコミット参照先を、指定した commit_id に置き換える

引用元、参照元、参考先

Git コマンドリファレンス(日本語版)
 ・https://tracpath.com/docs/git-reset/
 ・https://tracpath.com/docs/git-restore/
 ・https://tracpath.com/docs/git-rm/
Git Documentation
 ・https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt
 ・https://git-scm.com/docs/git-rev-parse#Documentation/git-rev-parse.txt---absolute-git-dir
 ・https://git-scm.com/book/ja/v2/Git-の基本-変更内容のリポジトリへの記録
 ・https://git-scm.com/book/ja/v2/Git-のさまざまなツール-リセットコマンド詳説
アクティビティ: Git によるバージョン管理
 ・https://tmytokai.github.io/open-ed/activity/git/text01/page04.html
 ・https://tmytokai.github.io/open-ed/activity/git/text02/page07.html
 ・https://tmytokai.github.io/open-ed/activity/git/text02/page08.html
Git reset で HEAD位置を変えないとき
 ・https://masuyama13.hatenablog.com/entry/2020/08/24/235327
[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法
 ・https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe
【Git&GitHub】ファイルの削除を記録(git rmコマンド)
 ・https://phoeducation.work/entry/20210806/1628204280
git add、git commitの保存先と取消コマンドについて
 ・https://qiita.com/s56258/items/62e14b27d6c7ed216fa5
git add の取り消し方法と、関連コマンドまとめ
 ・https://www-creators.com/archives/1282
Gitのコミットの裏側で起こっていること
 ・https://made.livesense.co.jp/entry/2017/08/22/080000
Gitのステージング領域の正体を探る
 ・https://engineering.mercari.com/blog/entry/2017-04-06-171430/
TypeScriptでGitを自作した話
 ・https://zenn.dev/akashixi/articles/18e386e810b280
Gitのインデックスの中身
 ・https://zenn.dev/kaityo256/articles/inside_the_index
【Git】インデックスとは?【図解でわかり易く解説】
 ・https://tetoblog.org/2021/06/git-index/
[git] Gitの内部(ツリーオブジェクト)
 ・https://www.yoheim.net/blog.php?q=20140301
【Git】git cleanの使い方を実例で解説。「-f」と「-df」とは何か?|Untracked files(未追跡ファイル)やディレクトリを削除する方法
 ・https://prograshi.com/general/git/git-clean/
汚してしまったGitワークツリーをヘッドリビジョンに戻す
 ・https://lab.unicast.ne.jp/2011/06/02/汚してしまったgitワークツリーをヘッドリビジョ/
gitでuntrackedなファイルを一括削除する方法
 ・https://hacknote.jp/archives/7130/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0