Gitは個人開発者の必須ツールです。しかし、「とりあえず add → commit → push だけ使えていれば十分」という状態から、もう一歩先へ進むだけで開発効率は劇的に向上します。
この記事では、個人開発者が本当に使えるGitの実践テクニック10選を厳選しました。コードレビューの場面やOSSコントリビュート、複数機能の並行開発など、実際の現場で直面するシーンを想定して解説します。「知ってるけど使ってなかった」ワザを今日から活用できるようになります。
目次
- git stash の応用——branchを間違えても大丈夫
- git rebase -i でコミットをきれいに整頓
- mergeとrebaseの使い分け——迷わない判断基準
- git bisect で最速バグ特定
- git worktree——複数ブランチを同時に開く
- GitHub CLI(gh) でターミナルからPR作成
- .gitconfigエイリアス で日常操作を爆速化
- コミットメッセージの作法——Conventional Commits実践
- git reset vs revert vs restore——取り消しをマスターする
- ブランチ戦略——個人開発に最適なフロー
1. git stash の応用——branchを間違えても大丈夫
「あっ、この修正は main じゃなくて feature/xxx でやるべきだった」という経験、誰にでもあります。git stash はそんなときに役立つ救世主です。
基本:stashして別ブランチへ移動
# とりあえず作業を退避
git stash -u # -u は untracked fileも含める
# 正しいブランチに移動
git checkout feature/add-login
# 退避した作業を戻す
git stash pop
便利な小技
git stash push -m "作業メモ" で名前付きstashが作れます。複数のstashを管理するときは git stash list で一覧表示、git stash apply stash@{1} で任意のstashを適用(popすると消えるが、applyは残す)といった使い分けができます。
# 名前付きstash
git stash push -m "WIP: ログイン処理のリファクタリング途中"
# stash一覧
git stash list
# stash@{0}: On feature/login: WIP: ログイン処理のリファクタリング途中
# stash@{1}: On main: クイックフィックス
# 特定のstashを適用(保持したまま)
git stash apply stash@{1}
「stashしてもう戻せなくなったらどうしよう」という不安があるかもしれませんが、git stash drop で明示的に消すまでは残り続けるので安心してください。
2. git rebase -i でコミットをきれいに整頓
「fix typo」「WIP」「あとで直す」——こうしたコミットが積み重なった履歴は、後から見返したときに何もわかりません。git rebase -i(インタラクティブリベース)で履歴を掃除しましょう。
# 直近3つのコミットをまとめる
git rebase -i HEAD~3
エディタが開き、以下のような画面が表示されます。
pick a1b2c3d ログイン機能を実装
pick e4f5g6h テストを追加
fixup i7j8k9l レビュー指摘を修正
「fixup」とマークしたコミットは、その直前のコミットに吸収されてメッセージも残りません。「squash」にするとコミットメッセージを編集できます。
重要:リモートにpush済みのコミットをrebaseで書き換えると、次にpushするときに git push --force-with-lease が必要になります。個人開発ブランチでは問題ありませんが、複数人で使うブランチでは避けましょう。
3. mergeとrebaseの使い分け——迷わない判断基準
「merge派?rebase派?」——Gitを学ぶ人が必ずぶつかる問いです。答えはシンプルです。公開ブランチはmerge、個人ブランチはrebaseが基本原則です。
| シチュエーション | おすすめ | 理由 |
|---|---|---|
| mainブランチに取り込む | merge(--no-ff) | 履歴に「いつマージされたか」が明確に残る |
| 機能ブランチを最新のmainに追従 | rebase | 余計なマージコミットが増えず、履歴が一直線に |
| 複数人で触るブランチ | merge | rebaseで履歴を書き換えると他の人の作業が壊れる |
| 自分の作業中ブランチ | rebase -i | コミットを整理してからpushできる |
個人開発では、以下のフローが最も安定しています。
# mainを最新に
git checkout main
git pull --rebase # pullもrebaseで!
# 機能ブランチ作成
git checkout -b feature/new-feature
# 作業中にmainが進んだら追従
git rebase main
# 完成したらmainにマージ(--no-ffでマージコミットを強制)
git checkout main
git merge --no-ff feature/new-feature
4. git bisect で最速バグ特定
「3日前までは動いていたのに、今は壊れている」——そんなとき、手動でコミットを1つずつチェックするのは時間の無駄です。git bisect を使えば二分探索で一瞬で原因のコミットを特定できます。
# bisect開始
git bisect start
# 今のコミット(壊れている)をbadとマーク
git bisect bad
# まだ動いていたコミット(3日前のコミットハッシュ)をgoodとマーク
git bisect good abc1234
# Gitが自動的に中間のコミットをチェックアウトする
# → テストを実行して結果を報告
git bisect good # 動いた場合
git bisect bad # 壊れている場合
# 原因のコミットが見つかったら終了
git bisect reset
より高度な使い方として、テストが自動化されているなら git bisect run で完全自動化も可能です。
# テストスクリプトを指定して完全自動bisect
git bisect start HEAD abc1234
git bisect run npm test
# 出力例:
# abcdef123456... is the first bad commit
# bisect run success
個人開発ではテストが書かれていないことも多いですが、最低限の smoke test スクリプト(例: curl http://localhost:3000 | grep "OK")を用意しておくだけでも、デバッグ時間が大幅に短縮できます。
5. git worktree——複数ブランチを同時に開く
「feature/Aの作業中に、mainで緊急修正が必要になった!」という場面。stashしてブランチを切り替えるのが普通ですが、git worktree を使えば別のディレクトリに同時にブランチをチェックアウトできます。
# 現在のリポジトリに、mainブランチを../myapp-mainにチェックアウト
git worktree add ../myapp-main main
# 別のターミナルで../myapp-mainに移動すれば、mainがそのまま開いている
cd ../myapp-main
# 緊急修正 → commit → push
# 不要になったら削除
git worktree remove ../myapp-main
git worktree prune
VSCodeで複数ウインドウを開いてそれぞれ別のブランチを編集できるので、PRレビューやホットフィックスが格段に楽になります。
6. GitHub CLI(gh)でターミナルからPR作成
GitHub CLI(gh)は、ブラウザに触れずにIssue作成・PR作成・レビュー依頼までをターミナルで完結できるツールです。個人開発では「コード書いて→PR作って→CI通ったらマージ」という一連の流れをキーボードだけで実行できます。
# 現在のブランチでPRを作成(エディタが開いて本文を書ける)
gh pr create --fill
# ドラフトPRとして作成(WIP状態)
gh pr create --draft --title "WIP: ログイン機能を追加"
# PR一覧を表示
gh pr list
# PRをマージ
gh pr merge --squash
個人開発では「PRの作成が面倒だからmainに直push」という人が少なくありません。しかし、gh pr create は数秒で完了するので、習慣にするとコード品質が確実に向上します。--fill オプションを使えばコミットメッセージがそのままPRタイトルと説明になるので、余計な入力を省けます。
7. .gitconfigエイリアスで日常操作を爆速化
毎日何度も打つGitコマンドは、エイリアスに登録してキーストロークを減らしましょう。~/.gitconfig に以下の設定を追加するだけで、日常の操作が劇的に速くなります。
[alias]
st = status -sb
co = checkout
br = branch
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
unstage = reset HEAD --
amend = commit --amend --no-edit
undo = reset --soft HEAD~1
last = log -1 HEAD
ci = commit
di = diff
dc = diff --cached
tree = log --graph --oneline --decorate --all
特におすすめなのが git lg です。履歴を見やすく表示するエイリアスで、コミットグラフを一瞬で把握できます。また git undo(直前のコミットを打ち消し)と git unstage(ステージングを取り消し)は、初心者のうちは特に重宝します。
8. コミットメッセージの作法——Conventional Commits実践
「とりあえず修正」「fix」「update」——こうしたコミットメッセージが並んだリポジトリは、後から変更理由を追うのが困難です。Conventional Commitsという規約に従うことで、コミットメッセージから自動でCHANGELOGやバージョンアップができるようになります。
<type>(<scope>): <description>
[optional body]
[optional footer]
主なtypeの種類:
feat— 新機能追加fix— バグ修正docs— ドキュメントのみの変更refactor— リファクタリング(機能変更なし)style— フォーマットのみ(インデント・セミコロンなど)chore— ビルドプロセスやツールの変更perf— パフォーマンス改善test— テスト追加・修正
実際の例:
feat(auth): Googleログイン連携を追加
OAuth2.0の認証フローを実装しました。
Google Cloud ConsoleでAPIキーの発行が必要です。
Closes #42
個人開発であっても、この規約を守るだけで「3ヶ月前の自分」がどんな意図で変更したのかが明確になります。さらに、semantic-releaseなどのツールと組み合わせると、コミットメッセージから自動でバージョン管理・リリースノート生成まで行えます。
9. git reset vs revert vs restore——取り消しをマスターする
Gitの「取り消し」には3種類のコマンドがあり、混乱しやすいポイントです。以下の表で整理します。
| コマンド | 対象 | 履歴 | 使用シーン |
|---|---|---|---|
git restore |
ワーキングツリーの変更 | 変わらない | 「このファイル、いじる前の状態に戻したい」 |
git reset |
コミット/ステージ | 書き換わる | 「さっきのコミット、やっぱりなかったことに」 |
git revert |
コミット | 新しいコミットが追加される | 「過去のコミットを打ち消したい(履歴は残す)」 |
個人開発では以下のように使い分けます。
# ステージングを取り消す(addを取り消し)
git restore --staged file.txt
# ワーキングツリーの変更を破棄
git restore file.txt
# 直前のコミットをなかったことに(push前限定)
git reset --soft HEAD~1 # 変更は残す
git reset --hard HEAD~1 # 変更も消す(注意!)
# リモートにpush済みのコミットを打ち消す
git revert HEAD
git push
git revert は「打ち消しコミット」を作るので、push済みのコミットにも安全に使えます。履歴に「これでXXXを元に戻した」という記録が残るので、共同開発では推奨される方法です。
10. ブランチ戦略——個人開発に最適なフロー
大企業向けのGit Flowのような複雑なブランチ戦略は、個人開発にはオーバーエンジニアリングです。個人開発・少人数チームには次のシンプルなフローがおすすめです。
推奨:GitHub Flow(シンプル版)
- main — 常にデプロイ可能な状態
- feature/xxx — 機能ごとにmainからブランチを作成
- PRを作成 → CIを通す → Squash & Mergeでmainに取り込む
- 定期的にタグ(v1.0.0)を打ってリリース
Squash & Mergeを採用すると、featureブランチの細かいWIPコミットが「1つの意味のあるコミット」にまとまるので、mainの履歴が常にきれいです。
# 今日から始めるGitHub Flow
git checkout main
git pull --rebase
git checkout -b feature/my-new-feature
# 作業 → commit → 作業 → commit
# 完成したら
git push -u origin feature/my-new-feature
gh pr create --fill # PR作成
# GitHub上でSquash & Merge
# ローカルでmainを更新
git checkout main
git pull --rebase
まとめ:小さな習慣が積み重なって大きな差になる
Gitは「使えればOK」というレベルから「使いこなす」レベルに引き上げるだけで、毎日の開発がストレスフリーになります。
今日からすぐ実践できること:
- まずは
.gitconfigにgit lgエイリアスを追加する - コミットメッセージを
feat:/fix:から始める - GitHub CLI(
gh)をインストールしてPR作成を習慣化する - ブランチ戦略を決めて、main直pushをやめる
これらのテクニックは、どれも「今すぐ無料で始められる」ものばかりです。「知ってるけどやってない」を「やっている」に変えるだけで、コード品質と開発速度は確実に変わります。
関連記事として、GitHub Actionsを使ったCI/CD入門ガイドもぜひご覧ください。本記事で紹介したブランチ戦略と組み合わせることで、コミットから自動テスト・自動デプロイまでを完全自動化できます。