GASをGithubで管理する

###### 導入背景
プライベートでGASを使用した得点計算ツールを開発しているが
ソースコード自体はGAS上で管理しなければならず
プロジェクトで共有するには少々使い勝手が悪く困っていました。

そこで、ソースコードの変更履歴を追跡し
複数の開発者との共同作業に適した分散型バージョン管理システムの[Github](https://github.com/rakisuto/GAS_Tools)に
GASのソースコードを運用することにしました。



# GitHubの環境構築手順
### ①. GitHubアカウントの作成

[GitHub](https://github.com/ "")にアクセス
Sign up ボタンをクリックしてアカウント作成（詳細は割愛）

### ②. Gitのインストール

gitのGUI操作を行うための準備。
[公式サイト](https://git-scm.com/ "") からGitをダウンロードし、インストール
ターミナルやコマンドプロンプトを開き、以下のコマンドでGitの設定を行う
```
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
```
# GASとの連携環境構築手順
Google Apps Scriptのプロジェクトをローカルで管理するために
clasp というCLIツールをインストールします。

clasp を使用するためには、事前にNode.js（および関連するパッケージマネージャーのnpm）をインストールする必要があります。

### 1. Node.jsのインストール
まず、[Node.jsの公式サイト](https://nodejs.org/ "")から適切なバージョンをダウンロードしてインストールします。
インストールすると、node と npm（Node.jsのパッケージマネージャー）の両方が利用できるようになります。

### 2. clasp のインストール
Node.jsをインストールした後、以下のコマンドを使用してclaspをインストールします

```
npm install -g @google/clasp
```
このコマンドにより、clasp がグローバルにインストールされ、どのディレクトリからでもアクセスできるようになります。

### 3. claspにログイン
下記コマンドでgoogle認証を行います。
これでgoogle上の環境とファイルやり取りが可能になります。
```
clasp login
```
# ローカルとGoogle Apps Scriptとでソースコードをやり取りする手順

### ①プロジェクトのクローン(複製)
既存のGASプロジェクトが存在する場合、GASのIDを指定して、プロジェクトをローカルにクローンします。
```
clasp clone [scriptID]
```
### ②ローカルからGASへのプッシュ(アップロード)
ローカルの変更をGASプロジェクトにプッシュします。

:::note warn
通常、プッシュはプルリクエスト承認後に管理者が実施します。
:::

```
clasp push
```
### ③GASからローカルへのプル(ダウンロード)
GASのオンラインエディタでの変更をローカルにプルします。

```
clasp pull
```

# ローカル環境でGithubを運用する手順
### ①リポジトリのクローン(複製)
リポジトリのURLがわかっている場合、以下のコマンドでローカル環境にクローンできます。

```
git clone [リポジトリのURL]
```

### ②ローカルリポジトリに移動
```
cd [リポジトリ名]
```
### ③ 最新の変更を取得
リポジトリをクローンした後、または既にクローンしている場合、プルを行うことで最新の変更を取得できます。
```
git pull
```
### ④ブランチを作成する
通常、mainブランチ上で作業を行うことはありません。
mainブランチから新しくローカルブランチを作成して作業を行い
最終的にmainブランチへソースファイルのプッシュを行います。
```
git checkout -b [新しいブランチ名]
```
>**実行例**
```
$ git checkout -b "test"
Switched to a new branch 'test'
```


### ⑤変更を反映する
```
git add [変更したファイル名]  # 特定のファイルのみ
# または
git add .  # 全ての変更をステージング
```

### ⑥変更をコミットする
```
git commit -m "[変更内容の説明]"
```
>**実行例(test.jsを作成＆ステージングした後にコミット)**
```
$ git commit -m "test"
[test cd1a1bf] test
 1 file changed, 3 insertions(+)
 create mode 100644 test.js

```

### ⑦変更をリモートリポジトリにプッシュする

```
git push -u origin [新しいブランチ名]
```
>***実行例***
```
$ git push -u origin test
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 552 bytes | 552.00 KiB/s, done.
Total 6 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), completed with 2 local objects.
remote:
remote: Create a pull request for 'test' on GitHub by visiting:
remote:      https://github.com/rakisuto/GAS_Tools/pull/new/test
remote:
To https://github.com/rakisuto/GAS_Tools
 * [new branch]      test -> test
branch 'test' set up to track 'origin/test'.

```

### ⑧mainブランチへのプルリクエストを行う

Githubのwebページ上でプルリクエストを発行する。
**Compare & pull request**を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558257/502067cd-cfa2-4c35-32ad-b32f985f7da1.png)
メッセージを入力して **create & pull request**を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558257/40415a5c-ba87-acfd-ed58-8dd759ec7618.png)
オーナーはプルリクエストを確認し、問題なければ**Merge pull request**を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558257/0a0225aa-cd0e-70bc-aada-4f8525af0641.png)
これでmainブランチにtest.jsがマージされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558257/a26d09af-9d56-3614-e494-6b5265230425.png)