以下のサンプルアプリを使って確認を行っていきます。
想定シナリオ
派生元ブランチに取り込まれた機能をリモートにプッシュ済みのブランチに取り込む
シナリオ
画面にhelloを追加する作業を担当することになり、コンポーネントを更新しています。
すると追加依頼があり、別のブランチから取り込まれた画像も今回の作業で使うことになりました。
この時のシナリオをmergeとrebaseでそれぞれ実践してみます。
merge案
まずは完成形から。
別ブランチから取り込まれた画像を使うために、ローカルで派生元のブランチmain
を作業中のブランチfeatuer/hello
にマージしました。
その後、取り込んだ機能を使ってソースコードを更新しマジリクを作成。main
にマージしています。
マジリクの内容を確認したところ、マージコミットが含まれています。取り込んだ画像作成のコミットや変更は含まれませんでした。
画像を追加したブランチの変更はこちら。feature/hello
には含まれなかった部分。
rebase案
まずは完成形から。
別ブランチから取り込まれた画像を使うために、ローカルで作業中のブランチfeatuer/hello2
を派生元のブランチmain
にリベースしました。
リベースによってfeatuer/hello2
の変更は以下のようにmain
に追加して実装した形になりました。
それぞれの機能を使ってソースコードを更新しソースコードをプッシュしますが、ローカルとリモートの履歴に差異が生まれたためエラーになりました。
作業中のブランチfeatuer/hello2
は自分以外は使用しないブランチのため-f
で強制プッシュします。
$ git push -f
マジリクを作成。main
にマージします。
マジリクの内容を確認したところ、マージコミットがありません。
まとめ
merge案よりもrebase案のほうが履歴が見やすいのが良いと思いました。
rebase案だと強制プッシュが必要になりますが自身しか操作しないブランチであれば問題ないので、今後はrebaseを使いながら履歴を見やすい状態で維持したいと思います。