前提
下記の3ブランチがある
- master(本番リリース)
- dev(次リリースの機能をマージしていく環境)
- feature(現在devにPR中で、devとコンフリクトしたのでdevをマージした)
dev環境でテストで大丈夫だったものをmasterにマージする
状況
devの一分機能をリリース取りやめになり、masterの状態へ戻した
この場合、すでにPR出しているものは次リリースの機能が必要だったり、devへのPRでコンフリクトするのでdevをマージしていたため、masterの状態に戻ったdevへのPRには不要な機能の修正も含まれていた。
直し方
revertするのが簡単だが、今後対象の機能を修正したのを取り込むので、revertするとそれを無効化するコミットが作成されてしまう。
マージコミットを打ち消すと、打ち消されたブランチに含まれていた変更が、その後、そのブランチを再度マージしたとしても、取り込みが発生しない、という事になります。これは、revert により変更自体は打ち消されても、マージの事実が歴史上に残り続けるからです。
これは困るので、reset
を使います
バックアップ作成
git branch bk_feature feature
マージコミット前に戻す
logを調べます
git log --first-parent
commit 233233232323222222222
10個目の機能追加
~中略~
commit 111111111111111111111
2個目の機能追加
commit 123456789102345678910
Merge branch 'dev' of https://github.com into feature
commit 098765432109876543210
最初の機能追加
このとき、マージコミットから最新のコミットまでのハッシュをメモっておきます
メモったら、マージコミット前に戻ります
git reset --hard 098765432109876543210
あとはマージコミット後にした修正をcherry pickでもってきます
# git cherry-pick {始点となるコミットの1つ前のコミットハッシュ}..{終点となるコミットハッシュ}
git cherry-pick 123456789102345678910..233233232323222222222
cherry-pickする際の参考
https://www-creators.com/archives/2578
https://trueman-developer.blogspot.com/2018/05/git.html
おわったらforce pushする
githubはforce pushしたことが表示される
禁止などの条件がある場合はコピーのブランチでおなじことをして再度PR
git push -f origin feature