Git ワークスペース、ステージングエリア、リポジトリ


基本概念

まず、Git のワークスペース、ステージングエリア、リポジトリの概念を理解しましょう。

  • ワークスペース:コンピュータ上で見えるディレクトリのことです。
  • ステージングエリア:英語では stage または index と呼ばれます。通常は、.git.git ディレクトリ内の index ファイル(.git/index)に格納されています。そのため、ステージングエリアはインデックス(index)と呼ばれることもあります。
  • リポジトリ:ワークスペースには隠しディレクトリがあります.git。これはワークスペースではなく、Git のリポジトリです。

次の図は、ワークスペース、リポジトリ内のステージングエリア、およびリポジトリの関係を示しています。

  • 図の左側はワークスペース、右側はリポジトリです。リポジトリ内で "index" とマークされた領域がステージングエリア(stage/index)で、"master" とマークされた領域は master ブランチが表すディレクトリツリーです。

  • 図から、"HEAD" は実際には master ブランチを指す「カーソル」であることがわかります。したがって、図中のコマンドで HEAD が登場する箇所は master に置き換えることができます。

  • 図中の objects と示された領域は Git のオブジェクトデータベースであり、実際には ".git/objects" ディレクトリ内にあり、作成されたさまざまなオブジェクトとその内容が含まれています。

  • ワークスペースで変更(または新規追加)したファイルに対してgit addコマンドを実行すると、ステージングエリアのディレクトリツリーが更新され、同時にワークスペースで変更(または新規追加)されたファイルの内容がオブジェクトデータベース内の新しいオブジェクトとして書き込まれ、そのオブジェクトのIDがステージングエリアのファイルインデックスに記録されます。

  • コミット操作(git commit)を実行すると、ステージングエリアのディレクトリツリーがリポジトリ(オブジェクトデータベース)に書き込まれ、master ブランチもそれに応じて更新されます。つまり、master が指すディレクトリツリーはコミット時のステージングエリアのディレクトリツリーです。

  • 次のコマンドを実行すると、git reset HEADステージングエリアのディレクトリツリーが書き換えられ、master ブランチが指すディレクトリツリーに置き換えられますが、ワークスペースには影響しません。

  • 次のコマンドを実行すると、git rm --cached <file>ステージングエリアからファイルが直接削除され、ワークスペースは変更されません。

  • 次のコマンドを実行すると、git checkout .またはgit checkout -- <file>ステージングエリアの全部または指定したファイルでワークスペースのファイルを置き換えます。この操作は非常に危険で、ワークスペース内でステージングエリアに追加されていない変更が消去されます。

  • 次のコマンドを実行すると、git checkout HEAD .またはgit checkout HEAD <file>HEAD が指す master ブランチ内の全部または一部のファイルで、ステージングエリアとワークスペースのファイルを置き換えます。このコマンドも非常に危険です。ワークスペースの未コミットの変更だけでなく、ステージングエリアの未コミットの変更も消去されるためです。

1、ワークスペース(Working Directory)

ワークスペースは、ローカルコンピュータ上のプロジェクトディレクトリであり、ファイルの作成、変更、削除を行います。ワークスペースには、現在のプロジェクトのすべてのファイルとサブディレクトリが含まれます。

特徴:

  • プロジェクトの現在の状態を表示します。
  • ファイルの変更はワークスペースで行われますが、これらの変更はまだバージョン管理に記録されていません。

2、ステージングエリア(Staging Area)

ステージングエリアは一時的な保存領域であり、リポジトリにコミットされようとしているファイルのスナップショットを含みます。コミットする前に、ワークスペースの変更を選択的にステージングエリアに追加できます。

特徴:

  • ステージングエリアには、次のコミットに含まれる変更が保存されます。
  • 次のコマンドを複数回使用して、git addコマンドでファイルをステージングエリアに追加し、すべての変更をコミットする準備ができるまで続けることができます。

よく使うコマンド:

git add filename       # 将单个文件添加到暂存区
git add .              # 将工作区中的所有修改添加到暂存区
git status             # 查看哪些文件在暂存区中

3、リポジトリ(Repository)

リポジトリには、プロジェクトのすべてのバージョン履歴が含まれます。

コミットのたびにリポジトリ内に新しいスナップショットが作成されます。これらのスナップショットは不変であり、プロジェクトの完全な履歴が保証されます。

特徴:

  • リポジトリはローカルリポジトリとリモートリポジトリに分けられます。ここでは主にローカルリポジトリを指します。
  • ローカルリポジトリは.gitディレクトリ内に格納され、すべてのコミット済みオブジェクトと参照が含まれます。

よく使うコマンド:

git commit -m "Commit message"   # 将暂存区的更改提交到本地版本库
git log                          # 查看提交历史
git diff                         # 查看工作区和暂存区之间的差异
git diff --cached                # 查看暂存区和最后一次提交之间的差异

ワークスペース、ステージングエリア、リポジトリの関係

1、ワークスペース -> ステージングエリア

git add コマンドを使用して、ワークスペースの変更をステージングエリアに追加します。

git add filename

2、ステージングエリア -> リポジトリ

git commit コマンドを使用して、ステージングエリアの変更をリポジトリにコミットします。

git commit -m "Commit message"

3、リポジトリ -> リモートリポジトリ

git push コマンドを使用して、ローカルリポジトリのコミットをリモートリポジトリにプッシュします。

git push origin branch-name

4、リモートリポジトリ -> ローカルリポジトリ

git pull または git fetch コマンドを使用して、リモートリポジトリから更新を取得します。

git pull origin branch-name
# 或者
git fetch origin branch-name
git merge origin/branch-name

例

作業ディレクトリで file.txt を変更したとします:

1、ワークスペース

file.txt を変更して保存します。

2、ステージングエリア

変更をステージングエリアに追加します:

git add file.txt

3、リポジトリ

ステージングエリアの変更をローカルリポジトリにコミットします:

git commit -m "Update file.txt"

4、リモートリポジトリ

ローカルのコミットをリモートリポジトリにプッシュします:

git push origin main

ワークスペース、ステージングエリア、リポジトリの役割と相互関係を理解することで、Git をより効率的に使用してバージョン管理と共同開発を行うことができます。

その他の拡張