原文: Git Clone Branch – How to Clone a Specific Branch

SVN や CVS のような比較的古い集中型のバージョンコントロールシステムとは異なり、Git は分散型です。完全な履歴とコードを操作する権限を、各開発者がローカルまたはリモートに持っています。また、必要に応じて、コードの複数の部分をどこからでも変更できます。

有名な Linux OS カーネルの作者である Linus Torvalds が、2005 年、Linux カーネルの開発用に Git を作成し、その後 Git は世界中でもっとも広く使われているモダンなバージョンコントロールシステムとなりました。

この記事では、Git clone と Git branch のワークフローを紹介し、必要に応じて特定のブランチを clone する方法を説明します。では始めましょう。

必要なもの

  • ターミナルについての基礎知識
  • ターミナルにコマンドを入力できること
  • Git のインストール (以下でも説明します)
  • GitHub のアカウント
  • 笑顔で楽しんで取り組む姿勢

Git と GitHub の簡単な紹介

Wikipedia では下記のように説明されています。

Git(ギット)は、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。

一方 GitHub は、Git を使用したバージョンコントロールのための、ウェブ上のホスティングサービスを指します。GitHub は、Git が持つ分散型バージョンコントロールとソースコード管理の全機能に加え、コンピューターコードのための追加機能も提供します。

Windows に Git をインストールする方法

最新の Git for Windows インストーラー をダウンロード、インストールしてください。

Linux に Git をインストールする方法

以下の中からあなたの Linux ディストリビューションに合わせてコマンドを実行してください。

Debian または Ubuntu

sudo apt-get update
sudo apt-get install git

Fedora

sudo dnf install git

CentOS

sudo yum install git

Arch Linux

sudo pacman -Sy git

Gentoo

sudo emerge --ask --verbose dev-vcs/git

Mac に Git をインストールする方法

最新の Git for Mac インストーラー をダウンロード、インストールしてください。

または下記のコマンドを実行してください。

brew install git

これで Git がインストールできました。ではチュートリアルに進みましょう。

Git クローン入門

Git を使うと、「リポジトリ」の中であなたのプロジェクトにバージョンを付けて管理できます。このリポジトリを GitHub のようなバージョンコントロール用のウェブベースホスティングサービスに保存します。

このリポジトリはあなたのローカルマシンにクローン (clone) することができ、すべてのファイルとブランチをローカルに持つことができます。(ブランチについては後ほど説明します。)

Screenshot-2020-06-23-at-5.47.48-AM

例えば、freeCodeCamp のリポジトリを SSH を使用して clone するには、次のコマンドを使用します。

git clone git@github.com:freeCodeCamp/freeCodeCamp.git

Git ブランチ入門

プロジェクトの作業中、さまざまな機能の開発をすることになります。そして複数のコントリビューターが、そのプロジェクトと各機能の作業をすることでしょう。

ブランチを使用すると、master ブランチと同じファイルで自由に作業できる「プレイグラウンド (playground)」と呼ばれる環境を作ることができます。本番環境のコードを壊したり影響を与えることのないように、このブランチで、独立した機能を作成したり、新しい機能を試したり、破壊的な変更を行ったり、修正を行ったり、ドキュメントを書いたり、アイデアを試したりできます。作業が完了したらそのブランチを本番の master ブランチにマージ (merge) します。

ブランチは Git の中核をなすコンセプトであり、GitHub でも 1 つのプロジェクトに異なるバージョンがあるワークフローの管理に使われています。master ブランチは、そのリポジトリのデフォルトブランチで、「本番環境にデプロイ可能なコード」と見なされることが多いです。passwordless-authrefactor-signup-ux のような新しいブランチは master ブランチから作成できます。

Screenshot-2020-06-22-at-2.47.53-AM
freeCodeCamp リポジトリのすべてのブランチ

Git ブランチをクローンする方法

リポジトリは git clone コマンドでクローンすることができますが、このコマンドはブランチおよびリモートの HEAD をクローンすることを覚えておいてください。これは通常、デフォルトの設定では master ブランチとリポジトリ内の他のすべてのブランチを含みます。

つまり、リポジトリをクローンすると、master と他すべてのブランチをクローンすることになります。これは、クローンした後あなた自身の操作で目的のブランチにチェックアウトしなければならないということです。

例えば、あるプロジェクトにおけるあなたのタスクがユーザーダッシュボードにパスワードレス認証を追加することだとしましょう。この機能が passwordless-auth ブランチにあるとします。

この場合、あなたの "feature branch" は後で master ブランチにマージされるので、今は master ブランチは必ずしも必要ありません。では、「あなたが必要ないたくさんのファイル」がある他のブランチをフェッチ (fetch) せずにこの passwordless-auth ブランチをクローンするにはどうしたらいいのでしょう。

この説明用に下記のサンプルリポジトリを作成しました。このリポジトリは Nextjs で作成されたシンプルなブログで、下記 4 つのダミーブランチがあります。

  • master
  • dev
  • staging
  • passwordless-auth

Nextjs では、pages/api フォルダー内のすべてのファイルが /api/* パスにマッピングされ、ページではなくAPIエンドポイントとして扱われます。このリポジトリではそれぞれのブランチに差異をつけるため、このディレクトリにダミーのAPIを作成しました。

master ブランチには pages/api/hello.js というファイルがありますが、 passwordless-auth ブランチには pages/api/auth.js というファイルがあります。それぞれのファイルはダミーテキストのレスポンスを返しています。こちらにある master ブランチの hello API のレスポンスを見てみてください。(あなたへの挨拶のメッセージが入っているはずです。)

では、このリポジトリをクローンしてみましょう。

git clone git@github.com:BolajiAyodeji/nextjs-blog.git

これでこのリポジトリ内のすべてのブランチにアクセスできるようになり、簡単にブランチを切り替えてそれぞれのバージョンとファイルを見ることができるようになります。

git branch -a
Screenshot-2020-06-22-at-4.51.56-AM

remotes/origin/.. というブランチはどこから来たのか疑問に思いますか?

リポジトリをクローンする時、リモート (remote) と呼ばれる、インターネット上、あるいは社内のサーバーなどからリポジトリのデータをプル (pull) します。この origin という語は、リモートの URL を置き換える別名として Git が自動で作成したエイリアスです。(別のエイリアスを指定したり、変更することもできます。)

これらの  remotes/origin/.. というブランチは、インターネット上からクローンした際の元リポジトリ (origin) を指しており、origin に対して pull、push などの操作を行うことができます。

Screenshot-2020-06-23-at-5.24.43-AM

つまり master をあなたのマシンにクローンした場合、remotes/origin/master はインターネット上の元の master ブランチで、 master があなたのローカルマシンにあるブランチになります。pull、push などの操作は remotes/origin/master に向けて行います。

まとめると、remote はインターネット上のリポジトリを指す URL で、origin はこの remote URL のエイリアスです。

Screenshot-2020-06-23-at-5.28.06-AM

特定のブランチをクローンする方法

では、デモ用のリポジトリから特定のブランチをクローンしてみましょう。特定のブランチをクローンする方法は 2 つあります。以下いずれかの方法があります。

  • リポジトリをクローンし、すべてのブランチをフェッチし、すぐ特定のブランチにチェックアウトする
  • リポジトリをクローンし、1 つのブランチだけをフェッチする

方法その 1

git clone --branch <branchname> <remote-repo-url>

または

git clone -b <branchname> <remote-repo-url>

上記の -b--branch のエイリアスです。

このコマンドにより、リポジトリ内のすべてのブランチをフェッチし、<branchname> に指定したブランチにチェックアウトし、指定したブランチが、git pushgit pull の設定がされたローカルブランチになります。しかしこのやり方では、まだ各ブランチから全てのファイルをフェッチしています。やりたいこととは少し違うようですね。

試してみましょう。

 git clone -b passwordless-auth git@github.com:BolajiAyodeji/nextjs-blog.git

このコマンドにより、passwordless-auth がローカルブランチに設定されますが、まだ他のブランチが追跡されています。

Screenshot-2020-06-23-at-5.30.01-AM
Screenshot-2020-06-30-at-3.27.31-AM

方法その 2

git clone --branch <branchname> --single-branch <remote-repo-url>

または

git clone -b <branchname> --single-branch <remote-repo-url>

上記の -b--branch のエイリアスです。

このコマンドはほとんど方法その 1 と同じことを実行しますが、Git バージョン 1.7.10 以降で導入された --single-branch オプションを使用しています。このオプションにより、他のブランチをフェッチせず、指定のブランチのファイルだけをフェッチすることができます。

試してみましょう。

git clone -b passwordless-auth --single-branch git@github.com:BolajiAyodeji/nextjs-blog.git

このコマンドにより passwordless-auth がローカルブランチに設定され、このブランチだけを追跡している状態になります。

Screenshot-2020-06-23-at-5.31.12-AM
Screenshot-2020-06-30-at-3.29.07-AM

cd pages/api コマンドを実行すると、前述した passwordless-auth ブランチの auth.js ファイルを見つけることができます。

結論

インターネットの帯域やストレージの空き容量が少ない中で、特定のブランチの作業をしたい状況もあるでしょう。他にもさまざまな理由で、ファイルを限定して特定のブランチをクローンしたいことがあるかもしれません。幸い、Git はそれを実現できる柔軟性を持っています。まずは肩ならしにこの記事で学んだことを試してみましょう。Git について学ぶことはまだまだあります。

ここから一つずつ学んでいきましょう。