Git & GitHub Tips集:知っておくと便利なコマンド・操作まとめ

スポンサーリンク

Git & GitHub Tips集:知っておくと便利なコマンド・操作まとめ

はじめに

日常のGit・GitHub操作で「これ知っておくと便利」なTipsをまとめます。基本コマンドは知っているけど、もう一歩踏み込んだ使い方を探している方向けです。


pull・fetch・rebase の違い

git pull とは

git pullgit fetch + git merge を一度に行うショートカットです。

git pull origin main
# 上と同じ意味
git fetch origin main
git merge origin/main

fetch + merge vs fetch + rebase

リモートの変更を取り込む方法は2つあります。

fetch + merge(デフォルト)

git fetch origin
git merge origin/main

ローカルの変更とリモートの変更をマージコミットで統合します。

      A---B---C  (ローカル)
     /         \
D---E---F---G---H  (マージ後)
         (リモート)
  • 履歴にマージコミットが残る
  • 作業の並行性がそのまま記録される
  • コンフリクトは1回だけ解決すれば済む

fetch + rebase

git fetch origin
git rebase origin/main

ローカルのコミットをリモートの最新コミットの上に「積み直し」ます。

              A'--B'--C'  (rebase後のローカル)
             /
D---E---F---G  (リモート)
  • 履歴が一直線になる(マージコミットが残らない)
  • git log が見やすくなる
  • コンフリクトがある場合はコミットごとに解決が必要

pull --rebase

git pull --rebase origin main

fetch + rebase を一度に行います。チームで「マージコミットを残さない」運用にしている場合に使います。デフォルト動作を変更するには:

git config --global pull.rebase true

どちらを使うか

状況 推奨
チームの運用ルールがある それに従う
履歴を一直線に保ちたい rebase
並行作業の経緯を残したい merge
共有ブランチ(main等)への取り込み merge
個人の作業ブランチの更新 rebase

共有ブランチにプッシュ済みのコミットを rebase すると他の人の履歴と食い違うため、自分だけが使っているブランチにのみ rebase を使うのが基本です。


ブランチ管理

マージ済みブランチを一括削除する

main にマージ済みのローカルブランチを一括で削除します。

git branch --merged main | grep -v '^\*\|main\|master\|develop' | xargs git branch -d
  • git branch --merged mainmain にマージ済みのブランチ一覧を取得
  • grep -vmainmasterdevelop・現在のブランチ(*)を除外
  • xargs git branch -d — 残ったブランチを削除(-d は安全削除。未マージなら失敗する)

リモートのマージ済みブランチを削除する場合:

git push origin --delete <branch-name>

GitHub上でPRマージ時に「Delete branch」を設定しておくと自動削除されます。

リモートで削除されたブランチをローカルから掃除する

git fetch --prune
# または
git remote prune origin

GitHub上で削除済みのリモートブランチへの参照が残っている場合に使います。--prune を毎回付けるのが面倒なら設定で自動化できます。

git config --global fetch.prune true

ブランチ名を変更する

# 現在のブランチ名を変更
git branch -m 新しい名前

# 別のブランチ名を変更
git branch -m 古い名前 新しい名前

コミット操作

直前のコミットメッセージを修正する

git commit --amend -m "修正後のメッセージ"

まだ push していないコミットにのみ使います。push 済みのコミットを amend すると履歴が書き換わります。

直前のコミットにファイルを追加する

git add 追加ファイル
git commit --amend --no-edit   # メッセージはそのまま

コミットを分割・まとめる(インタラクティブrebase)

git rebase -i HEAD~3   # 直近3コミットを操作

エディタが開き、各コミットに対して操作を選べます。

コマンド 意味
pick そのまま使う
reword メッセージを書き換える
squash 前のコミットにまとめる
fixup squashと同じだがメッセージは破棄
drop コミットを削除

特定のコミットだけ別ブランチに持ってくる

git cherry-pick <commit-hash>

変更の退避

作業中の変更を一時退避する(stash)

git stash          # 退避
git stash pop      # 復元して削除
git stash apply    # 復元して残す
git stash list     # 一覧
git stash drop     # 最新のstashを削除

未追跡ファイル(git add していないファイル)も含めて退避する:

git stash -u

名前を付けて退避する:

git stash push -m "作業中: ログイン機能"
git stash apply stash@{0}

ログ・差分の確認

ログを見やすく表示する

git log --oneline --graph --decorate --all

エイリアスに登録しておくと便利です:

git config --global alias.lg "log --oneline --graph --decorate --all"
git lg

特定のファイルの変更履歴を見る

git log --follow -p articles/git-github-tips.md

特定の文字列を含むコミットを探す

git log -S "検索したい文字列"

ブランチ間の差分を確認する

git diff main..feature/my-branch
git diff main...feature/my-branch   # 分岐点からの差分

誤操作のリカバリ

変更を取り消す

# ステージングを取り消す(ファイルは残る)
git restore --staged <file>

# ワーキングツリーの変更を取り消す(元に戻す)
git restore <file>

# 全ファイルを直前のコミット状態に戻す
git restore .

コミットを取り消す

# コミットを取り消してステージング状態に戻す(履歴は消える)
git reset --soft HEAD~1

# コミットを取り消してワーキングツリーに戻す
git reset HEAD~1

# コミットを完全に取り消す(変更も消える・要注意)
git reset --hard HEAD~1

削除したブランチを復元する

git reflog                          # 操作履歴からハッシュを探す
git checkout -b 復元ブランチ名 <hash>

reflog はローカルの全操作履歴を保持しており、--hard reset や誤削除からの復元に使えます。


.gitignore

グローバルな .gitignore を設定する

OS固有ファイル(.DS_StoreThumbs.db)やエディタ設定をリポジトリごとに書かなくて済みます。

git config --global core.excludesfile ~/.gitignore_global
# ~/.gitignore_global
.DS_Store
.idea/
.vscode/
*.swp

既に追跡しているファイルを .gitignore で除外する

git rm --cached <file>

.gitignore に追加しただけでは、すでに追跡中のファイルは除外されません。


GitHub CLI(gh)

# PRを作成する
gh pr create --title "タイトル" --body "説明"

# PRの一覧を見る
gh pr list

# PRをブラウザで開く
gh pr view --web

# Issueを作成する
gh issue create --title "タイトル"

# リポジトリをクローンする
gh repo clone user/repo

# ワークフローの実行状況を確認する
gh run list
gh run view

まとめ

やりたいこと コマンド
マージ済みブランチ一括削除 git branch --merged main | grep -v '^\*|main' | xargs git branch -d
リモート削除済みブランチの掃除 git fetch --prune
変更を退避 git stash
退避を復元 git stash pop
直前のコミット修正 git commit --amend
変更を取り消す git restore <file>
操作履歴を見る git reflog
ログをグラフ表示 git log --oneline --graph --decorate --all
PRを作成 gh pr create

特定文字列を変更したコミット・PRを追跡する方法は「GitHubで特定文字列を変更したコミットとPRを特定する方法:git log -S の使い方」を参照してください。

PRやIssueの絞り込みには「GitHub PRとIssueのフィルター検索:is:merged is:openまとめ」も参照してください。