2026年1月12日月曜日

Linux とネットワークの基礎から学ぶ Docker 入門 - - についての解説

Linux とネットワークの基礎から学ぶ Docker 入門

学習内容

  • Linux での Web アプリケーションの環境構築の基礎
  • Docker での環境構築で前提となるネットワークの基礎知識
  • API を使った Web アプリケーションの仕組み
  • Docker の仕組みの基礎知識
  • Docker で開発環境を作るための基礎知識

このコースの内容:

  • 5時間のオンデマンドビデオ
  • 3個の記事
  • 28個のダウンロード可能なリソース
  • モバイルとPCからアクセス
  • 字幕
  • 修了証明書
 

コースの内容

セクションの数: 8 • レクチャーの数: 55 • 総時間: 5時間6分
  • このコースについて5:05
  • 受講ガイド1:30
  • このコースで使用する環境について1:30
  • GCP の登録と、料金について2:15
  • Linux とは1:51
  • (追記)GCP で使用する OS について0:41
  • GCP で Linux の仮想マシン (GCE) を起動する4:26
  • SSH 接続してHello World2:24
  • ファイル操作の基本的なコマンドの練習3:06
  • コマンドの実行と PATH の基本6:39
  • Web サーバを構築してみる6:24
  • 自作の HTML をブラウザで表示7:06
  • プロセスの基本4:16
  • Linux の起動の流れと init プロセス4:20
  • nginx を手動で実行してみる6:03
  • ネットワークの仕組みの概要2:54
  • Echo プログラムを実装して通信してみる11:36
  • 通信で登場する IP アドレス・ポート番号・メッセージとは10:32
  • curl と telnet で Web サーバと通信してみる5:21
  • TCP/IP モデルとは2:37
  • このセクションで作るアプリケーションの説明5:11
  • (追記)GCP で使用する OS について0:40
  • サーバの準備と HTML の実装9:31
  • Ruby (Sinatra) の Hello World5:37
  • nginx のリバースプロキシ設定4:42
  • フロントエンド (JavaScript) とバックエンド (Sinatra) の疎通7:57
  • タスク一覧の取得処理を実装8:12
  • タスクの登録処理を実装9:21
  • JavaScript の改善2:32
  • MySQL のインストールとテーブルの作成8:28
  • Sinatra で MySQL とやりとり14:08
  • このセクションのまとめ5:10
  • Docker の概要とメリット6:53
  • Docker の仕組みと構成要素4:55
  • 構築する環境の説明2:21
  • Docker のインストール4:09
  • Hello World5:27
  • docker commit によるイメージの作成5:05
  • Dockerfile によるイメージの作成3:24
  • コンテナのライフサイクルの整理1:39
  • ボリュームによるファイルの共有4:54
  • Sinatra の開発環境の作成11:42
  • Sinatra にアクセスするためのポートの設定10:21
  • Sinatra のホットリロードの設定4:49
  • MySQL のコンテナの構築6:19
  • MySQL のコンテナ起動時に SQL を実行6:57
  • Sinatra のコンテナと MySQL のコンテナの疎通8:32
  • MySQL の文字コードの設定8:59
  • Docker Compose の導入12:37
  • Docker Compose でイメージのビルドも行う9:28
  • nginx のコンテナの構築4:40
  • nginx のコンテナのリバースプロキシ設定6:34
  • このセクションのまとめ2:20
  • さらにステップアップするには1:29
  • ボーナスレクチャー0:54

要件

  • 何らかのプログラミング言語で Web アプリケーションを作ったことがある
  • 絶対パス・相対パス程度のコンピュータの基礎知識がある
  • ターミナルで ls、cd などの基本的なコマンドを実行したことがある
  • Vim や nano など、ターミナルで使用可能なエディタを使うことができる
  • Google Cloud (GCP) に登録して使用することができる (他の手段で同様の Linux 環境をご用意いただいても構いません)
  • Docker をインストール可能な PC を所有している

解説

Docker は軽量かつ再現性の高い環境構築の手段として優れており、開発環境・本番環境ともに Docker を使う機会が多くなっています。 プログラミングを学んだ方がステップアップとして Docker を学びたいというケースも非常に多いです。 しかし、Docker を勉強しようとして突き当たる大きな壁が、Linux とネットワークの知識不足です。   ーーーーー     この内容のそれぞれについて、実行コマンドの具体例や業界話を交えながら解説してください。
 

このコース内容について、実際の現場で使われるコマンドや業界の実情を交えながら解説します。

📚 Linux環境構築の基礎(実践コマンド例)

GCPインスタンス起動後によく使うコマンド:

bash
# SSH接続(業界では鍵認証が標準)
ssh -i ~/.ssh/your_key.pem user@xxx.xxx.xxx.xxx

# サーバの状態確認(現場で頻繁に使用)
top
htop  # より視覚的に確認(インストールが必要)
free -h  # メモリ使用量
df -h    # ディスク使用量

# ファイル操作(実務での使い方)
find /var/log -name "*.log" -mtime -7  # 1週間以内のログファイルを探す
grep -r "ERROR" /var/log/  # エラーログを検索
tail -f /var/log/nginx/access.log  # リアルタイムでログ監視

業界話: 実際の現場では、tmuxscreenを使ってSSHセッションを維持することが多いです。ネットワークが切れても作業を継続できます。

🌐 ネットワーク基礎(具体例)

ネットワーク診断でよく使うコマンド:

bash
# ポート開放確認(セキュリティチェックで必須)
sudo netstat -tulpn | grep :80
# または(最近はssコマンドが推奨)
ss -tulpn

# 通信経路の確認
traceroute google.com
# Linuxでは(macOSと異なる)
tracepath google.com

# DNS解決の確認
dig google.com
nslookup google.com

# ファイアウォール設定(Ubuntu/Debian)
sudo ufw status
sudo ufw allow 22/tcp  # SSH開放

現場での実例: クラウド環境ではセキュリティグループやファイアウォールルールの設定忘れがよくあるトラブル原因です。「アプリケーションは動いているのに外部からアクセスできない」→ まずポート開放を確認します。

🐳 Docker実践コマンド集

開発者必須のDockerコマンド:

bash
# 開発中によく使うコマンド
docker ps -a  # 全コンテナ表示(-aで停止中も)
docker logs -f container_name  # ログを追尾
docker exec -it container_name bash  # 実行中のコンテナに入る

# イメージ管理
docker images
docker system df  # Dockerのディスク使用量
docker system prune -a  # 未使用リソース一括削除(注意!)

# デバッグ用
docker inspect container_name  # コンテナの詳細情報
docker stats  # リソース使用状況をリアルタイム表示

Dockerfileのベストプラクティス:

dockerfile
# マルチステージビルド(業界標準)
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node  # root以外で実行(セキュリティ向上)
EXPOSE 3000
CMD ["node", "server.js"]

業界の常識:

  • イメージサイズを小さくするためにalpineベースが好まれる

  • .dockerignoreファイルは必須(node_modulesなど除外)

  • 開発環境と本番環境で異なるDockerfileを使うことが多い

🔄 API連携の実際

curlコマンドでAPIテスト:

bash
# REST APIテストの基本
curl -X GET https://api.example.com/users \
  -H "Authorization: Bearer $TOKEN"

# JSONをPOST
curl -X POST https://api.example.com/tasks \
  -H "Content-Type: application/json" \
  -d '{"title": "新規タスク", "completed": false}'

# レスポンスの整形(jqがあれば)
curl -s https://api.example.com/users | jq '.[] | select(.active == true)'

現場での工夫: チームではPostmanInsomniaなどのGUIツールか、httpieコマンドを使うことも多いです。httpieはcurlより直感的です:

bash
http POST api.example.com/tasks title="タスク" completed:=false

🛠️ 開発環境構築の実例

Docker Composeで複数サービス:

yaml
# docker-compose.yml(実際のプロジェクト例)
version: '3.8'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: userpass
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"
    
  backend:
    build: ./backend
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_PORT: 3306
    volumes:
      - ./backend:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    
  frontend:
    build: ./frontend
    volumes:
      - ./frontend:/app
      - /app/node_modules
    ports:
      - "8080:3000"
    
  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - backend
      - frontend

volumes:
  mysql_data:

💡 現場でよくあるトラブルと解決策

  1. 「Dockerでディスク容量不足」

bash
# 対処法
docker system prune -a --volumes
docker builder prune -a
  1. 「コンテナ間で通信できない」

bash
# ネットワーク確認
docker network ls
docker network inspect bridge
# 同じネットワークにいるか確認
  1. 「開発環境と本番環境で挙動が違う」 → Docker Composeのoverride機能を活用:

yaml
# docker-compose.override.yml(開発用)
services:
  backend:
    volumes:
      - ./backend:/app  # ホットリロード用
    environment:
      NODE_ENV: development

🚀 次のステップとして学ぶべきこと

  1. Kubernetes基礎

bash
# Minikubeでローカル環境構築
minikube start
kubectl get pods
  1. CI/CDパイプライン

    • GitHub Actions

    • GitLab CI

    • CircleCI

  2. インフラストラクチャ・アズ・コード

    • Terraform(GCP/AWS構築自動化)

    • Ansible(構成管理)

業界のトレンド: 現在は「GitOps」が主流。インフラ設定もGitで管理し、プルリクエストベースで変更します。ArgoCDやFluxなどのツールが使われています。

このコースはまさに現場で必要なスキルを網羅しています。特に「Linux + ネットワーク + Docker」の組み合わせは、クラウド時代の開発者には必須の知識です。実際のプロジェクトでは、これらの知識を組み合わせて、再現性の高い開発環境を構築することが求められます。

このDockerとLinuxの学習コースについて、実務的な視点で詳しく解説していきますね。

Linuxの基礎とWebアプリケーション環境構築

Linux環境の準備 実務では、GCPだけでなくAWS EC2やさくらのVPSなども使われます。SSH接続は基本中の基本で、実際のコマンドはこんな感じです:

bash
# SSH接続
ssh user@192.168.1.100

# よく使うファイル操作
ls -la  # 隠しファイルも含めて詳細表示
cd /var/www/html  # Webサーバのドキュメントルートへ移動
pwd  # 現在のディレクトリを確認
mkdir -p project/src  # 親ディレクトリも含めて作成

Webサーバの構築 nginxは現代のWeb開発で最も使われるWebサーバの一つです。Apacheから移行する企業も多いですね。

bash
# nginxのインストール(Ubuntu/Debian)
sudo apt update
sudo apt install nginx

# nginxの起動・停止・再起動
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

# 設定ファイルの確認
sudo nginx -t  # 文法チェック

プロセス管理の実務 システム管理者なら必須のスキルです:

bash
# プロセスの確認
ps aux | grep nginx  # nginxのプロセスを検索
top  # リアルタイムでプロセス監視
htop  # topの改良版(インストール必要)

# プロセスの終了
kill -9 12345  # PID 12345を強制終了
pkill nginx  # nginxプロセスを全て終了

ネットワークの基礎知識

IPアドレスとポート番号 実務では、開発環境はlocalhost:3000、本番はexample.com:443(HTTPS)のような構成が一般的です。

bash
# ネットワーク状態の確認
netstat -tuln  # 待ち受けているポートを表示
ss -tuln  # netstatの新しい版
lsof -i :3000  # ポート3000を使用しているプロセス確認

# 通信テスト
curl http://localhost:8080  # HTTPリクエスト送信
telnet localhost 80  # 低レベルな通信テスト
ping google.com  # 疎通確認

実際のEchoサーバー例(Python)

python
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8888))
s.listen(1)
while True:
    conn, addr = s.accept()
    data = conn.recv(1024)
    conn.send(data)  # 受信したデータをそのまま返す
    conn.close()

API開発の実践(Ruby Sinatra)

実際の開発現場では SinatraはRuby on Railsより軽量で、小規模APIやマイクロサービスに最適です。

ruby
# app.rb
require 'sinatra'
require 'json'
require 'mysql2'

# CORS設定(フロントエンドとの疎通に必須)
before do
  headers 'Access-Control-Allow-Origin' => '*'
end

# タスク一覧取得
get '/api/tasks' do
  client = Mysql2::Client.new(
    host: ENV['DB_HOST'] || 'localhost',
    username: 'root',
    database: 'taskapp'
  )
  tasks = client.query('SELECT * FROM tasks')
  content_type :json
  tasks.to_a.to_json
end

# タスク登録
post '/api/tasks' do
  data = JSON.parse(request.body.read)
  client = Mysql2::Client.new(...)
  client.query("INSERT INTO tasks (title) VALUES ('#{data['title']}')")
  status 201
end

nginxのリバースプロキシ設定 実務では、nginxがフロントエンド(ポート80/443)を受け付け、バックエンド(ポート3000など)に転送する構成が標準です。

nginx
# /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name example.com;

    # 静的ファイル
    location / {
        root /var/www/html;
        try_files $uri $uri/ =404;
    }

    # APIへのプロキシ
    location /api/ {
        proxy_pass http://localhost:4567;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

MySQLとの連携

データベース環境構築

bash
# MySQLのインストール
sudo apt install mysql-server

# セキュアインストール(本番環境では必須)
sudo mysql_secure_installation

# MySQLへのログイン
mysql -u root -p

# データベースとテーブル作成
CREATE DATABASE taskapp CHARACTER SET utf8mb4;
USE taskapp;
CREATE TABLE tasks (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    completed BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

業界でのベストプラクティス

  • 本番環境では、アプリケーションユーザーとrootを分ける
  • パスワードは環境変数で管理(.envファイル)
  • マイグレーションツールを使う(RailsならActiveRecord、PythonならAlembic)

Dockerによる環境構築

Dockerの基本コマンド

bash
# イメージ操作
docker images  # イメージ一覧
docker pull nginx:latest  # イメージのダウンロード
docker build -t myapp:1.0 .  # Dockerfileからビルド
docker rmi image_id  # イメージ削除

# コンテナ操作
docker ps  # 実行中のコンテナ一覧
docker ps -a  # 全てのコンテナ一覧
docker run -d -p 80:80 nginx  # デタッチモードで起動
docker exec -it container_name bash  # コンテナ内でコマンド実行
docker logs -f container_name  # ログをリアルタイム表示
docker stop container_name  # 停止
docker rm container_name  # 削除

実践的なDockerfile例(Sinatra)

dockerfile
FROM ruby:3.2

WORKDIR /app

# 依存関係のインストール
COPY Gemfile Gemfile.lock ./
RUN bundle install

# アプリケーションコードのコピー
COPY . .

# ホットリロード用の設定
ENV RACK_ENV=development

# ポート公開
EXPOSE 4567

# 起動コマンド
CMD ["ruby", "app.rb", "-o", "0.0.0.0"]

ボリュームマウントの実務的な使い方

bash
# 開発時はソースコードをマウント(ホットリロード可能)
docker run -v $(pwd):/app -p 4567:4567 myapp

# データベースのデータ永続化
docker run -v mysql_data:/var/lib/mysql mysql:8.0

Docker Composeの実践

実務で使われる構成

yaml
# docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    depends_on:
      - app

  app:
    build: .
    volumes:
      - .:/app  # ホットリロード用
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASS=password
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=taskapp
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

volumes:
  mysql_data:

Docker Composeコマンド

bash
# 全サービス起動
docker-compose up -d

# ログ確認
docker-compose logs -f app

# 特定サービスの再起動
docker-compose restart app

# 全て停止・削除
docker-compose down

# ボリュームも含めて削除
docker-compose down -v

# イメージの再ビルド
docker-compose build --no-cache

業界での実践的なTips

開発環境と本番環境の違い

  • 開発: docker-compose.ymlでホットリロード有効
  • 本番: Kubernetes、ECS、Cloud Runなどのオーケストレーションツール使用
  • CI/CD: GitHub ActionsやCircleCIで自動ビルド・デプロイ

よくあるトラブルと解決法

bash
# ポートが既に使われている
sudo lsof -i :80
sudo kill -9 <PID>

# Dockerのディスク容量圧迫
docker system prune -a  # 未使用リソース削除

# コンテナが起動しない
docker logs container_name  # ログ確認
docker inspect container_name  # 詳細情報確認

この学習コースは、実務で必要なスキルがバランスよく含まれています。特にDocker Composeでのマルチコンテナ構成は、現代のマイクロサービス開発の基礎となる重要なスキルです。

GitとGitHub完全マスタリング講座 - 実行コマンドと業界話で解説

Udemy - git 入門編

学習内容

  • Gitの根幹をなしている概念の理解 (Gitのデータ構造から仕組みを理解する)
  • Gitでのチーム開発の方法と一通りのコマンドの修得
  • 誤った変更を元に戻せる
  • GitHubを用いたプルリクエスト・レビュー・マージの開発フロー
  • ブランチの作成とコンフリクトの解消がスムーズにできる

このコースの内容:

  • 5.5時間のオンデマンドビデオ
  • 5個の記事
  • 9個のダウンロード可能なリソース
  • モバイルとPCからアクセス
  • 字幕
  • 修了証明書
 

コースの内容

セクションの数: 11 • レクチャーの数: 68 • 総時間: 5時間54分
  • はじめに、コースについて2:46
  • Gitってなんのために使う?3:10
  • Gitの歴史2:14
  • GitHubってなに?3:28
  • コースを受講するにあたって1:16
  • Gitのインストール (Mac OS X)2:26
  • Gitのインストール (Windows)1:34
  • Atomのインストール (Mac OS X)1:50
  • Atomのインストール (Windows)2:30
  • GitHubの登録1:41
  • Gitの初期設定3:36
  • ターミナルの頻出コマンド0:29
  • Gitの基本的な仕組みを知ろう5:25
  • Gitの操作の流れを掴もう6:10
  • Gitってどのようにデータを管理しているの?16:34
  • Gitってどのようにデータを管理しているの?26:17
  • Gitのデータ管理の補足9:56
  • Gitを始めよう4:56
  • GitHub上にあるプロジェクトから始めよう3:25
  • 変更をステージに追加しよう3:38
  • 変更を記録しよう5:32
  • 現在の変更状況を確認しよう5:13
  • 何を変更したのかを確認しよう5:21
  • 変更履歴を確認しよう3:57
  • ファイルの削除を記録しよう6:21
  • ファイルの移動を記録しよう4:09
  • GitHubにプッシュしよう10:59
  • GitHubの画面を確認しよう4:23
  • コマンドにエイリアスを付けよう4:26
  • バージョン管理しないファイルは無視しよう5:34
  • 本章の復習
  • ファイルへの変更を取り消そう3:54
  • ステージした変更を取り消そう7:08
  • 直前のコミットをやり直そう6:56
  • 本章の復習
  • リモートの情報を確認しよう2:59
  • リモートリポジトリを追加しよう4:26
  • リモートから取得しよう (フェッチ編)6:34
  • リモートから取得しよう (プル編)3:49
  • フェッチとプルを使い分けよう3:22
  • リモートの情報を詳しく知ろう1:40
  • リモートを変更・削除しよう2:21
  • 本章の復習
  • ブランチって何?3:10
  • ブランチの仕組みを知ろう13:27
  • 新しいブランチを作成しよう4:41
  • ブランチを切り替えよう9:18
  • 変更をマージしよう13:14
  • コンフリクトを解決しよう8:55
  • コンフリクトが起きないようにするには?3:30
  • ブランチを変更・削除しよう4:16
  • ブランチを利用した開発の流れ3:46
  • リモートブランチって何?4:23
  • 本章の復習
  • プルリクエストの流れ16:13
  • GitHub Flowの流れ5:28
  • GitHub Flowを実践しよう5:45
  • リベースする15:07
  • リベースでしてはいけないこと3:56
  • リベースとマージのどちらを使う?6:48
  • プルの設定をリベースに変更する5:44
  • リベースで履歴を書き換える①13:11
  • リベースで履歴を書き換える②14:58
  • タグの一覧を表示する2:32
  • タグを作成する6:28
  • タグをリモートリポジトリに送信する3:30
  • 作業を一時避難しよう3:34
  • 避難した作業を確認しよう1:18
  • 避難した作業を復元しよう3:33
  • 避難した作業を削除しよう2:46

要件

  • インターネットに接続できるコンピュータ (Windows/Mac/Linux)
  • 基本的なパソコンの操作

解説

★ゼロからプロのチーム開発の現場でGitを使いこなせるよう完全マスターします
こちらのコースは未経験の方でも、プロのチーム開発の現場で必要とされるGitの全てを習得することを目的としたコースです。

★次のようことを感じたことはないですか?
「Gitって聞いたことあるけどよく分からない」
「マージするとコンフリクトが起きそうで怖い」
「エラーが出た時にどうしたらいいか分からない」
「コマンドが色々あって分かりにくい」
「リベースって使っちゃダメって言われたけどなんで?」
「データが壊れそう」

Gitが分かりづらく感じたり怖く感じたりするのは、そのコマンドの裏側で何が起こっているかがイメージできないからです。

こちらのコースでは、まずGitの仕組みを図解でしっかりと理解していきます。
Gitってそもそも何のためにあるのか、コミットした時にどういう風にデータを保存しているのか、マージやリベースした時に何が起こっているのか、ブランチってどういう風に実現しているのか。

そういうことを仕組みから理解することで、Gitの分かりづらいコマンドを自信を持って使えるようになります。なにより、Gitを使う上でのハードルであるステージやブランチ、HEADの概念を完全に理解することができます。
その上で、実際にプロジェクトを作成しGitHubを用いながら、コマンドを実行して学んでいきます。 スキルを身につける上で、実際に作りながら学んでいくことはとても大切です。理解したものを実践することで本当に使えるスキルを身に付けていきます。

★こちらのコースで学ぶこと
Gitにはたくさんのコマンドとオプションがあります。しかしこの中には、特に重要でないものもたくさんあります。

こちらのコースでは、チーム開発で必要とされる知識に重点を置いて、その部分を深く掘り下げて学んでいきます。そのことによって、非常に効率的に、そして応用の効く形で実践的スキルを身に付けます。

【GitとGitHubってなに?】では、GitとGitHubがそもそも何のためにあるのかということやバージョン管理の仕組みについて学んでいきます。

【インストールと初期設定をしよう】で次に、GitとGitHubのインストールと設定を行います。今回はGitの作業に、ターミナルとAtomエディタを使用します。ターミナルを使用することで、Gitの本来持っている力を100%引き出すことができます (エディタはAtomでなくても大丈夫です)。

【Gitの仕組みと基本的なコマンド】から、Gitのコマンドを具体的に学んでいきます。ここではステージやコミットの裏側で何が起きているのか、Gitはどのようにデータを記録しているのかということについて紹介します。その上でGitで作業する上で必須のコマンドを実践しながら身に付けます。

【変更を元に戻そう】では、間違って作業してしまったときに元に戻すやり方について紹介します。この内容を身に付けることで、何かあっても元に戻すことができるようになります。

【GitHubとやり取りしよう】でいよいよ、GitHubを利用した開発方法について学びます。フェッチとプルの使い分けなど、区別がつきにくいところもしっかり学んでいきます。

【ブランチとマージを使いこなそう】では、Gitの中でも分かりにくい、ブランチやマージの仕組みについて学びます。仕組みを図解した上で実践していきますので、今までよくわからなかった方でも、ブランチやマージを使いこなすことができるようになります。コンフリクトが起きてももう怖くありません。

【GitHubを利用した開発手順の流れ】では、GitHub Flowを利用した実践的チーム開発を行います。GitとGitHubを利用して、開発チームが最大限の力を発揮するための開発フローを紹介します。特にGitを利用することに慣れていないチームは、この内容を参考にして開発手順を構築することをおすすめします。

【リベースで変更履歴を修正しよう 】では、怖いと思われがちなリベースについて学びます。リベースを用いるとGitの変更履歴をきれいにすることができます。変更履歴をきれいにしつつ、リベースで事故らない方法を身に付けます。

【タグ付けしよう】では、タグの利用方法について学びます。タグをリリースポイントに利用することで、いつ何をリリースしたかが分かり、バグが起きた時の切り戻しも楽になります。

【スタッシュで作業を一次避難しよう】では、変更を一次避難させるスタッシュについて学びます。作業が途中でコミットしたくないけど別のブランチで作業しないといけない、そういう時に作業を一時避難できるようになります。

このコースの対象受講者:

  • Gitやバージョン管理に興味があるエンジニアやデザイナー
  • Gitをされたことがないけどこれから使おうとされている方(インターン生も!)
  • commitやpush、pullはできるけどもっとGitを使いこなしたい方
  • Gitを用いてのチーム開発に携わるマネージャーやディレクター

ーーーーー     この内容のそれぞれについて、実行コマンドの具体例や業界話を交えながら解説してください。

GitとGitHub完全マスタリング講座 - 実行コマンドと業界話で解説

1. Gitの根幹概念とデータ構造

実行コマンド例:

bash
# Gitリポジトリの内部構造を確認
ls -la .git/
find .git/objects -type f | head -10

# コミットオブジェクトの中身を見る
git cat-file -p [コミットハッシュ]

# ツリーオブジェクトの中身を見る
git ls-tree [ツリーハッシュ]

業界話:

「Gitのデータ構造は、キーバリューストアと似ています。各コミットは40文字のSHA-1ハッシュで管理され、これがGitの強力な履歴追跡機能の基盤です。業界では『コミットは消えない』と言われますが、実際には.git/objects内の圧縮ファイルとして永続化されています。LinkedInやGoogleなどの大規模プロジェクトでも、この構造がスケーラビリティを実現しています」


2. 基本的なGitワークフロー

実行コマンド例:

bash
# 典型的な1日の開発サイクル
git status                     # 現在の状態確認
git add -p                     # 変更を部分的にステージング
git commit -m "feat: ログイン機能実装"
git pull --rebase origin main  # リベースしながら最新化
git push origin feature/login

業界話:

「スタートアップでは、小さなコミットを頻繁に行う『小さなコミット主義』が主流です。これはコードレビューを容易にし、問題発生時の切り分けを簡単にします。GitHubが2022年に公開したデータでは、成功するプロジェクトほどコミットサイズが小さく、頻度が高い傾向があります」


3. 誤った変更の復元方法

実行コマンド例:

bash
# ケース別の復元方法
git checkout -- file.txt        # 変更を破棄
git reset HEAD file.txt         # ステージング解除
git commit --amend              # 直前コミット修正
git revert abc1234              # 過去のコミット取り消し
git reflog                      # 「全ての」操作履歴確認

業界話:

「Netflixの開発チームでは、『git revert』を推奨しています。なぜなら履歴を書き換えずに安全に変更を取り消せるからです。一方、『git reset』はローカルのみで使用し、既に共有した履歴は変更しないのが業界の暗黙ルールです」


4. GitHub開発フロー

実行コマンド例:

bash
# プルリクエストベースの開発
git checkout -b feature/new-api
# 開発作業...
git push -u origin feature/new-api
# GitHubでPR作成 -> レビュー -> 修正 -> マージ

# コードレビュー後の更新
git add .
git commit --amend --no-edit
git push -f origin feature/new-api

業界話:

「Microsoftの大規模プロジェクトでは、全PRに最低2人の承認が必要です。GitHubのProtected BranchとRequired Reviewsを設定することで、品質担保を自動化しています。また、『Squash and Merge』 vs 『Merge Commit』の議論は今でも続いており、プロジェクトの文化によって選択されています」


5. ブランチ戦略とコンフリクト解決

実行コマンド例:

bash
# ブランチ管理のベストプラクティス
git branch -a                  # 全ブランチ表示
git branch --merged            # マージ済みブランチ確認
git branch -d old-feature      # 不要ブランチ削除

# コンフリクト解決フロー
git merge main
# コンフリクト発生...
git status                     # コンフリクトファイル確認
# ファイルを編集して解決...
git add resolved-file.txt
git merge --continue

業界話:

「Googleでは、『trunk-based development』が主流で、すべての開発者がmainブランチに対して直接作業します。これには高度なCI/CDとテストカバレッジが必要です。日本ではGit Flowが人気ですが、海外ではGitHub FlowやGitLab Flowが増えてきています」


6. 実践的なチーム開発コマンド

実行コマンド例:

bash
# チーム開発便利コマンド
git log --oneline --graph --all -20  # 視覚的な履歴確認
git stash                            # 一時避難
git stash pop                        # 復元
git cherry-pick abc123               # 特定コミットのみ適用
git bisect start                     # バグ検出の二分探索

エイリアス設定例 (~/.gitconfig):

gitconfig
[alias]
    co = checkout
    br = branch
    ci = commit
    st = status
    lg = log --oneline --graph --all -20
    unstage = reset HEAD --
    last = log -1 HEAD

7. 業界でよく使われる.gitignore

gitignore
# プロジェクト固有の無視設定
.env
.env.local
*.log
.DS_Store

# 言語/フレームワーク固有
# Node.js
node_modules/
npm-debug.log*

# Python
__pycache__/
*.pyc

業界話:

「.gitignoreはプロジェクトの最初にしっかり設定することが重要です。特に.envファイルなどの機密情報を誤ってコミットする事故(『GitHub Leak』)は年間数千件発生しています。GitHubにはデフォルトの.gitignoreテンプレートが豊富に用意されています」


8. リベースの実践的使い方

実行コマンド例:

bash
# 安全なリベース手順
git fetch origin
git rebase -i origin/main      # インタラクティブリベース

# 危険な操作(共有ブランチでは絶対にNG)
git rebase -i HEAD~3           # ローカル履歴整理
git push -f                    # 強制プッシュ(注意!)

業界話:

「Airbnbのコーディング規約では、『共有ブランチではリベース禁止、プライベートブランチでは推奨』と明確に分けています。リベースで履歴をきれいに保つ一方、チームメンバーが混乱しないよう配慮が必要です」


プロの現場で生きる追加Tips:

  1. コミットメッセージ規約: Conventional Commitsが業界標準に

    text
    feat: 新機能追加
    fix: バグ修正
    docs: ドキュメント変更
    style: コードスタイル変更
    refactor: リファクタリング
  2. フックスクリプト活用:

    bash
    # .git/hooks/pre-commitで自動テスト
    npm test
    # 失敗したらコミット中止
  3. コードオーナー設定: GitHubのCODEOWNERSファイルでレビュアー自動割当

  4. セマンティックバージョニング: タグ付けを活用したリリース管理

    bash
    git tag -a v1.2.3 -m "リリースバージョン1.2.3"
    git push --tags

このコースの内容を実践すれば、中小企業からFAANG(Meta, Amazon, Apple, Netflix, Google)レベルの開発現場でも通用するGitスキルが身につきます。特に重要なのは「なぜそのコマンドを使うのか」を理解することです。コマンドを暗記するのではなく、Gitのデータ構造とワークフローを理解すれば、あらゆる状況に対応できるようになります。

このGitコース、実務で本当に役立つ内容が詰まっていますね!各セクションについて、実践的な視点で解説していきます。

📚 コース全体の構成と実務での重要性

このコースは「仕組みの理解」→「基本操作」→「チーム開発」という理想的な学習フローになっています。多くの開発者が「コマンドだけ覚える」アプローチで挫折するのに対し、このコースは根本から理解できる設計です。


🎯 各セクションの詳細解説

1. GitとGitHubの基礎理解

なぜ重要か: 「なぜこのツールを使うのか」を理解していないと、トラブル時に対応できません。

業界の実態:

  • スタートアップでも大企業でも、Git未使用の開発現場はほぼゼロ
  • 「Gitできます」は面接での必須スキル
  • バージョン管理なしの開発は「セーブ機能のないゲーム」と同じ

実務エピソード: あるプロジェクトで、新人がバージョン管理せず「最終版.docx」「最終版2.docx」「本当の最終版.docx」というファイルを作り、どれが最新か分からなくなった事件がありました。Gitがあれば履歴が全て残ります。


2. インストールと初期設定

重要なコマンド例:

bash
# Gitの初期設定(最初に必ず実行)
git config --global user.name "Yamada Taro"
git config --global user.email "yamada@example.com"

# エディタの設定(コミットメッセージ編集用)
git config --global core.editor "vim"

# 改行コード設定(Windows特有の問題を回避)
git config --global core.autocrlf true  # Windows
git config --global core.autocrlf input # Mac/Linux
```

**業界の慣習:**
- 会社用と個人用でメールアドレスを分ける開発者が多い
- グローバル設定とプロジェクト別設定を使い分ける

---

### 3. Gitのデータ構造と仕組み

**コアコンセプト:**
Gitは「スナップショット」でデータを保存します。差分ではなく、その時点のファイル全体の状態を記録。

**実際の内部構造:**
```
.git/
├── objects/     # 実際のデータ(blob, tree, commit)
├── refs/        # ブランチやタグの参照
├── HEAD         # 今いる場所を指すポインタ
└── index        # ステージングエリア

現場での理解度チェック: 「コミットって何?」と聞かれて「変更の保存」とだけ答える人は浅い理解。正解は「プロジェクト全体のスナップショットへの参照を持つオブジェクト」です。


4. 基本的なコマンド操作

頻出コマンドの実例:

bash
# リポジトリの初期化
git init

# GitHubからクローン
git clone https://github.com/username/repo.git

# ステージングに追加
git add index.html
git add .  # 全ての変更を追加

# コミット
git commit -m "Add login feature"

# 状態確認(最も頻繁に使う)
git status

# 差分確認
git diff              # ワーキングツリー vs ステージ
git diff --staged     # ステージ vs 最新コミット

# ログ確認
git log
git log --oneline --graph --all  # 視覚的に確認

実務のコミットメッセージ例:

bash
# 悪い例
git commit -m "fix"
git commit -m "update"

# 良い例
git commit -m "Fix login button alignment on mobile"
git commit -m "Add email validation to signup form"
git commit -m "Refactor: Extract user authentication logic"

プロの小技:

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 st  # git status と同じ

5. 変更の取り消し

危険度別のコマンド:

bash
# 【安全】ワーキングツリーの変更を取り消し
git checkout -- file.txt
# または(新しい記法)
git restore file.txt

# 【安全】ステージングを取り消し(変更は残る)
git reset HEAD file.txt
# または
git restore --staged file.txt

# 【注意】直前のコミットをやり直し
git commit --amend -m "Correct commit message"

# 【危険】コミットを取り消す
git reset --soft HEAD^   # コミットだけ取り消し(ステージは残る)
git reset --mixed HEAD^  # デフォルト、ステージも取り消し
git reset --hard HEAD^   # 全て削除(危険!)

実務の失敗談: git reset --hard を実行後「あ、あのファイル必要だった…」となるケースが頻発。こういう時は git reflog で救出できます。

bash
# 削除したコミットを探す
git reflog

# 特定のコミットに戻る
git reset --hard HEAD@{2}

6. リモートリポジトリとの連携

実践コマンド:

bash
# リモート確認
git remote -v

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

# プッシュ(初回)
git push -u origin main

# フェッチ(リモートの情報を取得、マージはしない)
git fetch origin

# プル(フェッチ + マージ)
git pull origin main

# リモートブランチの確認
git branch -r
git branch -a  # ローカル + リモート全て

フェッチ vs プルの使い分け:

bash
# 安全重視の開発フロー
git fetch origin          # まず情報だけ取得
git log origin/main       # リモートの変更を確認
git merge origin/main     # 問題なければマージ

# 素早い開発(チーム内で調整済みの場合)
git pull origin main      # 一気に取得してマージ

実務での落とし穴: いきなり git pull すると、予期せぬ変更が入ってローカル作業が壊れることも。重要な作業中は fetch → 確認 → merge が安全です。


7. ブランチとマージ

ブランチ戦略の実例:

bash
# 新機能開発用ブランチ作成
git branch feature/user-profile
git checkout feature/user-profile
# または一行で
git checkout -b feature/user-profile

# 作業後、mainに戻ってマージ
git checkout main
git merge feature/user-profile

# ブランチ削除
git branch -d feature/user-profile  # マージ済みのみ削除
git branch -D feature/user-profile  # 強制削除

コンフリクト解消の実例:

bash
# マージ時にコンフリクト発生
git merge feature/payment

# ファイルを開くと以下のような表示
<<<<<<< HEAD
const price = 1000;
=======
const price = 1500;
>>>>>>> feature/payment

# 手動で修正後
const price = 1500;  # 正しい値を選択

# 解消を完了
git add payment.js
git commit -m "Resolve merge conflict in payment price"

業界のブランチ命名規則:

  • feature/ - 新機能
  • bugfix/ - バグ修正
  • hotfix/ - 緊急修正
  • release/ - リリース準備

例:feature/add-payment-systembugfix/fix-login-error


8. GitHub Flow(チーム開発の標準)

実際の開発フロー:

  1. Issue作成(タスク管理)
  2. ブランチ作成
bash
   git checkout -b feature/issue-123-add-search
  1. 開発・コミット
bash
   git add .
   git commit -m "Add search functionality #123"
  1. プッシュ
bash
   git push origin feature/issue-123-add-search
  1. Pull Request作成(GitHub上で)
  2. コードレビュー
  3. マージ(レビュー承認後)
  4. ブランチ削除

実務のPR(プルリクエスト)例:

markdown
## 概要
ユーザー検索機能を追加

## 変更内容
- 検索APIエンドポイント追加
- フロントエンドに検索UIを実装
- 検索結果のページネーション対応

## テスト
- [ ] 検索機能の動作確認
- [ ] エッジケースのテスト(空文字、特殊文字)
- [ ] モバイル表示確認

## スクリーンショット
(画像添付)

関連Issue: #123

9. リベース(上級テクニック)

マージ vs リベースの違い:

bash
# マージ(履歴が分岐して見える)
git checkout main
git merge feature/new-ui
# → マージコミットが作られる

# リベース(一直線の履歴になる)
git checkout feature/new-ui
git rebase main
# → feature ブランチのコミットが main の先頭に付け替えられる

インタラクティブリベース(履歴の整理):

bash
# 直近3コミットを編集
git rebase -i HEAD~3

# エディタが開く
pick abc123 Add feature A
pick def456 Fix typo
pick ghi789 Add feature B

# 以下のように変更可能
pick abc123 Add feature A
squash def456 Fix typo    # 前のコミットに統合
pick ghi789 Add feature B

禁止事項(絶対に守る):

bash
# ❌ プッシュ済みのブランチでリベースしてはいけない
git push origin main
git rebase ...  # これをやると他の人のリポジトリが壊れる

実務での使い分け:

  • 個人ブランチ:リベースでOK(履歴をきれいに)
  • 共有ブランチ:マージのみ(安全第一)

10. タグ(リリース管理)

実践例:

bash
# 軽量タグ(簡易的)
git tag v1.0.0

# 注釈付きタグ(推奨、詳細情報を記録)
git tag -a v1.0.0 -m "Release version 1.0.0 - Initial public release"

# タグ一覧
git tag

# タグをリモートにプッシュ
git push origin v1.0.0
git push origin --tags  # 全タグを送信

# タグのチェックアウト
git checkout v1.0.0
```

**セマンティックバージョニング:**
```
v1.2.3
^ ^ ^
| | └─ パッチ(バグ修正)
| └─── マイナー(機能追加、後方互換性あり)
└───── メジャー(破壊的変更)

実務での活用: 本番環境へのデプロイ時、タグを打つことで「いつ何をリリースしたか」が明確に。問題発生時はタグで素早くロールバックできます。


11. スタッシュ(作業の一時退避)

実用例:

bash
# 緊急のバグ修正が入った!でも今の作業は未完成...
git stash  # 現在の変更を退避

# バグ修正ブランチで作業
git checkout hotfix/urgent-bug
# ... 修正 ...
git commit -m "Fix critical bug"

# 元の作業に戻る
git checkout feature/my-work
git stash pop  # 退避した変更を復元

# スタッシュ一覧
git stash list

# 特定のスタッシュを適用
git stash apply stash@{1}

# スタッシュ削除
git stash drop stash@{0}

実務のシナリオ: 「プルリク出したけどレビュー待ち。その間に別タスクやろう」→ スタッシュで切り替えがスムーズに。


🚀 実務で差がつくポイント

コミット粒度の考え方

bash
# ❌ 悪い例(1日の作業を1コミットに)
git commit -m "Today's work"

# ✅ 良い例(機能単位で細かく)
git commit -m "Add user model"
git commit -m "Add user controller"
git commit -m "Add user view"

.gitignoreの活用

bash
# .gitignore ファイル例
node_modules/
.env
*.log
.DS_Store
.idea/

ブランチ運用の失敗談

あるチームでは全員がmainブランチで直接作業し、誰かがバグを混入すると全員が影響を受けました。ブランチ戦略導入後、問題が激減しました。


🎓 学習のコツ

  1. 毎日触る:1週間に1回より、毎日10分の方が定着します
  2. 実プロジェクトで使う:架空のプロジェクトではなく、実際のコードで
  3. 失敗を恐れない:ローカルリポジトリで色々試してみる
  4. チーム開発を経験:一人では学べないコンフリクト解消などを体験

このコースを完走すれば、「Git使える人」から「Gitを理解している人」にレベルアップできます。特にデータ構造の理解は、トラブルシューティングで圧倒的な差になりますよ!

何か具体的なコマンドや概念について、さらに詳しく知りたい部分はありますか?