2017年06月28日

git ブランチについて

git については、ここや、ここで触れた。
今回は、git に不可欠なブランチについてさらっと触れてみたい。

git の origin とは


ブランチの話の前に、"origin" について。
これは、リモートブランチのサーバ名のこと。

以下のようにすると、"origin" がどこを指しているかわかる。

$ git config --list

remote.origin.url=gitserver:~/git/project1.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*







git の ブランチ とは


git で管理する作業履歴を示すもの。コミットしていくと履歴が増えるが、その履歴を繋いでいく構造がブランチ。
git_branch01.png



木の枝のように、枝分かれさせ管理することが可能。
git_branch02.png



初期のブランチの状態を見てみる。

$ git branch

* master

"master" とある。これがデフォルトのブランチ。最初にコミットすると作成される。

"origin/master" と表現された場合は、リモートリポジトリ(origin)の "master" ブランチを示している。


ちなみに、デフォルトで "master"ブランチは存在するが、必ずしもブランチ名称を"master"とする必要はない。
例えば、project1開発で git を運用したとして、"master"の名称を変えて見る。

$ git branch -m master project1

$ git branch
* project1

"master" ではなく、"project1" ブランチになった。これで運用しても良い。






新しいブランチをつくる


ひとつのブランチから、枝分かれさせ、新しいブランチを作る。
これを「ブランチを切る」ともいう。

新しいブランチ "new_branch" という名称で作ってみる。

$ git branch new_branch

$ git branch
* master
new_branch

新しく "new_branch" が存在した。
"*"(アスタリスク) がついているブランチが現在の作業ツリーの状態を示している。
上記では "master" ブランチで作業している状態だとわかる。


ここでファイルを変更してcommitすると、"master"ブランチの履歴に追加される。
一方の"new_branch"は影響しない。



"new_branch"で作業を行うためには、作業ツリーを切り替える。
この操作を チェックアウトと言う。

$ git checkout new_branch

Switched to branch 'new_branch'


$ git branch
master
* new_branch


ここでファイルを変更してcommitすると、今度は、"new_branch"ブランチの履歴に追加され、一方の"master"は影響しない。
git_branch03.png



"$ git branch" で示される、"*"(アスタリスク)は、現在チェックアウトされているブランチとも言える。



ここでブランチのイメージを修正しておこう。
「ブランチ」という名称なので、木の幹・枝のイメージで記述したのだが、コミットというのは、直近のコミット(親コミット)へのポインタが格納され、それをつなげていくことで変更履歴が構築される。下図のように矢印は直近のコミットを指す向きほうが正しく表現している。そして「ブランチ」は最新のコミットを指すポインタのことなので、「ブランチ」というのはコミット位置に当てるのが良いだろう。
git_branch04.png
図で書くとこうなるのだが、変更履歴の表現として心情的に「古い」→「新しい」へと向かわせたいので、以降も矢印の向きは古いコミットから新しいコミットへつなげていくことにする。




それから「ブランチを切る」というのは、最新のコミットを指すポインタを新しく作ることなので、ブランチを切った直後はこのようになる。
git_branch05.png
その後、コミットするとブランチ(ポインタ)が最新コミットを指すように自動的に更新される。
git_branch06.png


話を少し戻して、チェックアウトの状態の管理はどうなっているのか?
これは "HEAD" というポインタで示される。
"master" ブランチをチェックアウトしたのであれば、"HEAD" は、"master" を指すポインタになっている。
git_branch07.png






ブランチのマージ


ブランチを切る理由はいろいろある。
機能を追加する際に、機能がきちんと動作するまで分離するとか、不具合修正が完了するまで分離するとか。
こういう理由でブランチを切って分岐させたのであれば、それは一時的な分岐であり、いつかは本流に戻してあげないと本来の目的に達しない。
git のブランチ管理には、ブランチを切った先での変更を共有することができる。
この操作には、"merge" コマンドを使う。この操作は変更を共有する側で作業をする。

ただし、ブランチした後、分岐元にcommitがあるか・ないかでマージ動きが変わる。

分岐元で変更がなかった場合


git_branch08.png
"new_branch" ブランチを "master" ブランチにマージする。
この場合、単純に "master"ブランチ(= ポインタ)を挿げ替えるだけ。
"master" ブランチをチェックアウトし実行する。

$ git merge new_branch

Updating 76eb1f6..693e085
Fast-forward
index.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

"master" ブランチは、"new_branch" ブランチと同じコミットを示すようになった。
git_branch09.png
これを "fast-forward" マージという。



分岐元で変更があった場合


git_branch10.png
"new_branch" ブランチを "master" ブランチにマージする。コマンドは "fast-forward" マージと同じ。
"master" ブランチをチェックアウトし実行する。

$ git merge new_branch


コミットログをグラフ表示にして確認する。
$ git log --graph
* commit 674649a321b87801de0afea9389a162a66cac60d
|\ Merge: d7af236 5230eda
| | Author: hoge hogehoge
| | Date: San Jun 25 20:00:00 2017 +0900
| |
| | Merge branch 'new_branch'
| |
| | Merge new_branch -> master
| |
| * commit 5230eda9e7070b084e250852ec1f29bcc65e0870
| | Author: hoge hogehoge
| | Date: San Jun 25 19:00:00 2017 +0900
| |
| | new_branch 追加2
| |
| * commit 71950fae9396a54bbf255b8466f3f15e93e76051
| | Author: hoge hogehoge
| | Date: San Jun 25 18:00:00 2017 +0900
| |
| | new_branch 追加1
| |
* | commit d7af236ea4c844862eaafb38fbd99e951a34dda3
| | Author: hoge hogehoge
| | Date: San Jun 25 18:30:00 2017 +0900
| |
| | master branch 追加2
| |
* | commit 8673bdfb53790b7dc42a8a9ecf24491641c868f9
|/ Author: hoge hogehoge
| Date: San Jun 25 11:00:00 2017 +0900
|
| master branch 追加1
|
* commit 76eb1f66a10cea1ac9e3b3b1f59b5fe946a29467
| Author: hoge2
| Date: San Jun 25 10:10:00 2017 +0900
|
| master branch.
|
* commit b396e3f7adef3c4cedbda55df20ceac837750e0b
Author: hoge hogehoge
Date: Sat Jun 24 16:00:00 2017 +0900

Add new file.

ログを見ると、両方の変更履歴を取り込んだマージコミットが作成されている。
"master" ブランチは、このマージコミットを指している。
fast-forward マージでは、このマージが行われないためログ上にマージコミットが出てこない。
git_branch11.png


マージ操作については、こちらでより詳しく説明する。



まとめ


ブランチの統合についてはもっといろいろあり奥が深い。
今回は「ブランチとは」という点で触れたかったので、表面をさらっと流した。
何気なく使っていたので、以外にわかってなかった点もあったが、自分なりにもやもやしたところが晴れて、納得できた。


gitをインストール
gitサーバーのセットアップ
git 変更を一時的に退避 stash
git ブランチを合流するマージ
git ブランチを付け替える
git コミット履歴を変更する
git コミットを取り消す
git 変更をリセットする
git リモートでの操作
git リリース準備
git リモートブランチを追加
git チェックアウトをもっと便利に使う
git プロジェクトの構成
git 変更をpatchファイルにする
git コンフリクトに対処する
git 失敗したときの復元
posted by Zorinos at 20:00| Comment(0) | Linux | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください