shimgo
5/20/2017 - 9:03 AM

複数の同じコミットが別々のブランチに存在しているのを一つにまとめる

複数の同じコミットが別々のブランチに存在しているのを一つにまとめる

完全に理解した上での解決ではないもの、とりあえず解決方法を記す。
以下のようにfeature1で実装を行っていたところ変更内容はB,Cと同じだがハッシュコミットが異なるコミットB',C'ができてしまった。

develop  -A-B-C
           \
feature1    B'-C'-D-E

このままfeature1をdevelopにマージすると多くのコンフリクトを解消する必要と不要なコミットが履歴に残ってしまうのでそれは避けたい。
ここでdevelopをfeature1にマージしようとするとコンフリクトが発生してしまう。
そこで以下のコマンドでrebaseしてfeature1の分岐元をCにする。

git checkout feature1
git rebase develop
develop  -A-B-C
               \
feature1        D-E

実際にはちょっとしたコンフリクトが発生したが、重複コミットB',C'は自動的に消えた。
これは、rebaseでは2つのブランチの共通の親コミットから現在のブランチの各コミットからdiffを取ってパッチを作成してそれをrebase先(develop)に適用していくので、同じ変更であるB',C'は適用を省略されたと思われる。