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 は気軽に歴史を改変したり、整理したりということができることは知っておりました。過去を変えることはあまり行わないように思う一方で、大事なことと存じます。ですのでしっかりとノートいたしました。
以上です。
