GitHubを用いた複数人でのサービス開発（備忘録）

# GitHubを用いた複数人でのサービス開発（備忘録）
c2cサービス開発を行った時の記録です
ここでは、サービス開発におけるGitに関連する説明のみ行う（随時更新）
## 環境
AWS Cloud9上でreactをもちいた開発
開発者は複数人
## そもそもGitって何？
### Gitが生まれる前は
開発作業を行う際、毎回ソースコードが記述されたファイル名に日付や変更内容を記載していた
以下のような欠点があった
- ファイル名の命名方式を事前に決定する必要がある
- 開発過程で最新のファイルや一時的に取っておきたいファイル等が乱立
- 複数人で開発すると、ファイル名の命名形式が崩れたり、結合前、結合後のファイルが入り乱れる
### Gitホスティングサービス例
個人で運用する場合、Git運用にかかるコストを考慮すると、以下のホスティングサービスをもちいる方が良い
- GitHub
- GitLab
- Backlog
- BitBucket
### Gitの特徴
- バージョンの管理システム
- local、remoteレポジトリを持つ
	- localレポジトリは、各開発者がローカル環境に保持する
	- remoteレポジトリは、開発者全員で変更内容を共有する
- 分散型

### Git利用の流れ
1. ワーキングツリー
	- 編集前のファイルがおかれている
	- "git add (code)"でステージに移動
2. ステージ（インデックス）
	- 編集中のファイルがおかれている
	- "git commit (code)"でローカルレポジトリにファイルの最新情報を更新
3. localレポジトリ
	- 個々の開発者の最新ファイルがおかれている
	- "git push (code)"でremoteレポジトリに修正を反映
4. remoteレポジトリ
	- ファイル群全体の最新がおかれている
	- "git pull"で個々のlocalレポジトリに反映
	
## Gitの利用方法
### 初期設定
1.Gitのバージョン確認
バージョンは2.13.x以上であれば下記操作通りに動くはず

```
$ pwd
/home/ec2-user/environment
$ git --version
git version 2.18.4
```
2.GitHubに登録

```
$ git config --global user.name ""
$ git config --global user.email ""
$ git config --global core.editor 'vim -c "set fenc=utf-8"'  //シェルのデフォルトエディタに関係なく、Git でcommit,tagのメッセージを編集する際にvimが適応される
```
上記設定は./.gitconfigに設定されます

3.remoteリポジトリの作成
GitHubにログイン＞
左ペインの"Repositry"の横にある"New"ボタンをクリック＞
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/48ffc7cc-103e-9d8b-3245-deee7be67c30.png)
レポジトリ名の入力、private/publicレポジトリの選択＞
"Create Repositry"をクリック

>今回は別の人が作成したファイル群を下記コマンドで自身の環境で作成
そのため、このファイル群からremoteレジストリを作成する

>```
$ git clone https://github.com/(hoge)/(hoge).git
```
>この後、必要なパッケージをインストールするが、依存関係は人に依りけりなので今回は省略

4.remoteレジストリにpush
>以下の作業に入る前に必要であれば、sshキーの設定を行う

下記コマンドでremoteレジストリにコードをpush

```
$ git remote add origin git@github.com:(hoge)/(hoge).git
$ git branch -M master
$ git push -u origin master
```
>```git remote add ~```コマンドで```fatal: remote origin already exists.```と表示されることがある。私の場合、```git clone ~```で他人のorgin情報が残っていたため、このエラーが発生。
対応方法は以下の通り

```
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@github.com:(hoge_before)/(hoge_before).git   //別のorigin情報
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
$ git rm origin
$ git remote add origin git@github.com:(hoge)/(hoge).git
```

###  GitHubの基本的操作
1.remoteレジストリから開発者個人のレポジトリの作成
下記コマンドで開発者個人のレポジトリを作成

```
$ git clone git@github.com:(hoge)/(hoge).git (directry名)
```
2.localレジストリがremoteレジストリにpushできることの確認
下記コマンドで、```originのURL```情報が正しいことを確認

```
$ cat .git/config
～～～
[remote "origin"]
        url = git@github.com:(hoge)/(hoge).git   
        fetch = +refs/heads/*:refs/remotes/origin/*
～～～
```
push先のremoteレジストリはこちらのurlになる

3.ブランチの作成
開発者が```test2```ファイルを生成したとすると以下のような流れになる

```
$ git branch new_branch
$ git branch
new_branch
*master
$ git checkout new_branch   //ブランチの切り替え
$ touch test2
```
4.masterブランチへの統合

```
$ git add test2   //ステージへの移動
$ git status test2   //test2ファイルの状態確認                                                                                       
On branch dev
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   test2
$ git commit -m "push test2"   //localレジストリに反映。操作の内容をコメントとして記録
[dev 1a75071] push test2
 1 file changed, 1 insertion(+)
 create mode 100644 test2
$ git status test2                                                                                       
On branch dev
nothing to commit, working tree clean
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
```
masterブランチにマージされたことを確認するため、```ls```コマンドの結果に注目
test2ファイルが表示されている

```
$ ls
design.jpg         gatsby-config.js    gatsby-node.js  LICENSE       postcss.config.js  README.md  src     tailwind.config.js  utils
gatsby-browser.js  gatsby-node.esm.js  gatsby-ssr.js   package.json  providers          snippets   static  test                yarn.lock
$ git merge dev   //dev->masterブランチへマージ
Updating 7080a1c..1a75071
Fast-forward
 test2 | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test2
$ ls
design.jpg         gatsby-config.js    gatsby-node.js  LICENSE       postcss.config.js  README.md  src     tailwind.config.js  test2  yarn.lock
gatsby-browser.js  gatsby-node.esm.js  gatsby-ssr.js   package.json  providers          snippets   static  test                utils
```
5.remoteレジストリに反映

```
$ git push -u origin master
Enter passphrase for key '/home/ec2-user/.ssh/id_rsa': (password入力)
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:Aladdinshare/shareservice-v2.git
   7080a1c..1a75071  master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
GitHubにログインし結果を確認
分かりにくいですが、```test2```が作成されています
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/772481c2-7fef-c813-62c7-b916767f3853.png)
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758476/e2ab7d40-d0a1-4d3b-5bb1-f989fc7d40d2.png)

6.remoteレジストリの変更をlocalレジストリに反映
以降の操作は、先ほどまでと別の開発者の環境で実施

```
$ git fetch origin   
Enter passphrase for key '/home/ec2-user/.ssh/id_rsa': 
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:(hoge)/(hoge)
test2
   79df559..7080a1c  master     -> origin/master
$ git diff origin/master
diff --git a/test2 b/test2
deleted file mode 100644
index 9daeafb..0000000
--- a/test2
+++ /dev/null
@@ -1 +0,0 @@
-test2
$ ls
design.jpg         gatsby-config.js    gatsby-node.js  LICENSE       postcss.config.js  README.md  src     tailwind.config.js  yarn.lock
gatsby-browser.js  gatsby-node.esm.js  gatsby-ssr.js   package.json  providers          snippets   static  utils
$ git pull   
Enter passphrase for key '/home/ec2-user/.ssh/id_rsa': 
Updating 79df559..7080a1c
Fast-forward
 test2 | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test2
$ ls
design.jpg         gatsby-config.js    gatsby-node.js  LICENSE       postcss.config.js  README.md  src     tailwind.config.js  utils
gatsby-browser.js  gatsby-node.esm.js  gatsby-ssr.js   package.json  providers          snippets   static  test2               yarn.lock
```
**補足**
```git fetch```と```git pull```の関係
[こちらを参照ください](https://qiita.com/wann/items/688bc17460a457104d7d)