git rebase
merge
$ git merge <branch>
指定した <branch> を現在のブランチに統合
マージ用の新しいコミットを作って、<branch>での変更を合流させる
<branch> のコミットハッシュ値は改変されない
code:例.txt
master の HEAD が aaaa
branch での変更コミットが bbbb, cccc
master に branch を merge した場合
dddd (マージ用の新しいコミット)
cccc (同上)
bbbb (ブランチでのコミットのハッシュはそのまま)
aaaa (元の master の HEAD)
rebase
$ git rebase <branch>
指定した <branch> の上に現在のブランチの変更履歴をくっつける
rebase した <branch> のコミットハッシュ値は改変される
code:例.txt
master の HEAD が aaaa
branch での変更コミットが bbbb, cccc
master に branch を rebase した場合
yyyy (ブランチでハッシュが cccc だったもの)
xxxx (ブランチでハッシュが bbbb だったもの)
aaaa (元の master の HEAD)
master をブランチに取り込む場合
単純に git rebase master とすると master 側のコミットハッシュ値が改変されちゃって困る??
→ git が賢いので問題なさそう
まず master を最新にする
$ git checkout master && git pull origin master
開発ブランチで master を rebase
$ git checkout branch && git rebase master
git が賢いので master の HEAD の後ろに開発ブランチでの変更を移動してくれる
もし conflict したら
ファイルを編集
$ git add foo.txt
$ git rebase --continue
commit はしちゃダメ
ここでまた conflict したらファイル編集からやり直す
rebase 直前の状態に戻す場合
$ git rebase --abort
もし開発ブランチをリモートに push していた場合は rebase 後の push で怒られる
その場合は force push する
間違ったリモートブランチにプッシュしないように注意
その他
コミットが検出されない場合
git rebase -i しても noop と出てしまいコミットが検出されない場合は以下のようにブランチまで指定すると出るかも
$ git rebase -i origin/master