git clone(クローン)とは何か?使い方を実例で解説|ディレクトリのパスや名前を指定する方法(初心者向け、わかりやすい)

github-prograshi(プロぐらし)-kv git/github
記事内に広告が含まれていることがあります。

Gitで一番最初に方に実行するコマンドの一つにgit clone(クローン)があります。

とりあえず最初はgit cloneするものだとおまじない的にやっている人もいるかもしれません。git cloneはただGithubのリモートレポジトリの内容をとってくる以外にも便利な使い方があります。

ここではgit cloneでできることについて実例を踏まえてまとめています。


git clone(クローン)とは何か?

git clone(クローン)はGithub上の指定したリモートレポジトリをローカルに丸ごとコピーするコマンドです。クローンという名前の通りのコマンドです。


git cloneの使い方

git cloneは使い方が大きく4つあります。

git cloneの使い方
  1. 現在のディレクトリにリモートレポジトリを丸ごと展開する。
  2. 現在のディレクトリにディレクトリ名を指定して、リモートレポジトリを丸ごと展開する。
  3. ディレクトリと名前を指定してリモートレポジトリを丸ごと展開する。
  4. ローカルレポジトリの内容をコピーする。

第1引数でリモートレポジトリのURLを指定し、必要に応じて第2引数でコピー先のディレクトリを指定します。

(4)はあまり知られていませんが自分のローカル環境にあるレポジトリを他のディレクトリに丸ごとコピーすることもできます。(単に使う場面がないだけですが、、)

point

リモートレポジトリのURLは、HTTPSでもSSHでも可能です。(※SSHを使う場合は、公開鍵を登録し、SSH接続ができる状態であること)

  • HTTPS: https://github.com/xxxxx/リモートレポジトリ名.git
  • SSH: git@github.com:/xxxxx/リモートレポジトリ名.git


現在のディレクトリにリモートレポジトリを丸ごと展開する場合

コマンドの内容

git cloneでは引数にリモートレポジトリのURLを指定します。

git clone <リモートレポジトリのURL>
point

第2引数を指定しない場合、現在のディレクトリに、リモートレポジトリ名のディレクトリが生成されます。


実例

例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。

$ ls
local-pj/  vuecli/

ここに、リモートレポジトリ名 rails-testをクローンします。(URL: https://github.com/xxxxx/rails-test.git)

$ git clone https://github.com/xxxxx/rails-test.git
Cloning into 'rails-test'...
remote: Enumerating objects: 539, done.
remote: Counting objects: 100% (539/539), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 539 (delta 235), reused 503 (delta 199), pack-reused 0Receiving objects:  87% (469/539), 4.50 MiB | 8.98 MiB/s
Receiving objects: 100% (539/539), 7.27 MiB | 9.68 MiB/s, done.
Resolving deltas: 100% (235/235), done.

これでクローンが完了です。

ディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。

$ ls
local-pj/  rails-test/  vuecli/

クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。

$ ls -a rails-test
./               .gitignore       config/             entrypoint.sh*  package.json       storage/
../              .ruby-version    config.ru           Gemfile         postcss.config.js  test/
.browserslistrc  app/             db/                 Gemfile.lock    public/            tmp/
.git/            babel.config.js  docker-compose.yml  lib/            Rakefile           vendor/
.gitattributes   bin/             Dockerfile          log/            README.md          yarn.lock

.gitなどの隠しディレクトリやファイルもきちんとコピーされています。

これで、該当のディレクトリでコミット履歴も参照することができます。


現在のディレクトリにディレクトリ名を指定して、リモートレポジトリを丸ごと展開する

コマンドの内容

git clone <リモートレポジトリのURL> ではリモートレポジトリ名と同じ名前のディレクトリが自動生成されます。

ディレクトリ名を変えたいな~という場合もあるでしょう。その場合は第2引数でディレクトリ名を指定します。

git clone <リモートレポジトリのURL> <ディレクトリ名>


実例

例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。

$ ls
local-pj/  vuecli/

ここに、リモートレポジトリ名 rails-testの中身一式を「clone-test」というディレクトリ名の中にクローンします。(URL: https://github.com/xxxxx/rails-test.git)

第2引数を「clone-test」としてgit cloneを実行します。

$ git clone https://github.com/xxxxx/rails-test.git clone-test
Cloning into 'clone-test'...
remote: Enumerating objects: 539, done.
remote: Counting objects: 100% (539/539), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 539 (delta 235), reused 503 (delta 199), pack-reused 0Receiving objects:  87% (469/539), 6.38 MiB | 12.77 MiB/s
Receiving objects: 100% (539/539), 7.27 MiB | 12.10 MiB/s, done.
Resolving deltas: 100% (235/235), done.

これでクローンが完了です。

ディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。

$ ls
clone-test/  local-pj/  vuecli/

クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。

$ ls -a clone-test
./               .gitignore       config/             entrypoint.sh*  package.json       storage/
../              .ruby-version    config.ru           Gemfile         postcss.config.js  test/
.browserslistrc  app/             db/                 Gemfile.lock    public/            tmp/
.git/            babel.config.js  docker-compose.yml  lib/            Rakefile           vendor/
.gitattributes   bin/             Dockerfile          log/            README.md          yarn.lock

.gitなどの隠しディレクトリやファイルもきちんとコピーされています。

これで、該当のディレクトリでコミット履歴も参照することができます。


ディレクトリパスと名前を指定してリモートレポジトリを丸ごと展開する場合

コマンドの内容

git cloneでは第2引数でディレクトリパスを指定することで、指定したディレクトリにリモートレポジトリを丸ごと展開することができます。

現在のディレクトリじゃなくて、一階層上や一階層下などに新しくディレクトリを作成したい場合に使えます。

git clone <リモートレポジトリのURL> <ディレクトリのパス>
注意点

指定したパスに、指定した名前のディレクトリが生成され、その中にファイルが展開されます。ディレクトリ名はリモートレポジトリ名ではなくなります。

リモートレポジトリ名でディレクトリを作成する場合は、第2引数のディレクトリパスの末尾にリモートレポジトリ名を記述する必要があります。


実例

例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。

$ ls
local-pj/  vuecli/

一つ上の階層に新たに「new_dir」というディレクトリを作成して、その中に、リモートレポジトリ名 rails-testをクローンします。(URL: https://github.com/xxxxx/rails-test.git)

第2引数で「../new_dir」を指定します。

$ git clone https://github.com/xxxxx/rails-test.git ../new_dir
Cloning into '../new_dir'...
remote: Enumerating objects: 539, done.
remote: Counting objects: 100% (539/539), done.
remote: Compressing objects: 100% (291/291), done.
remote: Total 539 (delta 235), reused 503 (delta 199), pack-reused 0
Receiving objects: 100% (539/539), 7.27 MiB | 11.19 MiB/s, done.
Resolving deltas: 100% (235/235), done.

これでクローンが完了です。

ディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。

#一つ上の階層に移動
$ cd ..

$ ls
vue/  new_dir/

クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。

$ ls -a new_dir
./               .gitignore       config/             entrypoint.sh*  package.json       storage/
../              .ruby-version    config.ru           Gemfile         postcss.config.js  test/
.browserslistrc  app/             db/                 Gemfile.lock    public/            tmp/
.git/            babel.config.js  docker-compose.yml  lib/            Rakefile           vendor/
.gitattributes   bin/             Dockerfile          log/            README.md          yarn.lock

.gitなどの隠しディレクトリやファイルもきちんとコピーされています。

これで、該当のディレクトリでコミット履歴も参照することができます。


ローカルレポジトリの内容をコピーする

コマンドの内容

あまり知られていませんが、ローカルレポジトリの内容をクローンすることもできます。

その際は第1引数でローカルレポジトリのパスを指定します。

git clone <ローカルレポジトリのパス> <コピー先ディレクトリのパス>


実例

例えば、現在のディレクトリが「~/documents/projects/vue」で、ディレクトリの中身が以下のようになっているとします。

$ ls
local-pj/  vuecli/

一つ上の階層に新たに「new_dir」というディレクトリを作成して、その中に、ローカルレポジトリ「local-pj」というディレクトリを作成し、ファイル一式をコピーします。

第2引数で「../new_dir/local-pj」を指定します。

$ git clone local-pj ../new_dir/local-pj
Cloning into '../new_dir/local-pj'...
done.

これでクローンが完了です。

現在のディレクトリを確認すると対象のローカルレポジトリはそのまま存在しているのがわかります。

$ ls
local-pj/  vuecli/

一つ上の階層のディレクトリの状態を確認すると、クローンしたレポジトリ名のディレクトリができていることが確認できます。

#一つ上の階層に移動
$ cd ..

$ ls
vue/  new_dir/

#new_dirの中身を確認
$ ls new_dir
local-pj/

new_dirのディレクトリの中に、local-pjというディレクトリが生成されています。

クローンしたディレクトリの中身を確認すると、リモートレポジトリのファイル一式がインストールされていることがわかります。

$ ls -a new_dir/local-pj
./  ../  .git/  .gitignore  babel.config.js  package.json  package-lock.json  public/  README.md  src/

.gitなどの隠しディレクトリやファイルもきちんとコピーされています。

これで、該当のディレクトリでコミット履歴も参照することができます。


補足

なお、ローカルレポジトリのクローンは単純にディレクトリをコピーしただけなので以下の処理と同じです。

cp -r  <コピー元のディレクトリパス> <コピー先のディレクトリパス>

-rオプションは--recursiveのショートオプションで、ディレクトリの深い階層も含めて再帰的にコピーするという意味です。



指定したディレクトリが既に存在する場合はエラーになる

クローン先に指定したディレクトリに既に同じ名前のディレクトリ名がある場合は、「fatal: destination path ‘生成するディレクトリ名’ already exists and is not an empty directory.」というエラーが表示されます。

実例

$ git clone git@github.com:xxx/git-test.git
fatal: destination path 'git-test' already exists and is not an empty directory.


対処法

既に同じ名前のディレクトリ名がありますというエラー「fatal: destination path ‘生成するディレクトリ名’ already exists and is not an empty directory.」が表示された場合は以下で対応します。

エラー時の対処法
  1. コマンドを実行するディレクトリを変更する。
  2. ディレクトリ名やディレクトリパスを指定してコマンドを実行する。


ローカルに登録されるリモートレポジトリ名

git cloneすると、指定したリモートレポジトリが「origin」というエイリアス(別名)でリモートレポジトリに登録されます。

登録されているリモートレポジトリ名とURLを確認するには git remote -vを実行します。

$ git remote -v
origin  https://github.com/xxxxx/レポジトリ名.git (fetch)
origin  https://github.com/xxxxx/レポジトリ名.git (push)

なお、ローカルレポジトリをクローンした場合は、URLではなくディレクトリパスが登録されています。

$ git remote -v
origin  C:/Users/hlaup/Documents/projects/xxxxx/レポジトリ名 (fetch)
origin  C:/Users/hlaup/Documents/projects/xxxxx/レポジトリ名 (push)
タイトルとURLをコピーしました