テスト

よしデブ Blog

プログラミング、Web、IoTの話を発信。

【チュートリアル付き】gitに初挑戦してみようぜ!〜②初めてのbranch作成からmergeまで〜

はじめに

こんにちは、よしデブです。

前回に引き継ぎ git の操作を行っていきましょう。

今日は第二回ということで ブランチを用いた開発およびコード管理 を体験していただきたいと思います。git初めての方はもちろん、便利なオプションも紹介したいと思うので、経験者にも参考になれば幸いです。

前回のおさらい

前回の記事はこちら。 yoshidev523.hatenablog.com

前回は主に以下のことを体験してもらいました。

  1. コードを変更する
  2. コードを変更記録対象に指定する(git addコマンド)
  3. コードの変更を確定して記録する(git commitコマンド)

これらの作業は一つのブランチ上で行われます。

ブランチ(branch)とは?

ブランチは、ざっくり言うとコードを書く作業場です。

gitは必ずどこかのブランチ上で開発するようになっています。

ブランチは複数作ることができます。 このブランチという機能が、開発にgitを用いる上で一番の利点と言って良いと思います。 コードを書く作業場(ブランチ)を複数作ることで 他の作業場を汚すことなく開発することができます。

「汚すことがない」とはどういうことなのか、以降のチュートリアルで説明していきます。

チュートリアル

第一回の内容を踏まえた上で続きをやっていきましょう!

動作環境

動作環境は前回と同様、以下の通りです。

  • macOS 10.14.5(Mojave)
  • git v.2.21.0
  • Python v.3.5.7(Python3系ならどれでもOKです)

ブランチを作成して切り替える(git branchとgit checkout)

まず、現在のブランチが何なのかを確認します。確認にはgit branchコマンドを用います。

$ git branch
* master(緑色で出力)

現在のブランチがmasterブランチであることを確認してください。 masterブランチは最初にデフォルトで作成されるブランチです。

次に新しいブランチを作成します。 git branch {ブランチ名}でブランチを作成できます。今回はcalc-powerブランチ(累乗を計算する機能を作るブランチ)を作成します。 このようにブランチ名はそのブランチで何の機能を作るのか(修正するのか)を表すようにつけることをオススメします。

$ git branch calc-power
$ git branch
  calc-power
* master(緑色で出力)

さて、新たにcalc-powerブランチが作成されたことを確認します。 ここで注意してほしいのは、 ブランチは作成されたがそのブランチに未だ移動していない ということです。 ブランチを切り替えるコマンドはgit checkout {ブランチ名}です。 以下のコマンドでブランチを切り替わったことを確認してください。

$ git checkout calc-power
Switched to branch 'calc-power'
$ git branch
* calc-power(緑色で出力)
  master

【おまけ】ブランチを切る

補足ですが、このブランチを作成することはよく 「ブランチを切る」 と表現されます。 ブランチ(branch)は日本語でという意味で、枝分かれするイメージで切ると言われているのかな... 私もその辺はよくわかっていません笑

以降、ブランチを切るという表現を使うことがありますので、ブランチを作成するという風に読み替えてください。

【おまけ】ブランチ作成と切り替えを同時に行う(git checkout -b)

git branchでブランチを作成し、git checkoutでブランチを切り替えるという動作をまとめて行うコマンドがあります。 それはgit checkout -b {ブランチ名}というコマンドです。 既存のブランチ名を指定すると失敗するので注意してください。

$ git checkout -b calc-power
Switched to a new branch 'calc-power'
$ git branch
* calc-power(緑色で出力)
  master

次回からgit checkout -b {ブランチ名}というコマンドで、新たなブランチの作成および切り替えをしていきます。

ファイルを変更しコミットする(git addとgit commit)

calc-powerブランチに切り替えができれば、ファイルに機能追加をしていきましょう。 calc.pyファイルを以下のように変更(正確には追加)してください。変更内容は以下の通りです。

  • 累乗を計算するメソッド(power)を追加
  • 累乗の計算結果を出力

# coding: utf-8
def add(a, b):
  return a + b
# 引き算するメソッドを追加 def sub(a, b): return a - b
# 累乗を計算するメソッドを追加 def power(a, b): return a ** b
if __name__ == '__main__': # aを12に変更、bを8に変更 a = 12 b = 8 print('add: {0}+{1}={2}'.format(a, b, add(a, b))) # 引き算を実行 print('sub: {0}-{1}={2}'.format(a, b, sub(a, b))) # 累乗を計算 print('power: {0}^{1}={2}'.format(a, b, power(a, b)))

実際にプログラムを実行してみましょう。以下のような出力結果になればOKです。

$ python calc.py
add: 12+8=20
sub: 12-8=4
power: 12^8=429981696

正しくプログラムが動作したならば、コミットを行いましょう。 このあたりのコマンドについては第一回の記事を参考にしてください。

$ git add calc.py
$ git commit -m "powerメソッドを追加"
$ git log --oneline
dce5d65 (HEAD -> calc-power) powerメソッドを追加
8d34df8 a,bの値変更、subメソッドを追加
b5883d7 初めてのfirst commit

ブランチを切る恩恵を感じる

コミットが完了したら、ここでブランチをmasterブランチに一度切り替えてみましょう。

$ git checkout master
$ git branch
  calc-power
* master(緑色で出力)
masterブランチに切り替えたところで、calc.pyの中身を確認します。

# coding: utf-8
def add(a, b):
  return a + b
# 引き算するメソッドを追加 def sub(a, b): return a - b
if name == 'main': # aを12に変更、bを8に変更 a = 12 b = 8 print('add: {0}+{1}={2}'.format(a, b, add(a, b))) # 引き算を実行 print('sub: {0}-{1}={2}'.format(a, b, sub(a, b)))

内容が元に戻ってることが確認できましたでしょうか? 具体的には、先ほど追加した累乗計算の部分がありません。

git logコマンドでコミット履歴を確認してみます。

$ git log --oneline
8d34df8 (HEAD -> master) a,bの値変更、subメソッドを追加
b5883d7 初めてのfirst commit
累乗計算機能を追加したコミットがありません。 先ほど、「内容が元に戻ってる」と書きましたが、正確には masterブランチは累乗計算機能の追加が未だ反映されていない ということです。

これがブランチを切り替えて開発を行う良いところです。 開発するときに次の2つの問題がよく発生します。

  1. 既に動作するプログラムに対して新たな機能を追加する時、追加したことが原因で先ほどのプログラムが動作しなくなる。動作する状態に戻すことは容易ではない。
  2. 複数人で同時に開発する時、1つのファイルを編集している最中は他の人はそのファイルを使用することができない。

ブランチを切って開発することで以下の恩恵が受けられます。

  1. 既に動作するプログラムがあるブランチから独立して開発ができるので、プログラムの動作は保証される。
  2. 複数人がそれぞれ別のブランチ上で開発を行うことができ、それぞれのブランチは他のブランチの影響を受けないため同時開発が容易。

今回の場合に置き換えて考えると、累乗の計算がうまく動作しなかったり、累乗計算の機能が必要なくなったりした時、 masterブランチに戻って累乗計算のために追加した内容を簡単に無しにすることができます。

ブランチを統合して変更内容を反映する(git merge)

今回は累乗計算の動作確認ができたので、この変更内容をmasterブランチに反映したいと思います。 このようにブランチを統合することをマージ(merge)と言います。

マージにはgit mergeコマンドを用います。 現在のブランチがmasterであることを確認してからclac-powerブランチの内容を反映してみましょう。 現在のブランチがmasterブランチでなければgit checkoutコマンドでmasterブランチに切り替えてから行ってください。

$ git branch
  calc-power
* master(緑色で出力)
$ git merge calc-power
Updating 8d34df8..dce5d65
Fast-forward
 calc.py | 7 +++++++
 1 file changed, 7 insertions(+)

無事にマージできたでしょうか? ここで、もう一度calc.pyの中身を見てみます。

# coding: utf-8
def add(a, b):
  return a + b
# 引き算するメソッドを追加 def sub(a, b): return a - b
# 累乗を計算するメソッドを追加 def power(a, b): return a ** b
if __name__ == '__main__': # aを12に変更、bを8に変更 a = 12 b = 8 print('add: {0}+{1}={2}'.format(a, b, add(a, b))) # 引き算を実行 print('sub: {0}-{1}={2}'.format(a, b, sub(a, b))) # 累乗を計算 print('power: {0}^{1}={2}'.format(a, b, power(a, b)))

masterブランチに累乗計算機能が追加されていることを確認できたかと思います。

$ git log --oneline
dce5d65 (HEAD -> master, calc-power) powerメソッドを追加
8d34df8 a,bの値変更、subメソッドを追加
b5883d7 初めてのfirst commit

コミットログを見てもmasterブランチに反映されていることを確認できますね。いい感じです。

不要なブランチを消去する(git branch -d)

calc-powerブランチはmasterブランチに無事にマージされたのでもう必要ありません。 git branch -d {ブランチ名}というコマンドでブランチを消去します。

$ git branch -d calc-power
$ git branch
* master(緑色で出力)

チーム開発の流れ

複数人(チーム)で1つのプロダクトを開発する時、実際に多くの現場ではブランチを駆使して開発しています。 チームメンバーそれぞれが各機能を分担し、機能ごとにブランチを切って開発していきます。

例えば、webページをチーム開発するとしましょう。

masterブランチは常に動作する状態を保っておくブランチで、masterブランチに直接コミットはしません。 他のブランチからマージすることで変更を反映していきます。

上図のように、ある人はwebページにボタンを配置し、あるアザラシはヘッダーを配置することを担当されました。 それぞれはブランチをmasterブランチから新たに作成して、それぞれ独立したブランチ上で開発していきます。 そして、開発が終了した時はmasterブランチにマージされ、masterブランチは機能がどんどん追加されていきます。

このようにチーム開発においてそれぞれが機能ごとにブランチを切って開発をしていくことで、複数人で同時に開発したとしてもmasterブランチは常に動作する状態を保っています。

うむ、ブランチ最高。

おわりに

今回はgit操作のチュートリアル第二弾として、gitで重要な機能であるブランチについて説明しました。

次回はGitHubを使ってリモートに自分のgitプロジェクトをアップする体験をしていただきたいと思います。

ではでは。

ご指摘、ご意見などがあれば、コメントお願いします。またTwitterのDMにでもご連絡いただけたらと思います。よしデブ(@yoshidev523)| Twitter