Salesforce開発初心者向けgit関連の紹介 

###目次
 [はじめに](#はじめに)
 [deploy構成の例](#deploy構成の例)
 [gitを使用する開発流れの紹介](#gitを使用する開発流れの紹介)
 [gitローカル操作の紹介](#gitローカル操作の紹介)
 [終わりに](#終わりに)

### はじめに
こんにちは、PanGuのChoです。Salesforceプロジェクトを共同開発する際に、gitをどう言うふうに使うのか、そもそもgitはなんですか、と言う疑問を持っている初心者の方がいらっしゃるかと思います。今回はこれらの疑問を想定し、git関連の知識を紹介したいと思います。

また、deploy構成はプロジェクトの方針次第に大きく変わります。本記事に使用する構成例は汎用的なもので、vscodeにてlwcやapex classを開発、デプロイ、ソース管理の構成になっています。

### deploy構成の例
![salesforce.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/a7c88859-ffcc-3310-9871-776223303c55.png)
上記の図では、1段目にSalesforceの組織、2段目はローカルフォルダ、3段目はGitHubになっています。説明の便宜上に、gitブランチ名などの名前はSalesforce Sandboxの名前を採用しています。
**(1)sfdxにてdeploy**
2段目「開発用sandbox1」フォルダにあるソースを、1段目「開発用sandbox1」へdeploy。（vs codeUI上のデプロイ機能と同様）
**(2)push**
1段目「開発用sandbox1」にてテスト完了後に、2段目「開発用sandbox1」フォルダにあるソースをローカルrepositoryにコミット、そしてGitHubへpush。
**(3)pull request**
3段目branch「開発用sandbox1」をbranch「結合用sandbox3」へマージ。マージにはGitHubのpull request機能を使用。
※ここでは、3段目branch「開発用sandbox2」は別機能開発のソースを並行管理していることも想定しているが、3段目branch「開発用sandbox2」に関する操作は、3段目branch「開発用sandbox1」と同じのため割愛。
**(4)pull**
2段目ローカルフォルダ「開発用sandbox3」のソースを最新化する。
※「開発用Sandbox1」にて開発したソースを含めるように。
**(5)sfdxにてdeploy**
1段目Salesforce「結合用sandbox3」にdeploy。結合テストを行う。
**(6)sfdxにてdeploy**
(5)結合テストにて保証したソースを、「本番」へdeploy。
**(7)backup**
2段目ローカルフォルダ「本番」にSalesforce本番のソースを取得。
**(8)push**
3段目branch「本番」pushことによって、本番のdeploy履歴を管理。

ここまで、汎用的なデプロイ構成をご紹介しました。イメージを掴んだでしょうか？

### gitを使用する開発流れの紹介
gitを使用する開発流れを紹介します。下図にある「local repository」は前述の「開発用sandbox1」か「開発用sandbox2」に当てはまります。「remote repository」は共同開発のソースを集約する役目になります。
![git_remote.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/9cfac382-5b31-0bce-ba6e-cd1ad91b5492.png)

プロジェクトに参画した際に、すでにgit repositoryが建てられている場合は多いです。既存git repositoryからStartの手順を詳しく説明します。
**(1)新機能開発用repositoryをfork（または新branchを切る）**
汎用的に下図は新repositoryをforkすると表記しています。実業務のほとんどは新repositoryの代わりに、新規branchになるかと思います。
![git_remote.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/815cd195-070a-faed-c9ca-ee22a82378fd.png)
**(2)forked repository（またはbranch）をローカルへclone**

**(3)ローカルに開発したソースをcommit**

**(4)push**
ローカルに開発したソースを、リモートrepositoryへpush
![git_remote.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/f3ad6ee9-ea51-6286-2746-632fd3e283bf.png)
**(5)並行開発**
元のrepositoryに、他メンバーやチームによって先に、開発された内容がコミットされたを想定。
![git_remote.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/48cf71cc-731d-7856-5df4-fc82b16aa2b1.png)
**(6)pull request**
自分が開発を行っているrepositoryまたはbranchを、元のrepositoryへマージ作業は、GitHubのpull requestにて行う。pull requestのpull（引く）と言う言葉は、元repositoryの角度からよるものです。
![git_remote.6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/a50554c4-0239-0e7b-6540-d3085a27e87a.png)
さて、ここまではgit remoteに絡む操作を紹介しました。いかがでしたか？

### gitローカル操作の紹介
**gitインストール**
ここでは、gitのインストール手順を割愛します。

```shell:gitインストールされているかを確認
git --version
```

```shell:gitに使用するアカウントの初期設定（例）
git config --global user.name "pangu taro"
git config --global user.email "info@panguinfo.com"
```

**ローカルgit環境の概要**
下図のように、4つの領域が別れています。
![git_local-Page-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/01d928ce-afb3-0318-c2c0-8761d414ea91.png)

**ローカルrepository作成：非gitフォルダよりgit repositoryを作成する場合**

```shell:gitフォルダの初期化
git init
```

上記コマンドを実行後に、下図のように、それぞれの領域が作られます。
![git_local-Page-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/bddf2273-7714-a058-7fef-0a991b99ab8d.png)

**ローカルrepository作成：GitHubよりgit repositoryをcloneする場合**

```shell:cloneコマンドの例
git clone https://github.com/domain/repository.git
```
上記コマンドを実行後に、下図のように、remote repositoryのコミット履歴を含んだリソースはローカルフォルダに作られます。git initは実行不要です。
![git_local-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/fe19ce4e-fd71-4bb4-ad37-e92d943739bf.png)

**stagingエリアにファイルを追加**

```shell:stagingエリアにファイルを追加するコマンド
git add file  #該当ファイルのみ
git add .      #該当フォルダにあるすべてのファイル
```
上記コマンドを実行すると、work treeにあるファイルがstagingエリアに追加されます。コミット対象になります。
※SVNなどと違って、コミット都度にこの操作が必要です。
![git_local-Page-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/f5719d8a-4c21-5aa5-91f0-18027c82d463.png)

**commit**

```shell:commitコマンド
git commit -m "コミットコメント"
```
上記コマンドを実行すると、stagingエリアにあるファイルがコミットされます。
![git_local-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/8a2131ea-5d71-98e3-345e-9b1f4da69649.png)

**remote repositoryの設定＆確認**
GitHubよりgit repositoryをcloneした場合は、git remote add手順は不要です。

```shell:
git remote add origin https://github.com/domain/repository.git
git remote -v #確認
```
上記コマンドを実行すると、remote repositoryが設定されます。
![git_local-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/c0fb980c-8829-fa69-3edb-6ba5030fdcdf.png)

**remote repositoryへのpush**

```shell:
git push origin master
```
上記コマンドを実行すると、ローカルrepositoryにコミットしたソースは、remote repositoryへアップロードされます。
![git_local-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129251/d19e193d-ddf0-3bb2-cf7c-d3f7ece927f8.png)


### 終わりに
本記事は全体像をフォーカス、駆け足でSalesforce開発する際に使用するGitのまわりを解説しました。ご参考になりましたでしょうか？具体的なGitコマンド使い方、GitHubへの認証設定方法は割愛しております。このあたりにお気になる方は該当するナレッジサイトをご参照いただければ幸いです。