初心者エンジニア「まーじのボタンは緊張する」

# はじめに

若手エンジニアの方で、GitHubでmainにマージする時、『**不安だな**』と思ったことはないですか？

今はまだ、そこまで影響範囲が大きくない箇所を担当していますが、これから、活躍していくために、影響範囲の大きいタスクは避けては通れない道だと思っています！

タスク初め当初は、『もし自分の実装が原因で、ある機能が動かなくなったらどうしよう😨』という気持ちでしたwww（自分のコードに自信がないので）

そこで、この記事では、初心者エンジニアがマージボタンを押すときに感じる不安を和らげるため、対処するべきことを紹介します！

## 対象読者

- マージのボタンを押すときに、不安で手汗が出る初心者エンジニア

# 😅 Slackにて...

ちょうど半年前に、こう言うやりとりがありました

マージは緊張するとtimesに呟くと色んな方々が反応してくださいましたwww

<img width="500px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/d959d89a-5402-dd66-360d-486519dc43d4.png">

ここでは、

- **revertでやり直せるよ！**
- **マージする時は適度な緊張感をもつことは大事なこと**
- **やらかした数だけエンジニアは強くなる**
- **失敗した時に巻き戻せるかどうかを考える**

とスレッドで反応してくださいましたが、ちょっとしたことでも、勉強になりますね👀

HRBrainは、times文化なので、ちょっとしたことでもTwitterと同じ感覚でつぶやくと多くの反応が返ってきて、すごくおもしろい？🤣です！

# 😃 マージについて

マージとは、複数のブランチ間でコードの変更を統合するプロセスです！

※この記事でのマージの意味は、ブランチのコード変更をmainブランチに統合することとします！

## **マージボタン**

GitHub上では、プルリクエストページに「マージボタン」があります。

![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/e64cb8db-2301-1687-479d-0c86db4c7d1c.png)


このボタンをクリックすると、PRに含まれる変更がmainブランチに統合されます。

マージ前には、先輩エンジニアにコードレビューしてもらったり、CI/CD、QAエンジニアさんがテストするなどの工程があります！

<details><summary>CI/CDとは？</summary>

#### CI (継続的インテグレーション)

- ソフトウェア開発において、ビルド（ソースコードを機械言語に変換し、必要なライブラリなどを結合し、実行可能なシステムに変換する）やテストを自動化し、容易に品質管理を行うこと

#### CD (継続的デリバリー、継続的デプロイ) 

**継続的デリバリー**
- 開発者によるコードの変更に対して、バグ（システム内に存在する欠陥や誤り）がないか自動的にテストし、リポジトリにアップロードすること

**継続的デプロイ**
- 開発者による変更をリポジトリから本番環境に自動的にリリースし、ユーザーが利用可能にすること

</details>

## **マージの種類**

マージにも種類があります！（ここでは軽く触れます）

この機会にマージの種類も知っておくといいかもですね〜

<img width="400px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/b9f88132-988c-5f53-a975-dc68b9a32831.png">

### ✍️ Create a merge commit

**良い点**
全てのコミットとその順序が保持され、マージコミットの保持ができる
マージされたブランチの特定の変更を見つけやすい

**悪い点**
多くのマージコミットが履歴に加わり、履歴が読みにくくなる

### ✍️ Squash Merge（スカッシュマージ）

**良い点**
複数のコミットが一つにまとめられるため、履歴がクリーンになる
何をマージしたかマージコミットが残る

**悪い点**
個々のコミットの詳細が失われる


### ✍️ Rebase Merge（リベースマージ）

正直使ったことないです！🙇

**良い点**
コミット履歴が一本の直線で、理解しやすい
マージコミットが生成されないため、履歴がスッキリ！

**悪い点**
元のコミットのタイムスタンプや順序が変更される

本題ではないので、詳しく知りたい方はこちらを〜😏

https://qiita.com/ko-he-8/items/94e872f2154829c868df

# 😃 マージボタンを不安なく押すために〜

ここから本題です！

マージのボタンを不安なく押すために、準備が必要だと思っています！

備えあれば憂いなしということで、

- マージボタンを押す前についての準備
- マージボタンを押した後についての準備

の2つの視点から説明します！

## 💪 マージボタンを押す前についての準備

マージ前にできることを紹介します！

### 1. **セルフレビューで自分が不安な実装をあらかじめコメントしておく**

- コードをレビューしてもらう前に、自分自身でコードを見直すことはとても重要です！

- 特に不安な実装部分については、コメントを追加し、なぜそのようなアプローチをとったのか、他に考えられる代替案はないかなどを記しておくといいかもです！

以下の記事で詳しく書いてあります！

https://qiita.com/nakampany/items/152d204635180fd880db

### 2. **わからないこと・不安なことやがあれば、積極的に質問する**

- わからない点がある場合は、先輩エンジニアに積極的に質問することが大事です！
- 自分なりの質問のテンプレートを作っておくと実装やレビューがスムーズに進むかもですね！

- 何事も準備なので、自分なりの質問テンプレート作ってみた！
    
    **質問テンプレート**
    
    ```
    以下が、（わからない）ので、ペアプロしていただけないでしょうか？
    以下が、（不安な）ので、ご教授いただけないでしょうか？　など
    
    【わからないこと・不安なこと】
    Go言語でユニットテストを書きました。
    モックをどのように実装すれば良いのか理解できていません。
    [URL](GitHubのコードのPermalink)
    
    【試したこと】
    Goの標準ライブラリと、パッケージのドキュメント、ブログを参考にしました。
    [URL](https://github.com/golang/mock)
    プロダクトコードの既存のコードのこの実装を参考にしました。
    [URL](GitHubのコードのPermalink)
    
    【試した結果】
    明確な実装方法がわからず、どのようにモックをテストに適用すれば良いかが理解できていません。
    ```

    <details><summary>*[URL](GitHubのコードのPermalink)とは？*</summary>
    
    GitHubのコードのPermalinkとは、**GitHub上の特定のファイルやディレクトリの特定のコミットに対する直接リンク**です！
    
    便利なので、知っておいた方がいいかもです！🙆‍♂️
    
    - [コードスニペットへのパーマリンクを作成する - GitHub Docs](https://docs.github.com/ja/get-started/writing-on-github/working-with-advanced-formatting/creating-a-permanent-link-to-a-code-snippet)
    
    - [GitHubで特定行へのパーマリンクを素早く表示する方法 - Qiita](https://qiita.com/fumitoh/items/552deaad2be533f20b53)
    
    Visual Studio Code で GitHub URL をコピーする
    
    - [GitHub Pull Requests and Issues (VSCode拡張機能)](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github)
    
    - [Visual Studio Code で GitHub URL をコピーする](https://zenn.dev/mtmatma/articles/adc06eb115e1f2)
    </details>

### 3. **テストコードを書く**

- 場合によりそうですが、テストコードを積極的に書くのも1つの手段ですね！
- ユニットテストや統合テストを通して、新しいコードが既存の機能に影響を与えていないことを確認することも大事ですね！

<details><summary>何をテストしたらいいの？どんなテストを書いたらいいの？という方へ</summary>

テストコードの方針について、良さげな記事貼っておきます！

[【初心者向け】テストコードの方針を考える（何をテストすべきか？どんなテストを書くべきか？） - Qiita](https://qiita.com/jnchito/items/2a5d3e15761fd413657a)

</details>

## 💪 マージボタンを押した後についての準備

万が一、マージ後に問題が発生した場合には、どうしたらよいの？

### 1. **`revert`の実施**

`revert`とは、**過去のコミットを取り消すために、新しくコミットを作成を作成して打ち消す**ことです！

すぐに解決策が見つからない場合は、マージされた変更を取り消す（`revert`する）ことができます！

timesでも、指摘いただいたように、web上でボタンぽちぽちでできるので、楽です！ミスをしているので、気持ちは楽ではないですがw

#### 実際に`revert`をやってみた

**Step1 プルリクエスト(pull request)の画面を開く**

<img width="500px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/7cb82405-22a9-d179-c721-dfeb82025f5f.png">

**Step2 マージボタン(`Merge pull request`)を押し、プルリクエストのマージを行う**

<img width="500px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/120cd876-6fe4-591a-1c63-60a7f30e594d.png">

マージされましたね！

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/57f9541d-3b9f-f286-a239-4dac23163405.png)

**Step3 `revert`の実施！**

`revert`のボタンを押す！

<img width="500px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/99760b8d-4ece-71d5-5d5c-4cfa1bb91655.png">

過去のコミットを取り消すために、新しくコミットを作成を作成して打ち消すことなので、新しいプルリクエストの作成に行きます！

<img width="500px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/e4c718de-7419-534c-fa35-96b814c948da.png">

titleとdescriptionを埋めてCreate pull request！

**Step5 マージコミットを打ち消す新しいプルリクエストの作成完了！**

<img width="500px" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/acd05f79-1d8d-1756-b137-d66199fc8cdb.png">

差分がいい感じなので、しっかりできていそうですね!!!🙆‍♂️

![スクリーン ショット 2023-12-10 に 22.48.27 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/26323535-ec44-ac95-e32e-5025b3a98d29.png)

![スクリーン ショット 2023-12-10 に 22.49.12 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885098/f3209785-913c-a4aa-3505-82a92546619d.png)

### 2. **先輩エンジニアに相談**

問題を発見したら、速やかに先輩エンジニアに報告し、対応を相談します。

単独で解決しようとせず、チームで協力して対処しましょう。

といっても、問題の大きさによると思いますが

### 3. **原因分析と振り返り**

最後は、必ず原因分析と振り返りです！

問題の原因を知り、今後同様の問題を避けるためにドキュメント化など振り返りをしましょう！

2度と同じ失敗をしないように。。。！

# おわりに

今回は、マージボタンを押すことが不安な方に向けての記事を書きました！

マージのボタンはなんか、これまでやってきた実装の達成感などがあってか、なんか緊張しますよねw

それでも、マージボタンを押す際の緊張感は、準備をしっかりしておけば大丈夫だと思っています！！！

慣れは怖いので、適度な緊張感は持っていたいですね〜!

ではまた、次回の記事でお会いしましょう！👋

# 参考

https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request

# PR

HRBrainでは一緒に働いてくれる仲間を募集しています！😁

https://www.hrbrain.co.jp/recruit

アドベントカレンダー1記事目

https://qiita.com/nakampany/items/91d77f1b87278ed40e81

アドベントカレンダー2記事目

https://qiita.com/nakampany/items/1a34ca825667671cf704