diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index b15560ae..0dc2fe0c 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -364,6 +364,63 @@ exports.level = { } } ] + }, + "ja": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## コードの移動", + "", + "今まででは、gitの基本をひたすら見てきました -- コミット、ブランチ、そしてソースツリーの中でいろいろなポジションへのアクセス。これらの概念だけで、gitレポジトリの力を90%使いこなすことができ、開発者の主なニーズを満たしています。", + "", + "しかし最後の10%はより複雑なワークフローやちょっとトラブった時にとても役に立つこともある。これから取り上げる次の課題は「コードの移動」– つまり開発者が、このコードをここに置き、そのコードをそこに置きたい、と安易、かつ具体的に表す方法です。", + "", + "ちょっと複雑に聞こえるかもしれませんが、概念は簡単です。" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Cherry-pick", + "", + "このシリーズの一つ目のコマンドは、`git cherry-pick`。次の形になります:", + "", + "* `git cherry-pick <...>`", + "", + "現在の位置(`HEAD`)より下の一連のコミットをコピーしたいという意を単純に表す方法です。分かりにくいところが少ないので、個人的に私がとても好きなコマンドです。", + "", + "デモを見ていきましょう!", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "このレポジトリには、現在`side`ブランチから`master`にコピーしたいコードがあります。この前学んできたrebaseコマンドでは実現可能ですが、cherry-pickの動作を見ていきましょう。" + ], + "afterMarkdowns": [ + "それだけで終わりです! コミット`C2` と `C4`を取得したかったーそしてgitが現在の位置の直下に落としました。単純ですね!" + ], + "command": "git cherry-pick C2 C4", + "beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "このレベルをクリアするには、3つのブランチからmasterにコードをコピーしてください。どのコミットを取得するかについてはゴールのビジュアライズをみてください。", + "" + ] + } + } + ] } } }; 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 9822cb02..b5629a08 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -413,6 +413,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`をゴールで指定されている目的位置まで移動してください。" + ] + } + } + ] } } };