2014/01/27更新

[git] ブランチ使って開発しよう

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
今日は先日に引き続き、gitについてブログを書きたいと思います。今回は「ブランチ」を扱います。

画像

引用:http://www.flickr.com/photos/82955120@N05/12110418324


今回扱う内容は以下の通りです。
  1. ブランチとは
  2. ローカルブランチを作る
  3. ローカルブランチをリモートブランチに反映する
  4. リモートブランチをローカルブランチに持ってくる
  5. マージする
  6. ローカルブランチを削除する
  7. リモートブランチを削除する



ブランチとは

今までのブログ(さぁGitを始めようgitの基本操作)では、ブランチというものを意識せずに作業してきました。 gitには、svnのtrunkに該当するmasterブランチと、開発者が任意で作成できるブランチが存在します。 開発チームによって使い方は様々ですが、gitで開発する際には多くの場合、以下のような使い分けをするようです。

  • masterは開発できてテストもしてリリースするもの(したもの)を置いておく
  • 機能の開発や修正はブランチを作って作業して、開発やテストができたらmasterへマージする

例えば、フィーチャーブランチ(名前の例:feature-facebook-oauth)という機能追加ブランチを作ったり、 何らかの開発ブランチ(名前の例:develop-new-event)というブランチを作って、そのブランチで新規機能追加や既存機能の改善を行います。
また組織によっては、masterと同じくらい安定した状態のブランチ(名前の例:develop)を作る場合もあるようです。

ということで、gitを使って開発する場合には、基本的にはブランチで開発することとなるのです。(リリース前ならmasterで開発しちゃうこともあると思いますが)

ブランチについては、以下のページが(一見読みづらいと感じますが)分かりやすいので、ぜひご覧ください。

- 3.2 Git のブランチ機能 - ブランチとマージの基本 | git-scm.com



ローカルブランチを作る

まずはローカルブランチを作りましょう。ローカルブランチを作るとは、ローカルレポジトリにブランチを作るという意味です。 以下のコマンドで作成することが出来ます。

前回に引き続きstudyというディレクトリで作業を行います。

$ git branch first-branch
これでfirst-branchが出来ました。出来たブランチを確認するには、以下のコマンドでローカルブランチ一覧を表示することで確認出来ます。
$ git branch
  first-branch
* master
先ほど作ったfirst-branchが出来ていますね。 ここでmasterブランチの前に「*」が付いていることに気づくと思います。この「*」は、現在ローカルレポジトリで使っているブランチ(=カレントブランチ)を示しています。
それでは先ほど作ったブランチに移動しましょう。移動するには以下のように行います。
$ git checkout first-branch
Switched to branch 'first-branch'
first-branchに移動したメッセージが表示され、無事にfirst-branchをカレントブランチにすることが出来ました。checkoutはsvnと意味が違うので、最初は混乱しちゃいますよね。自分は長らく混乱してました。。。

なお、上記の「git branch」と「git checkout」をいっぺんに行うことも出来ます。以下のように行います。
$ git checkout -b first-branch
Switched to a new branch 'second-branch'
「-b」のオプションは便利でよく使うので、覚えておくと良いと思います。
これで、ローカルブランチの作成が出来ました☆



ローカルブランチをリモートブランチに反映する

さてローカルブランチを作ることは出来ましたが、このブランチを他の開発者と共有したい場合があります(したくない場合にはここで説明することは不要です)。
それを行うには、ローカルブランチをリモートブランチ(github)へ反映する必要があります。以下のように行います。

※カレントディレクトリは、first-branchとします。

$ git push origin first-branch
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/yoheiMune3/study
 * [new branch]      first-branch -> first-branch
You have new mail in /var/mail/A13030
これで無事にリモートレポジトリに、先ほど作ったfirst-branchというブランチが反映されました。
画像 githubのレポジトリのページで、上図のようにブランチを指定するところで、first-branchが表示されていることが分かります。
これでローカルブランチをリモートブランチに反映することが出来ました。



リモートブランチをローカルブランチに持ってくる

では上記とは逆に、誰かが作ってリモートレポジトリに存在するブランチを、ローカルレポジトリに持って来てみましょう。
まずはリモートレポジトリの最新情報を得るためのfetchという処理を行います。
$ git fetch
From https://github.com/yoheiMune3/study
 * [new branch]      second-branch -> origin/second-branch
second-branchというブランチがリモートレポジトリにあることが分かります。これをローカルレポジトリでも使えるようにするには、以下のように行います。
$ git branch second-branch origin/second-branch
Branch second-branch set up to track remote branch second-branch from origin.
これでsecond-branchがローカルレポジトリにも反映されました。ブランチが存在するかを確認してみましょう。
$ git branch
* first-branch
  master
  second-branch
ちゃんと、second-branchが存在することが分かりますね。あとはsecond-branchで作業したい場合には、checkoutでカレントブランチを切り替えればOKです。
なお、ブランチの確認には、上の他にオプションを付けて以下のような確認をすることも出来ます。
# リモートレポジトリにあるブランチを確認する
$ git branch -r
  origin/HEAD -> origin/master
  origin/first-branch
  origin/master
  origin/second-branch

# リモートとローカル両方確認する
$ git branch -a
* first-branch
  master
  second-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/first-branch
  remotes/origin/master
  remotes/origin/second-branch
オプションも覚えると色々と便利です。



マージする

さてブランチでいくつかコミットした結果を、マスターにマージしてみましょう。以下のようにファイルを編集したとしましょう。
# 可憐とディレクトリはfirst-branch
$ git branch
* first-branch
  master
  second-branch

# README.mdに文字を追加する
$ echo "ブランチで文字をついかしたよー" >> README.md

# addしてコミットする
$ git commit -am "ブランチでREADME.mdを編集したよ"

# リモートレポジトリに反映
$ git push
この内容を、masterへマージします。マージするには、以下のように行います。
# カレントブランチをmasterにする
$ git checkout master

# マージする
$ git merge first-commit
Updating 928bd4c..137638b
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
無事にマージが出来たようです。README.mdの中身を確認すると、masterブランチのREADME.mdに、first-branchブランチの内容が反映されていることが分かります。
$ cat README.md
study
=====

this is a repository for study.

追加してみた #ここを追加しましたA

変更したよ!他人だよ!

ブランチで文字をついかしたよー
マージを行うと、(オプションを指定しなければ)自動的にコミットもされます。
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
なので、このコミットをリモートレポジトリに反映すれば、マージは完了です。
$ git push
マージをすると基本的にはgitがいい感じに処理してくれますが、どうしてもgitが自動でマージ出来ないファイルが出来る場合があります。コンフリクトと呼びます。
コンフリクトの処理はまた別途説明したいと思います。



ローカルブランチを削除する

作業してマージして用済みになったブランチは削除しちゃいましょう。ローカルブランチを削除するには、以下を行います。
$ git branch -d first-branch
Deleted branch first-branch (was 137638b).
無事に削除されましたね。このコマンドですが、削除対象のブランチにいる時には、エラーになるので注意です。
$ git branch -d first-branch
error: Cannot delete the branch 'first-branch' which you are currently on.
また、変更があってマージしていない場合にも、以下のようなエラーになります。
$ git branch -d first-branch
error: The branch 'first-branch' is not fully merged.
この場合、マージしてから削除するか、以下のように強制的に削除することで対応出来ます。
$ git branch -D first-branch
Deleted branch first-branch (was 7f1ab0f).
これでローカルブランチの削除が出来ました。不要なブランチがあると、git branchなどで確認した時にいっぱい表示されて邪魔なので、不要なものは削除しちゃった方が良いですかね。



リモートブランチを削除する

リモートブランチも削除することが出来ます。削除するには、以下のように行います。
$ git push origin :first-branch
To https://github.com/yoheiMune3/study
 - [deleted]         first-branch
削除するには、pushでブランチ名を指定する際に、先頭に「:」を付けると削除することとなります。
github.com上で確認すると、first-branchブランチが無くなっていることが分かります。



最後に

以上、gitでブランチを使った開発を行う方法を説明しました。 gitで開発するならブランチはよく使われる機能なので、ぜひ使えるようになりたいものです。一度覚えれば簡単なことばかりですので、ぜひ覚えちゃいましょー。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。