Gitリモートリポジトリ操作コマンド解説

リモートリポジトリ操作

git remote - リモートリポジトリの管理

リモートリポジトリの追加、削除、表示などを行います。

オプション/サブコマンド 説明
add <名前> <URL> 新しいリモートリポジトリを追加
remove <名前> リモートリポジトリを削除
rename <古い名前> <新しい名前> リモートリポジトリの名前を変更
-v, --verbose リモートリポジトリの名前とURLを表示
show <名前> 指定したリモートリポジトリの詳細情報を表示

例:

git remote - リモートリポジトリの一覧を表示
git remote -v - リモートリポジトリの一覧とURLを表示
git remote add origin https://github.com/username/repo.git - originという名前でリモートリポジトリを追加
git remote remove origin - originリモートを削除
git remote rename origin upstream - originリモートの名前をupstreamに変更
git remote show origin - originリモートの詳細情報を表示

git push - ローカルの変更をリモートリポジトリに送信

ローカルブランチの変更をリモートリポジトリに送信します。

オプション 説明
-u, --set-upstream アップストリームブランチを設定(以降は引数なしでpush可能)
--force, -f リモートブランチを強制的に上書き(注意: 履歴が書き換わる)
--force-with-lease リモートブランチが予期せず変更されていない場合のみ強制プッシュ
--tags すべてのタグをプッシュ
--delete リモートブランチを削除

例:

git push origin main - ローカルのmainブランチをoriginリモートにプッシュ
git push -u origin feature - featureブランチをプッシュし、アップストリームとして設定
git push - 現在のブランチを設定済みのアップストリームにプッシュ
git push --force origin main - mainブランチを強制的にプッシュ(注意して使用)
git push --force-with-lease origin main - 安全な強制プッシュ
git push origin --delete feature - リモートのfeatureブランチを削除

git pull - リモートの変更をローカルリポジトリに取り込む

リモートブランチの変更をローカルブランチに取り込みます(fetch + merge)。

オプション 説明
--rebase マージの代わりにリベースを使用
--no-commit 自動コミットせずに変更をステージング
--ff-only Fast-forwardのみ許可(マージコミットを作成しない)
--prune リモートで削除されたブランチの参照を削除

例:

git pull - 現在のブランチに対応するリモートブランチから変更を取得してマージ
git pull origin main - originリモートのmainブランチから変更を取得してマージ
git pull --rebase - リモートの変更を取得し、ローカルの変更をリベース
git pull --ff-only - Fast-forwardできる場合のみプル(マージコミットを作成しない)

git fetch - リモートの変更をローカルに取得(マージはしない)

リモートリポジトリから変更を取得しますが、ローカルブランチにはマージしません。

オプション 説明
--all すべてのリモートから取得
--prune リモートで削除されたブランチの参照を削除
--tags すべてのタグを取得
--depth=<深さ> 指定した深さまでの履歴のみを取得

例:

git fetch - デフォルトリモート(通常はorigin)から変更を取得
git fetch origin - originリモートから変更を取得
git fetch --all - すべてのリモートから変更を取得
git fetch --prune - リモートで削除されたブランチの参照も削除
git fetch origin main - originリモートのmainブランチのみ取得

git pullとgit fetchの違い - 詳細な比較

git pullgit fetchはどちらもリモートリポジトリからデータを取得するコマンドですが、 その動作と用途には重要な違いがあります。

基本的な違い

git fetch git pull
リモートリポジトリからデータを取得するだけで、ローカルの作業ブランチには変更を加えない リモートリポジトリからデータを取得し、自動的にローカルの作業ブランチにマージ(または指定した場合はリベース)する
安全な操作:現在の作業に影響を与えない マージによってコンフリクトが発生する可能性がある
2ステップ操作の最初のステップ(後で手動でマージするため) 1ステップ操作(fetchとmergeを自動的に実行)

内部動作の違い

git fetchの動作:

  1. リモートリポジトリから最新のコミット履歴をダウンロード
  2. ローカルのrefs/remotes/を更新(例:refs/remotes/origin/main
  3. ローカルの作業ブランチ(refs/heads/mainなど)は変更されない
  4. ダウンロードしたコミットはローカルの.git/objectsディレクトリに保存される

git pullの動作:

  1. git fetchを実行してリモートの変更を取得
  2. その後、自動的にgit merge(または--rebaseオプションを指定した場合はgit rebase)を実行
  3. ローカルの作業ブランチが更新される

使い分けのポイント

git fetchを使うべき場合:

  • リモートの変更を確認してから統合したい場合
  • マージする前に変更内容を詳しく調査したい場合
  • 現在の作業を中断せずにリモートの最新状態を知りたい場合
  • 複数のリモートブランチの変更を選択的に統合したい場合

git pullを使うべき場合:

  • リモートの変更をすぐに統合したい場合
  • リモートの変更が自分の作業と競合しないことが分かっている場合
  • 迅速に最新の状態に更新したい場合

fetchした後の変更確認とマージ

fetchした後、以下のコマンドでリモートとの差分を確認できます:

git diff main origin/main - ローカルのmainブランチとリモートのmainブランチの差分を表示
git log main..origin/main - リモートにあって、ローカルにないコミットを表示
git log -p main..origin/main - 差分のあるコミットの詳細な変更内容も表示

確認後、マージする場合は:

git merge origin/main - リモートの変更をローカルブランチにマージ
git rebase origin/main - リモートの変更をベースにローカルの変更を再適用

ワークフロー例: 多くの開発者は、git fetchを使って変更を確認してから、明示的にgit mergeまたはgit rebaseを実行するワークフローを好みます。これにより、リモートの変更を統合する前に、その内容を理解し、潜在的な問題を特定する機会が得られます。