git clone: GitHub などからリポジトリを複製する方法
git clone は、リモートリポジトリのすべてのファイル、コミット履歴、ブランチを取得し、origin という名前のリモート設定を備えたローカルのコピーを作ります。基本の形は git clone リポジトリのアドレス です。オプションで保存先のフォルダ、ブランチ、--depth 1 による最新コミットだけの取得などを指定できます。
git clone は、リモートリポジトリの完全なローカルコピーを作ります。ファイル、コミット履歴の全体、ブランチ、タグを取得します。GitHub、GitLab、社内サーバーに既にあるプロジェクトを始める標準的な方法です。ZIP をダウンロードするのと違い、クローンは完全なリポジトリなので、コミットして変更を送り返すことができます。
git clone の基本的な使い方
リポジトリのアドレスをコピーして実行します(GitHub では緑色の「Code」ボタンから取得できます)。
git clone https://github.com/username/project.git
Cloning into 'project'...
remote: Enumerating objects: 1532, done.
remote: Counting objects: 100% (1532/1532), done.
remote: Compressing objects: 100% (812/812), done.
Receiving objects: 100% (1532/1532), 2.41 MiB | 6.10 MiB/s, done.
Resolving deltas: 100% (701/701), done.
Git は現在のフォルダに project というフォルダを作ります(名前はアドレスから .git を除いたものです)。そのフォルダに移動します。
cd project
git status
git clone が内部で行うこと
クローンは単なるファイルのダウンロードではありません。これらの手順を理解すると、クローン直後に「そのまま動く」理由と、origin/ で始まるブランチがどこから来るのかが分かります。コマンドは次の順に動きます。
- フォルダを作成し、その中で
git initと同等の処理を行う。 - 元のアドレスを指す
originという名前のリモートを追加する。 - すべてのオブジェクトと参照をダウンロードする。これは
git fetchと同等。 - リモートブランチ
origin/main、origin/developなどを作成する。 - 既定のローカルブランチ(通常は
main)を作成し、origin/mainに関連付けてファイルを展開する。
そのため、クローンの後で git remote を手動で設定する必要はありません。git push と git pull がすぐに使えます。
git remote -v
origin https://github.com/username/project.git (fetch)
origin https://github.com/username/project.git (push)
HTTPS と SSH での複製
| HTTPS | SSH | |
|---|---|---|
| アドレス | https://github.com/user/repo.git | git@github.com:user/repo.git |
| 公開リポジトリ | 認証なしで複製できる | アカウントに登録した SSH 鍵が必要 |
| 非公開リポジトリへの push | パスワードの代わりに Personal Access Token が必要 | 鍵で動作し、パスワードの入力が不要 |
| 企業ネットワーク | ポート 443 はほぼ常に開いている | ポート 22 が閉じていることがある |
他人の公開プロジェクトを読むだけなら HTTPS で十分です。定期的に push する自分のリポジトリには、SSH の方が便利です。
git clone git@github.com:username/project.git
HTTPS で複製した後に SSH に切り替えたい場合は、もう一度ダウンロードする必要はありません。
git remote set-url origin git@github.com:username/project.git
指定したフォルダに複製する
2番目の引数に、保存先のフォルダ名またはパスを指定します。
# 別の名前のフォルダに複製
git clone https://github.com/username/project.git my-copy
# 現在のフォルダに複製(フォルダは空である必要があります)
git clone https://github.com/username/project.git .
保存先のフォルダが既に存在し、空でない場合、Git は実行を拒否します: fatal: destination path 'project' already exists and is not an empty directory。
特定のブランチを指定して複製する
既定では、クローン後はリモートの既定ブランチにいます。最初から別のブランチにいるには -b(--branch)を使います。
git clone -b develop https://github.com/username/project.git
この場合、すべてのブランチがダウンロードされ、develop にいる状態になります。他のブランチを取得せず1つだけ欲しい場合は、--single-branch を追加します。
git clone -b develop --single-branch https://github.com/username/project.git
-b にはタグ名も指定できます。その場合、リリース時点のプロジェクトの状態が得られます(detached HEAD の状態になります)。
git clone -b v2.1.0 --depth 1 https://github.com/username/project.git
クローン後の他のブランチはどこにあるか
初心者がよく驚くのは、git branch に main しか表示されないことです。他のブランチはリモートブランチとしてダウンロードされています。確認するには次のとおりです。
git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/feature/login
いずれかのブランチで作業を始めるには、短い名前で切り替えるだけで十分です。Git がリモートブランチを追跡するローカルブランチを自動で作ります。
git switch develop
浅いクローン: 大きなリポジトリには --depth
古いプロジェクトでは、履歴だけで数ギガバイトになることがあります。現在のコードだけが必要な場合(CI で使う、ビルドするだけの場合など)は、最新のコミットだけを取得します。
git clone --depth 1 https://github.com/username/big-project.git
--depth は --single-branch を含むため、既定ブランチの1コミットだけが届きます。後で完全な履歴が必要になったら、あとから取得できます。
git fetch --unshallow
深さを --depth 50 のように指定したり、--shallow-since=2025-01-01 で日付を基準に制限したりすることもできます。活発に開発する場合、浅いクローンは不便です。git log、git blame、履歴の検索が不完全になるからです。
部分クローン: --filter
巨大なモノリポジトリ向けの別の方法として、コミット履歴は取得し、ファイルの中身は必要になったときに取得する方法があります。
git clone --filter=blob:none https://github.com/username/monorepo.git
この方法では、log やブランチの切り替えのための完全な履歴を保ちながら、通信量と容量を節約できます。サーバー側の対応が必要です。GitHub と GitLab は対応しています。
ミラークローンとリポジトリの移行
通常のクローンはブランチをリモートブランチとして取得し、サーバーの内部的な参照はコピーしません。プロジェクトを別のホスティングサービスに移す、またはバックアップを「そのまま」作るには --mirror を使います。
git clone --mirror https://github.com/username/project.git
cd project.git
git push --mirror git@gitlab.com:username/project.git
ミラーは作業ファイルを持たない bare リポジトリで、すべてのブランチとタグがローカルのブランチ・タグとして保存されます。git push --mirror を実行すると、それらを新しいサーバーにまるごと送れるので、履歴を失わずに移行できます。注意点として、Issue、pull request、サービスの設定などは Git の一部ではないため、この方法では移行されません。これらはサービス固有のデータです。
似た --bare も作業ディレクトリのないリポジトリを作りますが、コピーされるのはブランチとタグだけです。既存のプロジェクトから、自分のサーバー上の中央リポジトリを作るときに使います。
サブモジュールを含めて複製する
プロジェクトが git submodule を使っている場合、既定ではサブモジュールのフォルダが空になっています。すべてを一度に取得するには次のとおりです。
git clone --recurse-submodules https://github.com/username/project.git
フラグを付けずに複製してしまった場合は、後からサブモジュールを取得します。
git submodule update --init --recursive
git clone、fork、ZIP ダウンロードの違い
| 方法 | 得られるもの | 使いどころ |
|---|---|---|
git clone | 履歴と remote を含む完全なリポジトリ | 権限があるプロジェクトで作業する、または履歴が必要な場合 |
| GitHub の Fork | 自分のアカウントにあるリポジトリのコピー(サーバー上) | pull request で他人のプロジェクトに貢献する |
| Download ZIP | ファイルのみ。.git はない | コードをざっと見るだけで、コミットする予定がない場合 |
fork と clone は競合する方法ではありません。オープンソースで作業する場合は、まずサイトで fork し、その後に自分の fork をクローンして、オリジナルを2つ目のリモートとして追加します。
git clone git@github.com:me/project.git
cd project
git remote add upstream https://github.com/author/project.git
git fetch upstream
git clone のよくあるエラー
「Repository not found」
アドレスの綴りが違うか、非公開リポジトリでアクセス権がありません。GitHub は非公開リポジトリに対して、意図的に「アクセス禁止」ではなく「not found」と返します。アドレスを確認し、正しいアカウントでログインしているかを確かめてください。
「Permission denied (publickey)」
SSH で複製しようとしていますが、鍵が設定されていません。ssh -T git@github.com で確認し、公開鍵をアカウントの設定に追加するか、一時的に HTTPS で複製してください。
HTTPS で「Authentication failed」
アカウントのパスワードを入力しています。GitHub は、HTTPS 経由の Git 操作にパスワードではなく Personal Access Token を要求しています。Git に古い認証情報が保存されている場合は、OS の認証情報マネージャーから削除してください。
大きなリポジトリで途中で切断される
early EOF や RPC failed のようなエラーは、ネットワークが不安定であることやサイズが大きいことが原因のことが多いです。--depth 1 で浅いクローンを行い、後で git fetch --unshallow を実行するか、SSH で複製すると改善します。
Windows での改行コードの問題
クローン後にすべてのファイルが「変更済み」になることがあります。これは CRLF と LF の変換が原因です。Windows では git config --global core.autocrlf true を、Linux や macOS では input を設定してください。さらに、プロジェクトの .gitattributes でルールを定めるのが望ましいです。
クローン直後にやること
クローンが完了したら、コードを変更する前に数分かけて準備をしましょう。これで、他人のプロジェクトで作業を始めた最初の日によくある問題を避けられます。
- README と CONTRIBUTING を読む。 依存関係のインストール方法、テストの実行方法、ブランチの命名規則などが書かれていることが多いです。
- ブランチと状態を確認する。
git statusとgit log --oneline -5で、現在地と最新の変更が分かります。 - 自分のブランチを作る。
mainで直接作業しないでください:git switch -c feature/my-task。 - コミットの作成者を確認する。 1台のコンピュータで個人用と仕事用のアカウントを使い分けている場合は、
--globalを付けずに、そのリポジトリだけのメールアドレスを設定します:git config user.email "you@company.com"。 - 依存関係をインストールする。
node_modulesやvenvのようなフォルダはリポジトリに入れず、ローカルで作成します:npm install、pip install -r requirements.txtなど。
クローンを最新の状態に保つ
クローンは一度だけ行います。その後は、同僚の新しいコミットを同じ origin から取得します。
# サーバーに何が来ているかを、何も変えずに確認
git fetch
git log --oneline main..origin/main
# 現在のブランチに取り込む
git pull
まず git fetch を実行して内容を確認する習慣があれば、思わぬコンフリクトを避けられます。「更新するため」にプロジェクトを再度クローンするのは避けてください。ローカルのブランチや未コミットの作業が失われてしまいます。
git clone の早見表
| 作業 | コマンド |
|---|---|
| 通常の複製 | git clone <url> |
| 指定したフォルダに複製 | git clone <url> <フォルダ> |
| 指定したブランチで開始 | git clone -b <ブランチ> <url> |
| 1つのブランチだけ取得 | git clone -b <ブランチ> --single-branch <url> |
| 履歴なし(最新のみ) | git clone --depth 1 <url> |
| 古いファイルの中身なし | git clone --filter=blob:none <url> |
| サブモジュールを含める | git clone --recurse-submodules <url> |
| サーバー用の bare コピー | git clone --bare <url> |
まとめ
git clone はリポジトリ全体を取得し、origin を通じてサーバーとの接続を自動で設定します。そのため、クローン後すぐにコミット、push、pull ができます。自分のプロジェクトには SSH を、大きなリポジトリには --depth や --filter を、特定のブランチには -b を使いましょう。リモートリポジトリ、push、pull、fetch の扱い方は、Gitコースで実践的に解説しています。
よくある質問
git clone と git pull の違いは何ですか?
git clone は一度だけ実行して新しいローカルのコピーを作ります。git pull は既存のクローンの中で実行し、サーバーの新しい変更を取り込みます。
リポジトリの1つのフォルダだけを複製できますか?
直接はできません。近い方法は、--filter=blob:none --sparse を付けて部分クローンし、その後 git sparse-checkout set パス を実行することです。そうすると、作業ディレクトリには必要なフォルダだけが現れます。
クローンはどのくらいの容量を使いますか?
おおむね、圧縮された履歴全体と、現在のバージョンのファイルを展開したサイズの合計です。リポジトリのサイズは git count-objects -vH で確認できます。
ローカルのリポジトリを複製できますか?
はい。アドレスの代わりにパスを指定します: git clone /path/to/repo copy。本物のコピーを危険にさらさずに試したいときに便利です。
git clone の前に git init は必要ですか?
いいえ。git clone がフォルダを作成し、その中でリポジトリを初期化します。