Lesson3: まとめ How to Use Git and GitHub＠Udacity

#概要
テーマはリポジトリ作成/修正、ブランチの作成/マージ

#commit内容の記述ルール
Udacityでは[ここ:Udacity Git Commit Message Style Guide](http://udacity.github.io/git-styleguide/)のルールに従うらしい。チームで開発する場合はこういうルールが必要だよね。現在形で内容を書いたり、Subjectの内容を統一したり。**How**はコードに書いてあるから、内容は**What**と**why**を書くらしいね。

#Repository, Staging area, Working directoryの違い
Repository：コミットがたくさん積んである
Staging area：最新のコミットのコピー
Working directory：最新コミットのファイル＋付け加えたファイルをいじってるとこ


#Staging areaですること
git reset：staging area にあるファイルを、staging area から降ろすこと
git diff(引数なし)：Working directoryとStaging areaのコードの中身を比較してくれる。
git diff --staged：staging  area とrepository内の最新コミットのコードの中身を比較する。だいたいgit diffをやって、書いているコードがstaging areaのコードと違うことを確認して、git addし、その後、ダブルチェックのために、コミットする前に、staging area と最新コミットをgit diff --stagedで比較する。その後満を持してコミットするみたい。

![無題.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/46f09966-1440-1770-4c0d-b5d15b2e8592.gif)

コミットの前に・・・
git checkout masterを実行して最新のコミットのファイルに戻る。checkoutして前のファイルを動作させている場合、それはmasterとは別ブランチになるので、バグを修正してコミットしても、別ブランチにコミットされるだけでmasterには反映されない。なので、masterに戻って（git checkout masterして）からコミットすること。


#新しいブランチを作る
git branch: 全部のブランチを表示。現在いるブランチには*がつく。
git branch "LabelName"："LabelName"のブランチを作る。
git checkout "LabelName"："LabelName"のブランチをcheckoutする。

#作ったブランチを視覚的に確認
git log --graph --oneline マスター　ブランチ１　ブランチ2　ブランチ3・・・
![無題.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/3f862c0e-7423-3a4f-4679-121ec93a4092.gif)


上記コマンドで、マスターに対してそれぞれのブランチ１、ブランチ2・・・が、どのコミットから分かれたのか視覚的に表示される。

#"detached HEAD" state：いろいろ実験できる。branchにもできる。
コミットをgit checkoutするとこの"detached HEAD"状態になる。
gitにも表示されるが、この状態になると、今までいたブランチからは完全に切り離された、実験的なコミットができる。別のブランチ/コミットをgit checkout することで、"detached HEAD"状態で行ったコミットをすべて抹消することができる。
抹消したくない場合は、git checkout -b new_branch_nameをすれば、"detached HEAD"状態を新しいブランチとしてnew_branch_nameとして登録し、そこをcheckoutしている状態になる。つまり、 git checkout -b new_branch_name　＝　git branch new_branch_name + git checkout new_branch_nameというコマンドになっている。


#コミットのマージ
masterにbranch1をマージしたい場合。
基本的に現在checkoutしているブランチに、引数で与えたbranchをマージする。

◆パターン1：checkout masterからの　merge branch1
1, git checkout master:まず残したいブランチ(この場合master)をcheckout
2, git merge branch1:このコマンドで、現在checkoutしているブランチに、引数のブランチ(この場合branch1)をマージする。

◆パターン2:引数で与える
1, git checkout master:まず残したいブランチ(この場合master)をcheckout
2, git merge master branch1:このコマンドで、現在checkoutしているブランチ(master)に、引数のブランチ(この場合branch1)をマージする。これは精神的に確かめたい場合に使うコマンド。

◇番外編：3ブランチ(master, branch1, branch2)をマージする
1, git checkout master
2, git merge branch1 branch2:現在checkout しているmasterにbranch1とbranch2をマージする。


マージ後は下記コマンドでブランチのLabelを削除する。上記パターン1,2の場合は
git branch -d branch1（-dはdelete）
Labelを削除してもその中にあったコミットは消えず、上記の場合であればmasterにマージされる。順番としては時間でマージされる。マージが発生している場合は、コミットを続き時間のタイムスタンプごとにgit diffかけても、変化が多すぎる。まぁ当然そうなるよね。別のブランチだったんだから。これを避けるために

git show コミットID

のコマンドが用意されている。これは、コミットIDのparentのコミット(1つ前のコミット)との差分をとってくれるコマンド。parentコミットがわからなくても、内部的に記録されているので、それを参照して呼び出しているみたい。


#git merge でコンフリクトが起こった場合の対処：手動でコード修正
現状：masterブランチとeasy-modeブランチがある。masterブランチに織り込まれている内容を、easy-modeブランチに織り込みたい。
流れ
1, git checkout easy-mode
2, git merge master
↓
Auto-merging game.js
CONFLICT (content): Merge conflict in game.js
Automatic merge failed; fix conflicts and then commit the result.
と表示が出てコンフリクト
3, sublとタイプしsublime起動して、game.jsのコンフリクト箇所探す。→下記のように修正

```javascript:game.js
Asteroid = function() {  
  this.breakIntoFragments = function () { 
    for (var i = 0; i < 3; i++) {
      var roid = $.extend(true, {}, this);
      roid.vel.x = Math.random() * 6 - 3; 
      roid.vel.y = Math.random() * 6 - 3; 
      if (Math.random() > 0.5) {
        roid.points.reverse();
      }    
      roid.vel.rot = Math.random() * 2 - 1; 
      roid.move(roid.scale * 3); // give them a little push
      Game.sprites.push(roid);
    }    
  };

  this.collision = function (other) {
    SFX.explosion();
    if (other.name == "bullet") Game.score += 120 / this.scale;
    this.scale /= 3;
    if (this.scale > 0.5) {
<<<<<<< HEAD 
      // break into fragments
      for (var i = 0; i < 2; i++) {
        var roid = $.extend(true, {}, this);
        roid.vel.x = Math.random() * 6 - 3; 
        roid.vel.y = Math.random() * 6 - 3; 
        if (Math.random() > 0.5) {
          roid.points.reverse();
        }    
        roid.vel.rot = Math.random() * 2 - 1; 
        roid.move(roid.scale * 3); // give them a little push
        Game.sprites.push(roid);
      }
||||||| merged common ancestors
      // break into fragments
      for (var i = 0; i < 3; i++) {
        var roid = $.extend(true, {}, this);
        roid.vel.x = Math.random() * 6 - 3;
        roid.vel.y = Math.random() * 6 - 3;
        if (Math.random() > 0.5) {
          roid.points.reverse();
        }
        roid.vel.rot = Math.random() * 2 - 1;
        roid.move(roid.scale * 3); // give them a little push
        Game.sprites.push(roid);
      }
=======
      this.breakIntoFragments();
>>>>>>> master
    }
  };
};
```

修正後

```javascript:*game.js
Asteroid = function() {  
  this.breakIntoFragments = function () { 
    for (var i = 0; i < 2; i++) {/ここのiを3から2に変更
      var roid = $.extend(true, {}, this);
      roid.vel.x = Math.random() * 6 - 3; 
      roid.vel.y = Math.random() * 6 - 3; 
      if (Math.random() > 0.5) {
        roid.points.reverse();
      }    
      roid.vel.rot = Math.random() * 2 - 1; 
      roid.move(roid.scale * 3); // give them a little push
      Game.sprites.push(roid);
    }    
  };

  this.collision = function (other) {
    SFX.explosion();
    if (other.name == "bullet") Game.score += 120 / this.scale;
    this.scale /= 3;
    if (this.scale > 0.5) {

      this.breakIntoFragments();
    }
  };
};

```
**<<<<<<< HEAD**

iを３から２にしたeasy-modeにあるコード

**||||||| merged common ancestors**

master, easy-mode両方のブランチのcommon ancestorのコード

**＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝**

マスターブランチにあるコード

**>>>>>>> master**

4, git statusで「both modified: game.js」となることを確認。
5, git add game.js
6, git commit(ここではステータスが|MERGINGになっているので、-mは書かない。自動でGit
がコメントを追加してくれる。)
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/2c7e8811-dc5a-4724-c298-dbcd389217b9.jpeg)

7, git log で確認すると「コミットしてマージ」したコミットが細心になっている。
![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/adf6c81f-7b0e-7519-63a6-856f8d4d8a80.jpeg)


#便利グッズ
###gitコマンドチートシート

[GitHub:GIT CHEAT SHEET](https://github.com/github/training-kit/blob/master/downloads/github-git-cheat-sheet.pdf)

###GitHub training
[GitHub Professional Services](https://services.github.com/)

###図を描くソフト
[gliffy](https://www.gliffy.com/)
[yUML](http://yuml.me/diagram/activity/draw)

#感想
結構長かった。checkoutの使い方、addしてステージングエリアの使い方、branchの使い方を学べて大変勉強になりました。
GitHubのトレーニングに興味がある。


#調べた英単語
refactoring・・・n, リファクタリングとは、プログラムの外部的振る舞い（動作）を変えることなく、内部構造としてのソースコードを変更することである。、リファクタリング、手戻り
imperative tone・・・n,　現在形？
diagram・・・n, 図形、図表、一覧図