7. リモートリポジトリ操作

GitHubやGitLabなどのリモートリポジトリとの連携は、現代の開発フローにおいて必須です。 fetch、pull、pushなどのリモート操作を習得しましょう。

リモートリポジトリの基本

リモートリポジトリは、ネットワーク上(GitHub、GitLabなど)やローカルネットワーク上に存在するGitリポジトリです。 チーム開発では、リモートリポジトリを介してコードを共有します。

リモートの確認と追加

# リモートリポジトリの一覧表示
git remote

# リモートリポジトリの詳細情報(URL含む)
git remote -v
git remote --verbose

# リモートリポジトリを追加
git remote add origin https://github.com/username/repository.git

# 複数のリモートを追加(フォーク元など)
git remote add upstream https://github.com/original/repository.git

# SSHでリモートを追加(推奨)
git remote add origin git@github.com:username/repository.git

# 特定のリモートの詳細情報
git remote show origin

リモートの変更と削除

# リモートのURLを変更
git remote set-url origin https://github.com/username/new-repository.git

# HTTPSからSSHに変更
git remote set-url origin git@github.com:username/repository.git

# リモートの名前を変更
git remote rename origin upstream

# リモートを削除
git remote remove origin
git remote rm origin

Fetch(フェッチ)

リモートの変更を取得しますが、ローカルブランチには自動でマージしません。 安全に変更内容を確認してからマージできます。

# デフォルトリモート(origin)から取得
git fetch

# 特定のリモートから取得
git fetch origin
git fetch upstream

# 特定のブランチのみ取得
git fetch origin main

# すべてのリモートから取得
git fetch --all

# タグも含めて取得
git fetch --tags

# 削除されたリモートブランチの参照も削除
git fetch --prune
git fetch -p

# Fetch後の確認とマージ
git log HEAD..origin/main  # リモートの変更を確認
git diff HEAD..origin/main  # 差分を確認
git merge origin/main       # 問題なければマージ

Pull(プル)

FetchとMergeを組み合わせたコマンドです。 リモートの変更を取得して、現在のブランチに自動的にマージします。

# 現在のブランチにpull(fetch + merge)
git pull

# 特定のリモート・ブランチからpull
git pull origin main

# Rebaseでpull(fetch + rebase)
git pull --rebase
git pull -r

# Fast-forwardのみ許可
git pull --ff-only

# すべてのサブモジュールも更新
git pull --recurse-submodules

# Pullの設定
git config --global pull.rebase true  # デフォルトでRebase
git config --global pull.ff only      # Fast-forwardのみ許可

Push(プッシュ)

ローカルの変更をリモートリポジトリに送信します。 チームメンバーと作業を共有するための重要なコマンドです。

# 現在のブランチをpush
git push

# 特定のリモート・ブランチにpush
git push origin main

# 初回push時に上流ブランチを設定
git push -u origin feature-login
git push --set-upstream origin feature-login

# すべてのブランチをpush
git push --all origin

# すべてのタグをpush
git push --tags origin

# リモートブランチを削除
git push origin --delete feature-branch
git push origin :feature-branch  # 古い書き方

# 強制push(注意!)
git push --force origin main
git push -f origin main

# 安全な強制push(推奨)
git push --force-with-lease origin main

クローンとフォーク

リモートリポジトリをローカルにコピーする操作です。

# リポジトリをクローン
git clone https://github.com/username/repository.git

# 特定のブランチをクローン
git clone -b develop https://github.com/username/repository.git

# 浅いクローン(履歴の一部のみ)
git clone --depth 1 https://github.com/username/repository.git

# サブモジュールも含めてクローン
git clone --recurse-submodules https://github.com/username/repository.git

# フォークベースのワークフロー
# 1. GitHubでフォーク
# 2. フォークをクローン
git clone https://github.com/your-username/repository.git
cd repository

# 3. 元のリポジトリをupstreamとして追加
git remote add upstream https://github.com/original/repository.git

# 4. upstreamの最新を取得
git fetch upstream
git checkout main
git merge upstream/main

リモートブランチの操作

リモートブランチを確認・管理する方法です。

# リモートブランチの一覧
git branch -r

# すべてのブランチ(ローカル+リモート)
git branch -a

# リモートブランチをチェックアウト(追跡ブランチを自動作成)
git checkout feature-login  # origin/feature-loginが存在する場合
git switch feature-login

# リモートブランチから新しいブランチを作成
git checkout -b feature-login origin/feature-login
git switch -c feature-login origin/feature-login

# 削除されたリモートブランチの参照を削除
git remote prune origin
git fetch --prune

トラブルシューティング

よくある問題と解決方法です。

non-fast-forwardエラー

# エラー: Updates were rejected because the tip of your current branch is behind

# 解決方法1: Pullしてからpush
git pull origin main
git push origin main

# 解決方法2: Rebaseしてからpush
git pull --rebase origin main
git push origin main

# 解決方法3: 強制push(注意!)
git push --force-with-lease origin main

認証エラー

# SSH接続のテスト
ssh -T git@github.com

# SSH鍵を追加
ssh-add ~/.ssh/id_rsa

# HTTPSからSSHへ変更
git remote set-url origin git@github.com:user/repo.git

8. 一時保存(Stash)

作業中の変更を一時的に退避して、後で復元する機能です。 ブランチ切り替えやpull前に便利です。

基本的なStash

変更を保存して作業ディレクトリをクリーンにする方法です。

# 変更をstash
git stash
git stash save  # 古い書き方

# メッセージ付きでstash
git stash save "WIP: working on feature"
git stash push -m "WIP: working on feature"  # 新しい書き方

# 未追跡ファイルも含めてstash
git stash -u
git stash --include-untracked

# すべて(.gitignoreのファイルも)含めてstash
git stash -a
git stash --all

# 特定のファイルのみstash
git stash push -m "Partial stash" path/to/file.txt
git stash push -- file1.txt file2.txt

Stashの確認と適用

保存したstashを確認・復元する方法です。

# Stashの一覧
git stash list

# Stashの内容を確認
git stash show
git stash show stash@0
git stash show -p  # 差分も表示
git stash show -p stash@1

# 最新のstashを適用(stashは残る)
git stash apply

# 特定のstashを適用
git stash apply stash@2

# 最新のstashを適用して削除
git stash pop

# 特定のstashをpop
git stash pop stash@1

Stashの管理

stashを削除したり、整理する方法です。

# 最新のstashを削除
git stash drop

# 特定のstashを削除
git stash drop stash@1

# すべてのstashを削除
git stash clear

# Stashからブランチを作成
git stash branch new-branch-name
git stash branch new-branch stash@1

# Stashの説明を変更することはできないので、
# 新しく作り直す必要がある

Stashの高度な使い方

より柔軟なstash操作です。

# ステージングを保持してstash
git stash --keep-index

# パッチモードでstash(対話的に選択)
git stash -p
git stash --patch

# Stashを別のブランチに適用
git checkout other-branch
git stash apply stash@0

# Stashの内容を作業ツリーに適用してからコミット
git stash show -p | git apply
git add .
git commit -m "Apply stashed changes"

# コンフリクトが発生した場合
git stash apply
# CONFLICT...
# 解決して
git add .
# stashは自動的に削除されないので手動で削除
git stash drop

実用例

日常的な開発での使用例です。

ブランチ切り替え前に変更を退避

# 作業中に別のブランチに切り替える必要が出た
git stash save "WIP: feature A"
git checkout other-branch
# 作業...
git checkout feature-a
git stash pop

Pull前に変更を退避

# 未コミットの変更がある状態でpullする
git stash
git pull origin main
git stash pop
# コンフリクトがあれば解決

間違ったブランチで作業してしまった

# 間違ったブランチで作業していたことに気づいた
git stash
git checkout correct-branch
git stash pop
git add .
git commit -m "Correct branch commit"

複数の作業を切り替える

# 作業Aを一時保存
git stash save "WIP: feature A"

# 作業Bを開始
# ...

# 作業Bも一時保存
git stash save "WIP: feature B"

# 作業Aに戻る
git stash list
# stash@0: WIP: feature B
# stash@1: WIP: feature A
git stash apply stash@1

Stashの注意点

Stashの仕様と運用上の注意です。

# Stashは90日間保持される(デフォルト)
# それ以降は自動的に削除される可能性がある

# Stashは個人のローカル環境のみ
# リモートリポジトリには送信されない

# Stashが多くなると管理が大変
# 定期的に整理することを推奨
git stash list
git stash clear  # 不要なものを削除

# 重要な変更は stash よりもコミットを推奨
# stashは一時的な退避用途に限定する