Git を使い始める上で、最初に覚えるべきコマンドの一つが「git clone」です。 「git clone」は、リモートリポジトリにあるプロジェクトを、自分のローカル環境にコピーするために使用します。
「リポジトリをコピーするとはなんなのでしょうか?」
「git clone」すると、下の図のようなことを一通り実施してくれています。
これが「リポジトリをコピー」するということです。
本記事では「git clone」により実施されていることを1つ1つ解説します。 これにより、リポジトリの理解が深まるでしょう。
後半では、「git clone」を使わずに「リポジトリをコピー」します。 この操作を理解することで、今後のリポジトリ操作で困ったときに役立つので、最後まで読んでください。
git clone の使い方
「git clone」にリモートリポジトリパスを指定すれば、ローカルにリモートど同じ名前のローカルリポジトリのディレクトリが作成されます。
git clone git@github.com:crz33/git_handson.git
リモートリポジトリパスの後に、ディレクトリ名を指定すれば、ローカルの名前を変更できます。
ローカルリポジトリの状態を見てみよう
「git clone」で複製したローカルリポジトリの状況を確認してみましょう。
まずはローカルリポジトリのディレクトリへ移動します。
$ cd git_handson
リモートリポジトリの設定を確認
ローカルリポジトリに設定されているリモートリポジトリの情報(図の ① の情報)を表示してみます。
確認にはgit remote
を使います。
$ git remote -v
origin git@github.com:crz33/git_handson.git (fetch)
origin git@github.com:crz33/git_handson.git (push)
「origin」という名前で、「git@github.com:crz33/git_handson.git」の GitHub サーバのリポジトリが設定されています。
「origin」は、git clone
が設定するデフォルトの名前で、git pull
などの git コマンドでリモート名を省略すると使われます。
ブランチの設定を確認
次にブランチの情報を表示してみます。
ローカルリポジトリには「ローカルブランチ」と「リモートブランチ」の2つの設定があります。
- ローカルブランチ: ローカル編集作業用のブランチ。
- リモートブランチ: リモートリポジトリの参照用ブランチ。
まずは、「ローカルブランチ」を確認してみましょう。
git branch
を使います。
$ git branch
* main
以下の2つの情報が読み取れます。
- ローカルブランチは「main」ブランチのみ。
- ローカルの HEAD は「main」(アスタリスク:*)
ローカルブランチの HEAD は、現在作業中のブランチにつくラベルです。
git checkout
で作業中のブランチを切り替えると、そのブランチに HEAD が移動します。
git checkout
がわからない人は、リポジトリ操作についての解説記事もあるので、こちらを見てください。

次は「リモートブランチ」を確認しましょう。
git branch -a
を使います。
「-a」はローカル・リモート両方のブランチを表示するためのオプションです。
$ git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
先ほど確認した「main」ブランチに加え、remotes から始まる 2 つのリモートブランチが表示されました。
「remotes/origin/HEAD」は「(remotes/)origin/main」を参照していることを示しています。 ローカルブランチの HEAD は作業中のブランチを意味していましたが、リモートブランチの HEAD は意味が異なります。
リモートブランチの HEAD はリモートリポジトリごとに設定できる代表のブランチ名で、git push
などのリポジトリ操作でブランチ名を省略したときに使われます。
省略名の整理(remotes/origin/HEAD)
- origin:
git pull
などでリモートリポジトリ名を省略したときに使われるリポジトリ名。 - HEAD:
git push
などでブランチ名を省略したときに使われるブランチ名。
例えば、git push
であれば、本来は git push <リポジトリ名> <ブランチ名>
と、
「リポジトリ名」「ブランチ名」の2つを指定すべきですが、originとHEADを指定しておけばgit push
だけで済みます。
git push
という省略コマンドは、git push origin HEAD
が実行されているのです。
「ローカルブランチ」と「リモートブランチ」の情報が確認できました。
では、ローカルブランチとリモートリポジトリはどのように紐づいているのでしょうか。
ローカルブランチの詳細情報を確認してみましょう。
git branch -vv
を使います。
$ git branch -vv
* main 06955e4 [origin/main] Merge branch 'work-gitignore'
main ブランチは、リモートの origin リポジトリの main リポジトリのコミットをさしているのが確認できます。
「git clone」で複製されたローカルリポジトリの一通りの情報、
- リモートリポジトリはどのサーバのリポジトリなのか
- ローカルブランチとリモートブランチには何があるか
- ローカルブランチはリモートブランチのどこを示しているか
を確認しました。
もう少し git の理解を深めるために、git clone を使わずにリモートリポジトリを複製してみましょう。
git clone を使わずローカルリポジトリを作ってみよう
git clone を使わずローカルリポジトリを作ってましょう。
上の図の git clone でできあがるローカルリポジトリの状態へ向けて、1つ1つコマンドを実行しながら作っていきます。
作業ツリーのディレクトリを作成 : mkdir
まずはこれから作っていくローカルリポジトリの作業ディレクトリを作ります。
$ cd ~/work
$ mkdir git_handson_stepby
$ cd git_handson_stepby
将来、作業ツリーの場所となる空っぽのディレクトリができただけです。
ローカルリポジトリの初期化 : git init
ローカルリポジトリを初期化します。
初期化はgit init
です。
$ git init
Initialized empty Git repository in ~/work/git_handson_stepby/.git/
出力結果書かれているように.git
ディレクトリが作成され、いくつかファイルができています。
実はローカルリポジトリは、ただのファイルです。
これで、空のローカルリポジトリができました。
リモートリポジトリの設定 : git remote add
ローカルリポジトリ に リモートリポジトリ を設定します。
git remote add
を使います。
git clone と同じ代表名の origin をリモートリポジトリ名にしておきます。
$ git remote add origin git@github.com:crz33/git_handson.git
設定できているこを確認します。
$ git remote -v
origin git@github.com:crz33/git_handson.git (fetch)
origin git@github.com:crz33/git_handson.git (push)
リモートブランチも確認してみましょう。(実はまだないです)
$ git branch -a
(なし)
まだリモートリポジトリを設定しただけなので、ローカルリポジトリには、ローカルもリモートもブランチは1つもありません。
ここまでで、ローカルリポジトリにリモートブランチを参照設定できた状態です。
リモートリポジトリの内容を最新化 : git fetch
リモートリポジトリの内容をローカルリポジトリにダウンロードします(最新化)。
git fetch
を使います。
$ git fetch
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 11 (delta 1), reused 11 (delta 1), pack-reused 0 (from 0)
Unpacking objects: 100% (11/11), 933 bytes | 84.00 KiB/s, done.
From github.com:crz33/git_handson
* [new branch] main -> origin/main
ローカルリポジトリの内容を最新化できました。 ブランチの状態を確認してみましょう。
$ git branch -a
remotes/origin/main
ここまでで、リモートブランチがローカルブランチに反映されました。
リモートブランチの HEAD を設定 : git remote set-head
リモートブランチの HEAD はリモートリポジトリごとに設定できる代表のブランチ名で、git push
などのリポジトリ操作でブランチ名を省略したときに使われます。
設定は git remote set-head
です。
$ git remote set-head origin main
ブランチの状態を確認してみましょう。
$ git branch -a
remotes/origin/HEAD -> origin/main
remotes/origin/main
リモートの HEAD が設定できました。
ローカルブランチの作成 : git branch
ローカルブランチを作成します。
作成方法はgit branch
です。
$ git branch main origin/main
branch 'main' set up to track 'origin/main'.
リモートブランチ origin/main
からローカルブランチ main
を作成しました。
確認してみましょう。
$ git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
作業ツリーへ反映 : git checkout
リポジトリは最新化できましたが、まだ作業ツリーへ編集すべきファイルは反映されてません。
$ ls
(空)
ローカルブランチ main の内容を作業ツリーへ反映します。
git checkout
で反映できます。
$ git checkout main
Already on 'main'
Your branch is up to date with 'origin/main'.
「すでに main ブランチですよ」とメッセージがでています。 これは、HEAD が main の状態で、同じ main をチェックアウトしたためです。
git checkout
では、以下の2つを実施してます。
- ローカルリポジトリの HEAD を移動する
- そのブランチの内容(ファイルやディレクトリ)を作業ツリーへ反映する
今回のチェックアウトで、作業ツリーへ反映をしたかったのですが、
git branch
で main ブランチを作ったときに、まだ1つもローカルブランチがなかったため、そのときに HEAD が main に設定されていました。
そのため、「HEAD を移動する」に対して「すでに main ブランチですよ」と表示されただけです。
ファイルやディレクトリの内容は作業ツリーに反映されているので、「ls -al」で確認すればリポジトリに格納されていたファイルができていることが確認できます。
$ ls
README.md
これで、「git clone」した状態とまったく同じになりました。
まとめ
本記事では「git clone」により実施されていることを1つ1つ解説しました。 リポジトリの理解が深まっ多と思います。今後のリポジトリ操作に役立つでしょう。
以上です。
コメント