git ブランチの統合(merge,rebase)
はじめに
初めましてちびたかです!
とりあえずブログとやらを投稿してみたかったので、よくわからなかったgitのブランチ統合について備忘代わりにまとめてみました。
間違えている箇所や、記載方法のアドバイスがありましたらコメントをよろしくお願いいたします。
ブランチとは
開発を共同で行うと、各担当の機能を同時に進行していく必要がある。
同じソースコードを同時に編集してしまうと、他の人の修正作業が自分の修正に影響を及ぼす可能性がある。
そこでブランチという、一つのプロジェクトを分岐させる機能を使うことで、他の人の作業に影響を受けることなく作業を進めていくことが可能になる。
- ブランチの作成方法
$ git branch ブランチ名
- ブランチの切り替え方法
$ git checkout ブランチ名
作成したブランチで作業を進めていく。
作業が終わったら、メイン(ベース)のブランチに各ブランチを統合していくことによって、作業単位で履歴も残すことができる。
ブランチの統合
merge
mergeを行うと、分けたbranchを統合することができる。
mainブランチにtask1を取り込みたい場合は以下のコマンドを実行する。
# mainブランチにいる前提
$ git merge task1
上記コマンドを実行することによって、task1のブランチをmainに統合することができる。
また、mergeには統合方法としてfast-forwardとno-fast-forwardの2種類がある。
- Fast Forward
task1ブランチをmainブランチに統合する際に、mainブランチの内容がtask1ブランチを作った際の内容と変わっていない状態でmergeすることをfast-forwardマージと呼ぶ。
この場合はmainブランチはtask1ブランチの先頭に切り替わるだけなので新たなcommitは発生しない。
merge前の状態
merge後の状態
mainのブランチがtask1のブランチにスライドをしたイメージ。
マージコミットが発生しないので、コミット履歴の持ち方は綺麗になるが、task1のでの作業履歴が見えづらくなる。
- No Fast Forward
fast-forwardでは、mainブランチはtask1ブランチを切った際の内容と変更がない場合だったが、no-fast-forwardではmainブランチに変更があった際にmergeされる状態のこと。
task1ブランチの内容を取り込もうとする際に新しく、merge commitを作成し取り込みが完了する。
merge前の状態
merge後の状態
図のFのように、新たなマージコミットが発生する。履歴の持ち方は複雑化するが、task1の作業履歴は残ったままなので追跡がしやすい状態になる。
またオプションをつけることで、fast-forward実行を強制的にno-fast-forwardにすることが可能になる。
主なオプション
fast forward実行可 | fast forward実行不可 | |
---|---|---|
—ff | fast forwardでmerge | merge commitを作成 |
—no-ff | merge commitを作成 | merge commitを作成 |
—ff-only | fast forwardでmerge | エラー終了 |
rebase
rebaseとは、mergeと同様にブランチを統合する方法の一つにになる。
mergeとはコミット履歴の持ち方に違いがある。
# task1ブランチにいる状態
$ git rebase main
rebase前の状態
rebase後
rebaseを行うことによって、ブランチの履歴を一直線にまとめることができ、fast-forward可能な状態にすることができる。
rebaseをしただけではmainブランチの場所は移動しないので、rebase後にmergeをする必要がある。
rebaseはfast-forwardのように履歴をシンプルにすることが可能になるが、履歴を書き換えることになる。
そのためリモートリポジトリにプッシュしたコミットをリベースすることは行わないことが推奨されている。
参考サイト
Discussion