GitHubでcommitを取り消す便利な機能!revertを使ってみた
GitHubのrevertは、commitした内容を打ち消すようなcommitを重ねることでもともとのcommitを無かったことにしてくれる便利な機能です。
ただ使い方がいまいちピンとこなかったので、実際に使って試してみました。
解説というより、実験の記録という感じです。
準備
まずはrailsでアプリを作りました。
% rails _6.0.0_ new sample_app -d mysql
ローカルリポジトリを作って、ファーストコミットをして、リモートリポジトリをpublishしました。
それからブランチを作ってリモートにもpublishしたところで、準備完了です。
ちなみに、視覚的にわかりやすいので、GitHub Desktopを使いました。
とりあえずrevertを使ってみた
viewsディレクトリにsample.html.erb
というファイルを作成しました。
ひとまず「ビューファイルの作成」という名前でcommitしました。
Aと記述
続いてsample.html.erb
に適当に記述を追加しました。
これで「Aと記述」という名前でcommitしました。
「Aと記述」をrevert
先ほどの「Aと記述」をrevertしました。
今この状態です。
sample.html.erb
にAと記述したことが無かったことになるので、ファイルから記述が消えました。
「Aと記述」のrevertをrevert
「Aと記述」のrevertをrevertしました。
Aと記述したことを無かったことにしたことが無かったことになるので、結果的にAが復活しました。
ビューファイルを増やして、最新じゃないところを消してみた
「Aと記述」が無かったことになる、というよりは、その一個前の「ビューファイルの作成」の時点のデータで上書きした、と考える方がわかりやすいかも?
と思ったのですが、それじゃ意味変わってくるのでは?違うんじゃないか?とも思ったので確かめてみました。
sample2.html.erb
というファイルを作成し、commit。
sample3.html.erb
というファイルを作成し、commit。
「ビューファイル2の作成」をrevertしてみました。
sample2.html.erb
だけが消えました。sample3.html.erb
は残っています。
もしrevertしたcommitの一個前のデータで上書きしているなら、sample3.html.erb
も消えるはず。なのでやっぱり間違ってましたね。
そのcommitによって生まれた変化を打ち消す、という感じか。
コンフリクトを起こしてみた
先ほどの例ではsample2.html.erb
が消えてもsample3.html.erb
には影響はなかったですが、影響があるような場合はどうなるのかと。
sample3.html.erb
にXと記述してcommitしました。
続いてYと記述してcommitしました。
commit履歴はこうなっています。
やっぱりXだけ消したいと思って、「Xと記述」をrevertしました。
エラーになっちゃいました。
エディタでもこんなことになってます。
同じファイルを編集していると、一つめのcommitを消すことはできないみたいですね。
まとめ
なんとなくrevertの使い方が掴めてきた気がします。本当はmergeしたcommitのrevertとかも色々とやってみるつもりでしたが、それは改めて。
GitHubは実際の開発では必須なツールだと思うのでもっと慣れていきたいです。