RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Git】間違ったcommitを取消すあれこれ【イメージ編】

こんにちは!新卒のrs_chankoです。

エンジニアとして就職して早半年になります。
大学でもプログラミングを学んだものの、チーム開発は初めて。
就職してから「バージョン管理システム」というものに触れました。
とても便利ですよね。
しかしその反面、難しい。

僕が最初にハマった落とし穴。

「git rebase」です。

間違えて必要のないファイルをpushしちゃった!ってことありませんか?
ありますよね?僕はあります。
玄人の皆さんには簡単なことかもしれませんが、
初心者の僕は解釈違いで落とし穴に…。
自分の失敗を繰り返さないよう、超初心者僕も含めの皆さんにイメージをつかんでもらえたらなと。

ということで、今回は詳しい使い方というより
Gitに慣れていない方へ向けイメージをつかみやすいように
僕なりに解釈した「commitを取消すコマンド」についてたとえ話を交えて書いていきたいと思います。
間違えていないといいな

イメージをつかむ

プログラマーに必須の力に「想像力」があります。(持論)
それぞれどんな挙動を起こすのか。それが想像できないと痛い目を見ます僕がそうです

そしてGItでcommitを取消す方法もいくつかあります。
それぞれ似ているようで少し動きが違うようで。
ここでは3種類のコマンドを紹介したいと思います。
それぞれ「ハッシュ値」を、「夏休みの宿題の日記の日付○月×日」としてたとえ話にしています。

git reset

イメージとしては「日記のページを特定の日まで破り捨てる」感じですかね。
例えば

$ git reset --soft [ハッシュ値]

このコマンドをたたくと、現時点から、○月×日の翌日までの日記を破り、○月×日の次から今日のことを書く感覚です。

f:id:rs_chanko:20190927105926p:plain
resetのイメージ図
破ったページは捨てずに置いてあるので、戻すことも可能です。
しかし、机の中にしまっておくので、先生(共同作業者)には見られません。(画像ではC~Fがしまってあるような感じ、)
ただし「特定の1つのコミット」を消すわけでなく、
「特定のコミットまですべてのコミット」を消すことになるので、注意が必要です。
(作業状態はオプション次第で残せる)

git revert

こちらは「日記の特定の日を破り捨て、破り捨てたことを報告するページを一番新しいページに貼り付ける」
といった感じでしょうか。
「日記でそんなこと絶対やらないよ!」とは思いますが…

$ git revert [ハッシュ値]

このコマンドで○月×日のページを破り捨て、
新たに「○月×日のページ破り捨てたよ~」と最新のページの次のページに付け足します。
先生に怒られそうですね。

f:id:rs_chanko:20190927111024p:plain
revertのイメージ図
しかし、チーム開発では何を削除したのか、これが重要になると思いますので、
とても便利ですね。(僕はこれを使いたかった)

git rebase

こちらは「日記の特定の日を破り捨てて、その日から書き直す」といった感じ。
どういうこっちゃといった感じですが。
こちら、厄介なことに「HEAD」が移動するのです。

$ git rebase -i [ハッシュ値]

こちらをたたくとviにハッシュ値以降のコミットが表示され、
各コミットのコマンドを編集することで作業ができます。
例えば○月×日の次の日を削除します。
すると、突如タイムスリップします。(本当に唐突ですがこれがHEADが移動したというやつ)
○月×日の次の日から日記を書くことになるのですが、夏休み最終日、
何故かもう一冊の日記(タイムスリップする前のもの)が存在するのです。
どっちが本物だ、、、となるため、競合が発生します。

f:id:rs_chanko:20190927113241p:plain
rebaseのイメージ図
こんな感じのことが起きています。削除したコミットよりもあとを編集してpushしようとすると
コンフリクトが大量発生…
僕はこれで痛い目を見ました。

おわりに

そんなこんなでイメージはつかめたでしょうか。
自分の実現したい挙動をするコマンドを探すために
「想像力」が大切。(だと思います)
commitを取消するのには気を付けようという話でした。
実践編はまた後日!

Copyright © RAKUS Co., Ltd. All rights reserved.