Git は現在最も広く使われているバージョン管理システムです。初期設定から始まり、ブランチ・マージ・リベース・変更の取り消し・スタッシュ・チーム協作ワークフローなど、日常開発で使うほとんどの操作を網羅します。
初期設定
初めて Git を使う前に、グローバル設定をします:
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
デフォルトのブランチ名を設定(main 推奨):
git config --global init.defaultBranch main
デフォルトのエディターを設定(VS Code の例):
git config --global core.editor "code --wait"
すべての設定を確認:
git config --list
リポジトリの作成
ゼロから始める:
mkdir my-project && cd my-project
git init
既存のリポジトリをクローン:
# HTTPS(ユーザー名・パスワードまたはトークンが必要)
git clone https://github.com/user/repo.git
# SSH(SSH キーの設定が必要)
git clone git@github.com:user/repo.git
# 特定のフォルダ名でクローン
git clone git@github.com:user/repo.git my-folder
基本ワークフロー
Git のローカルは3層構造です:作業ディレクトリ → ステージングエリア → ローカルリポジトリ
# 現在の状態を確認
git status
# ファイルをステージに追加
git add file.txt
git add . # すべての変更をステージ
git add -p # 変更の一部を対話的に選択(非常に便利)
# コミット
git commit -m "feat: add user login"
# ステージをスキップして追跡済みファイルを直接コミット
git commit -am "fix: correct typo"
コミットメッセージの規約(Conventional Commits)
良いコミットメッセージは履歴を読みやすくし、CHANGELOG の自動生成を可能にします:
type(scope): subject
feat 新機能
fix バグ修正
docs ドキュメント変更
style フォーマット調整(ロジック変更なし)
refactor リファクタリング
test テストの追加・修正
chore ビルドプロセス・ツール設定など
履歴の確認
# コミット履歴を確認
git log
# 一行の簡潔なフォーマット
git log --oneline
# グラフィカルなブランチビュー
git log --oneline --graph --all
# 特定ファイルの履歴を確認
git log --follow -- path/to/file
# 特定のコミットの変更内容を確認
git show <commit-hash>
ブランチ管理
ブランチは Git の最も強力な機能の一つで、作成・切り替えのコストはほぼゼロです。
# すべてのブランチを表示
git branch
git branch -a # リモートブランチを含む
# 新しいブランチを作成
git branch feature/login
# ブランチを切り替え
git switch feature/login
# 作成と切り替えを一度に(よく使う省略形)
git switch -c feature/login
# ブランチを削除
git branch -d feature/login # 安全な削除(未マージ時に警告)
git branch -D feature/login # 強制削除
# 現在のブランチの名前を変更
git branch -m new-name
マージ
# ターゲットブランチに切り替え(通常は main)
git switch main
# feature ブランチをマージ
git merge feature/login
Fast-forward マージ:ターゲットブランチに新しいコミットがない場合、ポインタを前に移動するだけで履歴は一直線になります。
Non-fast-forward マージ:ターゲットに新しいコミットがある場合、マージコミットが作成され、履歴にフォーク構造が残ります。
マージコミットを常に作成するには --no-ff:
git merge --no-ff feature/login
コンフリクトの解決
マージコンフリクトが発生した場合、ファイルにマーカーが付きます:
<<<<<<< HEAD
ローカルの内容
=======
マージされてくる内容
>>>>>>> feature/login
正しい内容になるよう手動で編集し、その後:
git add .
git commit # Git がマージコミットメッセージを自動入力
リベース
リベースは現在のブランチのコミットを別のブランチの末尾に「移植」し、履歴を線形かつクリーンに保ちます。
# feature ブランチ上で、最新の main の上に移植する
git switch feature/login
git rebase main
対話的リベース(コミット履歴の整理に非常に便利):
# 直近 3 つのコミットを編集
git rebase -i HEAD~3
エディターで使えるコマンド:
| コマンド | 効果 |
|---|---|
pick | コミットをそのまま保持 |
reword | 保持するがメッセージを編集 |
squash | 前のコミットに統合 |
fixup | squash と同じ、メッセージ破棄 |
drop | コミットを削除 |
注意: リモートの共有ブランチに push 済みのコミットをリベースしてはいけません。他の人の履歴との衝突を引き起こします。
リモートリポジトリ
# リモートを確認
git remote -v
# リモートを追加
git remote add origin git@github.com:user/repo.git
# リモート URL を変更
git remote set-url origin git@github.com:user/new-repo.git
# プッシュ(初回は -u でアップストリームを設定)
git push -u origin main
# 以降は
git push
# プル(fetch + merge)
git pull
# フェッチのみ(マージしない)
git fetch origin
# リモートブランチを削除
git push origin --delete feature/login
スタッシュ
ブランチを切り替える必要があるが、コミットする準備ができていない変更がある場合:
# 現在の変更をスタッシュ
git stash
# 説明付きでスタッシュ
git stash push -m "wip: half-done login form"
# スタッシュの一覧を確認
git stash list
# 直近のスタッシュを復元(一覧に残す)
git stash apply
# 復元して一覧から削除
git stash pop
# 特定のスタッシュを復元
git stash apply stash@{2}
# 特定のスタッシュを削除
git stash drop stash@{0}
# すべてのスタッシュをクリア
git stash clear
変更の取り消し
Git の取り消しコマンドは複数あります。シナリオ別に理解しましょう:
作業ディレクトリの変更を取り消す(add 前)
# ファイルを最後のコミット状態に戻す
git restore file.txt
# すべてのファイルを戻す
git restore .
ステージを取り消す(add 後、commit 前)
git restore --staged file.txt
最後のコミットを修正する
# コミットメッセージを編集、または追加ファイルを含める
git add forgotten-file.txt
git commit --amend
コミットを安全に取り消す(逆向きのコミットを作成)
git revert <commit-hash>
特定のバージョンに戻す(reset)
# ソフトリセット:コミットを取り消し、変更はステージに残す
git reset --soft HEAD~1
# ミックスリセット(デフォルト):コミットを取り消し、変更を作業ディレクトリに戻す
git reset HEAD~1
# ハードリセット:コミットと変更をすべて破棄(危険、慎重に)
git reset --hard HEAD~1
revertvsreset:
revertは変更を元に戻す新しいコミットを追加し、履歴は保持される。共有ブランチに安全resetは履歴を書き換える。push していないローカルコミットにのみ使用
タグ
通常、リリースバージョンのマークに使います:
# 軽量タグ
git tag v1.0.0
# 注釈付きタグ(メッセージを含む)
git tag -a v1.0.0 -m "Release version 1.0.0"
# すべてのタグを表示
git tag
# リモートにタグをプッシュ
git push origin v1.0.0
git push origin --tags # すべてのタグをプッシュ
# タグを削除
git tag -d v1.0.0
git push origin --delete v1.0.0 # リモートタグを削除
.gitignore
.gitignore は Git に追跡しないファイルを指定します:
# 依存関係
node_modules/
vendor/
# ビルド出力
dist/
build/
*.min.js
# 環境変数
.env
.env.local
# OS ファイル
.DS_Store
Thumbs.db
# IDE 設定
.vscode/
.idea/
すでに Git に追跡されているファイルは、.gitignore に追加しても自動的に無視されません。まず追跡を解除する必要があります:
git rm --cached file.txt # 単一ファイルの追跡解除
git rm --cached -r node_modules/ # ディレクトリの追跡解除
協作シナリオ
Fork + Pull Request ワークフロー
- ターゲットリポジトリを自分のアカウントに Fork
- 自分の Fork をクローン
- feature ブランチを作成
- 開発・コミット
- 自分の Fork にプッシュ
- GitHub / GitLab で Pull Request / Merge Request を作成
Fork を上流と同期させる:
# アップストリームリモートを追加
git remote add upstream git@github.com:original/repo.git
# アップストリームの最新を取得
git fetch upstream
# ローカル main にマージ
git switch main
git merge upstream/main
チーム協作の主要原則
main/masterは通常保護されており、直接 push 不可- 機能ごとに feature ブランチを作成する
- マージ前に最新の main にリベースしてコンフリクトを減らす
- PR で Code Review を行い、その後マージする
便利なコマンド
# 2つのブランチの差分を確認
git diff main feature/login
# ファイルの各行を誰が変更したか確認
git blame file.txt
# バグを引き起こしたコミットを二分探索で見つける
git bisect start
git bisect bad # 現在のバージョンはバグあり
git bisect good v1.0.0 # このバージョンは正常
# Git が中間地点をチェックアウト。テストして good/bad をマーク
git bisect reset # 終了
# 特定のコミットを現在のブランチに適用
git cherry-pick <commit-hash>
# 追跡されていないファイルとディレクトリをクリーンアップ
git clean -fd
よくある問題
push が拒否される(rejected)
通常、リモートに他の人の新しいコミットがある場合:
git pull --rebase # 取得後にリベース、線形履歴を保持
git push
誤って削除したブランチを復元
コミットはすぐには消えません。reflog から見つけられます:
git reflog # すべての操作履歴を確認
git switch -c recovered-branch <commit-hash>
大きなファイルを誤ってコミットした
大きなファイルは Git リポジトリに入れるべきではありません(リポジトリが永久に肥大化します)。
push 前であれば:
git rm --cached bigfile.zip
git commit --amend
push 済みの場合は git filter-repo(廃止された filter-branch の代替)を使って履歴から完全に削除します。操作は複雑なので、最初から .gitignore で防ぐのが最善です。
Fonnpo