この記事について
本記事は、2022年3月時点で社内向けに作成された技術資料をもとに、再編集した内容です。
記載されている技術情報や仕様、価格などは、当時の情報に基づいており、現在とは異なる場合があります。
ご利用の際は、最新の公式ドキュメントをご確認のうえ、参考情報としてご活用いただけますと幸いです。
概要
featureブランチをmasterブランチにマージしたものの、不具合が発覚し、対象のコミットをrevertしました。
featureブランチを再修正して再度masterブランチへPRを投げたところ、想定していた変更履歴になりませんでした。
結論
revertしたコミットは、revertで打ち消すべし!
(たまにしか使わない操作なので忘れがち。この記事は、備忘録も兼ねて書いています。)
そもそもrevertとは?
「取り消したいコミットの内容を打ち消す、新しいコミットを作成する」コマンド。
元のコミットが削除されるわけではなく、履歴として残しつつ取り消す点がポイントです。
revertと似たコマンドにresetがありますが、こちらは「コミット内容そのものを元に戻す」操作になります。
リモートにpush済みのコミットはチーム内で履歴の不整合を防ぐためにも、履歴を残せるrevertを使うのが安全です。
ダメパターン
- featureブランチ→masterブランチへPR&マージ
- 本番で不具合が見つかった等の理由から、masterブランチでrevertを実行
- featureブランチで不具合を修正
- 再度featureブランチからmasterブランチへPR
- 正しい変更履歴が表示されない
↓
revertによって打ち消された内容がmasterブランチに残っていたため、PR上では再修正分しか変更履歴として認識されず、想定していた差分が表示されないという状況になっています。
対応方法(理想)
- featureブランチからmasterブランチをpullする
- revertコミットをrevert(取り消しの取り消し)
- featureブランチを修正
- featureブランチからmasterブランチへPR
対応方法(別解1)
- featureブランチからmasterブランチへPR&マージ
- masterブランチでrevert(本番で不具合)
- featureブランチで再修正後、masterブランチをpullする
- revertコミットをrevert
- featureブランチからmasterブランチへPR
- 理想の変更履歴になった!!!
revertによって作成された打ち消しコミットをrevertすることで、「取り消しの取り消し」となり、元の内容が復活します。
対応方法(別解2)
- masterブランチからtmpブランチを切り出す
- tmpブランチでrevertコミットをrevert
- tmpブランチをfeatureブランチへマージ
- featureブランチからmasterブランチへPR
- 理想の変更履歴になった!!!
参考サイト
出典:Qiita – @bigplants(Daiki Hirakata) – GitHubでマージ済のプルリクをrevertした後に引き続きrevertされたブランチで作業を続行したい時
https://qiita.com/bigplants/items/3d1d3ada97d0c86d2548