この記事は JSL (日本システム技研) Advent Calendar 2018 - Qiita 25日目の記事です。(オオトリですなあ。。。)
状況で使い分けるGit術 前編
前半の記事からーー早6ヶ月
(前回の設定で記載されてたP上司一切でてきてなくて吹いた)
Advent Calendarという理由にかこつけて後編です。
前編では
- コンフリクト時にMergeとRebaseで対応
- コミットをrebaseでまとめる
について記述しました。
今回は「月君のやらかし事例とその対処」です。
設定
- 月君 ... 最近調子に乗っており、ミスを犯すのは秒読み。SouceTree崇拝者。
- A先輩 ... 開発チームメンバーの先輩。すぐ調子に乗る月君を見はさなず見守ってくれるデキる意識高い系。
前提
- GitFlowを使用している
- Macでvimを使用している
Mergeでコンフリクト時に、軽率なresetを行い・・・
月君は相変わらず慎重さにかけた実装を行っていました。
月君「さて、じゃあPush前に・・・moon_dev2の内容をMergeしておくか」
Tips
SouceTreeからのMergeやRebaseは、対象ブランチの副ボタンクリックで出てくるコンテキストメニューから行えます
しかし
月君「まじかあ。。。」
〜数十分後〜
月君「あーもうコンフリクト地獄でよくわからん。origin/moon_dev
のコミットにresetしよう。そうすればもう大丈夫。なかったことにしよう」
月君は気づきませんでした。
moon_devブランチのHEADはPushしていなかったことに。
そしてPushしていなかったコミットはかなり重要な変更だったということに。
月君「よし。一旦なかったことにしたぞ。これでコンフリクトとかもきれいさっp・・・」
月君「重 要 な 変 更 の コ ミ ッ ト が 消 え て し ま っ た」
〜conflictを、軽率になかったことにしてはいけない〜
月君は焦るあまり、resetの--hardで嫌な記憶を抹消してしまったのです。
そして抹消したのは嫌な記憶のみならず、重要な記憶すらも…
〜そしてA先輩のもとへ〜
月君「かくかくしかじかで、やらかしてしまいました」
A先輩「そろそろやらかすと思っていたよ」
A先輩「そういうときはreflogでリカバリしよう」
月君「それはいったい!?」
reflogとは個人の環境に保存されている参照ログです。
$ (moon_dev) git reflog
参照ログがつらつら出てきました。
なくなってしまった重要な変更コミットも存在しています。
月君「む、重要なコミットは7417cd2だな。」
復元にはresetでHEADを指定します
$ (moon_dev) git reset --hard HEAD@{1}
月君「戻ったーーーーーーー!!!」
こうして肝を冷やした月君は、この反省を生かして今後も実力を延ばしていくのでした。
前編後編の事例は実体験だったり。。。
本番masterにpush -fしてCI走ってデプロイされた話も書こうかと思いましたが、
書いてる最中に胃が痛くなったので断念。
ちなみに私は現在の職場でGitを知りました。
それまではエクセルに差分記録して手動Mergeというレガシー通り越して化石な運用でしたね。
今回はストーリー仕立てにしましたが、Gitに関して一番参考にしたQiitaの記事は⇣だと思います
Gitでやらかした時に使える19個の奥義
そんなこんなで2018年アドベントカレンダー終了。
来年もよろしくおねがいします!