はじめに

チーム開発やオープンソースプロジェクトへの参加では、GitHubなどのリモートリポジトリとの連携が欠かせません。ローカルで作成したコミットをリモートに反映したり、他のメンバーの変更を取り込んだりする操作は、日常的に発生します。

本記事では、GitHubリモートリポジトリとの連携に必要なコマンドを体系的に解説します。git remoteによるリモートの管理、git cloneによるリポジトリの複製、git push/git pull/git fetchによる同期操作、そしてリモートブランチの追跡とoriginの概念まで、実践的な例とともに紹介します。この記事を読み終えると、以下のことができるようになります。

  • git remoteでリモートリポジトリを管理できる
  • git cloneでリモートリポジトリを複製できる
  • git pushでローカルの変更をリモートに反映できる
  • git fetchでリモートの変更を取得できる
  • git pullでリモートの変更を取得してマージできる
  • リモートブランチの追跡(tracking)を理解し設定できる
  • originの意味と役割を説明できる

実行環境と前提条件

本記事の内容は、以下の環境で動作確認を行っています。

項目 要件
Git 2.40以上
OS Windows 10/11、macOS 12以上、Ubuntu 22.04以上
ターミナル コマンドプロンプト、PowerShell、Terminal.app、bash等
エディタ VS Code推奨

前提条件として、以下の知識があることを想定しています。

  • コマンドライン操作の基礎知識(cdls/dirmkdir等)
  • テキストエディタの基本操作
  • Gitの基本コマンド(git initgit addgit commitgit statusgit log)の理解
  • GitHubアカウントの作成とSSH鍵またはHTTPS認証の設定

Gitのバージョンは以下のコマンドで確認できます。

1
git --version

リモートリポジトリとは

リモートリポジトリとは、ネットワーク上に存在するGitリポジトリのことです。GitHub、GitLab、Bitbucketなどのホスティングサービスで提供されるリポジトリが代表例です。

ローカルリポジトリとリモートリポジトリの関係

Gitは分散型バージョン管理システムであり、各開発者のローカルマシンに完全なリポジトリのコピーを持ちます。リモートリポジトリは、チームメンバー間でコードを共有するための中央ハブとして機能します。

┌─────────────────────────────────────────────────────────────┐
│                    GitHub(リモート)                        │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              origin (リモートリポジトリ)              │   │
│  │  main ─── commit A ─── commit B ─── commit C        │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                              ↑↓
           git push / git fetch / git pull / git clone
                              ↑↓
┌─────────────────────────────────────────────────────────────┐
│                  ローカルマシン                              │
│                                                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │            ローカルリポジトリ                         │   │
│  │  main ─── commit A ─── commit B ─── commit C        │   │
│  │  origin/main(リモート追跡ブランチ)                   │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘

originとは何か

originは、リモートリポジトリのデフォルトの名前(エイリアス)です。git cloneでリポジトリを複製すると、クローン元のリモートリポジトリが自動的にoriginという名前で登録されます。

originは単なる慣習的な名前であり、技術的には任意の名前に変更できます。ただし、多くのツールやドキュメントがoriginを前提としているため、特別な理由がない限りこの名前を使用することを推奨します。

git remoteでリモートリポジトリを管理する

git remoteコマンドは、リモートリポジトリの登録・確認・削除などを行うためのコマンドです。

登録済みリモートの一覧表示

1
2
3
4
5
# リモート名の一覧を表示
git remote

# URLも含めて詳細表示
git remote -v

期待される出力は以下の通りです。

origin  https://github.com/username/repository.git (fetch)
origin  https://github.com/username/repository.git (push)

(fetch)(push)は、それぞれ取得用と送信用のURLを示しています。通常は同じURLですが、別々に設定することも可能です。

リモートリポジトリの追加

既存のローカルリポジトリにリモートを追加する場合は、git remote addを使用します。

1
2
# 構文: git remote add <リモート名> <URL>
git remote add origin https://github.com/username/repository.git

複数のリモートを登録することも可能です。例えば、フォークしたリポジトリで元のリポジトリをupstreamとして追加する場合は以下のようにします。

1
2
3
4
5
# オリジナルのリポジトリをupstreamとして追加
git remote add upstream https://github.com/original-owner/repository.git

# 確認
git remote -v

期待される出力は以下の通りです。

origin    https://github.com/username/repository.git (fetch)
origin    https://github.com/username/repository.git (push)
upstream  https://github.com/original-owner/repository.git (fetch)
upstream  https://github.com/original-owner/repository.git (push)

リモートリポジトリのURLを変更する

リポジトリのURLが変更された場合や、HTTPSからSSHに切り替える場合は、git remote set-urlを使用します。

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

# 確認
git remote -v

リモートリポジトリの削除

不要になったリモートを削除するには、git remote removeを使用します。

1
git remote remove upstream

リモートリポジトリの情報を表示する

特定のリモートの詳細情報を確認するには、git remote showを使用します。

1
git remote show origin

期待される出力は以下の通りです。

* remote origin
  Fetch URL: https://github.com/username/repository.git
  Push  URL: https://github.com/username/repository.git
  HEAD branch: main
  Remote branches:
    develop tracked
    feature-a tracked
    main tracked
  Local branches configured for 'git pull':
    develop merges with remote develop
    main merges with remote main
  Local refs configured for 'git push':
    develop pushes to develop (up to date)
    main pushes to main (up to date)

git cloneでリモートリポジトリを複製する

git cloneは、リモートリポジトリをローカルに複製するコマンドです。リポジトリ全体のコピー(履歴を含む)を取得し、自動的にoriginとしてリモートを登録します。

基本的なclone操作

1
2
3
4
5
# HTTPS経由でクローン
git clone https://github.com/username/repository.git

# SSH経由でクローン
git clone git@github.com:username/repository.git

クローンが完了すると、リポジトリ名と同じディレクトリが作成され、その中にすべてのファイルと.gitディレクトリが配置されます。

ディレクトリ名を指定してclone

デフォルトではリポジトリ名がディレクトリ名になりますが、別の名前を指定することもできます。

1
git clone https://github.com/username/repository.git my-project

特定のブランチのみをclone

大規模なリポジトリで特定のブランチのみが必要な場合は、--single-branchオプションを使用します。

1
git clone --single-branch --branch develop https://github.com/username/repository.git

浅いクローン(shallow clone)

履歴が大きなリポジトリで、最新のコミットのみが必要な場合は、--depthオプションで取得するコミット数を制限できます。

1
2
# 最新の1コミットのみ取得
git clone --depth 1 https://github.com/username/repository.git

浅いクローンは、CI/CDパイプラインでのビルドや、一時的なコードの確認に便利です。ただし、履歴を遡る操作には制限があります。

cloneで自動的に行われる設定

git cloneを実行すると、以下の設定が自動的に行われます。

  1. リモートリポジトリがoriginとして登録される
  2. デフォルトブランチ(通常はmainまたはmaster)がチェックアウトされる
  3. ローカルブランチがリモートブランチを追跡するように設定される
  4. リモートブランチに対応するリモート追跡ブランチ(origin/mainなど)が作成される

git pushでローカルの変更をリモートに送信する

git pushは、ローカルリポジトリのコミットをリモートリポジトリに送信するコマンドです。

基本的なpush操作

1
2
# 現在のブランチをoriginにプッシュ
git push origin main

上記のコマンドは、ローカルのmainブランチの内容を、リモートoriginmainブランチに送信します。

上流ブランチを設定してpush

-u(または--set-upstream)オプションを使用すると、ローカルブランチとリモートブランチの追跡関係を設定できます。一度設定すると、以降はgit pushのみで同じリモートブランチにプッシュできます。

1
2
3
4
5
# 初回のプッシュで上流ブランチを設定
git push -u origin main

# 以降は引数なしでOK
git push

新しいブランチをリモートにpush

ローカルで作成したブランチをリモートに初めてプッシュする場合も、-uオプションを使用します。

1
2
3
4
5
6
7
8
9
# ローカルでブランチを作成
git switch -c feature-login

# 作業してコミット
git add .
git commit -m "feat: ログイン機能の追加"

# リモートにプッシュ(追跡関係を設定)
git push -u origin feature-login

強制プッシュ(force push)

履歴を書き換えた場合(git rebasegit commit --amendの後など)、通常のgit pushは拒否されます。この場合、強制プッシュが必要です。

1
2
3
4
5
# 強制プッシュ(危険!)
git push --force origin main

# より安全な強制プッシュ(推奨)
git push --force-with-lease origin main

--force-with-leaseは、他の誰かがリモートにプッシュしていないことを確認してから強制プッシュを行います。共有ブランチでの事故を防ぐため、--forceより--force-with-leaseの使用を推奨します。

強制プッシュはリモートの履歴を上書きするため、他のメンバーの作業に影響を与える可能性があります。共有ブランチ(mainなど)への強制プッシュは原則として避けてください。

リモートブランチの削除

不要になったリモートブランチは、git pushで削除できます。

1
2
# リモートブランチを削除
git push origin --delete feature-login

pushが拒否される場合

git pushが拒否される主な原因は以下の通りです。

原因 対処法
リモートに新しいコミットがある git pullで先に取り込む
fast-forwardできない git pull --rebaseまたはgit mergeで解決
権限がない リポジトリへの書き込み権限を確認

git fetchでリモートの変更を取得する

git fetchは、リモートリポジトリの変更をローカルに取得するコマンドです。ただし、作業ディレクトリには反映されません。取得した内容はリモート追跡ブランチ(origin/mainなど)に保存されます。

基本的なfetch操作

1
2
3
4
5
# originからすべてのブランチを取得
git fetch origin

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

fetchの結果を確認する

git fetchの後、リモート追跡ブランチと現在のブランチの差分を確認できます。

1
2
3
4
5
6
7
8
# リモート追跡ブランチの一覧
git branch -r

# ローカルとリモートの差分を確認
git log main..origin/main

# 差分の詳細を確認
git diff main origin/main

削除されたリモートブランチを反映する

リモートで削除されたブランチがローカルのリモート追跡ブランチに残っている場合、--pruneオプションで同期できます。

1
2
3
4
git fetch --prune origin

# または短縮形
git fetch -p origin

fetchとpullの違い

git fetchgit pullの違いを理解することは重要です。

コマンド 動作 作業ディレクトリへの影響
git fetch リモートの変更を取得し、リモート追跡ブランチを更新 なし
git pull git fetch + git merge(またはgit rebase あり(マージされる)

git fetchは安全な操作です。リモートの状態を確認してから、手動でマージするかどうかを決定できます。一方、git pullは自動的にマージを行うため、意図しない変更が加わる可能性があります。

チーム開発では、まずgit fetchでリモートの変更を確認し、内容を把握してからgit mergeまたはgit rebaseを実行するワークフローを推奨します。

git pullでリモートの変更を取得してマージする

git pullは、git fetchgit mergeを組み合わせたコマンドです。リモートの変更を取得し、現在のブランチにマージします。

基本的なpull操作

1
2
3
4
5
# 現在のブランチの上流ブランチからプル
git pull

# 明示的にリモートとブランチを指定
git pull origin main

pullのデフォルト動作

Git 2.27以降、git pullのデフォルト動作は--ff-only(fast-forwardのみ)です。つまり、ローカルとリモートの履歴が分岐している場合、プルは失敗します。

1
2
3
4
5
6
7
8
# fast-forward可能な場合のみプル(デフォルト)
git pull --ff-only

# マージコミットを作成してプル
git pull --no-rebase

# リベースしてプル
git pull --rebase

rebase付きのpull

git pull --rebaseは、リモートの変更を取得した後、ローカルのコミットをリベースします。履歴を直線的に保ちたい場合に便利です。

1
git pull --rebase origin main

デフォルトで--rebaseを使用するには、以下の設定を行います。

1
2
# グローバル設定
git config --global pull.rebase true

pullでコンフリクトが発生した場合

git pullでコンフリクトが発生した場合、手動で解決する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# プルを実行(コンフリクト発生)
git pull origin main
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
# Automatic merge failed; fix conflicts and then commit the result.

# コンフリクトを解決してファイルを編集
# ...

# 解決したファイルをステージング
git add file.txt

# マージを完了
git commit -m "Merge remote-tracking branch 'origin/main'"

リベース中にコンフリクトが発生した場合は、解決後にgit rebase --continueを実行します。

1
2
3
4
5
6
# リベースを再開
git add file.txt
git rebase --continue

# リベースを中止する場合
git rebase --abort

リモートブランチの追跡(Tracking)を理解する

リモート追跡ブランチとは、リモートブランチの状態をローカルに記録したものです。origin/mainのような形式で表されます。

リモート追跡ブランチの確認

1
2
3
4
5
6
7
8
# リモート追跡ブランチの一覧
git branch -r

# ローカルブランチとリモート追跡ブランチの両方を表示
git branch -a

# 追跡関係の詳細を表示
git branch -vv

git branch -vvの出力例は以下の通りです。

  develop  a1b2c3d [origin/develop] feat: 新機能の追加
* main     e4f5g6h [origin/main] docs: READMEの更新
  feature  i7j8k9l ローカル専用ブランチ

[origin/develop]のように表示されているのが、追跡しているリモートブランチです。

追跡関係の設定

既存のローカルブランチに追跡関係を設定するには、git branch -uを使用します。

1
2
3
4
5
# 既存のブランチに追跡を設定
git branch -u origin/feature-login feature-login

# 現在のブランチに追跡を設定
git branch -u origin/main

追跡関係のメリット

追跡関係が設定されていると、以下の利点があります。

  1. git push/git pullで引数を省略できる
  2. git statusでリモートとの差分が表示される
  3. git branch -vvで追跡状況を確認できる
1
2
3
4
5
# 追跡関係が設定されている場合のgit status出力
git status
# On branch main
# Your branch is ahead of 'origin/main' by 2 commits.
#   (use "git push" to publish your local commits)

リモート追跡ブランチからローカルブランチを作成

リモートにあるブランチをローカルで作業する場合、以下のコマンドでローカルブランチを作成できます。

1
2
3
4
5
# リモートブランチからローカルブランチを作成(自動で追跡設定)
git switch -c feature-api origin/feature-api

# または
git checkout -b feature-api origin/feature-api

リモートリポジトリ連携の実践ワークフロー

ここでは、GitHubリモートリポジトリとの連携における典型的なワークフローを紹介します。

ワークフロー1: 新規プロジェクトの開始

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# GitHubで新しいリポジトリを作成(Webブラウザで操作)

# ローカルでプロジェクトを初期化
mkdir my-project
cd my-project
git init

# 初期ファイルを作成
echo "# My Project" > README.md
git add README.md
git commit -m "Initial commit"

# リモートを追加
git remote add origin https://github.com/username/my-project.git

# プッシュ(mainブランチを作成して追跡設定)
git push -u origin main

ワークフロー2: 既存プロジェクトへの参加

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# リポジトリをクローン
git clone https://github.com/team/project.git
cd project

# 最新の状態を確認
git fetch origin
git log --oneline origin/main

# 作業用ブランチを作成
git switch -c feature/new-feature

# 作業してコミット
# ...
git add .
git commit -m "feat: 新機能の実装"

# リモートにプッシュ
git push -u origin feature/new-feature

ワークフロー3: 日常的な同期作業

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 朝一番にリモートの変更を取得
git fetch origin

# mainブランチの状態を確認
git log --oneline main..origin/main

# mainブランチを更新
git switch main
git pull origin main

# 作業ブランチに戻って最新のmainをマージ
git switch feature/my-feature
git merge main

ワークフロー4: フォークしたリポジトリの同期

オープンソースプロジェクトにコントリビュートする場合、フォークしたリポジトリを元のリポジトリと同期する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# オリジナルのリポジトリをupstreamとして追加
git remote add upstream https://github.com/original/repository.git

# upstreamから最新の変更を取得
git fetch upstream

# mainブランチをupstreamに合わせる
git switch main
git merge upstream/main

# 自分のリモート(origin)に反映
git push origin main

よくあるトラブルと対処法

pushが拒否される

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# エラー例
# ! [rejected]        main -> main (fetch first)

# 対処: 先にpullしてからpush
git pull origin main
git push origin main

# または(履歴を直線的に保つ場合)
git pull --rebase origin main
git push origin main

リモートブランチが見つからない

1
2
3
4
5
6
# エラー例
# fatal: 'origin/feature-x' is not a commit and a branch 'feature-x' cannot be created from it

# 対処: fetchしてからブランチを作成
git fetch origin
git switch -c feature-x origin/feature-x

認証エラー

1
2
3
4
5
# HTTPSの場合: 認証情報を確認
git config --global credential.helper store

# SSHの場合: 鍵の登録を確認
ssh -T git@github.com

detached HEAD状態からの復帰

リモート追跡ブランチを直接チェックアウトすると、detached HEAD状態になります。

1
2
3
4
5
6
7
# NG: detached HEADになる
git checkout origin/main

# OK: ローカルブランチとしてチェックアウト
git checkout main
# または
git switch main

まとめ

本記事では、GitHubリモートリポジトリとの連携に必要なコマンドを解説しました。主要なポイントを振り返ります。

コマンド 用途 主なオプション
git remote リモートの管理 -vaddremoveset-url
git clone リポジトリの複製 --depth--single-branch
git push ローカル→リモート -u--force-with-lease--delete
git fetch リモート→ローカル(マージなし) --prune--all
git pull リモート→ローカル(マージあり) --rebase--ff-only

リモートリポジトリとの連携は、チーム開発の基盤となる重要なスキルです。git fetchで安全に変更を確認し、git pullで取り込み、git pushで共有するという基本的なワークフローを習得することで、円滑なチーム開発が可能になります。

次のステップとして、Pull Requestを使ったコードレビューのワークフローを学ぶことで、より実践的なチーム開発スキルを身につけることができます。

参考リンク