概要
テーマはリポジトリ作成/修正、ブランチの作成/マージ
commit内容の記述ルール
Udacityではここ:Udacity Git Commit Message Style Guideのルールに従うらしい。チームで開発する場合はこういうルールが必要だよね。現在形で内容を書いたり、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で比較する。その後満を持してコミットするみたい。
コミットの前に・・・
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・・・
上記コマンドで、マスターに対してそれぞれのブランチ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のコンフリクト箇所探す。→下記のように修正
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
}
};
};
修正後
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
がコメントを追加してくれる。)
7, git log で確認すると「コミットしてマージ」したコミットが細心になっている。
便利グッズ
gitコマンドチートシート
GitHub training
図を描くソフト
感想
結構長かった。checkoutの使い方、addしてステージングエリアの使い方、branchの使い方を学べて大変勉強になりました。
GitHubのトレーニングに興味がある。
調べた英単語
refactoring・・・n, リファクタリングとは、プログラムの外部的振る舞い(動作)を変えることなく、内部構造としてのソースコードを変更することである。、リファクタリング、手戻り
imperative tone・・・n, 現在形?
diagram・・・n, 図形、図表、一覧図