こんにちは!新卒のrs_chankoです。
エンジニアとして就職して早半年になります。
大学でもプログラミングを学んだものの、チーム開発は初めて。
就職してから「バージョン管理システム」というものに触れました。
とても便利ですよね。
しかしその反面、難しい。
僕が最初にハマった落とし穴。
「git rebase」です。
間違えて必要のないファイルをpushしちゃった!ってことありませんか?
ありますよね?僕はあります。
玄人の皆さんには簡単なことかもしれませんが、
初心者の僕は解釈違いで落とし穴に…。
自分の失敗を繰り返さないよう、超初心者僕も含めの皆さんにイメージをつかんでもらえたらなと。
ということで、今回は詳しい使い方というより
Gitに慣れていない方へ向けイメージをつかみやすいように
僕なりに解釈した「commitを取消すコマンド」についてたとえ話を交えて書いていきたいと思います。
間違えていないといいな
イメージをつかむ
プログラマーに必須の力に「想像力」があります。(持論)
それぞれどんな挙動を起こすのか。それが想像できないと痛い目を見ます僕がそうです
そしてGItでcommitを取消す方法もいくつかあります。
それぞれ似ているようで少し動きが違うようで。
ここでは3種類のコマンドを紹介したいと思います。
それぞれ「ハッシュ値」を、「夏休みの宿題の日記の日付○月×日」としてたとえ話にしています。
git reset
イメージとしては「日記のページを特定の日まで破り捨てる」感じですかね。
例えば
$ git reset --soft [ハッシュ値]
このコマンドをたたくと、現時点から、○月×日の翌日までの日記を破り、○月×日の次から今日のことを書く感覚です。
破ったページは捨てずに置いてあるので、戻すことも可能です。
しかし、机の中にしまっておくので、先生(共同作業者)には見られません。(画像ではC~Fがしまってあるような感じ、)
ただし「特定の1つのコミット」を消すわけでなく、
「特定のコミットまですべてのコミット」を消すことになるので、注意が必要です。
(作業状態はオプション次第で残せる)
git revert
こちらは「日記の特定の日を破り捨て、破り捨てたことを報告するページを一番新しいページに貼り付ける」
といった感じでしょうか。
「日記でそんなこと絶対やらないよ!」とは思いますが…
$ git revert [ハッシュ値]
このコマンドで○月×日のページを破り捨て、
新たに「○月×日のページ破り捨てたよ~」と最新のページの次のページに付け足します。
先生に怒られそうですね。
しかし、チーム開発では何を削除したのか、これが重要になると思いますので、
とても便利ですね。(僕はこれを使いたかった)
git rebase
こちらは「日記の特定の日を破り捨てて、その日から書き直す」といった感じ。
どういうこっちゃといった感じですが。
こちら、厄介なことに「HEAD」が移動するのです。
$ git rebase -i [ハッシュ値]
こちらをたたくとviにハッシュ値以降のコミットが表示され、
各コミットのコマンドを編集することで作業ができます。
例えば○月×日の次の日を削除します。
すると、突如タイムスリップします。(本当に唐突ですがこれがHEADが移動したというやつ)
○月×日の次の日から日記を書くことになるのですが、夏休み最終日、
何故かもう一冊の日記(タイムスリップする前のもの)が存在するのです。
どっちが本物だ、、、となるため、競合が発生します。
こんな感じのことが起きています。削除したコミットよりもあとを編集してpushしようとすると
コンフリクトが大量発生…
僕はこれで痛い目を見ました。
おわりに
そんなこんなでイメージはつかめたでしょうか。
自分の実現したい挙動をするコマンドを探すために
「想像力」が大切。(だと思います)
commitを取消するのには気を付けようという話でした。
実践編はまた後日!
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
forms.gleイベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com