Gitの脱初心者コマンド集!開発効率を上げる実践的な使い方

Gitの基本を超える!より効率的なステージング操作
Gitを使い始めたばかりの頃は、git add .
とgit add <ファイル名>
だけで済ませていませんか?しかし、実務では変更が多くなるため、もっと効率的なステージング操作が必要です。ここでは初心者の域を超えた、便利なステージング操作を紹介します。
部分的なステージング(ハンク単位の追加)
ファイルの一部分だけをステージングしたい場合、git add -p
(patchの略)を使うと変更をハンク単位で確認しながらステージングできます。
git add -p
このコマンドを実行すると、変更箇所ごとに以下のような選択肢が表示されます:
Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?
主なオプションは:
y
: このハンクをステージするn
: このハンクをステージしないs
: ハンクをさらに小さく分割するe
: 手動で編集する
対話的なステージング
git add -i
(interactiveの略)を使うと、対話モードでさまざまなステージング操作ができます。
git add -i
このコマンドを実行すると、以下のようなメニューが表示されます:
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
例えば、2: update
を選択すると、変更したファイルの一覧が表示され、数字を入力することでステージングするファイルを選択できます。
ステージングの取り消し
ステージングした変更を取り消すには、git reset HEAD <ファイル名>
を使います。
git reset HEAD index.html
すべてのステージングを取り消す場合:
git reset HEAD
差分の確認
ステージングする前に変更内容を確認することは重要です。
ワーキングディレクトリとステージングエリアの差分を確認:
git diff
ステージングエリアと最新のコミットとの差分を確認:
git diff --staged
これらのコマンドを活用することで、大きなプロジェクトでも変更を細かく管理できるようになります。次のセクションでは、コミット履歴を操作するテクニックを紹介します。
コミット管理の技術!履歴を自在に操作するコマンド
コミット履歴をうまく管理することは、効率的な開発に欠かせません。この章では、コミット履歴を編集・管理する便利なコマンドを紹介します。
コミットメッセージの修正
直前のコミットメッセージを修正するには、--amend
オプションを使います。
git commit --amend -m "新しいコミットメッセージ"
メッセージだけでなく、コミット内容も変更したい場合は、まず変更をステージングしてから同じコマンドを使います。
git add 追加ファイル.txt
git commit --amend
複数のコミットをまとめる(リベース)
作業中に細かくコミットしたけれど、プルリクエストを出す前にきれいにしたい場合は、インタラクティブリベースが役立ちます。
git rebase -i HEAD~3 # 直近3つのコミットを対象にする
このコマンドを実行すると、エディタが開き、以下のような内容が表示されます:
pick abc1234 最初のコミットメッセージ
pick def5678 2番目のコミットメッセージ
pick ghi9012 3番目のコミットメッセージ
ここで、まとめたいコミットのpick
をsquash
(または短縮形のs
)に変更します:
pick abc1234 最初のコミットメッセージ
squash def5678 2番目のコミットメッセージ
squash ghi9012 3番目のコミットメッセージ
保存して閉じると、新しいコミットメッセージを入力するエディタが開きます。
コミットの打ち消し
誤ったコミットを打ち消すには、git revert
を使います。これは新しいコミットを作成し、指定したコミットの変更を打ち消します。
git revert <コミットハッシュ>
複数のコミットを連続して取り消す場合:
git revert <古いコミットハッシュ>..<新しいコミットハッシュ>
コミット履歴の検索
特定の変更が含まれるコミットを探すには、git log -S
を使います。
git log -S "検索文字列"
特定のファイルの変更履歴を見るには:
git log -- <ファイルパス>
コミットの詳細な差分を含めて表示:
git log -p
特定の著者のコミットだけを表示:
git log --author="ユーザー名"
コミット間の差分を確認
2つのコミット間の差分を確認するには:
git diff <古いコミットハッシュ>..<新しいコミットハッシュ>
特定のファイルだけの差分を確認する場合:
git diff <古いコミットハッシュ>..<新しいコミットハッシュ> -- <ファイルパス>
これらのコマンドを使いこなすことで、コミット履歴をより効率的に管理・活用できるようになります。正しいコミット履歴を維持することで、チームでの開発がスムーズになり、問題発生時のデバッグも容易になります。
ブランチ操作のプロ技!開発効率を高める戦略的な使い方
ブランチは効率的な開発のための重要なツールです。以下では、初心者レベルを超えたブランチの操作テクニックを紹介します。
ブランチの作成と切り替えを一度に行う
ブランチの作成と切り替えを一度に行うには、git checkout -b
を使用します。
git checkout -b feature/new-function
Git 2.23以降では、git switch
コマンドを使うこともできます。
git switch -c feature/new-function
作業の一時退避(スタッシュ)
現在の変更を一時的に保存したい場合、git stash
が役立ちます。
git stash
これで変更が一時保存され、ワーキングディレクトリがクリーンな状態になります。後で変更を復元するには:
git stash pop # 最新のスタッシュを適用して削除
または:
git stash apply # 最新のスタッシュを適用(削除しない)
複数のスタッシュを管理する場合:
git stash list # スタッシュ一覧を表示
git stash show stash@{1} # 特定のスタッシュの内容を表示
git stash pop stash@{1} # 特定のスタッシュを適用して削除
特定のコミットやブランチから新しいブランチを作成
特定のコミットから新しいブランチを作成するには:
git branch new-branch <コミットハッシュ>
ブランチのマージ戦略
ブランチをマージする方法にはいくつかあります。
通常のマージ(マージコミットを作成):
git merge feature-branch
Fast-forwardマージ(履歴をリニアに保つ):
git merge --ff-only feature-branch
リベースによるマージ(履歴をリニアに保ちながら変更を統合):
git checkout feature-branch
git rebase main
git checkout main
git merge feature-branch # これはfast-forwardマージになる
ブランチの整理と削除
マージ済みのブランチを一覧表示:
git branch --merged
マージ済みの全ブランチを削除:
git branch --merged | grep -v "\*" | xargs -n 1 git branch -d
リモートで削除されたブランチの参照を削除:
git fetch --prune
ブランチ間の差分を確認
2つのブランチの差分を確認するには:
git diff branch1..branch2
ブランチに含まれるコミットを一覧表示:
git log main..feature-branch
チェリーピック
他のブランチから特定のコミットだけを取り込むには、チェリーピックを使います。
git cherry-pick <コミットハッシュ>
複数のコミットを一度に取り込む場合:
git cherry-pick <コミットハッシュ1> <コミットハッシュ2>
これらのテクニックを使いこなすことで、複雑なプロジェクトでも効率的にブランチを管理できるようになります。特に複数の機能を並行して開発する場合や、大規模なチームで作業する場合に役立ちます。
リモートリポジトリとの連携を強化するテクニック
チーム開発では、リモートリポジトリとの効率的な連携が不可欠です。ここでは、リモートリポジトリを扱うための高度なテクニックを紹介します。
リモートの詳細な設定
リモートリポジトリの一覧を表示:
git remote -v
新しいリモートリポジトリを追加:
git remote add upstream https://github.com/original/repository.git
リモートリポジトリのURLを変更:
git remote set-url origin https://github.com/new/repository.git
リモートブランチの管理
リモートブランチを一覧表示:
git branch -r
リモートブランチをローカルにチェックアウト:
git checkout -b local-branch origin/remote-branch
または、Git 2.23以降では:
git switch -c local-branch origin/remote-branch
リモート追跡ブランチの設定
既存のローカルブランチをリモートブランチに追跡設定:
git branch -u origin/feature-branch
# または
git branch --set-upstream-to=origin/feature-branch
プッシュ時に追跡設定:
git push -u origin feature-branch
フォークしたリポジトリの同期
オリジナルのリポジトリ(上流リポジトリ)からの変更を自分のフォークに取り込む:
# 上流リポジトリを追加(初回のみ)
git remote add upstream https://github.com/original/repository.git
# 上流リポジトリから最新の変更を取得
git fetch upstream
# 上流リポジトリの変更をローカルのmainブランチに適用
git checkout main
git merge upstream/main
リモートブランチの詳細情報を取得
リモートリポジトリの最新情報を取得:
git fetch --all
プルネ(prune)オプションを使ってリモートで削除されたブランチの参照も削除:
git fetch --all --prune
複数のリモートリポジトリの管理
同じプロジェクトに対して複数のリモートリポジトリがある場合、それぞれにpush/pullできます:
# プッシュ先を指定
git push origin feature-branch
git push upstream feature-branch
# プル元を指定
git pull origin main
git pull upstream main
リモートタグの管理
リモートのすべてのタグを取得:
git fetch --tags
特定のタグをリモートにプッシュ:
git push origin v1.0.0
すべてのタグをリモートにプッシュ:
git push origin --tags
リモートでの変更を確認
プルする前にリモートの変更を確認:
git fetch
git diff main origin/main
これらのテクニックを活用することで、複雑なリモートリポジトリ環境でも効率的に作業できるようになります。特に複数人での開発や、オープンソースプロジェクトへの貢献時に役立ちます。
トラブルシューティング!Git使用中の問題を解決するコマンド
Gitを使用していると、さまざまな問題に遭遇することがあります。ここでは、よくある問題とその解決方法を紹介します。
コミット履歴のトラブル解決
直前のコミットを取り消す
まだプッシュしていない直前のコミットを完全に取り消すには:
git reset --hard HEAD~1
変更内容を残しながらコミットだけを取り消す場合:
git reset --soft HEAD~1
誤ってコミットした内容を修正
ファイルを誤って追加した場合や、コミット内容を修正したい場合:
git rm --cached <誤って追加したファイル> # ステージングから削除
# または
git add <忘れたファイル> # 忘れたファイルを追加
git commit --amend # 直前のコミットを修正
過去のコミットメッセージを修正
過去のコミットメッセージを修正するには、インタラクティブリベースを使用します:
git rebase -i HEAD~3 # 直近3つのコミットを対象にする
変更したいコミットのpick
をreword
(またはr
)に変更し、エディタを保存して閉じます。その後、新しいメッセージを入力します。
マージ関連のトラブル
マージ中のコンフリクト解決
マージ中にコンフリクトが発生した場合:
git status # コンフリクトしたファイルを確認
# コンフリクトしたファイルを編集して解決
git add <解決したファイル> # 解決したファイルをステージング
git merge --continue # マージを続行
または:
git merge --abort # マージを中止して元の状態に戻る
マージコミットを避ける
マージコミットを作成せずにリベースでブランチを更新する:
git pull --rebase origin main
ファイル関連のトラブル
ファイルの変更を元に戻す
まだコミットしていない変更を元に戻す:
git checkout -- <ファイル名> # 特定のファイルの変更を元に戻す
# または
git restore <ファイル名> # Git 2.23以降
すべての変更を元に戻す:
git reset --hard HEAD
削除したファイルを復元
誤って削除したファイルを復元する:
git checkout HEAD -- <削除したファイル名>
.gitignoreが効かない
すでにGitで追跡されているファイルを.gitignoreに追加しても効かない場合:
git rm --cached <ファイル名> # ファイルをステージングから削除するが、ワーキングディレクトリには残す
git add .gitignore
git commit -m "Update .gitignore"
リモートリポジトリのトラブル
プッシュの競合
リモートブランチに他の人の変更がある場合、プッシュが拒否されることがあります:
git pull # リモートの変更を取り込む
# コンフリクトがあれば解決
git push # 再度プッシュ
または、リベースを使う場合:
git pull --rebase # リモートの変更を取り込みつつ、自分の変更を再適用
git push # 再度プッシュ
間違ったリモートブランチにプッシュした
間違ったリモートブランチにプッシュした場合、正しいブランチにプッシュし直し、間違ったブランチを削除:
git push origin <正しいブランチ名> # 正しいブランチにプッシュ
git push origin --delete <間違ったブランチ名> # 間違ったブランチを削除
その他のトラブルシューティング
操作履歴の確認
Gitの操作履歴を確認して、問題が発生した地点を特定:
git reflog
特定のコミットに戻りたい場合:
git reset --hard <コミットハッシュ>
大きなファイルをコミットしてしまった
誤って大きなファイルをコミットして、リポジトリが肥大化した場合:
# 直前のコミットから特定のファイルを削除
git rm --cached <大きなファイル>
git commit --amend
履歴から完全に削除するには、より複雑な操作が必要になります(例:git-filterrepoツールの使用)。
パフォーマンスの問題
リポジトリのパフォーマンスが低下した場合、Gitのガベージコレクションを実行:
git gc
これらのトラブルシューティング技術を知っておくことで、Gitを使っていて問題が発生した場合も、冷静に対処できるようになります。定期的にバックアップを取っておくことも重要です。
Git活用の極意!自動化とエイリアスで作業を効率化
Gitをさらに効率的に活用するための極意として、自動化とエイリアスの活用方法を紹介します。これらのテクニックを使って、日々の作業をスピードアップしましょう。
Gitのエイリアス設定
頻繁に使うコマンドをエイリアス(別名)として設定することで、タイピング量を減らし作業効率を上げることができます。
基本的なエイリアスの設定
Gitのエイリアスは以下のように設定します:
git config --global alias.<エイリアス名> '<コマンド>'
例えば、git status
をgit st
として設定するには:
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 --date=relative"
このコマンドを設定すると、git lg
とタイプするだけで、グラフィカルなコミット履歴が表示されます。
その他の便利なエイリアス例:
# 変更の概要を表示
git config --global alias.stat 'status -s'
# 直前のコミットを修正
git config --global alias.amend 'commit --amend'
# 変更をステージングして直前のコミットに追加
git config --global alias.fixup 'commit --amend --no-edit'
# ブランチ一覧をより詳細に表示
git config --global alias.br 'branch -v'
# コミットを1行で表示
git config --global alias.l 'log --oneline'
# 最新のコミットを表示
git config --global alias.last 'log -1 HEAD'
Git Hooks(フック)を活用した自動化
Git Hooksは、特定のGitイベントが発生した時に自動的に実行されるスクリプトです。代表的なHooksには以下があります:
pre-commit
: コミット前に実行post-commit
: コミット後に実行pre-push
: プッシュ前に実行post-checkout
: チェックアウト後に実行
pre-commitフックの例
コミット前に構文チェックを自動実行する例:
# .git/hooks/pre-commit(実行権限を付与すること)
#!/bin/bash
# JavaScriptファイルの構文チェック
FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.js$')
if [ "$FILES" != "" ]; then
echo "JavaScriptファイルの構文チェックを実行中..."
for FILE in $FILES; do
npx eslint $FILE
if [ $? -ne 0 ]; then
echo "エラー: $FILE の構文チェックに失敗しました。"
exit 1
fi
done
fi
exit 0
このスクリプトを.git/hooks/pre-commit
として保存し、実行権限を付与することで、コミット前に自動的にJavaScriptファイルの構文チェックが行われます。
外部ツールとの連携
Gitの機能を拡張するために、外部ツールとの連携も有効です。
便利な外部ツール例
- git-flow: ブランチモデルを自動化するツール
- git-lfs: 大きなファイルを効率的に管理するツール
- git-filter-repo: リポジトリの歴史を編集するツール
- git-delta: 差分表示を改善するツール
例えば、git-deltaをインストールすると、git diff
やgit show
の出力が見やすくなります:
# git-deltaのインストール(macOSの場合)
brew install git-delta
# .gitconfigに設定を追加
git config --global core.pager "delta"
git config --global interactive.diffFilter "delta --color-only"
Gitの設定ファイルのカスタマイズ
Gitの動作をカスタマイズするために、.gitconfig
ファイルを編集することもできます。例えば:
[user]
name = あなたの名前
email = あなたのメール
[core]
editor = vim
autocrlf = input
[color]
ui = auto
[pull]
rebase = true
[alias]
st = status
co = checkout
br = branch
ci = commit
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
シェルスクリプトでの自動化
より複雑な操作は、シェルスクリプトで自動化することができます。たとえば、以下のスクリプトは現在のブランチをリベースし、プッシュします:
#!/bin/bash
# 現在のブランチ名を取得
current_branch=$(git rev-parse --abbrev-ref HEAD)
echo "ブランチ $current_branch を更新中..."
# mainブランチに切り替えて最新化
git checkout main
git pull origin main
# 元のブランチに戻ってリベース
git checkout $current_branch
git rebase main
# リベースが成功したらプッシュ
if [ $? -eq 0 ]; then
git push -f origin $current_branch
echo "ブランチ $current_branch を正常に更新しました。"
else
echo "リベースでコンフリクトが発生しました。手動で解決してください。"
fi
これらの自動化テクニックを活用することで、Gitを使った開発作業の効率を大幅に向上させることができます。自分のワークフローに合わせてカスタマイズし、より生産的な開発環境を構築しましょう。