git初学者の初めてのチーム開発で気をつける事の備忘録

#**はじめに**
IT企業で新米エンジニアとして働いてる@shh-nkmrです。

今回は、gitコマンドを個人の開発だったり勉強で触ってたりはしてるけどチーム開発では触ったことないよーって人向けに、僕が実際に直面して学んでことを共有したいと思います。とりあえずこれらを気をつければチーム開発の現場に出ても大丈夫！。。なはず
指摘等あったらコメント下さい。

>**前提条件**
ローカル:あなたのPC上のリポジトリ
リモート:githubとか。みんなで共有しているリポジトリ
今回はgithubを使用しています。


#**目次**
１、使用するgitコマンドの列挙と軽い解説
２、リモートブランチからブランチを切る
３、プルリクエストの作成
４、リモートの最新の状態をローカルに取り込む
５、コンフリクトが発生した場合の対処
６、作業中に別ブランチでの最優先の作業が発生した時


#**１、使用するgitコマンドの列挙と軽い解説**
ローカルにて、変更があったファイルを確認する

```console
$ git status
```

現在使用しているブランチを確認する

```console
$ git branch
```


リモートのブランチを確認する

```console
$ git branch -a
```


新たにブランチを作成&そのブランチ切り替え！

```console
$ git checkout -b ブランチ名
```


変更があるファイルをコミットできる状態にする

```console
$ git add -A
```


ローカルリポジトリにコミットする

```console
$ git commit
```

リモートから最新のリポジトリ情報を取得し、更新する。
※情報を更新するだけで、実際にローカルブランチの内容が更新されるわけではありませんっ

```console
$ git fetch
```


ブランチをマージする。
※上記のfetchとよく使われます。これによりローカルブランチが最新のものに更新される。

```console
$ git merge　ブランチ名
```

変更のあるファイルを一時退避させる。コメントも残せる
※作業中に別ブランチに切り替える時に使うよ

```console
$ git stash save -u "コメント"
```

一時退避したstashたちのリストを確認

```console
$ git stash list
```

一時退避させたものを復活させる&stashのリストから削除

```console
$ git stash pop スタッシュ名
```
リモートにあげる

```console
$ git push
```



#**2、リモートブランチから新しくブランチを切る**
#### 〜場面〜新しい作業を始めるとき
先輩： 画面Aの修正してほしいので、リモートのmasterからその修正用新しいブランチ切ってから作業して下さい

僕: はい！（ブランチ切るってなんだ...)

※初学者の時に一人で開発など行っている時は、基本的にmasterで作業をしてて別のブランチを切る（作る）は基本的にはしないでしょう（したほうがいいですけど）。しかしチームでやる時は**基本的にmasterで作業することはありません！**なので別ブランチを作って作業します。それではいってみましょう。

Step①:ますリモートの最新の情報をローカルに取得する

```console
$ git fetch
```

Step②:どのブランチから切るか確認する（リモートのブランチを確認)

```console
$ git branch -a
```

Step③:②で確認したブランチから、新しくブランチを切る

```console
$ git checkout -b 新たなブランチ名 切る元のブランチ
```
Step④:念のためにブランチができたか確認　※**よく使います**

```console
$ git branch
```
こんな感じ表示されるはず↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/0d28df24-388c-d7eb-7d3f-e1a9447bd30f.png)

これでおっけーです:ok_hand:このブランチで言われた内容の作業をしましょう。

#**3、プルリクエストの作成**
#### 〜場面〜任された作業が終わってリモートにあげる時
僕:　画面の修正終わりましたー！
先輩: それではpushしてプルリクしておいて下さい。
僕: はい！（プルリクって略すんだ)

※一人で開発していたら、まずプルリク(PRとも言われる)はしませんよね。チーム開発では自分で修正したり、新しく書いたコードを他の人にレビューしてもらいます。それではその手順をみてみましょう。

Step①：push前までの状態にする

```console
$ git status     ※変更のあるファイルを確認する
$ git add -A
$ git commit -m "コミットメッセージ"
```
これは、もう既にやっていることなので問題ないですね。**注意点**としてはチームによってコミットメッセージの規約があるので、それに準拠したコミットメッセージを心がけましょう。

Step②:
pushする前に差分の確認をしましょう。GUIのツールを使ってするとよいです。僕が使っているのはSourceTree（無料)というものです。これをすることにより自分でもコードをチェックして、誤ったものがpushされそうなっていたら未然に防ぎましょう。（僕はこれをしてなくて、誤ったままの状態をpushしてしまい。迷惑をかけてしまいました:bow:)...レビューする方の負担をなるべく減らすためにもまずは自分でチェック
**Sourcetree** →　https://www.sourcetreeapp.com/

Step③:いざpush

```console
$ git push origin あげる先のブランチ名
※現在いるローカルのブランチ名を入れます。初回だと新しくリモートにそのブランチを作成します
```
githubを確認してみると↓
こんな感じのボタンができているので、そこからPRを作成しましょう！

<img width="983" alt="スクリーンショット 2018-07-11 3.32.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/202225/c38b6c6c-20bf-8f92-8f35-93e3c3162080.png">

#**４、リモートの最新の状態をローカルに取り込む**
#### 〜場面〜他の人が更新した内容をローカルに取り込む
先輩: Aさんがリモート上で更新した内容があるので、ローカルに取り込んでから作業してみて下さい。
僕: おけです！（途中でどうやって取り込むんだ？）

※こちらも一人でやってたら起きませんよね。僕の場合はやってた担当の箇所の表示に関する処理が追加されたので、その変更を取り込む必要がありました。チームでしている時は、開発の整合性を保つためになるべくローカルのブランチは最新のものにしておきます。

Step①：ローカルのリモートの情報を更新する

```console
$ git fetch
```

Step②：更新元（させたい）ブランチを確認し、ローカルにマージする

```console
$git branch -a
$git branch                   *現在いるブランチの確認
$git merge 更新元のブランチ名     *更新先（させたい）ブランチにいる必要があります
```

これでローカルのブランチが更新されたました。ここで僕は疑問に思ったのですが```git pull```ではダメなの？でした。```git pull```は```git pull　== git fetch + git merge```を行います。先輩にも聞いたのですがpullはあまり使うことがないようです。
http://dqn.sakusakutto.jp/2012/11/git_pull.html

#**５、コンフリクトが発生した場合の対処**
#### 〜場面〜マージを試みた際
僕：うわー、コンフリクト発生してるやんー、どっち（コード）を残せばいいんだろ。。

※一人開発の場合はコンフリクトも起きづらいし、コンフリクトが起こった場合でも、全ての変更を把握しているので
どっちを残せばいいかわかりますよね！チームで開発する場合は他の方が書いた変更をまるまるしまう可能性もあるのでコンフリクトの解消には注意しましょう。

Step①:コンフリクトが起きているファイルを見に行く
こんな感じのメッセージが出ます↓` fuga.txt `でコンフリクトが起きてます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/9dddd9e9-80bb-0851-8cb2-e66b182ed1bc.png)

Step②:エディタで残すコードを決める。いらないものは、削除
こんな感じになってます↓` <<<<<<HEAD `, `=======`, `>>>>>>> conflict_practice`とあるのですが（gitがコンフリクト起きた場合に自動で生成してくれる)この部分は不要なので削除してよろし、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/6224c9a4-57cb-a10a-b057-a956c582320e.png)

↓残す部分以外は削除、最終的に下のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/622d1d85-05eb-ff01-070c-b76b1f0f6118.png)

```console
$git add -a
```
```console
$git commit 
```
を実行すればコンフリクト解消の完了です。

**※コンフリクト解消する際の注意点!!**
上記ではサンプルってことで、ぶっちゃけどっちでもええやんって感じなのですが、、、
実際の現場だとどっちを残したらいいのか自分の判断ではわかりませんっ
なので***コード変更した人、リーダーまたはPM***の方に確認を取りましょう。
....
ここで疑問に思ったのが、"コードを変更した人ってどうやって知るの？"でした。
チームには入ったばかりは右も左もわからずなので、誰がどの部分を担当しているのか
把握できないので大変です。僕はAtomエディタを使っているのですが、
そんな時は,コードを書いた人を教えてくれるblameというものを使ってます。
詳しくはこちらを参考にして下さい→https://qiita.com/snowsunny/items/17f35baf0671451d2c09#blame

#**６、作業中に別ブランチでの最優先の作業が発生した時**
#### 〜場面〜新しい作業を始めるとき
先輩： PRのレビューしコメントをしておいたので、そちらを最優先で修正して下さい。
僕:了解です！←この時の僕はstashに関してなにも知らなかった...

Step①:その作業をするブランチに切り替える

```console
$git checkout ブランチ名
```
**しかし**既に現在のブランチで変更されたファイルがある場合はうまくcheckout(切り替え)できないはずです。それは作業ツリーの状態が切り替え先のブランチと異なるとかそんな理由です。こんなエラーです

```Bash
error: Your local changes to the following files
 would be overwritten by checkout: hoge.rb
Please commit your changes or stash them before you switch branches.
Aborting
```
なのでこれらのファイルを一時退避させる必要があります。それがstash

Step②:ファイルを一時退避させる

```console
$git stash save -u "スタッシュ名"　　　
*スタッシュ名は後で一時退避から復活させる時に、どれを復活させるか見分けるためにわかりやすいものにしましょう。

$git checkout ブランチ名
```


〜〜最優先の作業を終え、やってた作業に戻る時〜〜

Step③:一時退避したファイルたちを復活させる

```console
$git stash list  *スタッシュしたリストを確認
```
矢印の先の部分がスタッシュ名です
<img width="365" alt="スクリーンショット 2018-07-11 9.14.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/202225/9dde157b-4b4f-675d-7a95-943e09ba3b31.png">

```console
$git stash pop スタッシュ名  *復活&スタッシュリストからの削除
```
これで前の作業状態に戻ったはずです。僕はstashをちゃんとに理解していなくてあわわしてました。後から考えればそれはそうだよねって感じです。


#おわり
ここまでつらつらと書かせて頂きましたが、初めての人向けを意識して書いたので既に経験のある方には文章の説明がまどろっこしいかもしれません。かく言う僕もまだ初学者などで説明に不備があるかもしれませんが、その際はコメントなどで指摘して下さい。よろしくお願いします。

参考
https://backlog.com/ja/git-tutorial/