LoginSignup
0
1

More than 3 years have passed since last update.

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

Posted at

概要

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

commit内容の記述ルール

Udacityではここ:Udacity Git Commit Message Style Guideのルールに従うらしい。チームで開発する場合はこういうルールが必要だよね。現在形で内容を書いたり、Subjectの内容を統一したり。Howはコードに書いてあるから、内容はWhatwhyを書くらしいね。

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

コミットの前に・・・
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 マスター ブランチ1 ブランチ2 ブランチ3・・・
無題.gif

上記コマンドで、マスターに対してそれぞれのブランチ1、ブランチ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のコンフリクト箇所探す。→下記のように修正

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
    }
  };
};

修正後

*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を3から2にした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

7, git log で確認すると「コミットしてマージ」したコミットが細心になっている。
無題.jpg

便利グッズ

gitコマンドチートシート

GitHub:GIT CHEAT SHEET

GitHub training

GitHub Professional Services

図を描くソフト

gliffy
yUML

感想

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

調べた英単語

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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1