git merge --no-ff <branchname>
とするところを間違えて git merge <branchname>
と –no-ff オプションをつけ忘れて実行してしまいました><。
今回は、git の過去を改変して –no-ff オプションをつけたマージをやりなおす方法をノートいたします。ローカル環境です。
解決のポイント
git reflog
でマージ前に戻る。git reset --hard HEAD
やgit reset --hard ORIG_HEAD
では解決できなかった。git reset --hard MERGE_HEAD
だったら上手く解決できたのかもしれない(未検証)。
補足
- HEAD: 最新のコミットに対するハッシュ値の別名
- ORIG_HEAD: 最新の一つ手前のコミットに対するハッシュ値の別名
- MERGE_HEAD: マージされたブランチの最新のコミットに対するハッシュ値の別名
実際にやり直した記録
$ # ↓間違えて --no-ff を付けないでマージしてしまった。 $ # 結果、マージコミットが作られていない。 $ git log --all --decorate --graph --oneline * 066b5a6 (HEAD -> master, feature2) feature2を追加する * c273a85 Merge branch 'feature1' feature1を追加する ... 略 ... $ # ↓reset 2種を試すも、効果なし $ git reset --hard HEAD HEAD is now at 066b5a6 feature2を追加する $ git reset --hard ORIG_HEAD HEAD is now at 066b5a6 feature2を追加する $ # ↓reflog で戻りたい過去を確認。マージ前の HEAD@{1} 時点に戻りたい。 $ git reflog 066b5a6 HEAD@{0}: merge feature2: Fast-forward c273a85 HEAD@{1}: checkout: moving from feature2 to master 066b5a6 HEAD@{2}: commit: feature2を追加する ... 略 ... $ # ↓戻りたい過去へ reset $ git reset --hard HEAD@{1} HEAD is now at c273a85 Merge branch 'feature1' feature1を追加する $ # ↓無事マージ前の過去へ戻ったことを確認 $ git log --all --decorate --graph --oneline * 066b5a6 (feature2) feature2を追加する * c273a85 (HEAD -> master) Merge branch 'feature1' feature1を追加する ... 略 ... $ # ↓本来行いたかった操作を行い、その結果を確認 $ git merge --no-ff feature2 Merge made by the 'recursive' strategy. ... 略 ... $ git log --all --decorate --graph --oneline * e8195f4 (HEAD -> master) Merge branch 'feature2' feature2を追加する |\ | * 066b5a6 (feature2) feature2を追加する |/ * c273a85 Merge branch 'feature1' feature1を追加する ... 略 ...
おわりに
参考ページです。ありがとう存じます!
Git は気軽に歴史を改変したり、整理したりということができることは知っておりました。過去を変えることはあまり行わないように思う一方で、大事なことと存じます。ですのでしっかりとノートいたしました。
以上です。