Git(Hub) Private Repository 作成からConflict解消まで[学生初心者向け](後編)

Make IT Adventcalendar 22日目です。@moya0423が担当します。
この記事は[Git(Hub) Private Repository 作成からConflict解消まで学生初心者向け(前編)](https://qiita.com/moya0423/items/6ca38b3d912c54b9d21f)の続きとなります。
まだ読んでいない方はこちらから読んでいただけると幸いです。

##リポジトリ関連・用語解説

master(マスター)やbranch(ブランチ)・push(プッシュ)など分からない用語が増えてきたので用語解説をします。

###Git cloneとは

`git clone`とはリモートリポジトリ(共有セーブデータ)を丸ごと自身のローカルリポジトリ(個人セーブデータ)に持って来て保存するよ という命令文です。
文字だとイメージが付きにくいので実際にcloneしてみましょう。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/264212/91110ab9-fc79-190c-3179-d21c21967f67.png)
Githubにあるリモートリポジトリから早速cloneしてみます。 画面右側にあるClone or DownloadからコードをコピーしてGit-Bashに貼り付けます。
cloneするコマンドは以下の通りです。

```
$ git clone "Githubからコピーしてきたコード"
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/264212/eb00f2ec-6679-8cef-9dd7-df886ee17c23.png)
実際にcloneした結果です。リモートリポジトリにあるファイルが全てローカルリポジトリに送信・保存されている事が確認できます。
###add/commitとは
`$ git add`とはインデックスにファイルを追加するためのコマンドです。
`$git commit`とはインデックスに追加されているファイルをコミット(個人セーブデータにセーブ)するためのコマンドです。
インデックス?コミット?とはなんぞやって話ですが文字だけでは説明が難しいので画像を交えて説明します。![アートボード 1.png](https://qiita-image-store.s3.amazonaws.com/0/264212/30fd84f2-bfb4-d7a0-4127-68bde13b38c1.png)
Gitの管理下で実際に作業しているファイル/フォルダのことをワークツリーと呼びます。
Gitではワークツリーとリポジトリの間にインデックスが存在しています。
このインデックスでは`$git add`されたファイルを保持します。
インデックスに保持された内容からリポジトリにコミット(個人セーブデータにセーブ)します。

###push/pull/fetch/mergeとは
![アートボード 3.png](https://qiita-image-store.s3.amazonaws.com/0/264212/dee60dd0-3197-af24-c416-78359a961a32.png)

####pull(プル)とは
リモートリポジトリ(共有セーブデータ)からデータをローカルリポジトリに送り込み、送り込んだデータをローカルリポジトリに反映させる(書き込む)処理です。

####push(プッシュ)とは
ローカルリポジトリにコミット(セーブ)されたファイル/フォルダをリモートリポジトリ(共有セーブデータ)にデータを送り込む処理です。pushの対はpullだと思われがちですが、正確にはfetchが対です。

####fetch(フェッチ)とは
リモートリポジトリ(共有セーブデータ)のファイル/フォルダをローカルリポジトリ(個人セーブデータ)にデータを送り込む処理です。

####merge(マージ)とは
pushやfetchされたデータを送信先へ取り込む・ブランチを統合する処理のことです。　直訳すると併合や合併です。

##branch(ブランチ)とは

![アートボード 5.png](https://qiita-image-store.s3.amazonaws.com/0/264212/64d2f954-d2ee-7fa9-3cf8-5592c5ed15f0.png)

直訳すると枝・支流です。
枝分かれさせることを「ブランチを切る」と言います。
ブランチには並行して別の作業を進める。
特定の課題を解決するためのブランチ(トピックブランチ)など使い方は多岐に渡ります。
画像のように中年ちゃんからブランチを切り、Aでは仕事をしている中年ちゃんを、Bでは筋トレをしている中年ちゃんを。のように中年ちゃんを分身させ別の作業を同時に進めるイメージです。
またmerge(結合)することによって「筋トレもして仕事もした中年ちゃん」を作成することが出来ます。

##早速リポジトリ操作からコンフリクト解消まで

実際にリポジトリの操作からコンフリクト解消までしていきます。

![アートボード 1.png](https://qiita-image-store.s3.amazonaws.com/0/264212/af712367-6c7b-a668-bda3-9d325e979b06.png)

リモートリポジトリからcloneした後に差分ファイルをリモートリポジトリから持ってきます。
リモートリポジトリから二通りの方法でファイルを持っていきます。
A君はpull,Bちゃんはfetchした後にmergeをします。

持ってきたいファイルはhuman.txtです。
早速A君がPullしたようです。
`$git pull`
![キャプチsャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/264212/5eda7d8e-a13e-4a6f-a016-64553841a33a.png)


human.txtがワークツリー内に入っていることが確認出来ます。
git pullはデータを受け取った後に、そのデータを取り込む処理です。 すなわち fetchした後にmergeをしています。続いてBちゃんもデータを取り込んだようです。
![キャプチャss.PNG](https://qiita-image-store.s3.amazonaws.com/0/264212/2bb8b8f6-8e73-8d8d-781f-6c428b875875.png)

`#$ git fetch`でリモートリポジトリから差分データを受け取った後に
`$ git diff`でローカルリポジトリと最新データとの差分を確認しています。
「human.txtが追加されていて、中身はこんな内容ですよ」　と表示されているのが確認できます

これを確認した後に`$ git merge origin/master`で最新データをローカルリポジトリにmerge(合併)させているのが確認出来ます。
A君もBちゃんもやっていることは同じです。　A君の場合は、データを受け取り、その後すぐにデータをcommitしているので、持ってきたくないファイルもマージしてしまう恐れがあります。 git pullするときは慎重にしましょう。

##conflict(競合)とは
「衝突」とも言われています
マスター側と別のブランチ、別のブランチ同士で同じファイルの同じ部分を変更した時に、どっちをマージすればいいのか分からなくなってしまいます　その時の事象を「コンフリクト」と呼びます。
![アートボード 10.png](https://qiita-image-store.s3.amazonaws.com/0/264212/7ca498b2-c2ba-0fad-6bc4-ed4fd33edae6.png)

###解決方法その１
競合している部分を削除する。
<img width="1107" alt="108a7efc5c55d595599593a373842f04 (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/264212/b9ebff11-c11d-ba54-470e-561f35e3085e.png">

`========`で挟んだ上と下の部分が競合を起こしているところです。
どちらをマージするべきか吟味した上でどちらかを消して競合を解決しましょう。

###解決方法その２

![1200px-Star_wars2.svg.png](https://qiita-image-store.s3.amazonaws.com/0/264212/f2b749fd-3294-25b8-be9e-643e800e67f0.png)

force(フォース)のちからを利用する 
`git push -f` ＊非推奨

`git push -f`でgit pushを強制出来ます。
競合先を強制的に上書きされてしまうので、あまりおすすめできません

#最後に
Calendarの概念をぶち壊す勢いで期限が過ぎてしまいました ~~過ぎた割に雑~~
しっかり勉強した上で前後編合わせて編集して行く予定です。
間違いだらけだと思われますのでご指摘をいただけると幸いです。
読んでくださってありがとうございました。