ブランチを使用する

Git checkout

このページでは、git checkout コマンドについて説明し、使用例とエッジケースを紹介します。Git では、「チェックアウト」はターゲットエンティティの異なるバージョン間の切り替えを意味します。git checkout コマンドは、ファイル、コミット、ブランチの 3 つの異なるエンティティに対して実行されます。「チェックアウト」の定義に加え、git checkout コマンドの実行を伝えるために「チェックアウトする」というフレーズも一般的に使用されます。「変更点のやり直し」トピックでは、git checkout を使用した過去のコミットの表示方法について確認しました。このドキュメントでは、ブランチに対するチェックアウト操作を主に取り上げます。

ブランチのチェックアウトは、指定されたブランチあるいはバージョンと一致するように作業ディレクトリが更新されるという点では過去のコミットのチェックアウトと似ていますが、作業ディレクトリに加えられた変更が残っている場合はそれがプロジェクト履歴に保存されるという点が異なります。すなわち、これは読み取り専用の操作ではありません。

ブランチのチェックアウト

git checkout コマンドは、git branch コマンドによって作成されたブランチ間を移動するコマンドです。ブランチをチェックアウトすることにより、作業ディレクトリ内のファイルがそのブランチに保存されているリビジョンに更新され、その後すべての新規コミットはそのブランチに記録されます。このコマンドは、作業を行う開発ラインを選択する手段であると考えられます。

個々の機能に対してそれぞれ専用のブランチを設けることにより、SVN に基づく従来のワークフローとは大きく異なる手法が実現できます。これによって既存の機能を損なう懸念を生ずることなく新しい実験的開発を行うことが容易に可能となり、また関連のない複数の機能開発を同時に行うことも可能となりました。加えて、ブランチの導入によりいくつかのコラボレーション型ワークフローも容易に採用できるようになりました。

git checkout コマンドは、git clone と時折混同されることがあります。2 つのコマンドの違いは、git clone ではコードがリモートリポジトリからフェッチされるのに対し、git checkout ではローカルシステムの既存コードのバージョンが切り替えられる点です。

用途: 既存ブランチ

使用しているリポジトリに既存のブランチが含まれている場合、git checkout を使用してそれらのブランチを切り替えられます。利用できるブランチと現在のブランチの名前を確認するには、git branch を実行します。

$> git branch
master
another_branch
feature_inprogress_branch
$> git checkout feature_inprogress_branch

上の例は、git branch コマンドを実行して利用可能ブランチのリストを表示し、指定されたブランチ (このケースでは feature_inprogress_branch) に切り替える方法を示しています。

新しいブランチ

git checkout は、git branch と連携して機能します。git branch コマンドは、新しいブランチの作成に使用できます。新しい機能を開始する場合、git branch new_branch を使用して master から新しいブランチを作成できます。git checkout new_branch を使用して、作成したブランチに切り替えられます。また、git checkout コマンドでは -b 引数を使用できます。この引数は、新しいブランチを作成して即時にそれに切り替えるための便利な手段として使用されます。git checkout を使用して機能を切り替えることにより、1 つのリポジトリで複数の機能を処理できます。

git checkout -b <new-branch>

上の例では、<new-branch> が即座に作成されてチェックアウトされます。-b オプションは、git branch <new-branch>git checkout <new-branch> の順に実行する便利なフラグです。

git checkout -b <new-branch> <existing-branch>

既定では、git checkout -bnew-branch の基準は現在の HEAD になります。オプションの追加ブランチパラメーターを git checkout に渡せます。上の例では、<existing-branch> が渡され、new-branch の基準は現在の HEAD ではなく existing-branch になります。

ブランチの切り替え

ブランチの切り替えは、単純な操作です。以下を実行すると、HEAD<branchname> の先端をポイントします。

git checkout <branchname>

Git では、チェックアウト操作の履歴が reflog で追跡されます。git reflog を実行して履歴を表示できます。

リモートブランチの git checkout

チームとのコラボレーションでは、リモートリポジトリの利用が一般的です。これらのリポジトリはホストされ、共有されている場合と、同僚のローカルコピーである場合があります。各リモートリポジトリに、固有のブランチのセットが含まれています。リモートブランチをチェックアウトするには、最初にブランチのコンテンツをフェッチする必要があります。

git fetch --all

Git の最新バージョンでは、リモートブランチをローカルブランチと同じようにチェックアウトできます。

git checkout <remotebranch>

Git の旧バージョンでは、新しいブランチを remote に基づいて作成する必要があります。

git checkout <remotebranch> origin/<remotebranch>

また、新しいローカルブランチをチェックアウトして、リモートブランチの最後のコミットにリセットもできます。

git checkout -b <branchname>
git reset --hard origin/<branchname>

Detached Head とは

ブランチに対する git checkout の 3 つの主な用途を確認したところで、「Detached Head」状態について説明することが重要です。ご説明いたしましたように、HEAD は Git で現在のスナップショットを参照するために使用されます。内部では、git checkout コマンドにより、HEAD が指定されたブランチまたはコミットをポイントするようシンプルに更新されます。ブランチをポイントする場合、Git で問題は発生しませんが、コミットをチェックアウトすると「Detached Head」状態に切り替わります。

これは、この状態で行われた作業はすべてプロジェクトの他の開発作業と「分離されている」ことを警告するものです。Detached Head 状態のまま機能開発を開始しても、そこに戻るためのブランチは作成されません。(たとえば機能をマージするつもりで) 他のブランチをチェックアウトしてしまうと、その機能を参照できなくなります。

重要なことは、開発は常にブランチで行わなければならず、Detached Head で行ってはならないという点です。これは、新しいコミットに対する参照手段を常に確保するためです。ただし、過去のコミットを閲覧するだけであれば、Detached Head 状態か否かを気にする必要はありません。

概要

このページでは、ブランチを変更する際の git checkout コマンドの使用方法について主に説明しました。要約すると、git checkout がブランチで使用された場合に、HEAD 参照のターゲットが変更されます。このコマンドは、ブランチの作成と切り替え、リモートブランチのチェックアウトに使用できます。git checkout コマンドは、標準の Git 操作に不可欠です。このコマンドは、git merge と対応します。git checkoutgit merge の両コマンドは、git ワークフロー を有効にするために不可欠です。

ブランチを試す準備が整いましたか?

この対話式のチュートリアルをお試しください。

今すぐ始める