gitのコマンドって、コマンド名だけでは動作が想像できないものが多いですよね…。けど、勉強していく中で呪いのように見かける言葉。
『rebaseすんなし』
ドユコトー?ってことでまとめ。
pull = fetch + merge(rebase)!
まず。
gitの主な動作はpush・fetch・merge・rebaseで出来ます。
push | アップロード |
---|---|
fetch | ダウンロード(リモートから更新情報の取得するだけ) |
merge | リモートローカルのブランチを合流(リモートの更新情報をローカルに反映) |
rebase |
pullはー?っていうと、fetch して mergeする = pull。
ちなみに、fetch して rebase する = pull --rebase。
要するに、pullは使わなくてOK!ってことです。
使わなくていい理由はこちらの記事が分かりやすかったです。ご参照ください。
Git pullを使うべきでない3つの理由
mergeするとどうなるの?
mergeは2種類ある!その1・・・Fast-Forward
topic
ブランチは、master
+(コミット)+(コミット)+(コミット) ということ。
マージするってことは・・・、master
ブランチに、(コミット)+(コミット)+(コミット)を足すということ。
ということは、topic
= master
なので、topic
まで進めちゃえー!っていうのが、Fast-Forward = 早送りなマージ。
mergeは2種類ある!その2・・・Non Fast-Forward
master
にコミットがされて、ブランチが完全に枝分かれした状態なので、topic
= master
ではないので、Fast-Forwardは出来ません。
なので、
master
+(コミット)+(コミット)+(コミット)= 〇(マージコミット)
マージした履歴を残します(〇というマージコミットを作ります)。
マージコミットを作るときに、コンフリクトがあればもちろんエラーが出ます。コンフリクト解消後に、マージコミットができます。
Fast-ForwardとNon Fast-Forwardの違いは?
ずばり、マージしたというコミットが残るか残らないか、です。
早送りできる状態でもマージコミットを残す時は、
git merge —no-ff topic
とすればOK。
一人で開発していて、何でも履歴を残しておきたいならgit merge —no-ff
。
一人で開発していて、すぐに修正終わっちゃってブランチにする必要がなかったな…(´・ω・`)なんて時はgit merge
。
rebaseするとどうなるの?
一言でいうと、「付け替える」「場所を変える」
図のように、topic
ブランチが別のコミットに付け変わっています。これがrebase。
rebase前とrebase後では、内容は一緒でも違う点があります。
- ①コミットID
- ②1個前のコミット(親)
コミットには一個前のコミットIDの情報も含まれているのですが、rebaseすると、ブランチで枝分かれする根元のコミットが変わるので、前後では全く異なるコミットに変わってしまいます。
コミットIDが変わっちゃう=全く新しいコミットになる。だからrebaseしちゃダメ!
リモートにpush済みのコミットを、rebaseで新しいコミットにしてしまった場合。
他の人がリモートを更新して別のコミットをpushした場合、もうrebaseしたコミットはpushできません。
強制的にpushすることは可能ですが、そうするとコミットログがおかしなことになり、今度は他の人がプルできなくなるということになり、迷惑のループとなります(苦笑)。
コミットIDが変わっちゃうからpushできなくなる場合がある。だからrebaseすんなし、ということですね。
まとめ!mergeとrebaseの違いはココ!
mergeはブランチを合流させる。rebaseはブランチを付け替える。
mergeもFast-ForwardとNon Fast-Forwardで、マージコミットを残す残さないの違いがありますが、
mergeはブランチを合流、rebaseはブランチの根本の場所を変える・付け替える、です。