Gitとは何か、動作原理とコマンド

著者: IT Sectr 公開日: 2026-05-09 読了時間: 8 分

Gitはオープンソースの分散型バージョン管理システムで、2005年にLinuxカーネル開発のためにLinus Torvaldsによって作成されました。SVNのような集中型システムとは異なり、Gitは開発者の各デバイスにリポジトリの完全なコピーを保存するため、サーバーに常時接続しなくても作業できます。Git SCM、2024年によると、Gitはすべての商用ソフトウェア開発プロジェクトの90%以上で使用されています。

重要なポイント

  • Gitは各開発者のコンピューターに変更の完全な履歴を持つ分散型VCSです。
  • コミットは一意のSHA-1ハッシュでファイル状態のスナップショットを作成し、変更を追跡します。
  • ブランチはGitで機能開発を分離し、競合なく並行作業を可能にします。
  • MergeとRebaseは、コミット履歴に対する異なるアプローチで変更を統合する2つの方法です。
  • GitHub、GitLab、Bitbucketは、GitリポジトリにUIとCI/CDを追加するウェブプラットフォームです。

Gitとは?

Gitはファイルの変更を追跡し、複数の開発者が同じプロジェクトで同時に作業できる分散型バージョン管理システム(VCS)です。集中型システムとは異なり、Gitでは各開発者が変更履歴全体を含むリポジトリの完全なコピーを持ち、システムをデータ損失に強くし、中央サーバーへの常時接続を必要としません。

Gitの歴史は2005年、BitKeeperがLinuxカーネル開発者向けの無料ライセンスを撤回した後、Linus Torvaldsが新しいVCSを作成したことから始まりました。目標は、速度、アーキテクチャのシンプルさ、ブランチによる非線形開発のサポート、完全な分散でした。3ヶ月でTorvaldsはGitのコアを書き、1年以内にプロジェクトは濱野純のリーダーシップの下で自己管理されるようになりました。

Stack Overflowの調査(2024年)によると、Gitはプロフェッショナル開発者の93.9%が使用しており、業界で支配的なバージョン管理システムとなっています。最も近い競合であるSubversion(SVN)は、主に集中型プロセスを持つ大企業環境で、わずか5.2%のプロジェクトで使用されています。

Gitの仕組み:リポジトリとコミット

Gitリポジトリは、Gitがすべてのファイルの変更を追跡するディレクトリです。ディレクトリ内には、コミット、ツリー、ブロブ、参照などすべてのシステムオブジェクトを保存する隠しフォルダ.gitがあります。開発者がコミットを作成するとき、Gitはファイルを完全にコピーするのではなく、スナップショットを作成し、それへの参照を保存します。

コミットには、一意のSHA-1ハッシュ(40文字)、前のコミットへの参照(parent)、作者、日付、コミットメッセージ、およびコミット時のファイルの状態を記述するツリーへの参照が含まれます。コミットの連鎖は有向非巡回グラフを形成し、各コミットは1つ以上の親を指します。

bash
# リポジトリの初期化
git init my-project
cd my-project

# コミットの作成
echo "こんにちは、Git" > README.md
git add README.md
git commit -m "Initial commit"

# 履歴の表示
git log --oneline --graph --all

Gitは3つの主要な領域を使用します:working directory(ディスク上のファイル)、staging area(準備されたファイルが行くインデックス)、repository(コミット履歴)。git addコマンドはワーキングディレクトリからステージングに変更を移動し、git commitはステージングの内容をリポジトリに記録します。この分離により、開発者は各編集を個別にコミットすることなく、一連の変更から意味のあるコミットを組み立てることができます。

Gitの基本コマンド

Gitの基本コマンドは開発者の日常業務の90%をカバーします。git cloneコマンドはリモートリポジトリのローカルコピーを作成し、git pullはサーバーから変更を取得して現在のブランチにマージし、git pushはローカルコミットをサーバーに送信します。これら3つのコマンドがGitでの作業の主要なサイクルを形成します。

ステータスを表示するにはgit statusを使用します。変更されたファイル、ステージングに追加されたファイル、追跡されていないファイルが表示されます。git diffはステージングに追加する前のファイルの具体的な変更を表示します。以下は最も頻繁に使用されるコマンドの表です:

コマンドアクション
git cloneリモートリポジトリをコピーgit clone https://example.com/repo
git addファイルをステージングに追加git add src/main.kt
git commit変更を履歴に記録git commit -m “ログインバグを修正”
git pushコミットをサーバーに送信git push origin main
git pullサーバーから変更を取得git pull origin feature

変更を取り消すために、Gitはいくつかのオプションを提供します。git resetはブランチポインタを指定されたコミットに移動し、ステージングまたはワーキングディレクトリをリセットできます。git revertは指定されたコミットの変更を元に戻す新しいコミットを作成します。これは共有ブランチにとって安全な取り消し方法です。履歴が書き換えられないからです。

Gitのブランチ:main、feature、release

Gitのブランチは、特定のコミットを指す軽量な移動可能ポインタです。新しいブランチを作成してもファイルはコピーされず、新しいポインタが作成されるだけで、ブランチ作成はほぼ瞬時に行われます。mainブランチ(以前はmaster)は、安定したリリース可能なコードを含むプロジェクトのメインブランチです。

標準的なプラクティスはGit FlowまたはGitHub Flowを使用することです。Git Flowでは、main(リリースコード)、develop(統合ブランチ)、feature/*(新機能)、release/*(リリース準備)、hotfix/*(緊急修正)のブランチを使用します。GitHub Flowはよりシンプルで、mainとフィーチャーブランチのみで、すべての変更はPull Requestを介して配信されます。

bash
# ブランチの作成と切り替え
git branch feature-auth
git checkout feature-auth
# または1つのコマンドで:
git checkout -b feature-auth

# ブランチの一覧
git branch --list
git branch -a  # リモート追跡を含むすべてのブランチ

# ブランチの削除
git branch -d feature-auth

Gitブランチの重要な機能はcherry-pickです。git cherry-pick <hash>コマンドを使用して、個々のコミットをあるブランチから別のブランチに移動できます。これは、ブランチ全体をマージせずにフィーチャーブランチからリリースにバグ修正を移行する必要がある場合に便利です。Gitはまた、コミットのスカッシュ、並べ替え、編集のためのリベースおよびインタラクティブリベース(git rebase -i)もサポートしています。

MergeとRebase

Merge(マージ)は2つの親を持つ特別なマージコミットを作成します。このコミットは2つのブランチの統合を記録し、完全な履歴を保持します。マージがいつどこで発生したかがわかります。Mergeは履歴をそのまま保持するため、監査は簡素化されますが、コミットグラフはより複雑になります。

Rebase(リベース)はマージコミットを作成する代わりに、現在のブランチのコミットをターゲットブランチの先端に移動します。履歴は線形になり、開発が順次行われたかのような印象を与えます。ただし、リベースは履歴を書き換え、コミットのSHA-1ハッシュを変更するため、他の開発者がアクセスできる共有ブランチでは危険です。

推奨事項:履歴が他の開発者に見えるパブリックブランチ(feature→develop)ではmergeを使用し、Pull Requestを作成する前にmainからフィーチャーブランチに最新の変更を適用する必要があるローカル作業ではrebaseを使用します。ルールはシンプルです:コミットがすでにサーバーにプッシュされている場合は、リベースしないでください。

競合の解決

マージ競合は、Gitが単一ファイル内の変更を自動的にマージできない場合に発生します。Gitはファイル内の競合セクションを特別なマーカーでマークします:<<<<<<<(私たちの変更)、=======(区切り)、>>>>>>>(相手の変更)。開発者は手動でファイルを編集し、希望するオプションを選択するか両方を組み合わせ、コミットでマージを完了します。

リモートリポジトリの操作

リモートリポジトリ(remote)はサーバー上にあるGitリポジトリのコピーです。GitHub、GitLab、Bitbucketはリモートリポジトリをホスティングする最も人気のあるプラットフォームです。コードの表示、アクセス管理、コードレビュー、CI/CDシステムとの統合のためのウェブインターフェースを提供します。

Gitでは、1つのプロジェクトに複数のリモートリポジトリを設定できます。デフォルトでは、主要なリモートはoriginと呼ばれます。git remote addコマンドは新しいリモートを追加し、git fetchはマージせずに変更を取得し、git pullgit fetch + git mergeの省略形です。Pull Requestを介してコードを操作するには、開発者はリポジトリのフォークを作成し、クローンして、フィーチャーブランチで作業し、元のリポジトリにマージリクエストを送信します。

bash
# リモートリポジトリの追加
git remote add origin https://github.com/user/repo.git

# リモートリポジトリの表示
git remote -v

# サーバーにブランチをプッシュ
git push -u origin feature-auth

# リモートブランチから変更を取得
git pull origin main

リモートリポジトリはリリースバージョンをマークするためのタグ付けをサポートしています。タグは軽量(コミットへの単なるポインタ)または注釈付き(作者、日付、メッセージなどのメタデータを含む)にできます。注釈付きタグは完全なバージョン情報を持ち、作者の検証のためにGPGキーで署名できるため、リリースバージョンには注釈付きタグが推奨されます。

並行作業のためのGit Worktree

Git Worktreeを使用すると、ディレクトリを切り替えることなく、異なるディレクトリで複数のブランチを同時に操作できます。git worktree add ../feature-auth feature-authコマンドは新しいワーキングディレクトリfeature-authを作成し、メインディレクトリでブランチを切り替えることなくコードを記述できます。Worktreeは、メインディレクトリが長期開発で占有されている場合に、リリースブランチで迅速な修正を行うのに便利です。

依存関係のためのGit Submodules

Git Submodulesは、あるGitリポジトリを別のリポジトリ内に含めるためのメカニズムです。サブモジュールは外部リポジトリの固定コミットへの参照を保存し、ビルドの再現性を保証します。git submodule add https://github.com/example/lib.gitコマンドは外部ライブラリをサブモジュールとして追加します。サブモジュールを含むプロジェクトをクローンする際は、すべての依存関係をダウンロードするためにgit submodule update --init --recursiveを実行する必要があります。

よくある質問

GitとSVNの違いは何ですか?

Gitはローカル履歴とオフライン作業機能を持つ分散型VCSです。SVNは集中型システムで、ファイルの表示以外の操作にはサーバーへの常時接続が必要です。

最後のコミットを取り消すには?

安全な取り消しにはgit revert HEADを使用します(新しいコミットが作成されます)。コミットがまだサーバーにプッシュされていない場合は、git reset --soft HEAD~1を使用できます。

.gitignoreとは何ですか?なぜ必要ですか?

.gitignoreは、Gitが無視するファイルとディレクトリのパターンをリストしたファイルです。一時ファイル、ビルド、IDE設定をリポジトリから除外するために使用されます。

git pullとgit fetchの違いは何ですか?

git fetchはサーバーから変更をダウンロードしますが、現在のブランチにマージしません。git pullはfetchを実行してすぐにマージを実行します。制御するには、fetch + diffレビューを使用してから、手動でマージしてください。

最後のコミットメッセージを修正するには?

git commit --amendを使用します。このコマンドはコミットメッセージを変更するためのエディタを開きます。コミットがすでにサーバー上にある場合は、git push --forceが必要になりますが、これは共有ブランチでは危険です。

まとめ

  • GitはLinus Torvaldsによる分散型バージョン管理システムで、ソフトウェア開発の標準となっています。
  • コミットはSHA-1ハッシュと前のコミットへの参照とともにファイル状態のスナップショットを記録します。
  • ブランチはコミットへの軽量ポインタで、並行した機能開発を可能にします。
  • Mergeは2つの親を持つマージコミットを作成し、Rebaseは線形グラフのために履歴を書き換えます。
  • リモートリポジトリ(origin)はpushとpullを介して開発者間でコードを同期します。
  • GitHub、GitLab、BitbucketはGitにウェブインターフェース、コードレビュー、CI/CDを追加します。
  • 始めるにはリポジトリをクローンし、commit、push、pullの3つのコマンドを習得してください。これらが基本的なワークフローをカバーします。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください