GitHubでcommitを取り消す便利な機能!revertを使ってみた

f:id:endoakak:20200725102930j:plain

GitHubのrevertは、commitした内容を打ち消すようなcommitを重ねることでもともとのcommitを無かったことにしてくれる便利な機能です。

ただ使い方がいまいちピンとこなかったので、実際に使って試してみました。
解説というより、実験の記録という感じです。

準備

まずはrailsでアプリを作りました。

% rails _6.0.0_ new sample_app -d mysql

ローカルリポジトリを作って、ファーストコミットをして、リモートリポジトリをpublishしました。
それからブランチを作ってリモートにもpublishしたところで、準備完了です。

ちなみに、視覚的にわかりやすいので、GitHub Desktopを使いました。

とりあえずrevertを使ってみた

viewsディレクトリにsample.html.erbというファイルを作成しました。

f:id:endoakak:20200730095010p:plain:h150

ひとまず「ビューファイルの作成」という名前でcommitしました。

Aと記述

続いてsample.html.erbに適当に記述を追加しました。

f:id:endoakak:20200730180024p:plain:h50

これで「Aと記述」という名前でcommitしました。

「Aと記述」をrevert

先ほどの「Aと記述」をrevertしました。

今この状態です。

f:id:endoakak:20200730180512p:plain:w200

sample.html.erbにAと記述したことが無かったことになるので、ファイルから記述が消えました。

f:id:endoakak:20200730180726p:plain:h50

「Aと記述」のrevertをrevert

「Aと記述」のrevertをrevertしました。

f:id:endoakak:20200730181429p:plain:w200

Aと記述したことを無かったことにしたことが無かったことになるので、結果的にAが復活しました。

f:id:endoakak:20200730181548p:plain:h50

ビューファイルを増やして、最新じゃないところを消してみた

「Aと記述」が無かったことになる、というよりは、その一個前の「ビューファイルの作成」の時点のデータで上書きした、と考える方がわかりやすいかも?
と思ったのですが、それじゃ意味変わってくるのでは?違うんじゃないか?とも思ったので確かめてみました。

sample2.html.erbというファイルを作成し、commit。
sample3.html.erbというファイルを作成し、commit。

f:id:endoakak:20200730181905p:plain:w200

f:id:endoakak:20200730182035p:plain:h100

「ビューファイル2の作成」をrevertしてみました。

f:id:endoakak:20200730182155p:plain:w200

sample2.html.erbだけが消えました。sample3.html.erbは残っています。

f:id:endoakak:20200730183448p:plain:h100

もしrevertしたcommitの一個前のデータで上書きしているなら、sample3.html.erbも消えるはず。なのでやっぱり間違ってましたね。
そのcommitによって生まれた変化を打ち消す、という感じか。

コンフリクトを起こしてみた

先ほどの例ではsample2.html.erbが消えてもsample3.html.erbには影響はなかったですが、影響があるような場合はどうなるのかと。

sample3.html.erbにXと記述してcommitしました。

f:id:endoakak:20200730190214p:plain:h50

続いてYと記述してcommitしました。

f:id:endoakak:20200730190343p:plain:h50

commit履歴はこうなっています。

f:id:endoakak:20200730190448p:plain:w200

やっぱりXだけ消したいと思って、「Xと記述」をrevertしました。

f:id:endoakak:20200730190728p:plain:h100

エラーになっちゃいました。

エディタでもこんなことになってます。

f:id:endoakak:20200730191006p:plain

同じファイルを編集していると、一つめのcommitを消すことはできないみたいですね。

まとめ

なんとなくrevertの使い方が掴めてきた気がします。本当はmergeしたcommitのrevertとかも色々とやってみるつもりでしたが、それは改めて。
GitHubは実際の開発では必須なツールだと思うのでもっと慣れていきたいです。