続・イラストでわかるgit入門の入門:ブランチを切る
- カテゴリ :
- バックエンド(インフラ)
- タグ :
- Tech
- git
- バージョン管理
こんにちは!志田です。
最近ドラクエモンスターズを購入しました。
だいあくまの書・シュプリンガー・メッサーラのパーティでがんがんいってます。
配合を繰り返していると、「この組み合わせ、AにもBにもなるのに!どっちが強くなるんだろう?」ということがたびたび起こります。
そんなときに使えたらいいのが、今回ご説明するブランチです。
前回の記事では、バージョン管理と基本的な動作について、ご説明しました。
・バージョン管理にgitを使おう!
・コミットを繰り返し、キリのいいところでプッシュする
・コミットを重ねることでバージョン管理ができる
みなさん、これまでの経験で、こんな経験ってありませんか?
・直すことによる影響範囲が広いため、もしきちんと改修できて、テストもできたら安定バージョンに含めたい
今まで何度もコミット・プッシュを重ねてきたプロジェクト。現在は安定バージョン!
上司「ちょっとおっきめの改修、お願いするよ!」
(えええ、それはちょっと、影響範囲が多岐に渡りますよ…)
・バグだらけでリリースしてしまったプログラム
チケット(バグ管理の単位)ごとに修正して、直ったものから本番に含めたい
・とにかく、安定バージョンとバグ直し中のバージョンをごっちゃにしたくない!
今までのコミットの流れは、こんなかんじです。
[コミット] → [コミット] → [コミット] →[現在の安定バージョン]
・・・これって、枝が伸びているように見えませんか?
それでは、さっき頼まれたあの改修を、現在のバージョンから枝分かれしたバージョンで行なって、
もしもきちんと修正・テストができたら現在のバージョンに含めるというのはどうでしょうか?
そうすれば、安定 + 修正のバージョンで、今以上によくなっているはず。
ひとつのプロジェクトから枝分かれをさせ、別の作業を行うことを「ブランチを切る」といいます。
ブランチとは、「支流、枝、分岐する」といった意味があります。
つまり、ブランチを切るというのは、「現行バージョンから枝分かれをさせる」という意味になります。
また、先ほどの図でいうと、安定バージョンを「masterブランチ」といいます。
これは、gitで管理をしている本流の、もともとのブランチのことで、自動的にmasterブランチと名前がついています。
ポケモンでいうと、サトシがイーブイゲットしたとき、もともとはサンダースにするつもりでした(masterブランチ)。
だけど、イーブイは1匹しかもらえないので、シャワーズとブースターも図鑑に書き加えたいです。
なので、masterブランチのほかに、シャワーズにしたバージョンとブースターにしたバージョンのブランチを切り、
あとでそれらをまとめれば、一気に全部の系統が図鑑に加えられます!やった!
ポケモンにもドラクエモンスターズにも美少女ゲームにも、ブランチが欲しいところですね。
では、実際にやってみましょう。
まさとしさんは、自社のHPを作るプロジェクトを任されました。
まずは、git管理のプロジェクトを作成しました。
そして、そこにindex.htmlを作成しました。
index.htmlができました。うーん、我ながらいい出来。
index.htmlをgit addをして、git管理下に含めます。
そして、git commitをして、現在の状況をコミットしました。
コミットには、ひと目でなにがしたかわかりやすいようにコミットメッセージをつけます。
ひとまずこの状況を本番状態としました。
数日後、まさとしさんは上司に呼ばれました。
「まさとしくん、あのHPカッコイイんだけど、トップページ訛ってない?」
本当だ・・・
ホームページと打つつもりが、ホームペーズになっていました。うう、直したい。
それに、いい文章も思いついちゃったんだよな。追加したい…。
でも、本番はとりあえずバグなく動いているし、修正がちゃんとできてから、チェックをしてから本番に反映したい。
そうだ、ブランチを切ろう!
とりあえず、現在のブランチを確認します。確認するには、git branchと入力します。
git init した状態だと、masterというブランチができています。
これまでにご説明したとおり、本流のブランチになります。
では、ここからタイポ(打ちミス)を修正するためのブランチを作成します。
git branch <ブランチ名> と入力することで、ブランチを作ることができます。
作ったら、またgit branchコマンドで一覧を確認しましょう。
ブランチの一覧を確認すると、たしかに「typo」ブランチができていることがわかります。
いままさとしさんが編集しているブランチはmasterで、行頭に*マークがついています。わかりやすいですね。
では、typoブランチに切り替えて、本当に切り替わったか確認します。
切り替えるには、git checkout <ブランチ名>と入力します。
*マークが移動し、ブランチがmasterからtypoに切り替わったことがわかります。
では、ファイルの中身を確認してみましょう。
特に変わっていません。
なぜなら、masterブランチからブランチを切ったために、masterブランチの状態(index.htmlがコミットされた状態)から
編集履歴が枝分かれしているだけだからです。
分かれた瞬間なので、なにも変わっていません。
では、タイポを直して行きましょう。
タイポを直すついでに、さっきひらめいた素敵なコピーも追加します。
修正したので、状態を見てみます。
On branch typoとあることから、typoブランチでの修正であることがわかります。
では、gitの管理下に追加し、コミットしましょう。
コミットはできましたが、今修正した内容が本番であるmasterブランチにも反映されてないかな?大丈夫かな?
まさとしさんを不安が襲いました。切り替えて確認してみます。
・・・よかった!まだmasterブランチは訛ったトップページのままです。
では、先ほどのtypoブランチをmasterブランチにマージします。
ポケモンでいうと、イーブイをブースターにしたデータを、イーブイをサンダースにした本命データに統合して図鑑を埋めることです。
なにやら、index.htmlがマージされたようです。内容を確認しましょう。
おお!直っています!そのうえ、さっき追加した素敵なコピーも追加されています。やった!
では、もうこの「typo」ブランチは必要ないので、削除しましょう。
削除には、git branch -d <削除したいブランチ名> というように、-dのオプションをつけます。
削除後に確認したところ、きちんとtypoブランチが削除され、元のmasterブランチだけになりました。
もちろん、先ほど行ったtypoブランチでの編集は、git mergeを行ったことでmasterブランチに含められたので、
typoブランチを消した今でも、masterブランチにその修正が残っているのです。
ブランチはいくつも作ることができます。
バグ単位で修正をしたり、大掛かりな修正をブランチとして切ったり、
Aブランチで行き詰まった時にBブランチを移動して、ブランチも頭も切り替えてすっきり作業するなど、
ブランチにはたくさんメリットがあります。
・ブランチを切ると、本流とは別の作業ができる
・あるブランチの修正をしても、他のブランチに影響しない
・ブランチはバグ修正や、大掛かりな修正など本流をいじりたくないときに便利
ターミナル上で目に触れる「ブランチ」は、文字だし実体があるんだかないんだかといったところで
とっつきにくい部分がありますが、頭の中にコミットとブランチの枝を思い浮かべることで、
少しわかりやすくなるかと思います。
みなさんもブランチ切ってくださいね。
最近ドラクエモンスターズを購入しました。
だいあくまの書・シュプリンガー・メッサーラのパーティでがんがんいってます。
配合を繰り返していると、「この組み合わせ、AにもBにもなるのに!どっちが強くなるんだろう?」ということがたびたび起こります。
そんなときに使えたらいいのが、今回ご説明するブランチです。
前回のあらすじ
前回の記事では、バージョン管理と基本的な動作について、ご説明しました。
・バージョン管理にgitを使おう!
・コミットを繰り返し、キリのいいところでプッシュする
・コミットを重ねることでバージョン管理ができる
こんな経験ありませんか
みなさん、これまでの経験で、こんな経験ってありませんか?
・直すことによる影響範囲が広いため、もしきちんと改修できて、テストもできたら安定バージョンに含めたい
今まで何度もコミット・プッシュを重ねてきたプロジェクト。現在は安定バージョン!
上司「ちょっとおっきめの改修、お願いするよ!」
(えええ、それはちょっと、影響範囲が多岐に渡りますよ…)
・バグだらけでリリースしてしまったプログラム
チケット(バグ管理の単位)ごとに修正して、直ったものから本番に含めたい
・とにかく、安定バージョンとバグ直し中のバージョンをごっちゃにしたくない!
コミットの流れと分岐
今までのコミットの流れは、こんなかんじです。
[コミット] → [コミット] → [コミット] →[現在の安定バージョン]
・・・これって、枝が伸びているように見えませんか?
それでは、さっき頼まれたあの改修を、現在のバージョンから枝分かれしたバージョンで行なって、
もしもきちんと修正・テストができたら現在のバージョンに含めるというのはどうでしょうか?
そうすれば、安定 + 修正のバージョンで、今以上によくなっているはず。
ブランチ
ひとつのプロジェクトから枝分かれをさせ、別の作業を行うことを「ブランチを切る」といいます。
ブランチとは、「支流、枝、分岐する」といった意味があります。
つまり、ブランチを切るというのは、「現行バージョンから枝分かれをさせる」という意味になります。
また、先ほどの図でいうと、安定バージョンを「masterブランチ」といいます。
これは、gitで管理をしている本流の、もともとのブランチのことで、自動的にmasterブランチと名前がついています。
ポケモンでいうと、サトシがイーブイゲットしたとき、もともとはサンダースにするつもりでした(masterブランチ)。
だけど、イーブイは1匹しかもらえないので、シャワーズとブースターも図鑑に書き加えたいです。
なので、masterブランチのほかに、シャワーズにしたバージョンとブースターにしたバージョンのブランチを切り、
あとでそれらをまとめれば、一気に全部の系統が図鑑に加えられます!やった!
ポケモンにもドラクエモンスターズにも美少女ゲームにも、ブランチが欲しいところですね。
プロジェクトでブランチ疑似体験
では、実際にやってみましょう。
まさとしさんは、自社のHPを作るプロジェクトを任されました。
まずは、git管理のプロジェクトを作成しました。
- drwxr-xr-x
3 masatoshi staff 102 6 13 18:29 . - drwx------+
17 masatoshi staff 578 6 13 18:28 .. - drwxr-xr-x
10 masatoshi staff 340 6 13 18:29 .git
そして、そこにindex.htmlを作成しました。
- ようこそ!アシアルのホームペーズへ!
index.htmlができました。うーん、我ながらいい出来。
- drwxr-xr-x
4 masatoshi staff 136 6 13 18:30 . - drwx------+
17 masatoshi staff 578 6 13 18:28 .. - drwxr-xr-x
10 masatoshi staff 340 6 13 18:29 .git - -rw-r--r--
1 masatoshi staff 55 6 13 18:30 index.html
index.htmlをgit addをして、git管理下に含めます。
そして、git commitをして、現在の状況をコミットしました。
- $
git add index.html - $
git commit
コミットには、ひと目でなにがしたかわかりやすいようにコミットメッセージをつけます。
- indexファイルを作成しました
- #
Please enter the commit message for your changes. Lines starting - #
with '#' will be ignored, and an empty message aborts the commit. - #
- #
Committer: すくえに まさとし <masatoshi@example.com> - #
- #
On branch master - #
- #
Initial commit - #
- #
Changes to be committed: - #
(use "git rm --cached <file>..." to unstage) - #
- #
new file: index.html - #
ひとまずこの状況を本番状態としました。
数日後、まさとしさんは上司に呼ばれました。
「まさとしくん、あのHPカッコイイんだけど、トップページ訛ってない?」
本当だ・・・
ホームページと打つつもりが、ホームペーズになっていました。うう、直したい。
それに、いい文章も思いついちゃったんだよな。追加したい…。
でも、本番はとりあえずバグなく動いているし、修正がちゃんとできてから、チェックをしてから本番に反映したい。
そうだ、ブランチを切ろう!
まさとし ブランチを切る
とりあえず、現在のブランチを確認します。確認するには、git branchと入力します。
- $
git branch - *
master
git init した状態だと、masterというブランチができています。
これまでにご説明したとおり、本流のブランチになります。
では、ここからタイポ(打ちミス)を修正するためのブランチを作成します。
git branch <ブランチ名> と入力することで、ブランチを作ることができます。
作ったら、またgit branchコマンドで一覧を確認しましょう。
- $
git branch typo - $
git branch - *
master typo
ブランチの一覧を確認すると、たしかに「typo」ブランチができていることがわかります。
いままさとしさんが編集しているブランチはmasterで、行頭に*マークがついています。わかりやすいですね。
では、typoブランチに切り替えて、本当に切り替わったか確認します。
切り替えるには、git checkout <ブランチ名>と入力します。
- $
git checkout typo - Switched
to branch 'typo' - $
git branch master - *
typo
*マークが移動し、ブランチがmasterからtypoに切り替わったことがわかります。
では、ファイルの中身を確認してみましょう。
- ようこそ!アシアルのホームペーズへ!
特に変わっていません。
なぜなら、masterブランチからブランチを切ったために、masterブランチの状態(index.htmlがコミットされた状態)から
編集履歴が枝分かれしているだけだからです。
分かれた瞬間なので、なにも変わっていません。
では、タイポを直して行きましょう。
タイポを直すついでに、さっきひらめいた素敵なコピーも追加します。
- ようこそ!アシアルのホームページへ!
- PHPでの開発ならまかせてください!
修正したので、状態を見てみます。
- $
git status - #
On branch typo - #
Changes not staged for commit: - #
(use "git add <file>..." to update what will be committed) - #
(use "git checkout -- <file>..." to discard changes in working directory) - #
- # modified:
index.html - #
- no
changes added to commit (use "git add" and/or "git commit -a")
On branch typoとあることから、typoブランチでの修正であることがわかります。
では、gitの管理下に追加し、コミットしましょう。
- $
git add index.html - $
git commit - typoの修正とコピーの追加
- #
Please enter the commit message for your changes. Lines starting - #
with '#' will be ignored, and an empty message aborts the commit. - #
- #
Committer: すくえに まさとし <masatoshi@example.com> - #
- #
On branch typo - #
Changes to be committed: - #
(use "git reset HEAD <file>..." to unstage) - #
- #
modified: index.html - #
コミットはできましたが、今修正した内容が本番であるmasterブランチにも反映されてないかな?大丈夫かな?
まさとしさんを不安が襲いました。切り替えて確認してみます。
- $
git checkout master - Switched
to branch 'master' - $
vim index.html
・・・よかった!まだmasterブランチは訛ったトップページのままです。
では、先ほどのtypoブランチをmasterブランチにマージします。
ポケモンでいうと、イーブイをブースターにしたデータを、イーブイをサンダースにした本命データに統合して図鑑を埋めることです。
- $
git merge typo - Updating
93fb5ae..2d7e002 - Fast-forward
index.html | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
なにやら、index.htmlがマージされたようです。内容を確認しましょう。
おお!直っています!そのうえ、さっき追加した素敵なコピーも追加されています。やった!
では、もうこの「typo」ブランチは必要ないので、削除しましょう。
削除には、git branch -d <削除したいブランチ名> というように、-dのオプションをつけます。
- $
git branch -d typo - Deleted
branch typo (was 2d7e002). - $
git branch - *
master
削除後に確認したところ、きちんとtypoブランチが削除され、元のmasterブランチだけになりました。
もちろん、先ほど行ったtypoブランチでの編集は、git mergeを行ったことでmasterブランチに含められたので、
typoブランチを消した今でも、masterブランチにその修正が残っているのです。
便利なブランチ
ブランチはいくつも作ることができます。
バグ単位で修正をしたり、大掛かりな修正をブランチとして切ったり、
Aブランチで行き詰まった時にBブランチを移動して、ブランチも頭も切り替えてすっきり作業するなど、
ブランチにはたくさんメリットがあります。
おさらい
・ブランチを切ると、本流とは別の作業ができる
・あるブランチの修正をしても、他のブランチに影響しない
・ブランチはバグ修正や、大掛かりな修正など本流をいじりたくないときに便利
ターミナル上で目に触れる「ブランチ」は、文字だし実体があるんだかないんだかといったところで
とっつきにくい部分がありますが、頭の中にコミットとブランチの枝を思い浮かべることで、
少しわかりやすくなるかと思います。
みなさんもブランチ切ってくださいね。