目次
- Gitの基礎知識
- Gitのセットアップと設定
- 基本的なGitコマンド
- ブランチの操作
- 変更の確認と比較
- コミットの修正と歴史の変更
- リモートリポジトリの操作
- GitHubの基礎知識
- GitHubアカウントとリポジトリ管理
- GitHubの主要機能
- GitHubフロー
- GitHubでのコラボレーション
- GitHub Actions
- GitHub CLI
- 高度なGit技術
- よくあるトラブルシューティング
Gitの基礎知識
Gitとは
- 分散型バージョン管理システム
- コードの変更履歴を記録・追跡
- 複数人での共同作業を可能にする
- オフラインでも操作可能
Gitの主要概念
- リポジトリ: プロジェクトとその履歴を含む格納場所
- コミット: 変更の保存ポイント
- ブランチ: 独立した開発ラインを作成
- マージ: ブランチの変更を統合
- リモート: ネットワーク上の共有リポジトリ
Gitのセットアップと設定
インストール
# macOS (Homebrew)
brew install git
# Ubuntu/Debian
sudo apt-get install git
# Windows
# GitHubからインストーラーをダウンロード: https://git-scm.com/download/win
初期設定
# ユーザー情報の設定(必須)
git config --global user.name "あなたの名前"
git config --global user.email "あなたのメール"
# エディタの設定
git config --global core.editor "vim" # または好みのエディタ
# デフォルトブランチ名の設定(Git 2.28以降)
git config --global init.defaultBranch main
# 設定の確認
git config --list
認証設定
# SSHキーの生成
ssh-keygen -t ed25519 -C "your_email@example.com"
# 公開キーの表示(GitHubに追加するため)
cat ~/.ssh/id_ed25519.pub
# SSHエージェントの起動と鍵の追加
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
エイリアスの設定
# よく使うコマンドのショートカット
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
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コマンド
リポジトリの作成
# 新しいリポジトリを初期化
git init
# 既存のリポジトリをクローン
git clone https://github.com/ユーザー名/リポジトリ名.git # HTTPS
git clone git@github.com:ユーザー名/リポジトリ名.git # SSH
基本的な作業フロー
# ファイルの状態を確認
git status
# ファイルをステージングエリアに追加
git add ファイル名
git add . # すべての変更をステージング
git add -p # 変更を対話的にステージング
# 変更をコミット
git commit -m "コミットメッセージ"
git commit -am "メッセージ" # 追跡されているファイルの変更をステージングしてコミット
# 変更をプッシュ
git push origin ブランチ名
git push # 現在のブランチをデフォルトのリモートにプッシュ
# 変更を取得
git pull origin ブランチ名
git pull # 現在のブランチの変更を取得してマージ
.gitignoreファイル
# .gitignoreの例
node_modules/
*.log
.DS_Store
.env
build/
dist/
*.bak
__pycache__/
*.pyc
ファイルの操作
# ファイルの削除
git rm ファイル名 # 実際にファイルを削除し、変更をステージング
git rm --cached ファイル名 # Gitの追跡からのみ削除(ファイルは残る)
# ファイルの移動/名前変更
git mv 古いパス 新しいパス
ブランチの操作
ブランチの基本操作
# ブランチの一覧表示
git branch # ローカルブランチ
git branch -r # リモートブランチ
git branch -a # すべてのブランチ
# ブランチの作成
git branch ブランチ名
git checkout -b ブランチ名 # ブランチを作成して切り替え
git switch -c ブランチ名 # Git 2.23以降
# ブランチの切り替え
git checkout ブランチ名
git switch ブランチ名 # Git 2.23以降
# ブランチの削除
git branch -d ブランチ名 # マージ済みのブランチを削除
git branch -D ブランチ名 # 強制削除
# ブランチ名の変更
git branch -m 古い名前 新しい名前 # 別のブランチの名前を変更
git branch -m 新しい名前 # 現在のブランチの名前を変更
マージとリベース
# ブランチのマージ
git merge ブランチ名 # 指定したブランチを現在のブランチにマージ
git merge --no-ff ブランチ名 # fast-forwardせずにマージコミットを作成
git merge --abort # マージを中止
# リベース
git rebase ブランチ名 # 現在のブランチを指定したブランチにリベース
git rebase -i HEAD~3 # 直近3つのコミットを対話的にリベース
git rebase --abort # リベースを中止
git rebase --continue # コンフリクト解決後にリベースを続行
コンフリクトの解決
# コンフリクトファイルの確認
git status
# ファイルを編集してコンフリクトを解決
# <<<<<<< HEAD
# 現在のブランチの変更
# =======
# マージするブランチの変更
# >>>>>>> ブランチ名
# 解決後に続行
git add 解決したファイル
git merge --continue # または git rebase --continue
変更の確認と比較
変更の差分表示
# 変更の差分を表示
git diff # ワーキングディレクトリとステージングエリアの差分
git diff --staged # ステージングエリアと最新コミットの差分
git diff HEAD # ワーキングディレクトリと最新コミットの差分
git diff コミットID1 コミットID2 # 2つのコミットの差分
git diff ブランチ1..ブランチ2 # 2つのブランチの差分
# 差分の統計情報
git diff --stat
コミット履歴の表示
# コミット履歴の表示
git log # コミット履歴
git log --oneline # 簡潔な形式
git log --graph --oneline --all # グラフィカルなブランチ履歴
git log -p # 各コミットの差分を表示
git log -n 5 # 直近5つのコミットを表示
git log --author="名前" # 特定の作者のコミット
git log --since="2023-01-01" --until="2023-12-31" # 期間指定
git log --grep="キーワード" # コミットメッセージで検索
# 特定のファイルの履歴
git log -- ファイル名
git blame ファイル名 # 各行の最終変更者を表示
一時的な変更の保存(stash)
# 作業中の変更を一時保存
git stash
git stash save "メッセージ" # メッセージ付きで保存
# 保存した変更の一覧
git stash list
# 保存した変更を適用
git stash apply # スタックから削除せずに適用
git stash pop # スタックから削除して適用
git stash apply stash@{n} # 特定のスタッシュを適用
# スタッシュの操作
git stash show # 最新のスタッシュの内容表示
git stash show -p # 最新のスタッシュの詳細表示
git stash drop stash@{n} # 特定のスタッシュを削除
git stash clear # すべてのスタッシュを削除
コミットの修正と歴史の変更
コミットの修正
# 直前のコミットを修正
git commit --amend # コミットメッセージを変更
git commit --amend --no-edit # メッセージを変更せずにファイルを追加
# 複数のコミットを圧縮・並べ替え・分割・編集
git rebase -i HEAD~3 # 直近3つのコミットを対話的に操作
# 対話モードで使用可能なコマンド:
# p, pick = コミットをそのまま使用
# r, reword = コミットを使用するがメッセージを変更
# e, edit = コミットを使用するが一時停止して修正
# s, squash = コミットを使用するが前のコミットに統合
# f, fixup = squashと同様だがメッセージは破棄
# d, drop = コミットを削除
コミットの打ち消しとリセット
# コミットの打ち消し(新しいコミットを作成)
git revert コミットID # 指定したコミットを打ち消す新しいコミットを作成
git revert HEAD # 直前のコミットを打ち消す
# 歴史のリセット(注意!歴史を書き換える)
git reset --soft HEAD~1 # コミットを取り消し、変更をステージングエリアに残す
git reset --mixed HEAD~1 # コミットを取り消し、変更をワーキングディレクトリに残す
git reset --hard HEAD~1 # コミットと変更を完全に削除(注意!)
コミットの移動と選択
# コミットの選択(cherry-pick)
git cherry-pick コミットID # 特定のコミットを現在のブランチに適用
git cherry-pick コミットID1..コミットID2 # 範囲を指定
# ブランチポインタの移動
git reset --hard コミットID # 特定のコミットに移動(注意!)
# コミットの分割
git rebase -i コミットID^
# edit に変更し、rebase開始後:
git reset HEAD^ # コミットを取り消し
git add -p # 変更を部分的にステージング
git commit -m "最初の部分"
git add . # 残りの変更をステージング
git commit -m "2番目の部分"
git rebase --continue
リモートリポジトリの操作
リモートの管理
# リモートの一覧表示
git remote -v
# リモートの追加
git remote add 名前 URL
# リモートの削除
git remote remove 名前
# リモートの変更
git remote set-url 名前 新しいURL
# リモートの詳細表示
git remote show origin
リモートとの同期
# リモートの情報を取得
git fetch origin # 変更を取得するがマージしない
git fetch --all # すべてのリモートから取得
git fetch --prune # リモートで削除されたブランチを削除
# リモートの変更を取得してマージ
git pull # 現在のブランチの変更を取得してマージ
git pull --rebase # 取得した変更をリベースで適用
# リモートブランチを追跡
git branch --track ブランチ名 origin/ブランチ名
git checkout --track origin/ブランチ名 # リモートブランチを追跡するローカルブランチを作成
# リモートブランチの削除
git push origin --delete ブランチ名
プッシュの詳細オプション
# 通常のプッシュ
git push origin ブランチ名
# 新しいリモートブランチにプッシュ
git push -u origin ブランチ名 # ブランチをプッシュして追跡設定
# 強制プッシュ(注意!)
git push --force # 履歴を強制的に上書き(危険)
git push --force-with-lease # 他の人の変更を上書きしないよう保護
# タグのプッシュ
git push origin タグ名
git push origin --tags # すべてのタグをプッシュ
タグの操作
# タグの一覧
git tag
git tag -l "v1.*" # パターンでフィルタリング
# タグの作成
git tag タグ名 # 軽量タグ
git tag -a タグ名 -m "メッセージ" # 注釈付きタグ
git tag -a タグ名 コミットID # 過去のコミットにタグ付け
# タグの削除
git tag -d タグ名 # ローカルタグの削除
git push origin :refs/tags/タグ名 # リモートタグの削除
GitHubの基礎知識
GitHubとは
- Gitリポジトリのホスティングサービス
- コードの共有・協力開発のためのプラットフォーム
- コードレビュー、イシュー管理、CI/CD等の機能提供
GitとGitHubの違い
- Git: 分散型バージョン管理システム(ツール)
- GitHub: Gitリポジトリをホスティングするウェブサービス
GitHubアカウントとリポジトリ管理
アカウント設定
- プロファイル設定
- SSHキーの追加(Settings > SSH and GPG keys)
- 二要素認証の設定(Settings > Password and authentication)
- Personal Access Tokenの作成(Settings > Developer settings)
リポジトリの作成と管理
# ウェブインターフェイスでの作成
# 1. GitHubにログイン
# 2. 右上の「+」> New repository
# 3. 必要事項を入力して作成
# 既存のローカルリポジトリをGitHubに追加
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git branch -M main
git push -u origin main
# GitHubからクローン
git clone https://github.com/ユーザー名/リポジトリ名.git
リポジトリの設定
- デフォルトブランチの変更
- ブランチ保護ルールの設定
- コラボレーターの追加
- トピックの設定
- リポジトリの公開/非公開設定
GitHubの主要機能
Pull Request(PR)
# 基本的なPRのワークフロー
git checkout -b 機能ブランチ
# 変更を加えてコミット
git commit -am "新機能を追加"
# ブランチをプッシュ
git push -u origin 機能ブランチ
# GitHubのウェブインターフェースでPRを作成
# 1. リポジトリページで「Compare & pull request」
# 2. ベースブランチと比較ブランチを確認
# 3. タイトルと説明を入力
# 4. 「Create pull request」をクリック
PRレビューとマージ
- コードレビューの実施
- レビューコメントの追加
- 承認または変更リクエスト
- PRのマージ方法:
- Create a merge commit
- Squash and merge
- Rebase and merge
Issues
- 課題・バグ・機能要望の追跡
- テンプレートの使用
- ラベル、マイルストーン、アサインの設定
- Issue間のリンク
- PRとIssueの連携(キーワード: fixes, closes, resolves)
Discussions
- コミュニティディスカッションの場
- カテゴリ分け
- アナウンス、Q&A、アイデア共有
Wiki
- プロジェクトのドキュメント管理
- マークダウン形式でのページ作成
- 目次と階層構造の設定
フォークとクローン
# GitHubでリポジトリをフォーク(ウェブインターフェース)
# フォークしたリポジトリをクローン
git clone https://github.com/あなたのユーザー名/リポジトリ名.git
# オリジナルリポジトリを追加(アップストリーム)
git remote add upstream https://github.com/オリジナル所有者/リポジトリ名.git
# アップストリームから更新を取得
git fetch upstream
git merge upstream/main # または適切なブランチ
# または
git pull upstream main
ブランチ保護
- mainブランチへの直接プッシュを禁止
- マージ前にレビュー承認を必須に
- ステータスチェック(CIテスト)の通過を必須に
- 署名済みコミットの要求
セキュリティ機能
- 脆弱性アラート
- 依存関係のバージョン更新
- Code scanning(コード品質・セキュリティ検査)
- Secret scanning(誤ってコミットされた機密情報の検出)
GitHubフロー
基本的なワークフロー
-
メインブランチからフィーチャーブランチを作成
git checkout main git pull git checkout -b feature/新機能
-
変更を加えてコミット
# ファイルを編集 git add . git commit -m "機能を実装"
-
変更をプッシュしてPRを作成
git push -u origin feature/新機能 # GitHubでPRを作成
-
レビュー後にマージ
# GitHubでマージボタンを使用 # または: git checkout main git merge feature/新機能 git push
-
ブランチの削除
git branch -d feature/新機能 git push origin --delete feature/新機能
GitHubフローの特徴
- シンプルで理解しやすい
- 継続的なデプロイに適している
- メインブランチは常にデプロイ可能な状態を保つ
- フィーチャーブランチでの作業と頻繁なPR
GitHubでのコラボレーション
Issue駆動開発
- GitHubでIssueを作成
-
Issue番号を含むブランチを作成
git checkout -b fix/123-バグ修正
-
コミットメッセージにIssue番号を含める
git commit -m "Fix #123: バグを修正"
- PRを作成し、Issueに関連付け
コードレビュー手法
- 行ごとのコメント
- 全体的なフィードバック
- 提案付きコメント(変更案を直接提示)
- レビュー状態:Comment, Approve, Request changes
プロジェクト管理
- プロジェクトボードの使用
- カンバン形式でのタスク管理
- 自動化ルールの設定
- マイルストーンによる進捗管理
ドキュメント作成
- README.mdの充実
- CONTRIBUTING.mdの作成
- CODEOFCONDUCTの設定
- GItHub Pagesの活用
GitHub Actions
基本構成
# .github/workflows/main.yml の例
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
トリガーの種類
- push, pull_request
- schedule(cron形式でスケジュール実行)
- workflow_dispatch(手動実行)
- repository_dispatch(外部イベント)
主なユースケース
- CI(継続的インテグレーション)
- コードのビルド
- テストの実行
- コードスタイルチェック
- CD(継続的デリバリー)
- 自動デプロイ
- リリースの自動化
- プロジェクト管理の自動化
- Issue・PRへの自動ラベル付け
- ステータスの自動更新
シークレットと環境変数
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Deploy to server
env:
API_KEY: ${{ secrets.API_KEY }}
run: ./deploy.sh
GitHub CLI
インストールと設定
# インストール
# macOS: brew install gh
# Windows: scoop install gh または choco install gh
# Linux: apt install gh など
# 認証
gh auth login
リポジトリ操作
# リポジトリ作成
gh repo create 名前 --public/--private
# リポジトリクローン
gh repo clone ユーザー/リポジトリ
# リポジトリのビュー
gh repo view
# リポジトリをフォーク
gh repo fork ユーザー/リポジトリ
プルリクエスト操作
# PRを作成
gh pr create --title "タイトル" --body "説明"
# PR一覧の表示
gh pr list
# PRをチェックアウト
gh pr checkout 番号
# PRをレビュー
gh pr review 番号 --approve/--comment/--request-changes
# PRをマージ
gh pr merge 番号 --merge/--squash/--rebase
Issue操作
# Issueを作成
gh issue create --title "タイトル" --body "説明"
# Issue一覧の表示
gh issue list
# Issueの表示
gh issue view 番号
# Issueの状態変更
gh issue close 番号
gh issue reopen 番号
ワークフロー操作
# ワークフロー実行一覧
gh workflow list
# ワークフロー実行
gh workflow run ワークフロー名
高度なGit技術
Git Hooks
- pre-commit: コミット前に実行
- post-commit: コミット後に実行
- pre-push: プッシュ前に実行
- カスタムフックの作成:
.git/hooks/
ディレクトリ内に実行可能スクリプトを配置
サブモジュール
# サブモジュールの追加
git submodule add リポジトリURL パス
# サブモジュール付きのリポジトリをクローン
git clone --recursive リポジトリURL
# 既存のリポジトリのサブモジュールを初期化
git submodule init
git submodule update
# すべてのサブモジュールを更新
git submodule update --remote
Git LFS(Large File Storage)
# Git LFSのインストール
git lfs install
# ファイルタイプを追跡
git lfs track "*.psd"
# .gitattributesをコミット
git add .gitattributes
git commit -m "LFSで追跡するファイルを設定"
# 通常のGit操作と同様に使用
git add 大きなファイル
git commit -m "大きなファイルを追加"
Git Bisect
# バイセクトを開始
git bisect start
# 不具合が発生するコミットを指定
git bisect bad
# 不具合が発生しない古いコミットを指定
git bisect good コミットID
# 各コミットをテストして結果を報告
git bisect good # 現在のコミットで問題なし
git bisect bad # 現在のコミットで問題あり
# バイセクトを終了
git bisect reset
GPGでのコミット署名
# GPGキーを生成
gpg --full-generate-key
# GPGキーをGitに設定
git config --global user.signingkey GPGキーID
# コミットに署名
git commit -S -m "署名付きコミット"
# 常に署名するよう設定
git config --global commit.gpgsign true
リファレンスとリフログ
# reflog - 操作履歴を表示
git reflog
# 参照の表示
git show-ref
git show-ref --heads # ローカルブランチの参照のみ
# refspecの使用
git push origin HEAD:refs/heads/新しいブランチ
フィルタリングとクリーンアップ
# ファイル履歴からの機密情報削除(注意!履歴書き換え)
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch パス/ファイル名" \
--prune-empty -- --all
# git-filter-repoの使用(より推奨)
# pip install git-filter-repo
git-filter-repo --path パス/ファイル名 --invert-paths
よくあるトラブルシューティング
コミットの取り消し
# 直前のコミットを取り消し(変更は保持)
git reset --soft HEAD^
# 直前のコミットを完全に削除(注意!)
git reset --hard HEAD^
# 特定のコミットを打ち消す新しいコミットを作成
git revert コミットID
誤ったブランチにコミットした場合
# 1. コミットを保存
git branch 正しいブランチ
# 2. 変更を元に戻す
git reset --hard HEAD~1 # 注意:コミット内容が正しいブランチに保存されていることを確認
# 3. 正しいブランチに切り替え
git checkout 正しいブランチ
マージコンフリクトの解決
# コンフリクトが発生した場合
git status # コンフリクトファイルを確認
# ファイルを編集してコンフリクトを解決
# <<<<<<< HEAD
# 現在のブランチの変更
# =======
# マージするブランチの変更
# >>>>>>> ブランチ名
# 解決後にコミット
git add 解決したファイル
git commit # または git merge --continue
リモートとの同期問題
# リモートからの変更と競合
git pull --rebase # リモートの変更を取得し、ローカルの変更をリベース
# プッシュが拒否された場合
git pull
git push # または
git push --force-with-lease # 他の人の変更を上書きしないよう保護
削除したブランチの復元
# 削除したブランチの最後のコミットを見つける
git reflog
# 新しいブランチを作成して復元
git branch 復元ブランチ コミットID
巨大なリポジトリのパフォーマンス改善
# 部分クローン
git clone --filter=blob:none リポジトリURL # ファイル内容なしでクローン
git clone --depth 1 リポジトリURL # 浅いクローン(最新コミットのみ)
# リポジトリの最適化
git gc # ガベージコレクション実行
git prune # 到達不能なオブジェクトを削除
コミット歴史のクリーンアップ
# 不要なファイルを履歴から削除
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch 大きなファイル' \
--prune-empty -- --all
# リモートリポジトリに強制プッシュ(注意!)
git push origin --force --all
GitHubリポジトリのトラブル
# リモートURLの確認と変更
git remote -v
git remote set-url origin 新しいURL
# 認証の問題
# SSHキーの確認
ssh -T git@github.com
# HTTPSでのパスワード認証からトークン認証への移行
git remote set-url origin https://ユーザー名:パーソナルアクセストークン@github.com/ユーザー名/リポジトリ名.git
GitHub Actions のトラブル
- ワークフローログの確認
- シークレットと環境変数の正しい設定
- ランナー環境の互換性確認
- タイムアウト設定の調整