- バージョン管理とは
- バージョン管理がない場合の問題点
[[手動バックアップの限界 (ファイル名の混乱、最新版の不明確さ)]]
[[変更履歴の喪失と意図の不明確化]]
[[複数人での同時編集の困難さとコンフリクト]]
[[誤った変更からの復旧の難しさ]]
[[実験的な変更の試行のしにくさ]]
- バージョン管理システムの主な機能
[[変更履歴の記録 (コミット)]]
[[特定のバージョンへの復元 (チェックアウト、リバート)]]
[[ブランチ (分岐) とマージ (統合)]]
[[差分の表示 (Diff)]]
[[競合 (コンフリクト) の検出と解決支援]]
[[タグ付け (特定のバージョンのマーキング)]]
[[ログの閲覧 (履歴確認)]]
[[リモートリポジトリとの同期]]
- バージョン管理の恩恵を受ける対象
[[ソースコード]]
[[ドキュメント (仕様書、設計書、マニュアル)]]
[[設定ファイル]]
[[インフラ構成コード (IaC)]]
[[データセット (一部のVCSまたは専用ツールと連携)]]
[[デザインファイル]]
3. Git MOC (最も詳細なセクション)
- Gitの設計思想と特徴 (Linus Torvaldsによる開発、速度、単純な設計、非線形開発の強力なサポート、完全分散型、大規模プロジェクトへの対応能力)
- Gitの3つの状態/エリア
[[ワーキングディレクトリ (Working Directory)]] (作業中のファイル群)
[[ステージングエリア (Staging Area / Index)]] (コミット対象の変更を準備する場所)
[[Gitディレクトリ (.git directory / Repository)]] (プロジェクトのメタデータとオブジェクトデータベース)
- Gitの主要オブジェクト
[[Blob (ブロブオブジェクト)]] (ファイルの内容)
[[Tree (ツリーオブジェクト)]] (ディレクトリ構造とファイル情報)
[[Commit (コミットオブジェクト)]] (スナップショット、親コミット、作者、メッセージなど)
[[Tag (タグオブジェクト)]] (特定のコミットへのポインタ、アノテートタグと軽量タグ)
- SHA-1ハッシュ (識別子)
- ポインタ (HEAD, ブランチ名, タグ名)
- Gitのスナップショットベースの考え方 (差分ベースではない)
- (オプション) Gitの内部構造の概要 (.gitディレクトリの中身) (objects, refs, HEADなど)
- 各OS (Windows, macOS, Linux) へのGitのインストール方法
- 初期設定 (
git config)
[[ユーザー名とメールアドレスの設定 (user.name, user.email)]]
[[デフォルトエディタの設定 (core.editor)]]
[[デフォルトブランチ名の設定 (init.defaultBranch)]] (例: main)
[[エイリアスの設定 (alias)]]
[[改行コードの扱い (core.autocrlf, core.safecrlf)]]
[[グローバル設定 (—global) とローカル設定]]
.gitignore ファイル
[[バージョン管理対象外にするファイルやディレクトリの指定方法]]
[[グローバルな.gitignoreファイル]]
[[.gitignoreのパターン記述ルール]]
.gitattributes ファイル (改行コード、差分・マージ戦略の指定など - 概要)
- リポジトリの作成
[[git init (新規ローカルリポジトリの作成)]]`
[[git clone <repository_url> (既存リモートリポジトリの複製)]]`
- 変更の追跡とステージング
[[git status (ファイルの状態確認)]]` (Untracked, Modified, Staged, Unmodified)
[[git add <file> (ファイルをステージングエリアに追加)]]`
[[git add . (カレントディレクトリ以下の変更を全てステージング)]]`
[[git add -p (パッチモードでのステージング)]]`
[[git rm <file> (ファイルの削除とステージング)]] (—cached`オプション)
[[git mv <old_name> <new_name> (ファイル名の変更とステージング)]]`
- コミット (変更の記録)
[[git commit -m "commit message" (ステージングされた変更をコミット)]]`
[[git commit -a -m "commit message" (追跡中ファイルの変更をステージングしてコミット)]]`
[[git commit --amend (直前のコミットを修正)]]` (プッシュ前のみ推奨)
- 良いコミットメッセージの書き方 (Conventional Commitsなど)
- 履歴の確認
[[git log (コミット履歴の表示)]]`
[[git log --oneline, --graph, --decorate, --stat, -p, --author, --since, --untilなどのオプション]]
[[git show <commit_hash> (特定のコミットの詳細表示)]]`
[[git diff (ワーキングディレクトリとステージングエリアの差分)]]`
[[git diff --staged (ステージングエリアと最新コミットの差分)]]`
[[git diff <commit1> <commit2> (2つのコミット間の差分)]]`
[[git blame <file> (ファイルの各行の最終変更者とコミットを表示)]]`
- 変更の取り消し
[[git restore <file> (ワーキングディレクトリの変更を取り消し)]] (git checkout — `の代替)
[[git restore --staged <file> (ステージングエリアから取り除く)]] (git reset HEAD `の代替)
[[git checkout <commit_hash> -- <file> (特定のコミットからファイルを取り出す)]]`
[[git reset <commit_hash> (HEADを指定したコミットに移動)]]`
[[--soft, --mixed (デフォルト), --hard オプションの違いと危険性]]
[[git revert <commit_hash> (特定のコミットを打ち消す新しいコミットを作成)]]` (公開履歴の変更に適している)
- ブランチとは
- ブランチの作成と切り替え
[[git branch <branch_name> (ブランチの作成)]]`
[[git branch (ブランチの一覧表示)]] (-r, -a`オプション)
[[git checkout <branch_name> (ブランチの切り替え)]]`
[[git switch <branch_name> (ブランチの切り替え - checkoutの代替)]]`
[[git checkout -b <branch_name> (ブランチの作成と切り替え)]]`
[[git switch -c <branch_name> (ブランチの作成と切り替え - checkout -bの代替)]]`
- ブランチのマージ (統合)
[[git merge <branch_name> (指定ブランチをカレントブランチにマージ)]]`
- Fast-forwardマージ
- 3-wayマージ (再帰的マージ)
- マージコンフリクト (競合) の解決
[[コンフリクトが発生する条件]]
[[コンフリクトマーカー (<<<<<<<, =======, >>>>>>>)]]
[[手動でのコンフリクト解決手順]]
[[マージツールの利用 (git mergetool)]]
[[git add と git commit による解決済みコンフリクトの記録]]
[[git merge --abort (マージの中止)]]`
- ブランチの削除
[[git branch -d <branch_name> (マージ済みブランチの削除)]]`
[[git branch -D <branch_name> (未マージブランチの強制削除)]]`
- ブランチの応用
[[フィーチャーブランチ]]
[[リリースブランチ]]
[[ホットフィックスブランチ]]
- (オプション) スタッシュ (Stash)
[[git stash (未コミットの変更を一時退避)]]`
[[git stash list, git stash apply, git stash pop, git stash drop]]
- リモートリポジトリとは (共有サーバー上のリポジトリ)
- リモートリポジトリの管理
[[git remote add <name> <url> (リモートリポジトリの追加)]]`
[[git remote -v (リモートリポジトリの一覧表示)]]`
[[git remote show <name> (リモートリポジトリの詳細表示)]]`
[[git remote rename <old_name> <new_name> (リモート名の変更)]]`
[[git remote remove <name> (リモートリポジトリの削除)]]`
- リモートリポジトリからの取得
[[git fetch <remote_name> (リモートの変更を取得、ローカルブランチは更新しない)]]`
[[リモート追跡ブランチ (Remote-tracking branches -例: origin/main)]]
- リモートリポジトリへのプッシュ (Push)
[[git push <remote_name> <local_branch_name>:<remote_branch_name> (ローカルブランチをリモートにプッシュ)]]`
[[git push <remote_name> <branch_name> (ローカルとリモートが同名の場合)]]`
[[git push -u <remote_name> <branch_name> (アップストリーム設定とプッシュ)]]`
[[git push --force (強制プッシュ - 危険性、使用場面の限定)]]`
[[git push <remote_name> --delete <remote_branch_name> (リモートブランチの削除)]]`
[[git push --tags (タグのプッシュ)]]`
- リモートリポジトリからのプル (Pull)
[[git pull <remote_name> <remote_branch_name> (fetch + mergeの糖衣構文)]]`
- プル時のコンフリクト解決 (マージコンフリクトと同様)
- [[
git pull --rebase (フェッチ + リベース)]] (履歴を直線的に保つ)
- フォーク (Fork) とプルリクエスト (Pull Request / Merge Request) (GitHub/GitLabなどのホスティングサービスにおける概念)
- リベース (Rebase)
- タグ (Tagging)
[[git tag <tag_name> (軽量タグの作成)]]`
[[git tag -a <tag_name> -m "message" (注釈付きタグの作成)]]`
[[git tag (タグの一覧表示)]]`
[[git show <tag_name> (タグの詳細表示)]]`
[[git push <remote_name> <tag_name> (特定のタグをプッシュ)]]`
[[特定のタグをチェックアウトする]]
- チェリーピック (Cherry-pick)
[[git cherry-pick <commit_hash> (特定のコミットを現在のブランチに取り込む)]]`
- リフログ (Reflog)
[[git reflog (HEADとブランチの参照履歴を表示 - 失ったコミットの回復などに利用)]]`
- サブモジュール (Submodules)
[[git submodule add <repository_url> <path> (別のGitリポジトリをサブディレクトリとして含める)]]`
[[サブモジュールの更新と管理]]
- Git LFS (Large File Storage)
- Gitフック (Git Hooks)
git bisect (バグを混入させたコミットを二分探索で見つける)
.mailmap (複数のメールアドレスや名前を正規化)
- Gitの差分・マージドライバのカスタマイズ
- Gitホスティングサービスの役割 (リモートリポジトリ提供、コラボレーション機能)
- GitHub MOC
[[GitHubの機能 (リポジトリ、プルリクエスト、Issueトラッキング、Actions (CI/CD), Pages, Projects)]]
- GitLab MOC
[[GitLabの機能 (リポジトリ、マージリクエスト、Issueトラッキング、CI/CD (Auto DevOps), Wiki, パッケージレジストリ)]]
[[セルフホスト版とSaaS版]]
- Bitbucket MOC (Atlassian製品との連携)
- Azure Repos (Azure DevOps) MOC
- 各ホスティングサービスの比較 (料金、機能、プライベート/パブリックリポジトリ)
[[頻繁にコミットする (小さく、論理的な単位で)]]
[[明確で一貫性のあるコミットメッセージを書く]]
[[作業前に git pull(またはfetch&merge/rebase) する]]
[[フィーチャーブランチを効果的に活用する]]
[[公開履歴をリベースしない (黄金律の再確認)]]
[[コードレビューを実践する]]
[[.gitignoreを適切に設定する]]
[[不要なファイルをコミットしない]]
[[定期的にリモートリポジトリと同期する]]
[[チームでワークフローの合意を形成する]]
[[SourceTree]]
[[GitKraken]]
[[GitHub Desktop]]
[[IDE統合のGitクライアント (VS Code, IntelliJ IDEA, Eclipseなど)]]
- CLIとの使い分け
[[一般的なマージコンフリクトの解決]] (再掲)
[[誤ってコミットした変更の取り消し]] (revert, reset)
[[失ったコミットの回復 (reflog)]]
[[ブランチを間違えて作業した場合の対処]]
[[Detached HEAD状態とその解決]]
[[大きなファイルのコミット問題と対処 (Git LFS, BFG Repo-Cleaner)]]
[[リモートとの同期エラー]]
[[SVNの基本コマンド (checkout, commit, update, add, delete, copy, move)]]
[[SVNのブランチとマージ (ディレクトリコピーベース)]]
[[SVNのロック機構 (一部ファイルタイプ向け)]]
[[SVNとGitの主な違いと比較]] (集中型 vs 分散型、ブランチ/マージの容易さ、オフライン作業)
[[SVNからGitへの移行]]
[[Hgの基本コマンド (clone, commit, push, pull, update, add, remove, branch, merge)]]
[[Hgの思想とGitとの類似点・相違点]] (コマンドの分かりやすさ、拡張性、リビジョン番号)
[[Hgのブックマークと名前付きブランチ]]
[[Hgのフェーズ (public, draft, secret)]]
- CDパイプラインとバージョン管理
[[コミット/プッシュをトリガーとした自動ビルド・テスト・デプロイ]]
[[ブランチ戦略とCI/CDの連携]]
- コードレビュープロセスとバージョン管理
[[プルリクエスト (Pull Request / Merge Request) ベースのレビュー]]
[[レビューツールとの連携 (GitHub, GitLab, Bitbucket, Gerrit)]]
- リリース管理とバージョン管理
[[タグ付けによるリリースバージョンのマーキング]]
[[リリースブランチ戦略]]
[[CHANGELOGの自動生成 (Conventional Commitsなど)]]
- Issueトラッキングシステムとの連携 (JIRA, Redmine, GitHub Issuesなど)
[[コミットメッセージとIssue IDの関連付け]]
[[ブランチ名とIssue IDの関連付け]]
[[バージョン管理システムを使わない]]
[[巨大なコミット (変更内容が多すぎる)]]
[[意味不明なコミットメッセージ]]
[[頻繁でないコミット/プッシュ (ローカルに溜め込む)]]
[[ブランチを使わない (全員がmain/masterに直接コミット)]]
[[長期間生存するフィーチャーブランチ (マージコンフリクト地獄)]]
[[公開履歴の強制プッシュ (git push —force の乱用)]]
[[バイナリファイルや生成物を不用意にコミットする (Git LFSなどを使わない)]]
[[機密情報 (パスワード、APIキー) をコミットする]]
[[.gitignoreを適切に使わない]]
[[コンフリクト解決を他人に任せる/適当に行う]]
[[チームでワークフローの合意がない]]