GitでリモートリポジトリにPushした後でコミットをなかった事にしたい

revertでコミットを打ち消す事にする

  • 履歴を改編してpush -fすれば無かったことに出来るのでしょうがやりたくないのでrevertすることにしました。
    • ところがPullRequest運用で出来たMergeのコミットに対してSourceTreeから上手くrevert出来なかったのでブログに残しておきます。

エラー発生

  • 単純に取り消したい所を選んで右クリックで「コミット適用前に戻す」をしたらエラーになった。 f:id:gozuk16:20150715202341p:plain

    • git revert --helpでみると-mというのは-m parent-number, --mainline parent-numberとなっていてどうやらMergeのコミットの場合は戻るべき親が複数あるので位置を指定するらしいです。
  • SourceTreeのグラフ(樹形図)でも見えますけど、git log --oneline --graphとすると以下の様なものがでます。

*   7469d7e Merge pull request #2 from gozuk16/feature/2
|\
| * 60b8bb2 revert test 2
|/
* 6167dcb Revert "revert test 2"
* 9d2615c revert test 2
*   f4466bb Merge pull request #1 from gozuk16/feature/1
|\
| * e98d717 revert test 1
|/
* dd65d81 ローカルで修正
* e8a97f6 Initial commit
  • 7469d7eをrevertしたいとすると、どちらが親か決めないといけないので-m 1というように親を指定します。
    • 1と言うのは60b8bb26167dcbのうち6167dcbを指定していることになります。
      • グラフの左側から1, 2, 3・・・と数えるらしいです。

revert

  • SourceTreeではパラメータが指定できなかったので端末(コンソール)を押してコマンドでやります。
    • 複数revertするときは新しいコミットから遡っていきます。
    • 今回は、dd65d81に戻りたいので7469d7ef4466bbの2つを打ち消します。
$ git revert -m 1 --no-edit 7469d7e
[master 62644c2] Revert "Merge pull request #2 from gozuk16/feature/2"
 1 file changed, 1 deletion(-)
$ git revert -m 1 --no-edit f4466bb
[master b1e918e] Revert "Merge pull request #1 from gozuk16/feature/1"
 1 file changed, 5 insertions(+), 6 deletions(-)
  • SourceTreeでみると62644c2b1e918eの打ち消しコミットが2つで来ています。
    • 一番新しい打ち消しコミットのb1e918eと元に戻りたいdd65d81を選択すると差異が無いことがわかります。 f:id:gozuk16:20150715202401p:plain

rebase

  • 普段はめったにrebaseしないのですが、さすがに打ち消しコミットが2つあると後でわかりにくいのでrebaseします。
    • SourceTreeで打ち消しコミットの1つ前(7469d7e)を選択して右クリックすると「7469d7eの子を対話式でリベース」(7469d7eの子とインタラクティブなリベースを行う)と出ます。
    • 新しい方のコミットを選択して、「過去を含めてsquash する」(前のコミットとスカッシュ)を押すとコミットがまとまります。
    • 「メッセージを編集」を選んで適当にメッセージを書きます。
    • OKすると2つあった打ち消しコミットが1つにまとまります。 f:id:gozuk16:20150715203932p:plain
  • Pushしてお終い。

感想

  • ちゃんと履歴を残しつつ好きな場所に戻れるとか、Git便利だなー。
  • どうでもいいことですが、SourceTreeのMac版とWindows版で日本語訳変えるのやめて欲しい。
    • というか日本語訳とコマンドが紐付かなくてちょっと不安になることもある。どのコマンドを使っているのか日本語訳にも付けてくれると嬉しいかも。