筆者の備忘録用に、ローカル開発におけるGitの基本コマンド(ブランチ編)をまとめました。
そもそもブランチとは?
ブランチとは、特定の開発作業(サイトに特定の機能を追加する、など)を独立して進めるための作業領域のこと。特にチーム開発では欠かせないツールで、個人開発においても組織的なコード管理と効率的な開発フローを実現できます。
ブランチでの作業が完了したら、その変更を主ブランチに「マージ」することで、その機能をプロジェクト全体に統合することができます。もしブランチで開発した内容が期待通りに機能しない場合は、簡単に元のソースコードに戻すこともできます。
ブランチ開発のメリット
元のソースコード(通常は「master」や「main」と呼ばれる主要なブランチ)から切り離し、そちらに影響を与えることなく開発を進めることでリスクを最小化できるのが最大のメリット。新機能の開発はもちろん、バグ修正などにも利用でき、一つのプロジェクト内で複数人が複数開発を同時に進められるのもポイントです。
個人で開発する場合のブランチの有用性は?
個人開発においても、組織的なコード管理と効率的な開発フローを実現できます。
新しい試みを安全に行いながら、必要に応じて元の状態に戻すことも容易になり、ソースコードの管理に最適です。
ブランチ開発の基本コマンド
【git checkout / git switch】ブランチの新規作成 & ブランチの移動
git branch 新しいブランチ名
git checkout 移動したいブランチ名
ブランチ開発の最初の一歩、まず新しいブランチを作成します。
ブランチを作成したら、現在のブランチ(通常は「main」または「master」)から作成したブランチに移動します。
慣れてきたら、上記コマンドを一つに纏めた以下コマンドでもOKです。
git checkout -b new-feature
git checkout の代わりに git switch を使う
git switch
はGit 2.23で導入された新しいコマンドで、ブランチの切り替えをより直感的かつ安全に行えるよう設計されています。
git switch 移動したいブランチ名
git checkout と同じで、ブランチを移動するときのコマンドです。
git switch -c new-branch
ブランチの作成と同時に、そのブランチに移動するコマンドです。
git checkout と git switch の違いは?
git checkout
は基本コマンド編にもある通り、「過去のコミットに遡る」などブランチの移動以外にも機能を有します。
一方git switch
は、ブランチの切り替え機能のみを有するコマンドです。
一見すると「多機能なgit switch
が使えればいいのでは・・・」と思われますが、その多機能さゆえ、操作を誤ると取り返しのつかない事態も起こり得ます。安全性という側面から、ブランチの切り替えに関してはgit switch
の使用が推奨されています。
【git branch】ブランチの確認
git branch
現在作成済のブランチ一覧が表示されます。(ブランチを作成していないときは「main」または「master」という主ブランチのみが表示されます。)
また、今自分がどこのブランチで作業しているかも確認できます。
【git merge】ブランチの更新内容を主ブランチに統合
ブランチで作業したら、git add
とgit commit
で更新内容をコミットします。
(こちらのコマンドについては基本コマンド編にて)
git add .
git commit -m "コミットメッセージ"
ブランチでコミットした内容は、主ブランチの方には反映されません。
反映させるためには、以下コマンドを実行して主ブランチに「マージ」します。
git checkout main
git merge 統合したいブランチ名
マージ先のブランチ(この場合は「main」)に移動してからマージします。
(git checkout main
の代わりにgit switch main
でもOKです。)
git merge コマンドのオプション
git mergeには様々なオプションが用意されています。
以下は、個人的によく使うものをピックアップしました。
git merge --no-ff
マージコミットを作成するオプション。
ファストフォワードマージ* が可能な場合でもマージコミットが作成され、マージが行われたことを常に履歴に残したい場合に使われる。
ちなみにデフォルト(オプションなし)では、ファストフォワードマージ* が許可される。(明示する場合のオプションは--ff
)
git merge --ff-only
ファストフォワードマージ* が可能な場合にのみマージを実行し、そうでない場合はマージを行わずにエラーを返すオプション。
ファストフォワードマージ(Fast-forward merge)は、履歴にマージコミットを作成せずにブランチを統合する方法です。
マージ対象のブランチが、主ブランチの直接の子孫である(=主ブランチで新しいコミットがなく、ブランチのコミットが新しく追加されるのみである)場合に適用できます。
ファストフォワードマージが適用されると、プロジェクトの履歴が直線的に保たれて分岐が発生していないかのようになり、読みやすくなります。
一方、特定のブランチでの作業を明確に示したい場合(例えば、特定の機能開発を行ったブランチを他の開発者と共有する場合など)、あえてマージコミットを明示的に作成する方が良い場合があります。(その場合に、上記の--no-ff
オプションを使用します。)
git merge --squash
ブランチの全コミットを1つにまとめて(スカッシュして)、マージ先のブランチにマージするオプション。
履歴をシンプルに保つことができます。(ただし、マージされるブランチの個々のコミットは失われます。)
git merge --abort
マージ中に問題が発生した場合に、マージ操作を中止してマージ前の状態に戻すオプション。
コンフリクト* が発生した場合など、いったんマージをキャンセルしたい場合に使います。
異なるブランチをマージしようとしたとき、同じファイルの同じ部分が異なる方法で変更されていた場合に発生します。
Gitではこれらの競合を自動で解決することはできないため、手動で介入して解決する必要があります。
【git branch -d / -D】ブランチを削除
git branch -d 削除したいブランチ名
指定したブランチを削除するコマンド。
主ブランチにマージした後など、ブランチ開発が終了して不要になったときに使用します。
削除対象のブランチで作業している場合は削除できませんので、他のブランチに移動してから実行します。
ただし、まだマージされていないブランチを指定した場合は、警告が出て削除されません。
削除前にマージしたかどうかを確認できる、比較的安全なコマンドといえます。
git branch -D 削除したいブランチ名
指定したブランチを強制的に削除するコマンド。
マージされていないブランチを指定した場合でも、警告なしで強制削除します。
基本的にはgit branch -d
を使って、これで削除できなかったけど削除したい場合に使うのが安全です。
【git log –oneline –graph –all】ブランチを含む全コミット履歴の確認
git log --oneline --graph --all
コミット履歴を視覚的 かつ コンパクトに表示するためのコマンド。(git log
については基本コマンド編にて)
オプションに--graph
や--all
を付けることにより、ブランチ間の関係を含めた履歴を確認できます。
--oneline
-
各コミットを一行(ハッシュの先頭数文字 + コミットメッセージ)で表示する。
表示がコンパクトになり、履歴が把握しやすくなる。 --graph
-
コミット履歴に、テキストベースでグラフィカルな表現を追加する。
ブランチの分岐や統合が視覚的に表示され、リポジトリの構造が理解しやすくなる。 --all
-
全ブランチのコミット履歴を表示する。
デフォルトのgit log
コマンドは、現在作業中のブランチの履歴のみを表示するが、--all
オプションを使うことで全ブランチの履歴を一覧できる。
参考までに、以下のような出力が得られます。
* abcdefg Merge branch 'feature'
|\
| * hijk123 Some feature work
* | lmno456 Another commit on main
|/
* qrst789 Initial commit
以上、ローカルにおけるブランチ開発でよく使うコマンドをご紹介しました。
本記事で紹介したコマンドは、実際にプロジェクトフォルダを用意してVSコードエディタで実行してみた画像付き記事もあります。より理解が深まると思いますので、本記事と合わせてご覧ください。