実務未経験者ではじめて共同開発にトライする方へ向けたお役立ち情報


初めて共同開発を体験して、昔の自分がこれを知っておいたら便利だろうと思えることを備忘録をかねて書き記します。はじめて共同開発をする方向けの記事です。

##slackの情報共有はとっても便利

下記記事をご参考ください。
https://qiita.com/unsoluble_sugar/items/e42ac352400598a24915

連携するとGitHubの変更履歴がSlackと同期するのでSlackの掲示板で進捗確認できて便利です。
![スクリーンショット 2021-03-28 15.34.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/6c92eca6-8ee9-8f81-3731-ae6e62a27a12.png)




##まずはブランチを作成しよう
```Ruby:ブランチの作成
%git checkout -b <ブランチ名>
#branchの作成&切り替えができる便利なコマンド
```

```Ruby:ついでに覚えておくと便利
%git switch <ブランチ名>
#ブランチの切り替えができます。

%git branch -d <ブランチ名> 
#ブランチの削除ができます。

%git commit --amend 
#push前のメッセージを変更できます。

```

##事前準備
```Ruby:事前に確認すること

% git branch
  guest_login
* like-post
  master
  model-test
```
※がついているコードが現在使っているbranchです。
基本的に**master**ブランチを使うことはまずありません。


##いまあるローカルブランチをリモートブランチにくっつける(merge)
まず事前準備、前回のコミットからの進捗をgit pushしてアップデートしてください。
くっつけることを**merge**といいます。

```Ruby:pushの手順
%git add -A
#-AはALLの略なので差分が全てコミットとされて困る場合は、更新したい特定のファイルだけを指定する。
%git commit -m "コミットメッセージ"
%git push --set-upstream origin <ブランチ名>

例
ブランチ名がlike-postなら
%git push --set-upstream origin like-post
 
```

##リモートブランチ(GitHubのブランチ)をローカルへ持ってくる(pull)
リモートブランチを**pull(プル）**するっていいます。
**pull = fetch&mergeのイメージです。**
例は以下の設定です。
あたりまえかもしれませんが、半角ブランクをブランチ名とURLの前にあけてください。
現在のローカルブランチにリモートの指定のブランチを合体させるケースです。

リモートのブランチ名：maser
同期したいURL:https://github.com/kyodo/development.git

```Ruby:リモートから指定のBranchをローカルへ持ってる時
%git pull URL master
%git pull "同期したいアカウントのURL" <同期したいリモートのブランチ名>

例
%git pull https://github.com/kyodo/development.git master

#1例としての以下のような表示がでます。

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

remote: Enumerating objects: 36, done.
remote: Counting objects: 100% (36/36), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 18 (delta 13), reused 12 (delta 8), pack-reused 0
Unpacking objects: 100% (18/18), 2.27 KiB | 154.00 KiB/s, done.
From https://github.com/koudaikumazaki/team-development
 * branch            master     -> FETCH_HEAD
Updating 3b43c45..8af03e2
Fast-forward
 Gemfile.lock                        |  2 +-
 app/controllers/posts_controller.rb | 34 +++++++++++++++++++++++++++++++---
 app/views/posts/edit.erb            | 28 ++++++++++++++++++++++++++++
 app/views/posts/index.html.erb      |  4 ++--
 app/views/posts/show.html.erb       |  2 +-
 5 files changed, 63 insertions(+), 7 deletions(-)
 create mode 100644 app/views/posts/edit.erb
```

##ローカルで更新した情報をリモートへアップデートする

```Ruby:リモートへローカルの更新情報を反映する。
%git add -A
#-AはALLの略なので差分が全てコミットとされて困る場合は、更新したい特定のファイルだけを指定する。
%git commit -m "メッセージ名"


%git push origin <現在のブランチ名>
#または
%git push origin HEAD

#HEADは現在のブランチなので、
#git branch
#で現在のブランチを特定して調べてから
#git push origin "現在のブランチ名"
#と入力する手間が省けて便利。

※git push後に下記が表示されたケースでは、誤って、git push origin HEAD:masterを選択してはイケません!!!!
#筆者はやってしまったことがあるのでくれぐれもご注意を。

fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push origin HEAD:master

To push to the branch of the same name on the remote, use

    git push origin HEAD

To choose either option permanently, see push.default in 'git help config'.

```

##仲間がつくったbranchを確認する
ただ確認したいだけ、**自分のbranchに仲間の作業内容をくっつけ(merge)たくないケース。**
担当分野をお互いにチェックする作業の時に使えるコマンドがこちらです。
わんちゃんが飼い主が投げた遊び道具をとってくるイメージがfetch。
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/31841f25-39a6-fe2a-2b5c-c0883e0958eb.jpeg)

```Ruby:仲間のbranchを確認したい時。

%git fetch <リモートブランチ>
%git fetch -a
#aはALLの略です。
#リモートリポジトリの変更をローカルに取り込みます。

%git branh -a
* contact/#2
  header/#8
  master
  romm/#1
#remoteブランチを赤色で表示されます。
  remotes/origin/#3
  remotes/origin/#5
  remotes/origin/HEAD -> origin/master
  remotes/origin/access/#6
  remotes/origin/areaguide/#4
  remotes/origin/contact/#2
  remotes/origin/footer/#5
  remotes/origin/header/#8
  remotes/origin/master
  remotes/origin/origin/room/#1
  remotes/origin/room/#1
  remotes/origin/top/#3!

#リモートブランチから切り替えたいbranchを選択します。
#例としてremotes/origin/access/#6を選択します。
#remotes/origin/を除いたブランチ名でブランチを切り替えます。（スイッチ)

%git switch access/#6

M       src/asset/js/hamburger.js
M       src/asset/sass/object/component/_hamburger.scss
M       src/ejs/_includes/_header.ejs
Branch 'access/#6' set up to track remote branch 'access/#6' from 'origin'.
Switched to a new branch 'access/#6'

#切り替えが完了しました!

```

参考URLです。

https://git-scm.com/docs/git-fetch



##コミットせずに作業を中断したい時
共同開発では、複数のブランチで別々の実装をする過程でブランチを切り替える必要が多発します。キリが悪いけどブランチを切り替えて確認しなければ、いけない時に使えるコマンドが**git  stash**です。

```Ruby:stashで作業を一時退避する

%git stash save　#saveは付けなくてもいい。
#または
%gitstash save "コメント"

で中断できます。

中断した作業リストは以下のコマンドで見ることができます。

%git stash list

stash@{0}: On #8: ヘッダーの実装
stash@{1}: On #2: first stash

中断した作業をもとに戻すには以下のコマンドを入力します。

#git stash apply [スタッシュの番号名]
%git stash apply stash@{0}

中断した作業を消すには以下のコマンドを入力します。

#git stash drop [スタッシュの番号名]
%git stash drop stash@{0}

```

stashはとても便利なので使って見てください。

参考URL

https://qiita.com/chihiro/items/f373873d5c2dfbd03250


##コンフリクトへの対応

共同開発にコンフリクトは、つきものです。
うぁぁぁぁぁっ、コンフリクトだ!!と焦りますが。。。
masterブランチへこのままmergeしたら問題が起きますと、伝えてくれているので焦らずに冷静に対応しましょう。
コンフリクトが起きるとプルリクエスト画面に下記の表示が出ます。

![スクリーンショット 2021-04-01 13.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/d9dcaba7-c5ef-d70c-0bb8-9335e0496ea8.png)

まずは
右上の**Resolve conflicts**ボタンを押します。
するとコンフリクトの詳細画面が表れます。


![スクリーンショット 2021-04-01 13.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/e5ef4d21-8c98-5eae-e735-1af510e8b138.png)

わかりやすくするために、コンフリクト詳細をズームします。

```Ruby:コンフリクト画面ズームイン

<<<<<<< like
    resources :likes, only: [:create, :destroy]
  end

=======
    resources :comments, only: [:create, :edit, :update, :destroy]
  end
  
>>>>>>> master

#はじめは読むのを戸惑いますが、違いがどこにあるのかを示してくれています。
likeブランチのコード<<<<<<< like  から =======まで
maserブランチのコード======= から  >>>>>>> masterまで
この部分が違います、コンフリクトの原因だと説明してくれています。

#下記のように修正しました。

  resources :posts do
    resources :likes, only: [:create, :destroy]
    resources :comments, only: [:create, :edit, :update, :destroy]
  end  

```

![スクリーンショット 2021-04-01 13.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/283628af-a45e-a2b4-456f-15355db91b0f.png)

![スクリーンショット 2021-04-01 13.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/03dd4b30-c8ef-39f5-e406-63a5147fd9e9.png)

修正が終わったら
**commit merge**をクリックします。
![スクリーンショット 2021-04-02 20.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/07c3b017-c86b-13cf-22f8-9f7e5c733fd0.png)


すると
**This branch has no conflicts with the base branch**
とメッセージが切り替わり、無事にコンフリクトが解消できました!!


先輩エンジニアからプルリクの右側にある**Files changed**タブで差分が一覧を事前に確認してから、レビュー依頼をするようアドバイスがありました。意図しない変更によってバグが発生することがあるためだそうです。**「自分が修正した箇所以外は差分が出ないように」**が基本だそうです。


![スクリーンショット 2021-04-02 20.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455521/8e449b45-b48f-7f65-67ca-7fdef5e7e3a7.png)

おつかれさまでした。
以上、共同開発で知っておくと便利なお役立ちTIPSでした!!

余談ですが。
Gitで共同開発を知ってみるとCoding以外の分野で応用ができそうに思えてきます。参考例です。

https://qiita.com/ktkraoichi/items/f6ad43c2da0b3136d6be


現在、共同開発中なので、補足情報があれば随時更新します!!!!