図で見るGitの各操作

Gitの各操作で何が起きるのかが掴みづらいので、いちど自分の認識を図にしてみる。画像が多いので注意。

そもそもGitが初見で混乱するのは
 ・リモートとローカルそれぞれのリポジトリ
 ・ブランチという派生バージョンの切り替え
 ・ステージングエリア(インデックス)という一時領域
これらの存在が一度に出てくるせいだと思うので、その辺を中心に書き起こした。

各操作のイメージ

リモートリポジトリのクローン(git clone ~)

リモートリポジトリ全体(ブランチも含む)をローカルに複製。ファイルも生成される。

派生ブランチを切る(git branch BRANCH_NAME)

元のブランチと親子関係のある派生ブランチが生成される。

ファイルの編集

ユーザーがファイルを編集する。この時点ではまだリポジトリの情報は変化しない。

更新の追加(git add ~)

ファイルの更新や削除の情報をステージングエリアへ登録する。

更新の追加の取消(git reset)

ステージングエリアの情報を削除する。ファイル実体が戻るわけではない。

コミット(git commit)

ステージングエリアの変更を確定し、特定のブランチへ登録する。ステージングエリアに追加されていない変更は含まれない。

ブランチの切り替え(git checkout BLANCH_NAME)

ブランチを切り替えると、切替先のブランチに一致するようにファイル実体が置き換えられる。未コミットの修正(ステージングエリア含む)はそのまま引き継がれる。

置き換え対象のファイルと未コミットのファイルが被った場合はエラーになる。ユーザーの編集が上書きされて消えないようにだと思われる。

ファイルを元に戻す(git checkout BLANCH_NAME FILE_NAME)

ファイル実体を特定のブランチの状態に戻す。ブランチ名を省くとステージングエリアになる。

プッシュ(git push origin BRANCH_NAME)

ローカルリポジトリのブランチをリモートリポジトリにアップロードする。

マージ(git merge ~)

ブランチを統合する。

リモートの更新を同期(git fetch)

ローカルにあるリモートブランチの情報(追跡ブランチ)を同期する。ローカルブランチが変更されるわけではない。

リモートの更新を取り込み(git pull)

リモート追跡ブランチを同期した後に、ローカルのブランチにマージする(fetch→merge)。ファイル実体も置き換えられる。

また新たにあれば追加していく。間違いもありそうなので、判明したら修正する。

コメント