こんにちは、バカンのソフトウェアエンジニアの垣野内です。
この記事はバカン Advent Calendar 2019の22日目の投稿です。
前回に引き続きgitの入門記事をおとどけします!今回はブランチについての解説です。
ブランチは、覚えるコマンドは少ないのですが、慣れるのに少し時間がかかるかもしれません。
今回もこれでもかというくらいスクショをつけておきました!
コマンドでの入門をおすすめするのは、第一回に述べた通りです。
「なんでコマンドなの?もう令和だよ?」と言いたくなる気持ちをグッとこらえて、コマンド練習までぜひ一緒にやってみてください!
ブランチとはどんなものか
前回のコマンド練習その1のところで、git log
というコマンドを使うことでコミットの履歴が見れることを確認しました。
↓再掲
git log --graph --all
というオプションをつけて実行すると、もう少しグラフィカルに見れます↓
(※ グラフィカルに見る方法はいくつかあります1)
コミット1つ1つがアスタリスク * で表され、それらがつながったグラフが左端に表示されました。
このグラフをコミットグラフと呼びます。
(おそらく公式な用語となってるわけではないですが、よく使われる言葉です)
そして、ブランチとは、特定のコミットからコミットグラフを枝分かれ(まさに”ブランチ”)させるための仕組み です。コマンド練習その2のところで解説しますが、ブランチを作ったときのコミットグラフを先にお見せするとこんな感じになります↓
このコミットグラフを表示させ、そして理解するところまでが今回のゴールです!
ブランチを使うと何が嬉しいのか
大きく3つ嬉しいことがあると筆者は考えてます:
1. 枝分かれさせることで(ブランチを作ることで)、”本流”の方にうっかり影響をあたえずにすむ
2. 複数人で並行して作業ができる
3. コミットのまとまりを作ることができる
※"本流"というのはあくまで比喩です。枝分かれの前の「木の”幹”」と言ってもいいでしょう。具体的にはコマンドのところで理解を深めてください!
よくわからない人も、やはりコマンドを叩いてみることでわかるかと思いますのでやってみましょう!
コマンド練習その2
さて、まずはブランチの一覧を確認するコマンドからいきましょう。
「え?もうブランチがあるの?」と驚かれたかもしれませんが、実は、git init
した時点で、master
ブランチという名前のブランチがデフォルトで作られるのです。
ブランチの一覧(git branch
)
では、git branch
とたたいてみましょう!
無事にmaster
ブランチの存在が確認できたでしょうか?
git log
のところですでに見えていたHEAD -> master
の master
とは、実はmaster
ブランチのことだったんですね。(上図↑赤枠)
HEAD
とは現在の作業ディレクトリのことです。(作業ディレクトリについては第一回 へ)
つまり、「現在の作業ディレクトリは master ブランチを向いていますよ」ということです。
(ここの説明はブランチを複数作ってみたら理解できると思うので、わからなくても先に進んでみてください!
操作的な理解のあとに意味的な理解がついてくると思います。)
ブランチを新たに作る(git branch <ブランチ名>
)
次に、ブランチを作ってみましょう。git branch <ブランチ名>
で作ることができます。
ここでは、branch_test_1 というブランチ名にしてみます。つまり、git branch branch_test_1
とたたいてみましょう!そして、もう一度git branch
と叩いてブランチの一覧を確認しましょう!
↑上のように、branch_test_1 というブランチが作成できたでしょうか?
左のアスタリスクは、「作業ディレクトリが現在いるブランチ」を表しています。
現在”いる”という表現がわかりにくいかもしれませんが、これも進めていくうちにわかるかと思います。
ここで、git log --graph --all
も確認しておきましょう。
赤枠の部分の表示が少し変わりましたね。
ブランチが2つあり、HEAD
は依然 master
ブランチを向いています。
ブランチを切り替える(git checkout <ブランチ名>
)
ブランチには「切り替え」という考え方があります。
今、master
ブランチに”いる”ことを確認しましたが、branch_test_1
ブランチに”切り替え”てコミットをすることで、master
ブランチの状態を全く汚すことなくファイルの変更をすることができます。
(作業ディレクトリをまるっとコピーして、別名で保存して作業しているのと似ています。しかし、”本流”に合流させる時の作業がはるかに簡単です)
実際にやってみれば意味がわかるでしょう。
まず、git checkout <ブランチ名>
とたたき、ブランチを切り替えます。今回はbranch_test_1
に切り替えたいので、git checkout branch_test_1
とたたきます。
そして、git branch
をたたき、切り替わっていることを確認しましょう!
↑上の図のようになったでしょうか?
ここで、git log --graph --all
も確認しておきましょう。
ブランチを切り替えたので、HEAD
はbranch_test_1
ブランチを向いています。
切り替えたブランチでコミットしてみる
切り替えたbranch_test_1
ブランチにて変更を加えてみましょう!
前回の復習ですが、「変更して、add して、commit する」 という流れですよ!
ここでは、”git third test on branch_test_1” という文字列を加えてみました。
コミットまでやったら、再びgit log --graph --all
でコミットグラフを確認してみましょう。
HEAD -> branch_test_1
のコミットはmaster
ブランチのコミットよりも先にいますね。2
もう一度何か変更を加えてみましょう!
ここでは、”git fourth test on branch_test_1” という文字列を加えてみました。
くどいようですが、コミットまでやったら、再びgit log --graph --all
でコミットグラフを確認してみましょう。
HEAD -> branch_test_1
がいるコミットがさらにさきに進んでいることがわかります。
もとのブランチに戻ってみると...???
ここでもとのmaster
ブランチに戻ってみましょう。git checkout master
です。
そして、git log --graph --all
を打ってみましょう。
masterブランチに切り替えたので、HEAD
の向き先が master
ブランチを向きましたね。
ここで、変更を加えてきたファイルも見てみてください。
”git third test on branch_test_1” という文字列や ”git fourth test on branch_test_1”という文字列がきれいになくなっていませんか?
なくなっているのではなく、作業ディレクトリがこの時のバージョンに戻ったのです!
これで、ブランチの一覧のところで説明した HEAD -> master
の意味がわかったのではないでしょうか?
また、ブランチを新たに作るのところで説明した、「作業ディレクトリが現在いるブランチ」という説明もわかってきたかと思います。
ブランチを切り替えて作業をすることで、別名フォルダや別名ファイルを作ることなく複数のバージョンを共存させることができるのです!
そのため、複数人での並行作業もやりやすいということですね!
これで、ブランチを使うと何が嬉しいのかのところのメリット1とメリット2についても回収したつもりです。(メリット3については最後に軽く触れます)
もとのブランチでコミットすると...???
もとのmaster
ブランチで1つコミットしてみましょう!
ここではtest2.txt というファイルを新たに作り、”git fifth test on master” という文字列を加えました。
コミットまでやったら、いつもどおり、git log --graph --all
でコミットグラフを確認してみましょう!
まさにツリーのようにブランチが生えているようすが表示されましたね!
これでgitのブランチに関しても入門できたと言ってよいでしょう!おつかれさまでした!
マージ(概念だけ)
最後に、後回しにしていたブランチを使うと何が嬉しいのかのところのメリット3について軽く触れたいと思います。
すぐ上のコミットグラフにおける、branch_test_1
ブランチでの2つのコミットを本流のmaster
ブランチへ合流させることができます。これをマージと言います。
「branch_test_1
ブランチをmaster
ブランチにマージする」という言い方をします。
(gitにおけるマージには明確に方向があるということに注意。「AとBをマージする」のではなく、「AをBにマージする」という考え方です)
これによって、master
ブランチに一気に2つのコミットが取り込まれ、masterブランチのtest1.txtにもも”git third test on branch_test_1” という文字列や ”git fourth test on branch_test_1”が現れるようになります!
そして、この2つのコミットを戻したかったら、このマージを取り消せばよいのです3。
マージのコマンドについては、ググってぜひやってみてください!
おさらいです。以下のコマンドの操作とともに、ブランチの有用性が理解いただけたかと思います。
-
git branch
(引数なし)(ブランチの一覧を表示) -
git branch <ブランチ名>
(ブランチの作成) -
git checkout <ブランチ名>
(ブランチの切り替え)
おわりに
git シリーズはこれでおしまいです。入門者の方が挫折しないよう、内容をしぼり、かつ丁寧なコマンドの解説を試みました。
もちろんこの2回の記事で紹介できてないコマンドもいくつもあるのですが、基本的な考え方が理解できれば適宜ググっていけるのではないかと思っています。
参考文献
- 入門Git 絶版となってしまったようですが、個人的にはとても好きな本です。合う/合わないがとてもはっきりわかれる本だと思います。
- Git の仕組み (1) この記事を読んで Git って面白いなと思ったのでした。ものごとの仕組みに興味のある方は、コマンドに慣れてきたころに読んでみると面白く読めると思います。
- サルでもわかるGit入門
- https://twitter.com/098ra0209/status/1163424568544907265 最近 twitter で見つけたものです。ポップな絵とともに用語の整理ができてよいですね。
参考リンク
-
VSCode や IntelliJ などのエディタのプラグインを使うという方法、SourceTree などの git のGUIクライアントを使うという方法などです。ちなみに筆者は、以下のように、
git log --graph --all --format=\"%x09%C(cyan bold)%an%Creset%x09%C(yellow)%h%Creset %C(magenta reverse)%d%Creset %s\"
というコマンドを git の alias に登録して、git tree
と打てばこれを呼び出せるようにしています。グラフィカルかつブランチが見やすいので気にいっています。.gitconfig
というファイルがあると思うので、そこに全く同じように書けばよいです。 ↩ -
本編に書くか迷いましたが、git では、コミットへの参照という形でブランチが実現されています。コミットをするたびに、最新のコミットを追いかけていくので、動く参照です。 ↩
-
gitは、マージも1つのコミットとして表現されます。マージを消すとはこのコミットを”取り消す”ということにほかなりません。さらについでに補足すると、git における「コミットんぼ取り消し」には2種類あります; 1.そのコミットをなくすというコミットをする(revert) 2.本当にそのコミットをなかったことにする(reset) それぞれググってみてください! ↩