Gitリポジトリ — 開発全体を通じてGitがファイルの変更を追跡するプロジェクトのソースコード保存場所です。リポジトリにはコミット、ブランチ、タグの完全な履歴が含まれており、開発者がコード上で共同作業を行うことを可能にします。Git, 2024によると、リポジトリはあらゆるバージョン管理システムの基盤であり、世界中の何百万ものプロジェクトで使用されています。
重要なポイント
Gitリポジトリ — バージョン管理システムがプロジェクトファイルの変更履歴を記述するメタデータとオブジェクトを保存するデータ構造です。開発者がgit initコマンドでリポジトリを初期化すると、Gitはプロジェクトルートに隠しフォルダ.gitを作成します。
このフォルダ内には、システムの動作に必要なすべてのオブジェクト、参照、設定ファイルが格納されています。リポジトリは特定の場所に縛られません — 開発者はローカルで作成し、後でリモートサーバーにリンクすることができます。
Gitは分散リポジトリモデルを使用しています。プロジェクトの各メンバーは自分のコンピュータに履歴の完全なコピーを持っています。つまり、コミット、履歴表示、ブランチ作成といったほとんどの操作は、サーバーに接続せずにローカルで実行されます。
Gitのドキュメントによると、分散アーキテクチャによりシステムは障害に強くなります。サーバーがダウンしても、ローカルリポジトリがあればプロジェクトの完全な履歴を復元できます。
ローカルリポジトリ — 開発者のコンピュータ上のプロジェクトのコピーです。コミット、ブランチ、タグの完全な履歴を含み、ネットワーク接続なしでcommit、branch、merge、rebase操作を実行できます。
リモートリポジトリ — サーバー上にホストされ、チームメンバー全員の同期ポイントとして機能します。開発者はgit pushコマンドで自分の変更を送信し、git pullコマンドで他の人の変更を取得します。
ローカルリポジトリとリモートリポジトリの接続は、remote origin — Git設定に保存されたサーバーURL — を通じて設定されます。1つのローカルリポジトリを複数のリモートリポジトリにリンクできるため、フォークでの作業に便利です。
このモデルの主な利点は、開発者がオフラインでコードを作業し、結果を送信する準備ができたときにのみ変更を同期できることです。
| 特性 | ローカル | リモート |
|---|---|---|
| 場所 | 開発者のコンピュータ上 | サーバー上(GitHub、GitLab) |
| オフラインアクセス | 全操作に完全アクセス | 接続なしでは利用不可 |
| 同期 | リモートとPush/Pull | ローカルからのpushを受信 |
| バックアップ | データ損失から保護されない | バックアップ付きサーバーに保存 |
Gitの保存モデルは他のバージョン管理システムとは根本的に異なります。バージョン間の変更リスト(デルタ)を保存する代わりに、Gitは各コミット時点のプロジェクトの全ファイルの完全なスナップショットを保存します。
リポジトリ内の各オブジェクトは、40文字の一意のSHA-1ハッシュで識別されます。コミット間でファイルの内容が変わっていなければ、Gitは新しいオブジェクトを作成せず既存のものを再利用します — これにより容量を節約できます。
Gitは4種類のオブジェクトを使用します。blob(ファイル内容)、tree(ディレクトリ構造)、commit(メタデータ付きスナップショット)、tag(コミットへの名前付き参照)です。すべてのオブジェクトは.git/objectsフォルダに保存されます。
Git Internalsによると、Gitのオブジェクトモデルはデータの整合性を保証します。ファイル内容の変更は新しいハッシュを生成するため、履歴を気付かれずに変更することは不可能です。
.gitフォルダはリポジトリの心臓部です。これがなければGitは変更を追跡できず、通常のディレクトリは単なるファイルの集まりに過ぎません。このフォルダの構造を理解すると、リポジトリの問題診断に役立ちます。
HEADファイルは特に重要です。通常の状態ではブランチへのシンボリック参照を含みます(例:ref: refs/heads/main)。detached HEAD状態ではコミットを直接指します — つまり、新しいコミットはどのブランチにも結びつきません。
Gitリポジトリでの作業には、開発者が日常的に行う一連の基本操作が含まれます。各操作は、新しいオブジェクトの追加や参照の移動によってリポジトリの状態を変更します。
pushとpullの操作だけがリモートサーバーへの接続を必要とします。他の操作はすべて完全にローカルで実行されるため、履歴の量が多くても高速に動作します。
リポジトリ内の各ファイルは4つの状態を経ます。untracked(追跡外)、modified(変更済み)、staged(準備済み)、committed(コミット済み)です。Gitはgit addで明示的に追加されたファイル、または既にコミット履歴にあるファイルのみを追跡します。
このモデルを理解することがGitを効果的に使う鍵です。開発者は変更したファイルの一部だけを選択的にコミット用に準備し、明確な説明付きで論理的に完結したコミットを作成できます。
リモートリポジトリは通常、Webインターフェース、アクセス管理システム、コラボレーション開発のための追加ツールを提供する専門プラットフォームでホストされます。
プラットフォームの選択は、チームの規模、プライバシー要件、必要な統合機能によって決まります。モバイル開発では、コミュニティの広範なサポートとiOS・Android向けCI/CDツールとの統合により、GitHubが選ばれることが多いです。
実践的なシナリオを考えてみましょう。開発者が既存のリポジトリをクローンし、新しいブランチを作成し、変更を加えてサーバーにプッシュします。各コマンドはリポジトリのさまざまなコンポーネントとの連携を示しています。
# リモートリポジトリのクローン
git clone https://github.com/user/mobile-app.git
# プロジェクトディレクトリに移動
cd mobile-app
# 新しいフィーチャーブランチを作成して切り替え
git checkout -b feature/auth
# 変更されたファイルの状態を確認
git status
# すべての変更をステージングエリアに追加
git add .
# 説明付きでコミットを作成
git commit -m "Add authentication module"
# リモートリポジトリに変更をプッシュ
git push origin feature/auth
git statusコマンドは日常業務で最も役立つコマンドの1つです。どのファイルが変更されたか、どのファイルがコミット準備済みか、どのファイルがGitに追跡されていないかを表示します。
リポジトリの履歴を分析するには、書式設定フラグを付けてgit logコマンドを使用します。コミットの時系列、作成者、日付、SHA-1識別子を表示します。
# ブランチグラフの可視化で履歴を表示
git log --oneline --graph --all
# 特定のコミットの変更を表示
git show a1b2c3d
# 現在の状態を最後のコミットと比較
git diff HEAD
# 特定のファイルの履歴を表示
git log --follow src/MainActivity.kt
--graphフラグはブランチのASCIIグラフを表示します。これは複数のブランチで活発に作業しているリポジトリで特に有用です。頻繁にリリースを行うモバイルプロジェクトでは、視覚的なグラフによって開発構造をすばやく評価できます。
よくある質問
リポジトリは変更履歴を持つコードの技術的な保存場所です。プロジェクトはリポジトリ、タスク管理システム、ドキュメント、開発プロセスを含むより広い概念です。1つのプロジェクトに複数のリポジトリが含まれることがあります。
GitHubのWebインターフェースでNewボタンをクリックして新しいリポジトリを作成します。名前、説明、アクセスレベルを指定します。その後、リポジトリをローカルマシンにクローンするか、git remote add originで既存のローカルリポジトリとリンクします。
リモートリポジトリがサーバーから削除されても、少なくとも1人の開発者がローカルコピーを持っていれば復元可能です。新しいリモートリポジトリを作成し、完全な履歴を持つローカルコピーからgit push --forceを実行するだけです。
フォークは自分のアカウント上の他人のリポジトリのコピーです。履歴の完全なコピーを取得し、オリジナルに影響を与えずに任意の変更ができます。フォークはPull Requestを通じてオープンソースプロジェクトに参加するために使用されます。
git gcでオブジェクトを圧縮し、到達不能なデータを削除します。git filter-branchまたはgit filter-repoで履歴から大きなファイルを削除します。バイナリファイルを含むプロジェクトではGit LFS(Large File Storage)を検討してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。