【git】mergeコミットのrevertを試してみた。

git

概要

mergeコミットのrevertをしようと思ったのですが、一筋縄ではいかなかったので経緯と調べた事を記します。

まず、こんな感じのコミット履歴でした。
(画面はSourceTreeです。)

スクリーンショット 2015-02-23 19.05.30


・developから派生したfirst, secondブランチ
・first, second共にdevelopにマージ
・secondのマージを取り消すコミットがしたい。

って感じですね。

とりあえずmergeコミットをrevertしてみる

$ git revert 22297c3

怒られました。

error: Commit 22297c36739631c201f7ef542181f75c8a7b4d64 is a merge but no -m option was given.
fatal: revert failed

-mオプションを付けろや、との事ですので付けてみました。

git revert -m 1 22297c3

すると、コミットメッセージ編集画面になり無事revertが出来ました。

スクリーンショット 2015-02-23 19.08.54

めでたしめでたし。

いやいやいやいや、なんなんでしょう、このオプション。

本家はこんな事を書いてます。


-m parent-number
–mainline parent-number
Usually you cannot revert a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of the mainline and allows revert to reverse the change relative to the specified parent.・・・

解説しますね。

mergeは親コミットを2つ持っている

コミットは必ず親コミットを持ちます。
(最初のcommitは例外です。)

スクリーンショット_2015-02-23_19_07_38

そして、マージコミットは二つの親コミットを持ちます。

マージされるブランチ(develop)のマージ前コミット(c5a729a)
マージするブランチ(second)の先頭コミット(95af56c)

です。

revertもコミットになりますので、そのコミットの親をどちらにするんだい?と言うのを指定するのが-mオプションになります。
と言う事で、”-m 1″はdevelopのマージ前コミットを親にしますよと言う指定だったのですね。

なんでこんな指定が必要なのか?

本家とかを読んで察するにこういう事だと僕は理解しています。
(間違ってたら@daiki1003まで教えて下さい。)

スクリーンショット_2015-02-23_19_07_38

マージコミットをrevertする = コミットを無くす
と言う事なので、こうなります。
スクリーンショット_2015-02-23_19_07_38

git「developにrevertコミットをしようと思うんだけど、
22297c395af56cとどっちに付ければ良いんだい??」

と言う疑問を解消するため、と言う感じではないでしょうか。

誰かのお役に立てば。

Twitterフォローお願いします

毎日技術ブログを更新しています。

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非@daiki1003のフォローお願いします♪

コメント

タイトルとURLをコピーしました