diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index 76e033ed..dba23fb2 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -480,6 +480,84 @@ exports.level = { } } ] + }, + "ja": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moving around in Git", + "", + "Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。", + "", + "移動方法が身につけば、他のgitコマンドをもよりうまく扱えるようになるでしょう!", + "", + "", + "", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "まずは\"HEAD\"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語ですーようするに今作業中のコミットを表します。", + "", + "HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。", + "", + "HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。" + ], + "afterMarkdowns": [ + "ほら、HEADが元から`master`ブランチの下に隠れていたんですね!" + ], + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### HEADの分離", + "", + "HEADの分離とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:", + "", + "HEAD -> master -> C1", + "" + ], + "afterMarkdowns": [ + "そして実行後はこう:", + "", + "HEAD -> C1" + ], + "command": "git checkout C1", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。", + "", + "このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸の上に表示されています。" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index aaa53804..154f0b31 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -412,6 +412,71 @@ exports.level = { } } ] + }, + "ja": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git インタラクティブrebase", + "", + "どのコミットを操りたいか(そしてそれを指定するハッシュ)がわかる時にGit cherry-pickはとても便利で、その簡単さはとてもありがたいです。 ", + "", + "しかし、どのコミットを操りたいかがわからない時はどうでしょう?ありがたいことに、そんな時にぴったりのコマンドがgitにその備わっています。このためにgitのインタラクティブrebaseを使えます。rebaseしたい一連のコミットを一括で見るベストな方法です。", + "", + "具体的に見てみましょう..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "インタラクティブrebaseとは単に、`rebase`コマンドに`-i`オプションを合わせて使うことです。", + "", + "このオプションをつければ、gitがインタフェースを開き、どのコミットがrebase対象の下にコピーされるかを確認できます。それらのコミットのハッシュやメッセージも表示され、rebaseの概要を一眼で見るのに便利です。", + "", + "\"ホンモノ\"のgitでは、その「インターフェース」とは`vim`などのテキストエディタの中でファイルが開くだけです。ここでコンセプトを見せるために同じような動作をする小さなダイアログウィンドウを作りました。" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "インタラクティブrebaseダイアログが開くと、3つの操作から選べます:", + "", + "* UIウィンドウのなかで順番を調整するだけでコミットの順番を変えられます(こちらのダイアログでは、マウスでドラッグアンドドロップで操作します)。", + "* 特定のコミットを丸ごと除くこともできます。除きたいコミットを指定するには`pick`をオフにします。", + "* 最後に、コミットを組み合わせられます。技術的に制限があるため、あいにくこちらのレベルには出てきませんがのでその詳細の説明を省きますが、短く言いますと、複数のコミットを一つにまとめることができる機能です。", + "", + "さて、例を見てみましょう。" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "ボタンを押せば、インタラクティブrebaseウィンドウが現れます。コミットの順番を変更したり、`pick`を外したりしてみて、その結果を見てみましょう!" + ], + "afterMarkdowns": [ + "よっしゃー。gitがUIで指定されたようにコミットをコピーしました!" + ], + "command": "git rebase -i HEAD~4 --aboveAll", + "beforeCommand": "git commit; git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "このレベルをクリアするにはインタラクティブrebaseを実行し、ゴールのビジュアライズに表示されている順番を実現しましょう。ミスがあれば`undo`や`reset`で修正できるのをお忘れなく。" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index c526fb3f..d0f362f2 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -469,6 +469,81 @@ exports.level = { } } ] + }, + "ja": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 相対リファレンス", + "", + "コミットのハッシュを利用してgitの中で移動するのも少し疲れる時もあります。現実の世界では、このチュートリアルのようにターミナルの隣に見やすいツリーのビジュアライズがないので、ハッシュを見るには`git log`を使う必要があります。", + "", + "その上、実際のハッシュはこちらで見たものよりずっと長いです。例えば、先ほどのレベルの紹介のコミットハッシュは`fed2da64c0efc5293610bdd892f82a58e8cbc5d8`です。少し覚えにくいですね...", + "", + "そのため、gitでは手短くコミットを指定する方法があります。ユニークな存在だと確認できるだけのハッシュの字数を入力すれば良いですー上記の長い文字列の代わりに`fed2`を入力するだけで済みます。" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "先ほど言いましたように、ハッシュでコミットを指定するのがめんどくさくなる時もあるので、gitには相対リファレンスという素晴らしい機能があります。", + "", + "相対リファレンスを使うことで、覚えやすい位置(例えば`bugFix`ブランチや`HEAD`)から始め、そのところから相対的な位置を指定できます。", + "", + "相対コミットは強力ですが、ここでは二つをご紹介します:", + "", + "* 一つずつ上へ移動させる`^`(カレット)", + "* 複数回上へ移動させる `~`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "まずはカレット(^)から始めましょう。リファレンス名にカレットを追加すると、指定コミットの親コミットを見つけるようにとgitに命令を出しています。", + "", + "なので `master^`と記述すれば、\"`master`の一個上の親\"、という意味になります。", + "", + "そして`master^^`とはその親の一つの上のコミット(2代目の先祖)を指します。", + "", + "masterの上のコミットをここで見てみましょう" + ], + "afterMarkdowns": [ + "やりました!コミットハッシュを書くよりずっと簡単ですね。" + ], + "command": "git checkout master^", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "`HEAD`を相対リファレンスとして参照することもできます。 ここで数回そのコマンドを使い、コミットツリーの中で上へと移動しましょう。" + ], + "afterMarkdowns": [ + "簡単ですね!`HEAD^`で時間を巻き戻せます。" + ], + "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", + "beforeCommand": "git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "このレベルをクリアするには、`bugFix`の親コミットをチェックアウトしてください。その操作により`HEAD`が分離されます。", + "", + "ハッシュを使用してもいいですが、その代わりに相対リファレンスをトライしてみましょう!" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index bff35104..43cc92a3 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -403,6 +403,75 @@ exports.level = { } } ] + }, + "ja": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "###\"~\" 演算子", + "", + "コミットツリーの中で複数の段階上へ移動したいとします。毎回毎回`^`と打つのは面倒くさくなるかもしれませんので、gitにはチルダの演算子も備わっています。", + "", + "", + "チルダ演算子のあとには、上へ移動したい親コミットの数を表す数字もオプションでつけられます。実際の動作を見てみましょう。" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "遡る前のコミット数を`~`で指定しましょう。" + ], + "afterMarkdowns": [ + "よっしゃ!効率が良いですねー相対リファレンスはなんと便利です。" + ], + "command": "git checkout HEAD~4", + "beforeCommand": "git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "###ブランチの強制", + "", + "今はあなたも相対リファレンスの達人なので、実践的な使い方を覚えましょう。", + "", + "相対リファレンスのよくある使い方としてあるのは、ブランチの移動です。`-f`オプションを使ってブランチを直接コミットに関連付けられます。次のようになります", + "", + "`git branch -f master HEAD~3`", + "", + "masterブランチを(強制的に)HEADより親三代前へと移動します。" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "先ほどのコマンドの動作を見てみましょう。" + ], + "afterMarkdowns": [ + "できました!相対リファレンスを使うことで、手短く`C1`を指定することができ、`-f`でブランチを強制的にそこへ移動することができました。" + ], + "command": "git branch -f master HEAD~3", + "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "相対リファレンスとブランチの強制関連付けを見ましたので、いまここでそれらの方法を使ってみましょう。", + "", + "このレベルをクリアするには`HEAD`、`master`、`bugFix`をゴールで指定されている目的位置まで移動してください。" + ] + } + } + ] } } }; diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index 45a67719..a8bf6286 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -527,6 +527,69 @@ exports.level = { } } ] + }, + "ja": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "##gitで変更を巻き戻す", + "", + "gitでは、変更を取り消す方法が多くあります。そしてコミットと同様に、ローレベルの作業(ファイルやチャンクを単体でステージしたり)とハイレベルの作業(変更が実際に取り消される方法)があります。ここではピントを当てるのは、後者になります。", + "", + "gitでは変更を取り消す方法が主に二つあります。一つは`git reset`で、片方が`git revert`です。次のダイアログで、一つずつ見ていきましょう。", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Reset", + "", + "`git reset`は、ブランチリファレンスを過去へと移動することで、変更を取り消します。このように、「歴史の書き換え」として考えることができますー`git reset`は元からコミットがなかったかのようにブランチを前へと移動します。", + "", + "動作を見てみましょう:" + ], + "afterMarkdowns": [ + "やりました!Gitが単にmasterブランチのリファレンスを`C1`まで戻しました。現在ローカルレポジトリは`C2`がなかったかのような状態になっています。" + ], + "command": "git reset HEAD~1", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Revert", + "", + "gitのresetは自分のパソコン上のローカルブランチにとてもよく動きますが、他の人が使っているリモートブランチになるとresetの「歴史の書き換え」方法は通用しません。", + "", + "変更を逆戻し、その状態を他人にも共有するには`git revert`を使う必要があります。動作を見ていきましょう。" + ], + "afterMarkdowns": [ + "変ですね、取り消し対象のコミットの下に新しいコミットが現れましたね。それはこの新しいコミット`C2'`により*変更*が行われたからです。その変更とは、`C2`コミットを取り消すという内容です。", + "", + "revertでは、変更をpushし他人とも共有することができます。" + ], + "command": "git revert HEAD", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "このレベルをクリアするには、最新の二つのコミットを`local`と`pushed`両方にて取り消してください。", + "", + "`pushed`とはリモートブランチで、`local`はローカルブランチであることをお忘れなく。この情報を考慮した上で取り消しかたを選択してください。" + ] + } + } + ] } } };