git cloneとは? その裏で起きているたくさんのことを解説

Git を使い始める上で、最初に覚えるべきコマンドの一つが「git clone」です。 「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

「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 は、現代のソフトウェア開発には欠かせないツールです。 Git を使いこなすには、まず「リポジトリ」を理解することが重要です。 この記事...

次は「リモートブランチ」を確認しましょう。 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 を使わずローカルリポジトリを作ってましょう。

上の図の 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 が設定できました。

リモートブランチの 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

まとめ

本記事では「git clone」により実施されていることを1つ1つ解説しました。 リポジトリの理解が深まっ多と思います。今後のリポジトリ操作に役立つでしょう。

以上です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発の経歴が20年のエンジニアです。
フロントエンド(Ajax,...,React,SPA)からバックエンド(Database,...,Hadoop,PaaS)まで幅広く経験し、現在は企業に勤め、社内のITアーキテクトに就いています。

コメント

コメントする

CAPTCHA


目次