前回はローカルリポジトリでの基本的な操作を行いました。
kurora-shumpei.hatenablog.com
今回はGitの重要で便利な機能の一つである「ブランチ」の使い方を説明していきます。
では早速始めていきましょう。
今回の記事作成する際に参考にした本です。
GitHub実践入門──Pull Requestによる開発の変革 WEB+DB PRESS plus
ブランチとは
日本語訳すると「枝」という意味ですね。だから何なんだと思うかもしれませんが、この名前が「ブランチ」の機能をいい感じに表しています。
どういうことかというと、ブランチは
現在の進行している作業を枝分かれさせることで、別々の作業を同時進行させることができる
という機能を持っているからです。
以下の図を見ればなんとなく理解できるかと思います。
masterブランチというのがGitで標準で用意されているブランチです。基本的にはこのmaterブランチを主軸にして作業を進めていきます。
一人で作業しているとかだと、このmasterブランチ上で作業を進めれば問題ありません(そうなるとそもそもGit使わかなくても...)。
ただ、複数人で作業するとなると作業分担などが発生して、別々の作業を同時進行する場面が出てくると思います。そういうときに「ブランチ」が真価を発揮するわけです。
どういうことかというと、主軸であるmasterブランチから枝分かれするように新しい「ブランチ」(上の図だとalphaブランチとbetaブランチ)を生成することで、別々の作業を他の作業に干渉されることなく進めることができるのです。
上の図を例にすると、
① masterブランチで作業を進めていた時に、alphaという機能とbetaという機能を実装する必要がでてきました。
② なので、現在のmasterブランチからalphaブランチとbetaブランチを作成して、それぞれの機能を実装するために作業を進めます。
③ beta機能は結局いらないことになったので、betaブランチを削除して作業自体をなかったことにします。
④ alpha機能は実装することができましたので、主軸であるmasterブランチに統合(マージと呼びます)します。
大体こんな感じでブランチを活用し、作業を進めていきます。
ちなみに、ブランチを作成することを「ブランチを切る」とよく言うので覚えていてください。
ブランチの操作
ブランチの概要は大体理解できたと思うので、これからは実際にGIt上でのブランチの操作を学んでいきましょう。
ブランチの一覧表示 : git branch
このコマンドは、現在存在するブランチの一覧表示をしてくれる上に、現在自分がどのブランチ上にいるかも教えてくれます。
早速実行してみましょう。
git branch
そうすると
*master
このように表示されると思います。
この左端にある「*」が現在のブランチを示しています。この表示から、今はmasterブランチしか存在していないということがわかります。
ブランチを作成して移動する : git checkout -b
このコマンドは、新しいブランチを作成して、さらにそのブランチに移動する所までやってくれます。
早速実行してみましょう。
git checkout -b alpha
そうすると
Switched to a new branch 'alpha'
このように表示されます。この状態で
git branch
を入力すると
* alpha master
こんな感じに表示されたら成功です。
ちなみに、このコマンドはブランチの作成と移動を勝手にやってくれますが、作成と移動に関しては個別のコマンドがちゃんと存在します。
git branch alpha # ブランチの作成 git checkout alpha # ブランチの移動
大体の場合は「git checout -b」で問題ないですが、もしどちらか一方だけを使いたいときはこれらのコマンドを活用してください。
ブランチを作成して移動することができたので、実際にこのブランチ上で簡単な作業をしてみましょう。
以前作った「README.md」ファイルがあるかと思いますので、そのファイルに何でも良いですが、今回は「alpha」という単語を追加してみてください。
追加して保存したら、「README.md」ファイルをコミットしてみましょう。
git add README.md git commit -m "Add alpha"
これでalphaブランチ上ではalphaという文字が「README.md」ファイルに追加されています。
masterブランチでの確認
今の作業はalphaブランチで行っていたので、materブランチの方では何も変化がないはずです。まあ一応確認しておきましょう。
git checkout master
これでmasterブランチに切り替わりました。そして「README.md」ファイルを確認してみましょう。恐らく何も記述されていないはずです。
このように、ブランチごとが独立していることで、別々の作業を並行して行うことができるのです。
ブランチの種類
ブランチには大きくわけて2つの種類があります。まあ、ぶっちゃけ知らなくても問題ないですが、知っていて損はないので一応紹介しておきます。
トピックブランチ
名前というのはそのものの性質を表していることが多いですよね。今回もその例に漏れず、トピックブランチという名前がその性質を表しています。
要するに、一つのトピックに集中して、他の作業は一切行わないブランチのことです。
今回の作業の場合だと、alphaブランチがトピックブランチに当たります。
他の作業を一切行わないのが重要で、もし、他の作業、例えばバグ修正だとかをするときは、また新しくブランチを作成して、そのブランチ上でバグ修正を行うようにします。
このような作業形態をとれば、masterブランチは常に安定して動作することができるので、他の人に公開するときも気兼ねなく公開することができます。
統合ブランチ
統合ブランチはトピックブランチの分岐点となるようなブランチのことで、併合する先となるブランチになっています。
今回の作業の場合だとmasterブランチが統合ブランチに当たります。
先ほど説明しましたが、この統合ブランチは常に安定して動作しておくべきものなので、中途半端な変更などはしないようにしましょう。
ブランチを統合(マージ) : git branch
では、alphaブランチ(トピックブランチ)をmasterブランチ(統合ブランチ)に統合(マージ)してみましょう。
このマージという作業は統合先のmasterブランチ上で行います。
なので、まずはmasterブランチに移動しましょう。
git checkout master
そして、alphaブランチをマージします。この時に、ブランチからマージしたことをログに残すためにマージコミットを作成しておきましょう。
git merge --no-ff alpha
「--no-ff」がマージコミットを行うためのオプションとして動作します。
そうすると、
Merge branch 'alpha' # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit.
このようにマージコミットメッセージを記入するためのエディタが自動的に立ち上がります。
ただ、一番上の行にalphaブランチからマージされましたよーというメッセージをGitが勝手に書いてくれているのでありがたくそれを使いましょう。
なので、とくに編集せずにそのまま保存してください。
これでmasterブランチにalphaブランチの内容がマージされました。
競合(コンフリクト)を解消
ブランチは別の作業を並行して進めるときに便利だと説明しました。ただ、複数作業を並行して進めるときによく起きる問題があります。それは別の作業で同じファイルを編集してしまい、どちらかの編集が上書きされてしまうことです。
この問題は、複数人で作業するときに気をつけなければならないことの一つで、「コンフリクト」と呼ばれています。これを起こしてしまうと、一方の作業が完全に無駄になってしまいます。なので、同じファイルを複数人で編集しないようにするなどして起こさないようにすることが必要です。
ただ、どうしても同じファイルを複数人で編集する必要がある場面があったりますので、もしコンフリクトが起きてしまった場合の対処方法を紹介します。
とりあえず、コンフリクトを起こしてみましょう。
まずは新しくブランチを作成しましょう。
git checkout -b beta
そして、README.mdファイルに「beta」という単語を追加して、保存しましょう。
そしていつも通り、コミットしましょう。
git add README.md git commit -m "Add beta"
次にalphaブランチへ移動します。
git checkout alpha
そしてREADME.mdファイルのalphaの後ろに「++」を追加して保存しましょう。
そしていつも通りコミット。流石にコマンドは省略しますね。
次にmasterブランチへ移動、してalphaブランチをマージします。
git checkout master
git merge --no-ff alpha
そして、次にbetaブランチをマージしてみましょう。
git merge --no-ff beta
恐らく以下のようなメッセージが表示されたかと思います。
Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result.
これがコンフリクトです。alphaブランチで編集した内容がbetaブランチをマージすることで上書きされてしまいますよ、という注意をしてくれています。
これを解消しないとマージができませんので、README.mdファイルを開いてコンフリクトを解消しましょう。
コンフリクト部分をテキストエディタから解消する
README.mdファイルを開くと以下のようになっていると思います。
#0から始めるGitHub <<<<<<< HEAD alpha++ ======= alpha beta >>>>>>> beta
実際はもうちょっとカラフルかもしれませんが、大体こんな感じになっているはずです。
「=======」より上が現在のmasterブランチに反映されている内容です。それより下がマージしようとしているbetaブランチの部分です。
このコンフリクトを解消するためには、理想の状態に内容を編集してあげれば良いだけです。
#0から始めるGitHub
alpha++
beta
こんな感じですかね。「=======」、「<<<<<<< HEAD」、「>>>>>>> beta」の部分を消去して保存すれば、コンフリクトを解消したことになります。今回は「alpha」もいらなかったので消去しました。
このように、コンフリクトが起きたらエディタを開き、内容をよく確認してコンフリクトを解消するようにしましょう。
そして、最後はいつも通りコミットしましょう
git add README.md git commit -m "Fix Conflict"
最後に
これで、ブランチの概要と基本的な操作を習得することができました。今回紹介したもの以外にも、ブランチの操作は存在しますので興味のある人は確認しておいてください。基本的な操作としては今回紹介した内容で十分だと思います。
次回は、ついについにリモートリポジトリに変更を登録するための操作を説明をしていきます。
今回の記事作成する際に参考にした本です。