1. データ保存方式の根本的差異
- 各コミットのファイルを個別に保存
- ファイルの提出時間でバージョンを区別し、別々の論理ストレージ領域に保存
- 復元時は直接前のバージョンから復旧
- 保存される情報は基本ファイル+時間経過による差分で構成される(差分ベースのバージョン管理)
- コミット時点の全ファイルのスナップショットを保存
- 変更のないファイルは再保存せず、既存ファイルへのリンクを保持
- データをスナップショットの連続として扱う
GitとSVNの主な違い
| 特性 | Git | SVN |
|---|---|---|
| アーキテクチャ | 分散型 | 集中型 |
| 保存方式 | 完全なファイル | 差分ファイル |
| オフライン操作 | 可能 | 不可 |
| ブランチ処理 | 強力 | 制限あり |
| 変更履歴操作 | 高度な変更可能 | 制限あり |
| パフォーマンス | 高速 | 比較的低速 |
🔍 公式最新版参考:
Pro Git 書籍 第2版 - 日本語公式サイト
Pro Git 全言語版リポジトリ(GitHub)
2. Gitの主要概念と動作原理
2.1 Gitの基本領域構成
ワークスペース(作業領域)
<プロジェクトディレクトリ>/
├── src/
├── config/
└── ... # ユーザーが直接編集するファイル群
-
特徴:
- コードを編集する物理的なディレクトリ
- 変更内容はGitの追跡対象外(
git statusで「Untracked files」と表示) - バージョン管理対象にするには
git addでステージングエリアに追加する必要がある
ステージングエリア(索引領域/キャッシュ領域)
<プロジェクトディレクトリ>/.git/index
-
役割:
- コミット前の変更を一時保存する「草稿箱」
-
git addでワークスペースの変更を登録 - 複数の変更をまとめて1つのコミットに統合できる
- メールの下書きのように、途中段階の変更を安全に保持可能
ローカルリポジトリ
<プロジェクトディレクトリ>/.git/
├── objects/ # コミットデータ本体
├── refs/ # ブランチ/タグ参照
└── HEAD # 現在のブランチポインタ
-
動作メカニズム:
-
git commitでステージング内容を固定スナップショットとして保存 - 40桁のSHA-1ハッシュ(例:
a1b2c3d...)で各コミットを一意識別 -
git checkoutで任意のコミットの状態をワークスペースに復元-
注意: 未コミットの変更は上書きされる(事前に
git stashで退避推奨)
-
注意: 未コミットの変更は上書きされる(事前に
-
リモートリポジトリ
git remote add origin <URL> # GitHub/GitLab/GiteeなどのURL
-
機能:
- チームメンバー間でのコード共有基盤
- 分散開発時の変更履歴同期ポイント
-
git pushでアップロード、git fetch/git pullでダウンロード
2.2 Gitファイルの状態変化周期
状態遷移図
各状態の定義
Untracked (未追跡状態)
- ワークスペースに新しく作成されたファイル
- Gitが存在を認識しておらず、バージョン管理対象外
Unmodified (未変更状態)
- ステージングエリアからローカルリポジトリへコミット済み
- ファイルが変更されておらず安定状態
Modified (編集済み状態)
- 追跡対象ファイルが変更されたが未ステージング
- 変更内容がGitに正式記録されていない一時状態
Staged (ステージング済み状態)
-
git addでステージングエリアに追加済み - 変更が次回コミットの候補として確定待ち状態
Unstaged (ステージング未済み状態)
- 追跡対象ファイルが変更されたが未ステージング
- 変更がワークスペースにのみ存在する状態
2.3 Gitのコミット履歴とコミットチェーン
コミットチェーンの基本構造
-
コミット履歴が連なって形成されるチェーン状の構造
-
親コミット:
- 初期コミット以外のすべてのコミットに存在
- 1つの親(通常の変更)または複数の親(マージ時)
-
子コミット:
- 最新コミット以外のすべてのコミットに存在
- 1つの子(直線的な変更)または複数の子(ブランチ作成時)
コミット参照の仕組み
git show HEAD # 現在のHEADが指すコミット情報を表示
-
文字列ベース参照:
- コミットは40桁のハッシュIDで一意に識別可能
- 人間が扱いやすい「参照名」でもアクセス可能
-
主要参照ポイント:
-
master/main:デフォルトブランチの最新コミット参照 -
HEAD:- 現在の作業ブランチの「先端」を指すポインタ
- 通常は最新コミットを指す
- 相対参照の起点となる(例:
HEAD~= 1つ前のコミット)
-
コミットチェーン
2.4 Git ブランチとタグ
ブランチ(Branch)
- 技術的本質:コミットオブジェクトを指す移動可能なポインタ
-
デフォルト名:
masterまたはmain -
動作原理:
git commit # コミットごとにブランチポインタが前方に移動 -
開発上の意義:
- ファイルの複数コピーを仮想的に作成
- 異なるソフトウェアバージョンの並行開発を可能に
- 開発バージョンの分離による安全な進化
ブランチ活用シナリオ
事例:新機能開発(2週間要)
- 独立ブランチ作成 → 他メンバーの作業に影響なし
- 毎日進捗をコミット → 作業内容喪失リスク解消
- 開発完了後メインブランチにマージ → 安全な統合
タグ(Tag)
- 技術的本質:特定のコミット状態を固定する不動のポインタ
- 主用途:リリースバージョンのマイルストーン管理
-
運用ルール:
- 日常開発 → ブランチへのコミット&プッシュ
- バージョン公開時 → 対応コミットにタグ付与
タグとブランチの根本的差異
| 特性 | タグ (Tag) | ブランチ (Branch) |
|---|---|---|
| 構造 | コミット1点を固定指す | 連続したコミット列を追跡 |
| 移動性 | 不可 | HEADポインタで移動可能 |
| 用途 | バージョン凍結状態の管理 | 進行形開発の管理 |
タグ活用シナリオ
事例:v2.0ベースの新機能追加
v2.0タグから開発ブランチを新規作成git checkout -b v4-dev v2.0
- 新機能を開発し
v4.0タグを付与- 元のブランチ構造に影響なし
推奨バージョン命名規則
| 形式 | 例 | 適用ケース |
|---|---|---|
バージョン番号.リリース番号.修正番号 |
v1.3.2 | 標準的なバージョン管理 |
バージョン番号.リリース番号.アップグレード番号_修正番号 |
v1.9.3_6 | 大規模更新を含む場合 |
2.5 Git開発ブランチフロー
ブランチ管理の重要性
-
チーム開発の基盤:
- 開発者間の変更を隔離し独立作業領域を提供
- リリースサイクルに合わせたコード統合・テストを可能化
-
DevOps実現の鍵:
"ブランチ戦略はソフトウェア協業とリリースモデルの風向計。適切な戦略がDevOps実装を加速する"
主要ブランチモデル比較
1. 単一マスターモデル
(master) # 全作業が単一支で完結
-
特徴:
- 開発/テスト/リリース全てを
masterで実施 - 各工程が相互干渉するリスク
- 開発/テスト/リリース全てを
-
適用ケース:
- 単一機能開発
- ビルド工程不要の小規模プロジェクト
2. master/develop モデル
(develop) → (master)
-
構成:
-
master:長期(リリース履歴記録) -
develop:長期(変更履歴記録)
-
-
利点:
- developでの開発がmasterビルドに影響しない
-
制約:
- 複数機能の並行開発に非適応
3. master/develop/feature モデル
(feature1) → (develop) → (release) → (master)
(feature2) → ↗
-
特徴:
- feature短期ブランチ:開発者単位の作業領域
- release短期ブランチ:リリース前テスト専用
-
課題:
- リリース中にdevelop変更があると競合発生
4. master/develop/feature/release モデル
(feature) → (develop) → (release) → (master)
-
最適化点:
- 独立releaseブランチでビルド/修正を隔離
-
注意点:
- リリース期間が長いほどdevelopとの差分拡大
5. master/develop/feature/release/hotfix モデル
(feature) → (develop)
↓
(release) → (master)
↑
(hotfix) ← (master)
-
緊急対応機構:
- 本番環境バグをmasterから直接修正
- hotfixブランチで速やかに対処後にマージ
-
利点:
- develop/main開発フローを中断せず緊急対応可能
6. Git-flow 公式モデル
(release) → (master)
↗
(feature)→(develop) →
↘
(hotfix) → (master)
長期ブランチ
| ブランチ | 役割 |
|---|---|
master |
リリース済み製品コードの保存 |
develop |
新機能開発の統合基点 |
短期ブランチ
| タイプ | 作成元 | マージ先 | 目的 |
|---|---|---|---|
feature |
develop | develop | 新機能開発 |
release |
develop | master/develop | リリース前最終調整 |
hotfix |
master | master/develop | 本番環境の緊急修正 |
基本ルール
-
masterには直接コミット禁止 - 機能開発は必ず
featureブランチで実施 -
release/hotfix完了後は該当ブランチ削除
2.6 Gitリモートリポジトリの活用
リモートリポジトリの基本概念
-
目的:
- 地理的に分散したバックアップの実現
- 複数メンバー間での協業を可能にする
-
対応プロトコル:
- HTTP/HTTPS
- SSH
- Git専用プロトコル
リモートリポジトリ設定手順
Step 1: リモートサービス登録
# 代表的なGitホスティングサービス例
- GitHub (https://github.com)
- GitLab (https://gitlab.com)
Step 2: リモートリポジトリ作成
各サービスのWebインターフェースで新規リポジトリ作成
Step 3: ローカルリポジトリとリモートを関連付け
# 一般的なリモート名は"origin"
git remote add origin <リポジトリURL>
リポジトリURLはサービス上で確認可能
Step 4: コードのプッシュ&プル
# ローカル→リモートへ送信
git push origin main
# リモート→ローカルへ取得
git pull origin main
Step 5: 新規クローン作成(リモートから)
# 基本クローン
git clone https://github.com/user/repo.git
# 特定ディレクトリにクローン
git clone https://github.com/user/repo.git /path/to/directory
リモートリポジトリ管理コマンド
リモート設定操作
| 操作 | コマンド例 |
|---|---|
| 追加 | git remote add new_remote <URL> |
| 一覧表示 | git remote -v |
| 削除 | git remote rm old_remote |
| 名称変更 | git remote rename origin source |
リモート操作の基本フロー
協業開発ワークフロー
1. リモート変更の取得
# 全ブランチの変更取得(マージなし)
git fetch origin
# 特定ブランチの変更取得
git fetch origin feature-branch
2. リモートブランチの確認
# リモート追跡ブランチ一覧
git branch -r
# 詳細なリモート情報
git remote show origin
3. リモート変更のローカル反映
# リモートブランチに切り替え
git checkout feature-branch
# リモート変更をローカルにマージ
git merge origin/feature-branch
# 上記2つを一括実行 (fetch + merge)
git pull origin feature-branch
変更のリモートへの反映
基本プッシュ
# カレントブランチを対応リモートへ
git push origin
# 特定ブランチをプッシュ
git push origin feature-branch
一括操作
# 全ブランチをプッシュ
git push --all origin
# 全タグをプッシュ
git push --tags origin
強制プッシュ(注意!)
# リモート履歴を上書き(共同作業で使用注意)
git push --force origin
ベストプラクティス
-
プッシュ前の最新化:
git pull --rebase origin main # リベースで履歴整理 git push origin main -
リモートブランチ削除:
# ローカルで削除後、リモートからも削除 git push origin --delete old-branch -
上流ブランチ設定:
# 初回プッシュ時に設定 git push -u origin feature-branch以後は
git pushのみで同ブランチへプッシュ可
3.Gitよく使われるコマンド
基本設定とヘルプ
# Git及びサブコマンドのヘルプ表示
git help <subcommand> # サブコマンド指定なしならGit全体のヘルプ
git <subcommand> --help # 同上の代替構文
man git-<subcommand> # manページ表示
# バージョン確認
git version
# グローバル設定(~/.gitconfigに保存)
git config --global user.name "username"
git config --global user.email "user@example.com"
git config --global color.ui true
git config --global core.editor vim
# 設定確認と編集
git config --global --list # 設定一覧表示
git config --global -e # 対話式エディタで編集
リポジトリ操作
# 新規リポジトリ初期化
git init # 標準リポジトリ
git init --bare # ベアリポジトリ(作業ディレクトリなし)
# リポジトリクローン
git clone http://url
git clone -b develop http://url # 特定ブランチ指定
git clone -b v1.0 http://url # 特定タグ指定
ファイル操作ワークフロー
# ステージングエリア操作
git add index.html # 単一ファイル追加
git add . # 全変更ファイル追加
# ファイル管理
git mv old.txt new.txt # 追跡済みファイルの改名
git rm --cached file.txt # ステージング取り消し(ファイル保持)
git rm file.txt # ファイル完全削除
git restore --staged <file> # ステージング取り消し(Git 2.23以降)
git restore <file> # 作業ディレクトリ変更取り消し
git restore -s HEAD~ README.md # 前回コミットから復元
# ファイル状態確認
git ls-files # ステージング済みファイル一覧
git ls-files -s # モードビット+オブジェクトID表示
git ls-files -o # 未追跡(untracked)ファイル表示
git cat-file -p <blobid> # オブジェクト内容確認
変更差分の確認
# 基本差分比較
git diff # 作業ツリー vs ステージング
git diff --staged # ステージング vs 最新コミット
git diff HEAD~3 # 作業ツリー vs 3世代前コミット
git diff commitA..commitB # コミット間差分
コミット操作
# 基本コミット
git commit -m "メッセージ"
# 変更追加+コミット(新規ファイル除く)
git commit -am "メッセージ"
# コミット修正
git commit --amend --no-edit # 直前コミットに変更追加
git commit --amend -m "新メッセージ"
# コミット詳細確認
git show HEAD
履歴管理
# 基本ログ
git status # 作業ツリー状態
git log # 標準ログ
git log --oneline # 簡易表示(短縮コミットID)
git log --oneline -5 # 直近5件表示
# 詳細オプション
git log --stats # 変更統計付き
git log -p # 変更内容詳細表示
git log --author="name" # 作者指定フィルタ
git log README.md # ファイル変更履歴
git log origin/main # リモートブランチ履歴
# 操作履歴記録(復元用)
git reflog
バージョン管理
# コミットリセット
git reset --soft HEAD~1 # コミット取り消し(変更保持)
git reset --mixed HEAD~1 # デフォルト(ステージング解除)
git reset --hard HEAD~1 # 変更完全破棄
# タグ操作
git tag v1.0 # 軽量タグ作成
git tag -a v2.0 -m "説明" # 注釈付きタグ作成
git tag -d v1.0 # タグ削除
git tag # タグ一覧
git show v2.0 # タグ詳細確認
git reset --hard v1.0 # タグ状態への復元
ブランチ管理
# 基本操作
git branch # ローカルブランチ一覧
git branch -av # 全ブランチ表示(リモート含む)
git branch new-feature # 新規ブランチ作成
git branch new-branch 62f3a1d # 特定コミットから新規作成
git branch -d old-feature # ブランチ削除
git checkout develop # ブランチ切り替え
git checkout -b hotfix # 新規作成+切り替え
git checkout v1.0 # タグ切り替え(detached HEAD)
# 高度操作
git branch -M main # 現在のブランチ名変更
git checkout origin/dev # リモートブランチ取得
git checkout HEAD~ -- file # 削除ファイル復元
マージ操作
git merge main # メインブランチを現在のブランチに統合
git merge --abort # マージ中断
リモート操作
# リモート設定
git remote -v # 一覧表示
git remote show origin # 詳細情報確認
git remote add origin git@url # 新規リモート追加
git remote rename origin upstream # リモート名変更
git remote remove origin # リモート削除
# 同期操作
git push origin main # 明示的プッシュ
git push -u origin main # 上流ブランチ設定
git push origin :dev # リモートブランチ削除
git push origin v2.0 # タグプッシュ
git push origin --tags # 全タグプッシュ
git push --delete origin old-tag # リモートタグ削除
git pull # フェッチ+自動マージ
git fetch origin # 変更取得のみ
git fetch origin master # 特定ブランチ取得
無視ファイル設定
# .gitignoreで追跡対象外ファイルを指定
vi .gitignore
重要リファレンス
reset --hardやpush --forceは操作前に状態を必ず確認し、共同作業環境では特に注意が必要です!







