Tasuke Hubのロゴ

ITを中心に困っている人を助けるメディア

分かりやすく解決策を提供することで、あなたの困ったをサポート。 全ての人々がスムーズに生活できる世界を目指します。

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

記事のサムネイル
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

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番目のコミットメッセージ

ここで、まとめたいコミットのpicksquash(または短縮形の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つのコミットを対象にする

変更したいコミットのpickreword(または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 statusgit 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 diffgit 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を使った開発作業の効率を大幅に向上させることができます。自分のワークフローに合わせてカスタマイズし、より生産的な開発環境を構築しましょう。

おすすめの書籍

おすすめコンテンツ