はじめに:なぜバージョン管理が必要なのか?

開発をしていると、誰でも一度はこんな経験をしたことがあるでしょう。「昨日作業したコードの方が良かったのに...」、「この機能を追加する前に戻りたい」、「同僚が修正した部分と私が修正した部分がぶつかって大変なことになった」。ファイル名の後ろに日付をつけたり、「最終版」、「本当の最終版」、「本当に本当の最終版」のような接尾辞をつけた経験、皆さんありますよね?

このような問題を解決するために登場したのがバージョン管理システム(Version Control System, VCS)です。そして現在、世界中の開発者が最も多く使用しているバージョン管理システムが、今日学ぶGitです。

Gitは2005年にLinuxカーネル開発のためにリーナス・トーバルズが作りました。最初はLinux開発チーム内部でのみ使用していましたが、その優れたパフォーマンスと柔軟性のおかげで、今ではソフトウェア開発の標準ツールとなりました。スタートアップから大企業まで、1人の開発者から数千人が参加するオープンソースプロジェクトまで、Gitなしでは現代のソフトウェア開発を想像するのは難しいほどです。

この記事では、Gitの基本概念から実務ですぐに使えるコマンドまで、順を追って見ていきます。初めてGitに触れる方でも、この記事を読み進めれば基本的なバージョン管理を始められるようになるでしょう。

1. Gitのインストール

Gitを使用するには、まずコンピュータにインストールする必要があります。OSごとにインストール方法が少し異なるので、ご自身の環境に合った方法で行ってください。

1.1 Windowsでのインストール

Windowsユーザーであれば、Git公式サイトからインストールファイルをダウンロードするのが最も簡単です。

  1. git-scm.com/download/winにアクセスします。
  2. 自動的にダウンロードが開始されます。開始されない場合は「Click here to download manually」をクリックしてください。
  3. ダウンロードしたインストールファイルを実行します。
  4. インストール過程では、ほとんどのオプションはデフォルト値をそのまま使用しても構いません。
  5. ただし、「Adjusting your PATH environment」の段階では「Git from the command line and also from 3rd-party software」を選択することをお勧めします。

インストールが完了したら、スタートメニューから「Git Bash」を探して実行してみてください。このターミナルでGitコマンドを使用できます。

1.2 macOSでのインストール

macOSでは、いくつかの方法でGitをインストールできます。

方法1:Xcode Command Line Toolsを使用

ターミナルを開いて、次のコマンドを入力するだけです。

xcode-select --install

ポップアップウィンドウが表示されたら「インストール」をクリックしてください。Gitを含む開発ツールが一緒にインストールされます。

方法2:Homebrewを使用

Homebrewがインストールされていれば、さらに簡単です。

brew install git

1.3 Linuxでのインストール

Linuxディストリビューションごとにパッケージマネージャを使用します。

Ubuntu/Debian系:

sudo apt update
sudo apt install git

Fedora/CentOS/RHEL系:

sudo dnf install git
# または旧バージョンの場合
sudo yum install git

1.4 インストールの確認

どのOSでも、インストールが完了したらターミナルで次のコマンドで確認してみてください。

git --version

git version 2.x.xのような形でバージョンが出力されれば、インストール完了です。

2. Gitの初期設定

Gitを初めてインストールしたら、いくつかの基本設定をする必要があります。この設定は一度だけ行えばよく、後でいつでも変更できます。

2.1 ユーザー情報の設定

Gitはコードをコミットするたびに、誰が作成したかを記録します。そのため、まずご自身の名前とメールアドレスを設定する必要があります。

# ユーザー名の設定
git config --global user.name "山田太郎"

# メールアドレスの設定
git config --global user.email "yamada@example.com"

--globalオプションを使用すると、このコンピュータのすべてのGitリポジトリでこの設定を使用します。特定のプロジェクトでのみ別の情報を使用したい場合は、そのプロジェクトフォルダで--globalなしで同じコマンドを実行すればOKです。

2.2 デフォルトエディタの設定

Gitはコミットメッセージを作成する際にテキストエディタを開きます。デフォルトはVimですが、Vimに慣れていない場合は他のエディタに変更できます。

# VS Codeを使用
git config --global core.editor "code --wait"

# Notepad++を使用(Windows)
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

# nanoを使用(Linux/macOS)
git config --global core.editor "nano"

2.3 設定の確認

現在設定されている内容を確認するには、次のコマンドを使用します。

# すべての設定を確認
git config --list

# 特定の設定のみ確認
git config user.name
git config user.email

3. Gitのコア概念を理解する

Gitを正しく使うには、いくつかのコア概念を理解する必要があります。最初は少し混乱するかもしれませんが、これらの概念を理解すれば、Gitのすべてのコマンドが論理的につながります。

3.1 3つの領域:Working Directory、Staging Area、Repository

Gitはファイルを3つの領域で管理します。

Working Directory(作業ディレクトリ)

実際にファイルを編集する場所です。皆さんがコードを作成・修正する、まさにそのフォルダです。この領域のファイルはGitが「追跡中(tracked)」かもしれませんし、「追跡していない(untracked)」かもしれません。

Staging Area(ステージング領域、Index)

次のコミットに含めるファイルを準備する場所です。「これらのファイルの現在の状態を保存します」と印をつけるようなものです。git addコマンドでファイルをこの領域に上げます。

Repository(リポジトリ)

Gitがすべてのバージョン情報を保存する場所です。プロジェクトフォルダ内の.gitフォルダがまさにこのリポジトリです。git commitコマンドでステージングされたファイルをここに恒久的に記録します。

簡単に例えると、写真アルバムを作る過程に似ています。Working Directoryはカメラロールにあるすべての写真、Staging Areaは「今回のアルバムに入れる写真」として選んだもの、Repositoryは実際にプリントしてアルバムに貼った写真と考えればいいでしょう。

3.2 ファイルの状態

Gitでファイルは次のような状態を持つことができます。

  • Untracked:Gitがまだ追跡していない新しいファイル
  • Staged:ステージング領域に追加されたファイル
  • Modified:修正されたがまだステージングされていないファイル
  • Committed(Unmodified):リポジトリに安全に保存されたファイル

4. 基本コマンドをマスターする

では、実際にGitを使ってみましょう。最もよく使う基本コマンドを一つずつ見ていきます。

4.1 git init - リポジトリの作成

新しいプロジェクトを始める際に最初に実行するコマンドです。

# 新しいフォルダを作成してGitリポジトリを初期化
mkdir my-project
cd my-project
git init

このコマンドを実行すると、現在のフォルダに.gitという隠しフォルダが作成されます。このフォルダ内にGitがバージョン管理に必要なすべての情報を保存します。

4.2 git status - 状態の確認

現在の作業ディレクトリとステージング領域の状態を確認します。Gitを使用する中で最もよく実行するコマンドです。

git status

出力結果から、どのファイルが修正されたか、どのファイルがステージングされたか、どのファイルが追跡されていないかを一目で確認できます。

4.3 git add - ステージング

ファイルをステージング領域に追加します。

# 特定のファイルのみステージング
git add index.html

# 複数のファイルをステージング
git add index.html style.css script.js

# 現在のフォルダのすべての変更をステージング
git add .

# 特定の拡張子のファイルのみステージング
git add *.js

ヒント:git add .は便利ですが、誤って不要なファイルまでステージングしてしまう可能性があります。コミット前にgit statusでステージングされたファイルを必ず確認してください。

4.4 git commit - 変更の保存

ステージングされたファイルをリポジトリに記録します。

# コミットメッセージと一緒にコミット
git commit -m "ログイン機能を実装"

# ステージングとコミットを一度に(すでに追跡中のファイルのみ)
git commit -am "バグを修正"

良いコミットメッセージの書き方

コミットメッセージは、後で変更履歴を確認する際に非常に重要です。以下のルールに従うと良いでしょう。

  • 何を変更したかを明確に記述
  • 現在形で記述(例:「Add feature」または「機能を追加」)
  • 1行目は50文字以内で要約
  • 必要であれば空行の後に詳細説明を追加

4.5 git log - コミット履歴の確認

これまでのコミット履歴を確認します。

# 基本的なログを表示
git log

# 1行で簡潔に表示
git log --oneline

# グラフでブランチ構造を表示
git log --oneline --graph

# 最近の5件のコミットのみ表示
git log -5

# 特定のファイルの変更履歴を表示
git log -- index.html

4.6 git diff - 変更内容の確認

ファイルの具体的な変更内容を確認します。

# 作業ディレクトリとステージング領域を比較
git diff

# ステージング領域と最後のコミットを比較
git diff --staged

# 2つのコミット間の差分を比較
git diff abc123 def456

# 特定のファイルのみ比較
git diff index.html

5. .gitignoreファイルの設定

プロジェクトにはGitで管理すべきでないファイルがあります。例えば、ビルド成果物、ログファイル、APIキーが含まれる設定ファイル、node_modulesのような依存関係フォルダなどです。これらのファイルを無視するよう設定するのが.gitignoreファイルです。

5.1 .gitignoreファイルの作成

プロジェクトのルートフォルダに.gitignoreファイルを作成し、無視するファイルやフォルダのパターンを記述します。

# OS関連ファイル
.DS_Store
Thumbs.db

# エディタ/IDE設定ファイル
.vscode/
.idea/
*.swp

# 依存関係フォルダ
node_modules/
vendor/

# ビルド成果物
dist/
build/
*.min.js
*.min.css

# ログファイル
*.log
logs/

# 環境設定ファイル(機密情報)
.env
.env.local
config/secrets.yml

# キャッシュ
.cache/
__pycache__/
*.pyc

5.2 .gitignoreパターン構文

  • #で始まる行はコメント
  • *は0個以上の文字とマッチ
  • ?は正確に1個の文字とマッチ
  • /で始まると現在のフォルダのみ対象
  • /で終わるとフォルダを意味
  • !で始まると例外処理(無視しない)
# すべての.txtファイルを無視
*.txt

# ただしimportant.txtは追跡
!important.txt

# ルートのTODOファイルのみ無視(サブフォルダのTODOは追跡)
/TODO

# buildフォルダ全体を無視
build/

# docフォルダ内の.txtファイルのみ無視
doc/**/*.txt

5.3 すでに追跡中のファイルを無視する

.gitignoreに追加してもファイルが追跡され続ける場合、すでにGitが追跡を開始したファイルだからです。この場合、キャッシュを削除する必要があります。

# 特定のファイルの追跡を停止(ファイルは削除しない)
git rm --cached config.json

# フォルダの追跡を停止
git rm -r --cached node_modules/

# 変更をコミット
git commit -m "gitignoreを追加し、追跡ファイルを削除"

6. ミスを取り消す

Gitの最も強力な機能の一つは、ミスを取り消せることです。状況によって異なるコマンドを使用します。

6.1 ステージングの取り消し

誤ってファイルをステージングした場合、次のコマンドで取り消せます。

# 特定のファイルのステージングを取り消し
git restore --staged index.html

# すべてのファイルのステージングを取り消し
git restore --staged .

6.2 ファイル変更の取り消し

作業ディレクトリの変更を破棄して、最後のコミット状態に戻すには:

# 特定のファイルを最後のコミット状態に復元
git restore index.html

# 注意:このコマンドは変更を完全に削除します!
# 保存していない作業は復旧できません。

6.3 git reset - コミットの取り消し

git resetはコミットを取り消すコマンドです。3つのモードがあります。

# --soft:コミットのみ取り消し、変更はステージング状態を維持
git reset --soft HEAD~1

# --mixed(デフォルト):コミット取り消し、変更は作業ディレクトリに維持
git reset HEAD~1

# --hard:コミット取り消し、変更も完全に削除(注意!)
git reset --hard HEAD~1

HEAD~1は「現在のコミットの1つ前」を意味します。HEAD~3は3つ前のコミットを意味します。

注意:git reset --hardは変更を完全に削除します。他の人と共有したコミットをresetすると大きな問題が発生する可能性があるので、ローカルでのみ使用してください。

6.4 git revert - 安全に取り消す

git revertは特定のコミットの変更を取り消す新しいコミットを作成します。すでに共有されたコミットを取り消す際に安全に使用できます。

# 特定のコミットを取り消し
git revert abc123

# 最近のコミットを取り消し
git revert HEAD

resetと異なり、revertは履歴を削除せず新しいコミットを追加するため、協業環境でより安全です。

7. 実践例とヒント

7.1 典型的なGitワークフロー

実際の開発でGitをどのように使うか、例で見てみましょう。

# 1. 新しいプロジェクトを開始
mkdir my-website
cd my-website
git init

# 2. ファイル作成と最初のコミット
echo "<h1>Hello World</h1>" > index.html
git add index.html
git commit -m "プロジェクト初期化:index.htmlを作成"

# 3. 機能開発
# (ファイルを修正...)
git status  # 変更を確認
git diff    # 具体的な変更内容を確認
git add .
git commit -m "ヘッダーナビゲーションを追加"

# 4. ミスした場合
git log --oneline  # 履歴を確認
git reset --soft HEAD~1  # コミットを取り消して再作業
# (修正後)
git add .
git commit -m "ヘッダーナビゲーションを追加(バグ修正)"

7.2 便利なGitエイリアス設定

よく使う長いコマンドを短くして使用できます。

# エイリアスの設定
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --oneline --graph --all"

# 使用例
git st      # git statusと同じ
git lg      # きれいなロググラフ

7.3 よくあるミスと解決法

コミットメッセージを間違えた場合:

git commit --amend -m "修正されたコミットメッセージ"

ファイルを追加し忘れてコミットした場合:

git add forgotten-file.txt
git commit --amend --no-edit

間違ったブランチで作業した場合:

# 現在の変更を一時保存
git stash
# 正しいブランチに移動
git checkout correct-branch
# 変更を復元
git stash pop

おわりに

この記事では、Gitの基礎を見てきました。Gitのインストールから基本コマンド、.gitignore設定、そしてミスを取り消す方法まで扱いました。最初はコマンドが多くて混乱するかもしれませんが、実際に使っているうちにすぐ慣れます。

今日学んだ内容だけでも、一人でプロジェクトのバージョン管理ができます。しかし、Gitの真の力は協業で発揮されます。次の記事では、GitHubを活用したリモートリポジトリ管理と協業方法について見ていきます。

Gitは最初は難しく感じるかもしれませんが、一度慣れれば開発生産性を大きく向上させる必須ツールです。今日学んだコマンドを実際のプロジェクトに適用してみて、わからない部分があればgit help [コマンド]を活用してみてください。Gitと一緒に楽しい開発の旅になりますように!