COMPANY SERVICE STAFF BLOG NEWS CONTACT

STAFF BLOG

スタッフブログ

TECHNICAL

テクログ

2013.09.25

git merge と git rebase

テクログ

何も用意がありませんので、基本的ですが
git merge と git rebase の違いについて書きます。

図にすると一発ですので、GitExtensionsのキャプチャを張っていきます。

まずリポジトリの状態です。

「ブランチ分岐点」コミットのmasterから、my_branchが派生しています。
my_branchでは自分の担当箇所として、「my_branch修正_1」「my_branch修正_2」というコミットを積んでいます。
masterでは「master修正_1」「master修正_2」「master修正_3」というコミットが積まれています。他の方の修正がmasterのコミットとして積まれたとします。

masterとmy_branchの修正内容を合わせる手段には
【merge】【rebase】があります。(もっとあるかもしれません)

どちらを利用してもソースの状態は同じになりますが、
リポジトリの状態がまったく異なります。実際に動かして、それを確認します。

1. my_branch を master に【merge】
? ? $ git checkout master (カレントブランチを master にして)
? ? $ git merge my_branch (my_branch を master に取り込みます)

2. my_branch を master に【rebase】
? ? $ git checkout my_branch (カレントブランチを my_branch にして)
? ? $ git rebase master (my_branch を master から派生するように置き換える)

一人で開発する分には、ソースが一緒にならどちらでもいいかもしれませんが、
これらの使い分けは、複数人の開発で威力を発揮します。
(と、個人的に思っています)

例えば、
上図 1.【merge】の状況というのは、
my_branch での開発が一旦完了していることが理想だと思います。

仮に、「my_branch は開発途中、でも master の状態を反映したい」という場合、
1.のような状況を作ってしまうと、中途半端なソースが master に乗っかり、
リモートに上げでもすれば、他の方の開発環境を動かなくしてしまう恐れが出てきます。

では、my_branch に master のソースを取り入れたい場合はどうすればよいのか。
2.【rebase】を使います。

上図 2. というのは、
「my_branch の派生元を変更して、現在の master の先頭コミットから派生し直した」
つまり
「my_branch に、master のコミットが含まれている(反映されている)」状態になります。

——-
ただし、【rebase】も万能というわけでありません。
2.の例では、my_branchのコミットの流れを改変していることになります。

「ブランチ分岐点 ⇒ my_branch修正_1 ⇒ my_branch修正_2」
? ? ? ? ? ? ? ? ? ? ? ? ?↑ここに無理やり
「master修正_1 ⇒ master修正_2 ⇒ master修正_3」の流れをねじ込んでいるということです。

注意①
my_branch が、自分だけが利用するブランチであれば問題は少ないですが、
このブランチを複数人で開発するとなると
一方では改変前にコミットを積み、また一方では改変後にコミットを…という状況が発生、
pushが正常に行われなくなる恐れがあります。

注意②
自分だけで開発していたとしても、
「改変前にリモートへpush」
? →「開発を続けてコミットを積む」
? ? →「masterにrebase(コミット履歴を改変)」
? ? ? →「リモートへpush」
? ? ? ? ⇒ 「ローカルは改変後、リモートは改変前なので、pushが失敗」

ということは十分に起き得ますので、何でもかんでも【rebase】ではなく、
使いどころを見極める必要はありそうです。

※ちなみに、注意②の場合、
リモートブランチ(改変前)を削除して、新しくブランチ(改変後)をpushすれば解決します。

? ? $ git push origin :my_branch( : でリモートブランチを削除の意味)
? ? $ git push origin my_branch

—————————————-
これがベストプラクティスかどうかは分かりませんが、
「自分のソースが他の方の修正範囲とコンフリクトしていないか」
「最新のソースに乗せた状態で、自分の書いたソースは正常に動くのか」
を、事前に把握できるのはとても良いことだと思っています。

まだ【rebase】をしたことがない方は、是非利用してみてはいかがでしょうか。

この記事を書いた人

core-corp

入社年

出身地

業務内容

特技・趣味

テクログに関する記事一覧

TOP