git revert <commit_hash>
だけでは動作しません。どうやら、-m
指定する必要があるようです。
ベストアンサー1
ではgit revert -m
、オプションは親番号-m
を指定します。マージコミットには複数の親があり、どの親がメインラインで、どの親がマージ解除するブランチであるかを Git が自動的に認識しないため、このオプションが必要になります。
の出力でマージコミットを表示するとgit log
、 で始まる行にその親がリストされていることがわかりますMerge
。
commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <[email protected]>
Date: Wed Aug 17 22:49:41 2011 +0100
Merge branch 'gh-pages'
Conflicts:
README
この状況では、git revert 8f937c6 -m 1
は にあったツリーを取得し8989ee0
、git revert -m 2
は にあったツリーを復元します7c6b236
。
何を元に戻すのかをよりよく理解するにはgit diff <parent_commit> <commit_to_revert>
、次の操作を実行します。
git diff 8989ee0 8f937c6
そして
git diff 7c6b236 8f937c6
しかし、そうする際には、
「...は、マージによってもたらされるツリーの変更を決して望まないことを宣言します。その結果、後のマージでは、以前に元に戻されたマージの祖先ではないコミットによってもたらされたツリーの変更のみがもたらされます。これは、あなたが望むことかもしれませんし、そうでないかもしれません。誤ったマージを元に戻す方法詳細については。" (git-merge マニュアルページ)。