1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gitバージョン管理システムの基礎と開発ワークフロー実践

1
Last updated at Posted at 2025-11-04

1. データ保存方式の根本的差異

SVN と CVS
image.png

  • 各コミットのファイルを個別に保存
  • ファイルの提出時間でバージョンを区別し、別々の論理ストレージ領域に保存
  • 復元時は直接前のバージョンから復旧
  • 保存される情報は基本ファイル+時間経過による差分で構成される(差分ベースのバージョン管理)

Git
image.png

  • コミット時点の全ファイルのスナップショットを保存
  • 変更のないファイルは再保存せず、既存ファイルへのリンクを保持
  • データをスナップショットの連続として扱う

GitとSVNの主な違い

特性 Git SVN
アーキテクチャ 分散型 集中型
保存方式 完全なファイル 差分ファイル
オフライン操作 可能 不可
ブランチ処理 強力 制限あり
変更履歴操作 高度な変更可能 制限あり
パフォーマンス 高速 比較的低速

🔍 公式最新版参考
Pro Git 書籍 第2版 - 日本語公式サイト
Pro Git 全言語版リポジトリ(GitHub)

2. Gitの主要概念と動作原理

2.1 Gitの基本領域構成

image.png

ワークスペース(作業領域)

<プロジェクトディレクトリ>/
├── src/
├── config/
└── ... # ユーザーが直接編集するファイル群
  • 特徴:
    • コードを編集する物理的なディレクトリ
    • 変更内容はGitの追跡対象外(git statusで「Untracked files」と表示)
    • バージョン管理対象にするにはgit addでステージングエリアに追加する必要がある

ステージングエリア(索引領域/キャッシュ領域)

<プロジェクトディレクトリ>/.git/index
  • 役割:
    • コミット前の変更を一時保存する「草稿箱」
    • git addでワークスペースの変更を登録
    • 複数の変更をまとめて1つのコミットに統合できる
    • メールの下書きのように、途中段階の変更を安全に保持可能

ローカルリポジトリ

<プロジェクトディレクトリ>/.git/
├── objects/  # コミットデータ本体
├── refs/     # ブランチ/タグ参照
└── HEAD      # 現在のブランチポインタ
  • 動作メカニズム:
    1. git commitでステージング内容を固定スナップショットとして保存
    2. 40桁のSHA-1ハッシュ(例: a1b2c3d...)で各コミットを一意識別
    3. git checkoutで任意のコミットの状態をワークスペースに復元
      • 注意: 未コミットの変更は上書きされる(事前にgit stashで退避推奨)

リモートリポジトリ

git remote add origin <URL>  # GitHub/GitLab/GiteeなどのURL
  • 機能:
    • チームメンバー間でのコード共有基盤
    • 分散開発時の変更履歴同期ポイント
    • git pushでアップロード、git fetch/git pullでダウンロード

image.png

2.2 Gitファイルの状態変化周期

状態遷移図

image.png

各状態の定義

Untracked (未追跡状態)

  • ワークスペースに新しく作成されたファイル
  • Gitが存在を認識しておらず、バージョン管理対象外

Unmodified (未変更状態)

  • ステージングエリアからローカルリポジトリへコミット済み
  • ファイルが変更されておらず安定状態

Modified (編集済み状態)

  • 追跡対象ファイルが変更されたが未ステージング
  • 変更内容がGitに正式記録されていない一時状態

Staged (ステージング済み状態)

  • git addでステージングエリアに追加済み
  • 変更が次回コミットの候補として確定待ち状態

Unstaged (ステージング未済み状態)

  • 追跡対象ファイルが変更されたが未ステージング
  • 変更がワークスペースにのみ存在する状態

image.png

2.3 Gitのコミット履歴とコミットチェーン

コミットチェーンの基本構造

  • コミット履歴が連なって形成されるチェーン状の構造

  • 親コミット

    • 初期コミット以外のすべてのコミットに存在
    • 1つの親(通常の変更)または複数の親(マージ時)
  • 子コミット

    • 最新コミット以外のすべてのコミットに存在
    • 1つの子(直線的な変更)または複数の子(ブランチ作成時)

コミット参照の仕組み

git show HEAD  # 現在のHEADが指すコミット情報を表示
  • 文字列ベース参照

    • コミットは40桁のハッシュIDで一意に識別可能
    • 人間が扱いやすい「参照名」でもアクセス可能
  • 主要参照ポイント

    • master/main:デフォルトブランチの最新コミット参照
    • HEAD
      • 現在の作業ブランチの「先端」を指すポインタ
      • 通常は最新コミットを指す
      • 相対参照の起点となる(例:HEAD~ = 1つ前のコミット)

コミットチェーン

image.png

2.4 Git ブランチとタグ

公式リファレンス

ブランチ(Branch)

  • 技術的本質:コミットオブジェクトを指す移動可能なポインタ
  • デフォルト名masterまたはmain
  • 動作原理
    git commit  # コミットごとにブランチポインタが前方に移動
    
  • 開発上の意義
    • ファイルの複数コピーを仮想的に作成
    • 異なるソフトウェアバージョンの並行開発を可能に
    • 開発バージョンの分離による安全な進化

ブランチ活用シナリオ

事例:新機能開発(2週間要)

  1. 独立ブランチ作成 → 他メンバーの作業に影響なし
  2. 毎日進捗をコミット → 作業内容喪失リスク解消
  3. 開発完了後メインブランチにマージ → 安全な統合

タグ(Tag)

  • 技術的本質:特定のコミット状態を固定する不動のポインタ
  • 主用途:リリースバージョンのマイルストーン管理
  • 運用ルール
    • 日常開発 → ブランチへのコミット&プッシュ
    • バージョン公開時 → 対応コミットにタグ付与

タグとブランチの根本的差異

特性 タグ (Tag) ブランチ (Branch)
構造 コミット1点を固定指す 連続したコミット列を追跡
移動性 不可 HEADポインタで移動可能
用途 バージョン凍結状態の管理 進行形開発の管理

タグ活用シナリオ

事例:v2.0ベースの新機能追加

  1. v2.0タグから開発ブランチを新規作成
git checkout -b v4-dev v2.0
  1. 新機能を開発しv4.0タグを付与
  2. 元のブランチ構造に影響なし

推奨バージョン命名規則

形式 適用ケース
バージョン番号.リリース番号.修正番号 v1.3.2 標準的なバージョン管理
バージョン番号.リリース番号.アップグレード番号_修正番号 v1.9.3_6 大規模更新を含む場合

2.5 Git開発ブランチフロー

ブランチ管理の重要性

  • チーム開発の基盤
    • 開発者間の変更を隔離し独立作業領域を提供
    • リリースサイクルに合わせたコード統合・テストを可能化
  • DevOps実現の鍵

    "ブランチ戦略はソフトウェア協業とリリースモデルの風向計。適切な戦略がDevOps実装を加速する"

image.png

主要ブランチモデル比較

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 本番環境の緊急修正

基本ルール

  1. masterには直接コミット禁止
  2. 機能開発は必ずfeatureブランチで実施
  3. 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

ベストプラクティス

  1. プッシュ前の最新化

    git pull --rebase origin main  # リベースで履歴整理
    git push origin main
    
  2. リモートブランチ削除

    # ローカルで削除後、リモートからも削除
    git push origin --delete old-branch
    
  3. 上流ブランチ設定

    # 初回プッシュ時に設定
    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 --hardpush --forceは操作前に状態を必ず確認し、共同作業環境では特に注意が必要です!

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?