Git初心者のGit

#Gitとは？
Gitとは一言でいえば　"バージョン管理システム"　のことです。
Gitでは、サーバ上にあるリモート・リポジトリ（**1本の木**みたいなもの）と言うフォルダに対して、変更を加える（**枝付け**）ことでリモート・リポジトリ（1本の木）をよりカラフル(変更)にしていくと言うものです。
この枝付けを多数の人と行うのが**GitHub**です。

**(注意)**
ここでは、自分の作業場＝ローカル・リポジトリを**ローカル**と呼ぶ！
　　また、一本の木＝リモート・リポジトリを**リモート**と呼ぶ！
**(注意)**
#Gitの流れ
具体的にどのような流れで行うか説明します。

1.ローカル環境が整ったら、リモートからフォルダを自分の作業スペース（**ローカル**）に持ってきます。

2.リモートで変更点を**Git上**の**issue**と言う場所に変更したい内容と共に載せる。

3.ローカルで**branch**を作成して、**作ったbranch**に移動する。

4.そのbranch上で変更を加え,**add**して**commit**して**push**する。

5.**Gitに戻り**、最終確認をして**変更を許可**する。

6.ローカル上にあるフォルダに変更内容を加えるために**merge**する。

#Gitのコマンド
以下で[　]これが登場するが、実際に入力する時は[　]これを入力しない。

##- **init**

```
$git init
```
これは、これから Git をするという宣言のようなもので、 **Gitを使用できる環境を作ってくれる**。

##- **remote**

```
$git remote add origin [SSH]
```
init を行った後にリモートにある [SSH] と共に入力することで**自分の作業場(ローカル)を作る**ことができる。
別の言い方では, **多くある木の中(ネット上には他の人が作ったリモートが沢山)**から, **みんなで作業したいリモート(一本の木)**を設定するコマンド.
**(注意)** 下の **clone と remote** のどちらで環境構築したかで**後の進め方が変わってくる!**  

##- **clone**

```
$git clone [SSH]
```
リモートに書かれてあるSSHを入力することで**リモート(一本の木)**を持ってくることができる。


##- **branch**

```
$git branch [branchname]
```
[branchname]　は例えば issue#1 のように書く。変更作業はここで作った***branch上***で行う。
[branchname] の例では, 追加したい機能の名前など.
(例) ボタン機能を追加したい → [add_button_function] 
みたいな感じ. 記法(命名法 or 書き方)は開発メンバーで揃えましょう.


```
$git branch 
```
このコマンドでローカルにあるbranch（枝）の状態がわかる。


##- **checkout**

```
$git checkout [branchname]
```
これで、[ ]ここに指定した branch に*移動*することができる。
**注意**：⬇️に書いてることはやってること同じなので深く考えないように.よくわからなかったらスルー.

```
$git checkout [リモートの移動したいbranchname]
```
リモートにあるbranchに checkout するとそのbranchを**ローカル**に**コピーする(引っ張ってくる)**ことができる.


```
$git checkout .
```
これで、 現在の branch の変更内容を全て消去できる.

~~**注意**：作った　branch　に移動する時は、先に　master から離れる。~~


##- **status**

```
$git status
```
このコマンドを入力することでどのファイルを変更したかがわかる。
また、今どのファイルを**　$git add　**しているのか、していないのかも確認できる。
わかるのは、あくまでも**ファイルで変更内容は確認できない**!!
**(注意)**　*$git add をする前に必ず確認しよう!!*


##- **diff**

```
$git diff
```
これをすることで、今まで加えた変更内容がみることができる。
**(注意)**　*$git add をする前に必ず確認しよう!!*

##- **add**

```
$git add [filename]
```
これをすることでリモートに**送りたいファイルを指定**する。
*この状態ではまだリモートに送ることはできない！*
このコマンドをする前に必ず**　status と diff**　を行い間違いがないか確認する!!

```
$git add .
```
これで, 現在のbranchで行なった**変更全て**を add する.

##- **commit**

```
$git commit -m "[変更点]"
```
$git add をした後にこれをすることでリモートに送る準備ができる。
[変更点]は加えた点が**誰に見られても理解できるもの**にする!!

##- **push**

```
$git push origin master
```
まず **origin というのはリモートの一般的な名前**のこと。
接続するRemote環境(一本の木)を設定するコマンドで紹介した、 *$git remote add origin [SSH]* の**origin**のこと!
これによって、**変更したファイルを送る**ことができる。

##- **merge**

```
$git merge
```
merge(合流, 統合)という意味.
これをする前に、必ず **$git checkout master** を行う！　作成した branch 上で行わないように。
これを行うことで、他の人の変更を**origin(リモート)から引っ張ってきて統合**することができる。

##- **pull**

```
$git pull origin master
```
これによって、更新されたファイルをリモートから持って来て、**自分の作業場(ローカル)の環境を更新**することができます。
origin は**リモート・リポジトリの名前**のこと。

```
$git pull origin [branchname]
```
実際には⬆︎の意味で捉えられます.
これは, このコマンドを*打った時にいるbranch*に対して, **orgin(リモート)上にある[branchname]で指定したbranch**を**現在いるbranchに統合(merge)**することを意味しています.
難しかったらスルーで構いません.
[追加: 2019/6/13]

#**まとめ**
- addをする前には必ず、**status と diff**をして最終確認をする。  


- 小まめに **merge** することで **conflict(衝突)**を回避しよう!! 
 conflict(衝突)とは**他の人と自分の変更点に矛盾**が生じたときに起こる問題のこと。

- 他にも多くのコマンドとアプローチの方法があるため調べてみる!!

# 振り返り
この記事を書いてから１年が経ちました. 
今振り返ってみると, 無茶苦茶なこと書いてるな！？ と思う箇所もありましたが, Gitを初めて勉強した時は「なにいってるんだこいつ?」 と思いながら学びました.
わかる人が読めば, 「なんだ? この説明は.」と思う箇所もあると思います.
(僕も久々に読んで思いました笑)
しかしこの記事は, わからなくて**四苦八苦している自分が書いたもの**なので, **同じく苦しんでいる人**には案外この説明がわかりやすのかもしれません.
なので, あまり書き方・説明方法を変更するつもりはありません.
と言いつつ少し説明を追加したりしたのですが...
この記事が誰かの理解の一助になれば嬉しいです.