git githubをwslで使う　初心者用

gitを使ったことがない初心者がgit環境を整えて，コミット，プッシュ，マージ，コンフリクト解決ができるようになるまでを，具体的なコマンドを実行しながら練習するための覚え書き．

#gitの準備

github desktopを使えばatomなどで編集し，guiでコミットやプッシュができるが，コマンドで使用する方法としてWSLのUbuntuでやる方法

##WSLでgit連携
``` :shell
 $ sudo apt get install git
 $ git config --global user.name  USERNAME
 $ git config --global user.email hogehoge@gmail.com
```




##公開鍵をgithubに登録する

```
 $ssh-keygen -t rsa -C "hogehoge@gmail.com"
 $cat ~/.ssh/id_rsa.pub
```
パスフレーズを任意で入力する．githubのパスワードとは違うもので，空欄でも問題ない. __以下の順に操作__

* github.comでマイページに行く
* setting を選択する
* SSH and GPG key　を選択する
* New SSH key　を選択する
* コピペで公開鍵を張り付けて保存．
* 上記のパスフレーズを入力．

```
$ ssh -T git@github.com
```
で確認してみる．
あとは普通にリポジトリクローンしたりプッシュしたりできる．



#gitを始める

```
$mkdir hoge
$cd hoge
$git init
```
これでこのディレクトリに.gitができる．
```/hoge/.git/```
この.gitが存在している場所/hoge/下がgitの管理下である．

__なぜinitが必要？__
たんにgit cloneするだけでは，コードをダウンロードしただけに過ぎない．
initコマンドでそのディレクトはgitのローカルのリポジトリ機能がつかえる．
さらにリモートと連携することで，push,pullなどを用いてサーバ上へ変更を反映することができる．

__いちいちリモートを切り替えないといけない？__
（git管理下になっているディレクトリはストレージ内にいくつか存在でき，それぞれのgitディレクトリはそれぞれのリモートと関連付けらている．ディレクトリに移動するだけでリモートは切り替わる．）



このままではリモートのリポジトリと連携ていないので，Tarouさんのtestというリポジトリと連携してみると，

```
$git remote add origin git@github.com:Tarou/test.git
```
上このディレクトリ（リポジトリ）をリモート（URL先）に関連づけるコマンド．
任意のURLを張り付ければよい．このときプライベート設定ならパスフレーズを要求される．

もしくは単に

```
$git clone git@github.com:Tarou/test.git
```
とすれば```/hoge/test/.git````ができる．これだと__リポジトリ名のディレクトリが作られる___．すでにPCに開発したプログラムがあって，リモートへ送りたいだけならcloneしないほうがよいかも．


```
$git remote -v
 prigin git@github.com:Tarou/test.git (fetch)
 prigin git@github.com:Tarou/test.git (push)
```
と出れば成功．
リモート先のファイルをダウンロードするorローカルのファイルをリモートへ送るには，

```:download 
$git pull origine 
```

```:sending
$git add -A
$git status
$git commit -m "first commit"
$git log
$git diff Head 
$git push origin master
```



#gitで使うコマンドの説明
```$git clone```
新規でリモートからリポジトリをコピー
```$git pull origine```
リモートからリポジトリをコピーしてくる
```$git status```
編集中なら赤字，ステージング中なら緑字
```$git commit -m "coment"```
リモートへコミットする
```$git add .``` 
ステージングする
```$git log```
コミットの歴史　
--Graph　ツリー表示
--oneline １コミット１行
```$git push origin ```
ローカルへプッシュする
```$git pull```
リモートからダウンロードしてマージもする
pull=fetch+mergeということ
```$git fetch```
リモートからダウンロード
名もなきブランチ扱い：FETCH_HEADでチャックアウトできる
```$git branch -d develop```
ブランチdevellopを削除する 


#ブランチ
developというブランチ名でブランチしてみる．

```
$git chekout -b develop 
```
ブランチを切る```git branch develop```
とそのブランチに入る```git checkout develop```
を一気に行うオプションである．
```git branch```でブランチを一覧できる．

ブランチの中で作業してリモートのブランチにプッシュする．

```
$git add -A
$git commit -m "dev"
```
ローカルで何度かコミットなどして，ある程度できたらリモートへプッシュする．

```
$git push origine develop
```
そうして初めてリモート上でブランチの存在が認知される．
これをマスターへ融合させる．この間にマスターは特に変更されてないなら自動でマージできる．

```
$git checkout master
$git merge develop 
```
ほかにもブランチがあったとしても先にマージされたブランチが方が正統派となる．
ここでエラーがでるなら，ファイルを開いて編集する．
この編集作業自体がマージにほかならない．作業内容を記録するためにコミットしておく．

```
$git add -A
$git commit -m "develop merge ok!"
```
ただし，コンフリクトが起きることがわかっているなら，あらかじめdevelop側で現在のmasterをマージしておいてから，master側でマージをするほうが礼儀正しいはずである(土足で入るようなもの)．

気になる場合はリベースでやり直してみる．

```
$ git reset --hard HEAD~
$ git checkout develop
$ git rebase master 
```
そしてコンフリクトを手動で直す作業．．．

```
$ git add A
$ git rebase --continue
```
この時点で一応commit,pushを残しておいてもいいかも．
このリベースは単にまだmasterにマージするつもりはなくても，masterの最新情報をdevelopに与えておくのに使うときれいに開発できるはず．

```$git rebase --abort```でリベースを取り消し．

```
 $ git checkout master
 $ git merge develop 
```
これで自動的にマージされる．（というかdevelop側ですでにマージが終わっているものを受け入れてもらっているだけ．）