ブランチを使用する

git ブランチ


このドキュメントでは、git branch コマンドの詳細と全体的な Git ブランチングモデルについて説明します。ブランチングは、現代的なほとんどのバージョン管理システム (VCS) で使用できる機能です。他の VCS のブランチングは、時間とディスク領域を大幅に消費する場合があります。一方、Git のブランチングは、毎日の開発プロセスに組み込まれています。Git のブランチは、変更のスナップショットを効果的に指し示すポインターです。新たなフィーチャー開発やバグフィックスを行う場合、その規模の大小を問わず、変更をカプセル化するためにブランチを作成します。これにより、不安定なコードがメインコードベースにマージされにくくなり、メインブランチにマージする前にフィーチャーの履歴を整理することも可能になります。

Git チュートリアル: git branch

上の図は、小規模なフィーチャー開発と長期のフィーチャー開発という独立した 2 つの開発ラインを有するリポジトリを視覚化したものです。これらの開発作業をブランチで行うことにより、両方を同時に進行させることができるだけでなく、メインの master ブランチを不完全なコードから守ることができます。

Git ブランチの背景にある設計思想は、他のバージョン管理システムモデルよりもはるかに軽量です。SVN ではディレクトリ間で直接ファイルのコピーを行うのに対し、Git におけるブランチはコミットに対する参照として保存されます。この意味でブランチとは、コミットのコンテナーではなく、一連のコミットの先端を表すものと言えます。ひとつのブランチの履歴はコミットの相互関係を通して外挿されます。

読み進むに従い、Git ブランチは SVN ブランチとは異なるものであることが理解できると思います。SVN ブランチが作業成果を時折大規模にまとめるためのものであるのに対し、Git ブランチは日常的なワークフローに不可欠な要素です。Git の内部ブランチアーキテクチャの詳細について、以下に説明します。

仕組み

ブランチとは独立した開発ラインを意味します。ブランチは、編集 / ステージ / コミットプロセスを抽象化した概念です。作業ディレクトリ、ステージングエリア、プロジェクト履歴を全く新しく作成する手段であると考えることもできます。新しいコミットは現在のブランチの履歴に記録され、プロジェクト履歴のフォークを形成します。

git branch は、ブランチの作成、一覧表示、名称変更、削除を行うコマンドです。このコマンドにはブランチの切り替えを行う機能も、分岐した履歴を統合して元に戻す機能もありません。そのため、多くの場合 git branch コマンドは git checkout コマンドおよび git merge コマンドと併用されます。

よく使われるオプション

git ブランチ

リポジトリ内のすべてのブランチを一覧表示します。これは git branch --list と同義です。

git branch <branch>

<branch> という名称の新規ブランチを作成します。新たに作成されたブランチのチェックアウトは行われません

git branch -d <branch>

指定したブランチを削除します。ブランチにマージされていない変更が残っている場合は Git が削除を拒否するため、このコマンドは「安全な」操作です。

git branch -d <branch>

指定したブランチにマージされていない変更が残っていたとしてもそれを強制的に削除するコマンドです。このコマンドは、特定の開発ラインで行われたすべてのコミットを完全に破棄する場合に使用します。

git branch -m <branch>

現在のブランチの名前を <branch> に変更します。

git branch -a

すべてのリモートブランチを一覧表示します。 

ブランチの作成

ブランチはコミットへの単なるポインターであることを理解する必要があります。ブランチを作成する場合に Git が行うのは新しいポインターの生成です。リポジトリはまったく変更されません。たとえば、下図のようなリポジトリで作業を始めるとします。

Git チュートリアル: ブランチのないリポジトリ

続いて、次のコマンドを使用してブランチを作成するものとします:

git branch crazy-experiment

ここではリポジトリの履歴には何の変更も加えられません。新たに作られるのは現在のコミットに対するポインターのみです:

Git チュートリアル: ブランチの作成

この操作は単に新規ブランチを作成しただけであることに留意してください。このブランチへのコミット追加を開始するには、git checkout コマンドを使用して選択する必要があります。その後、通常の git add コマンドや git commit コマンドを使用します。 

リモートブランチの作成

これまでの例では、ローカルブランチの操作を説明しました。git branch コマンドは、リモートブランチに対しても動作します。リモートブランチを操作するには、まずリモートリポジトリを設定し、ローカルリポジトリの設定に追加する必要があります。

$ git remote add new-remote-repo https://bitbucket.com/user/repo.git
# ローカルリポジトリの設定にリモートリポジトリを追加
$ git push <new-remote-repo> crazy-experiment~
# crazy-experiment ブランチを new-remote-repo にプッシュ

このコマンドは、ローカルリポジトリ crazy-experiment のコピーをリモートリポジトリ <remote> にプッシュします。

ブランチの削除

ブランチでの作業が終了し master ブランチへのマージが完了すると、ブランチを削除しても履歴を失うことはありません:

git branch -d crazy-experiment

ただし、指定したブランチのマージが完了していない場合は、上のコマンドを実行するとエラーメッセージが表示されます:

error: The branch 'crazy-experiment' is not fully merged.
If you are sure you want to delete it, run 'git branch -D crazy-experiment'.

これにより、開発ライン全体へのアクセス手段の喪失を防止できます。ブランチを削除してもよいという確信がある場合 (そのブランチで行った実験的開発が失敗した場合など) は、大文字の -D フラグを使用します。

git branch -D crazy-experiment

このコマンドを実行すると、ブランチのステータスとは無関係に一切の警告なしに削除を行うため、慎重に使用しなければなりません。

上述のコマンドは、ブランチのローカルコピーを削除しますが、リモートリポジトリにはまだブランチが存在している場合があります。リモートブランチを削除するには、以下のコマンドを実行します。

git push origin --delete crazy-experiment

または

git push origin :crazy-experiment

この操作により、リモートリポジトリ origin に削除信号がプッシュされ、リモートブランチ crazy-experiment の削除がトリガーされます。

まとめ


このドキュメントでは、Git のブランチの動作と git branch コマンドについて説明しました。git branch コマンドの主な機能は、ブランチの作成、一覧表示、名称変更、削除です。このコマンドを実行した後のブランチをさらに操作するには通常、git checkout のような他のコマンドを一緒に使用します。ブランチの切り替えやマージなど、git checkout を使用したブランチ操作の詳細については、git checkout ページを参照してください。

他の VCS と比較すると、Git のブランチ操作は低コストで、頻繁に使用されます。この柔軟性により、Git ワークフローを強力にカスタマイズできます。Git ワークフローの詳細については、フィーチャーブランチワークフロー
GitFlow ワークフローフォーク型ワークフローの各ページの説明を参照してください。 

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

この対話式チュートリアルを利用しましょう。

今すぐ始める