はじめに

この章では、Gitの基本的な操作を実際に手を動かしながら学習します。 リポジトリの作成から始まり、日常的な開発で必要となるコミット、ブランチ、プッシュなどの操作を 段階的にマスターしていきます。

学習のポイント

各セクションには実践演習が含まれています。必ず手を動かして確認しながら進めてください。エラーが発生しても慌てずに、エラーメッセージを読んで対処法を学びましょう。

2.1 リポジトリの作成と管理

ローカルリポジトリの作成

まず、新しいプロジェクトのためのローカルリポジトリを作成します:

Bash
# 新しいディレクトリを作成
mkdir my-first-project
cd my-first-project

# Gitリポジトリとして初期化
git init

# 初期化の確認
ls -la
# .gitディレクトリが作成されていることを確認
重要

git initを実行すると、そのディレクトリがGitリポジトリになります。既存のプロジェクトをGit管理下に置く場合も、同じコマンドを使用します。

既存のリポジトリをクローン

GitHubから既存のリポジトリをクローンする方法:

Bash
# HTTPSでクローン
git clone https://github.com/username/repository-name.git

# SSHでクローン(推奨)
git clone git@github.com:username/repository-name.git

# 特定のディレクトリ名でクローン
git clone git@github.com:username/repository-name.git my-custom-name

# 特定のブランチをクローン
git clone -b branch-name git@github.com:username/repository-name.git

リポジトリの状態確認

リポジトリの現在の状態を確認する最も重要なコマンド:

Bash
# 現在の状態を確認
git status

# 短縮形式で表示
git status -s

# ブランチ情報も含めて表示
git status -sb

実践演習 2.1

以下の手順を実行してください:

  1. 新しいディレクトリ「practice-git」を作成
  2. そのディレクトリでGitリポジトリを初期化
  3. README.mdファイルを作成(内容は「# My Practice Repository」)
  4. git statusで状態を確認

2.2 コミットの作成と管理

ステージングとコミットの基本

Gitでは変更を記録する前に、まずステージングエリアに追加する必要があります:

Bash
# ファイルをステージングエリアに追加
git add filename.txt

# 複数ファイルを追加
git add file1.txt file2.txt

# 全ての変更をステージング
git add .

# 特定の拡張子のファイルのみ追加
git add *.js

# インタラクティブモードで追加
git add -i

コミットの作成

ステージングエリアの変更をコミットとして記録:

Bash
# コミットメッセージを指定してコミット
git commit -m "Add initial README file"

# エディタを開いて詳細なメッセージを記述
git commit

# ステージングとコミットを同時に実行(追跡済みファイルのみ)
git commit -am "Update README with project description"

# 空のコミットを作成(CI/CDのトリガーなどに使用)
git commit --allow-empty -m "Trigger CI build"

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

コミットメッセージのベストプラクティス
  • 1行目: 50文字以内で変更の要約
  • 2行目: 空行
  • 3行目以降: 必要に応じて詳細な説明(72文字で折り返し)
Example
# 良い例
feat: ユーザー認証機能を追加

JWTトークンを使用した認証システムを実装。
- ログイン/ログアウト機能
- トークンの自動更新
- セッション管理

Closes #123

# 悪い例
修正
更新しました
いろいろ変更

コミットの修正

直前のコミットを修正する方法:

Bash
# 直前のコミットメッセージを修正
git commit --amend -m "新しいコミットメッセージ"

# ファイルを追加して直前のコミットに含める
git add forgotten-file.txt
git commit --amend --no-edit

# コミットの作者情報を修正
git commit --amend --author="Name "
注意

--amendは履歴を書き換えるため、既にプッシュしたコミットには使用しないでください。チーム開発では混乱の原因となります。

コミット履歴の確認

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

# 1行形式で表示
git log --oneline

# グラフ形式で表示
git log --graph --oneline --all

# 特定の期間のコミットを表示
git log --since="2024-01-01" --until="2024-01-31"

# 特定の作者のコミットを表示
git log --author="John Doe"

# ファイルの変更履歴を表示
git log -p filename.txt

# 統計情報付きで表示
git log --stat

実践演習 2.2

前の演習で作成したリポジトリで以下を実行:

  1. index.htmlファイルを作成(簡単なHTMLテンプレート)
  2. README.mdに説明を追加
  3. それぞれを別々のコミットとして記録
  4. コミット履歴を確認し、適切なメッセージが付いているか確認
  5. 最後のコミットメッセージを修正

2.3 ブランチの概念と操作

ブランチとは

ブランチは開発の流れを分岐させる仕組みです。 メインの開発ラインに影響を与えずに、新機能の開発や実験的な変更を行うことができます。

main     ●───●───●───●───●
              ╲         ╱
feature        ●───●───●
                        
● = コミット
─ = 履歴の流れ
╲╱ = ブランチの分岐/マージ

ブランチの作成と切り替え

Bash
# 現在のブランチを確認
git branch

# 新しいブランチを作成
git branch feature-login

# ブランチを切り替え
git checkout feature-login

# ブランチの作成と切り替えを同時に実行
git checkout -b feature-user-profile

# 新しい方法(Git 2.23以降)
git switch feature-login
git switch -c feature-new-feature  # 作成と切り替え

# リモートブランチを元に新しいブランチを作成
git checkout -b feature-x origin/feature-x

ブランチの管理

Bash
# 全てのブランチを表示(リモート含む)
git branch -a

# リモートブランチのみ表示
git branch -r

# ブランチを削除
git branch -d feature-completed

# マージされていないブランチを強制削除
git branch -D feature-abandoned

# ブランチ名を変更
git branch -m old-name new-name

# 現在のブランチ名を変更
git branch -m new-name

ブランチ戦略の基礎

効果的なブランチ運用のための基本的な戦略:

Feature Branch(フィーチャーブランチ)

各機能ごとにブランチを作成し、完成後にメインブランチにマージ

feature/user-authentication

Bugfix Branch(バグ修正ブランチ)

バグ修正専用のブランチ

bugfix/login-error

Hotfix Branch(緊急修正ブランチ)

本番環境の緊急修正用

hotfix/security-patch

ブランチ間の差分確認

Bash
# 2つのブランチ間の差分を表示
git diff main..feature-branch

# 特定のファイルの差分のみ表示
git diff main..feature-branch -- path/to/file.js

# コミットの差分を表示
git log main..feature-branch

# 視覚的に差分を確認
git log --graph --oneline main feature-branch

実践演習 2.3

ブランチ操作の練習:

  1. feature/navbarブランチを作成
  2. そのブランチでnavbar.htmlを作成してコミット
  3. feature/footerブランチを作成(mainから)
  4. そのブランチでfooter.htmlを作成してコミット
  5. 各ブランチの内容を確認し、独立していることを確認

2.4 リモートリポジトリとの連携

リモートリポジトリの設定

ローカルリポジトリをGitHubなどのリモートリポジトリと連携させます:

Bash
# リモートリポジトリを追加
git remote add origin git@github.com:username/repository.git

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

# リモートリポジトリの詳細情報を表示
git remote show origin

# リモートリポジトリのURLを変更
git remote set-url origin git@github.com:username/new-repository.git

# リモートリポジトリを削除
git remote remove origin

# 複数のリモートリポジトリを管理
git remote add upstream git@github.com:original/repository.git

プッシュ操作

ローカルの変更をリモートリポジトリに送信:

Bash
# 現在のブランチをプッシュ
git push

# 初回プッシュ時(上流ブランチの設定)
git push -u origin main

# 特定のブランチをプッシュ
git push origin feature-branch

# 全てのブランチをプッシュ
git push --all

# タグをプッシュ
git push --tags

# 強制プッシュ(危険!)
git push --force
# より安全な強制プッシュ
git push --force-with-lease
強制プッシュについて

--forceは履歴を上書きするため、他の開発者の作業を失う可能性があります。--force-with-leaseは他者の変更がある場合は失敗するため、より安全です。

プル操作

リモートリポジトリから変更を取得:

Bash
# リモートの変更を取得してマージ
git pull

# 特定のリモート・ブランチから取得
git pull origin main

# リベースモードでプル
git pull --rebase

# フェッチのみ実行(マージしない)
git fetch

# 全てのリモートから取得
git fetch --all

# 削除されたリモートブランチの参照を削除
git fetch --prune

プルとフェッチの違い

git fetch

  • リモートの変更を取得のみ
  • ローカルブランチは変更されない
  • 安全に最新情報を確認できる
  • マージのタイミングを制御可能

git pull

  • fetch + mergeを実行
  • ローカルブランチが更新される
  • コンフリクトが発生する可能性
  • 即座に最新状態になる

リモートブランチの追跡

Bash
# ローカルブランチにリモートブランチを設定
git branch --set-upstream-to=origin/main main

# 短縮形
git branch -u origin/main

# 追跡情報を確認
git branch -vv

# リモートブランチを元に新しいブランチを作成(自動追跡)
git checkout --track origin/feature-x

実践演習 2.4

GitHubでリポジトリを作成し、ローカルと連携:

  1. GitHubで新しいリポジトリを作成(READMEなし)
  2. ローカルリポジトリにリモートとして追加
  3. これまでの作業をプッシュ
  4. GitHub上で確認
  5. READMEをGitHub上で編集し、ローカルにプル

2.5 基本的なトラブルシューティング

よくあるエラーと対処法

コンフリクトが発生した場合

Bash
# コンフリクトの確認
git status

# コンフリクトしているファイルを編集
# <<<<<<< HEAD
# 自分の変更
# =======
# 他者の変更
# >>>>>>> branch-name

# 解決後、ファイルをステージング
git add resolved-file.txt

# コミットして完了
git commit -m "Resolve merge conflict"

間違ってコミットした場合

Bash
# 直前のコミットを取り消し(変更は残る)
git reset --soft HEAD~1

# 直前のコミットを完全に取り消し(変更も削除)
git reset --hard HEAD~1

# 特定のファイルのみステージングから除外
git reset HEAD file.txt

# 特定のコミットまで戻る
git reset --hard abc1234

変更を一時的に退避させたい場合

Bash
# 現在の変更を一時退避
git stash

# メッセージ付きで退避
git stash save "作業中のログイン機能"

# 退避リストを表示
git stash list

# 最新の退避を適用
git stash pop

# 特定の退避を適用(削除しない)
git stash apply stash@{1}

# 退避を削除
git stash drop stash@{0}

作業の取り消し

Bash
# 特定のファイルの変更を取り消し
git checkout -- file.txt

# 全ての変更を取り消し(危険!)
git checkout -- .

# 新しい方法(Git 2.23以降)
git restore file.txt

# ステージングから除外
git restore --staged file.txt

# 追跡されていないファイルを削除
git clean -n  # ドライラン
git clean -f  # 実行
git clean -fd # ディレクトリも含めて削除

便利な設定とエイリアス

Bash
# よく使うコマンドのエイリアスを設定
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.unstage 'reset HEAD --'

# ログ表示のエイリアス
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# 設定の確認
git config --global --list

実践演習 2.5

トラブルシューティングの練習:

  1. 意図的にコンフリクトを発生させて解決
  2. コミットを取り消して再度コミット
  3. stashを使って作業を一時退避・復元
  4. 便利なエイリアスを3つ以上設定

2.6 まとめと次のステップ

この章で学んだこと

  • リポジトリの作成とクローン
  • ステージング、コミット、履歴の確認
  • ブランチの作成と管理
  • リモートリポジトリとの連携(プッシュ/プル)
  • 基本的なトラブルシューティング

コマンドクイックリファレンス

基本操作

git init git status git add . git commit -m "message"

ブランチ操作

git branch git checkout -b branch-name git merge branch-name git branch -d branch-name

リモート操作

git remote add origin URL git push -u origin main git pull git fetch

理解度チェック

確認問題

  1. git addgit commitの役割の違いを説明してください
  2. ブランチを使う利点を3つ挙げてください
  3. git pullgit fetchの違いは何ですか?
  4. コンフリクトはなぜ発生し、どのように解決しますか?
  5. git stashはどのような場面で使用しますか?

次章への準備

第3章では、GitHubの核心的な機能であるプルリクエストとマージ戦略について学びます。 チーム開発において最も重要な概念の一つですので、以下の準備をしておきましょう:

  • GitHubアカウントが有効であることを確認
  • 練習用のリポジトリがGitHubにプッシュされていること
  • 基本的なブランチ操作に慣れていること