# Conflicts:
#	src/levels/remote/mergeManyFeatures.js
This commit is contained in:
Alexey Berkov 2015-07-27 13:48:38 +03:00 committed by Alexey Berkov
commit 1a5bd9e058
27 changed files with 419 additions and 136 deletions

View file

@ -1,6 +1,5 @@
# LearnGitBranching
[![Build Status](https://travis-ci.org/pcottle/learnGitBranching.svg?branch=master)](https://travis-ci.org/pcottlele/learnGitBranching)
LearnGitBranching is a git repository visualizer, sandbox, and series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line).
@ -119,6 +118,7 @@ And the following heroes for assisting in translating:
* Honorat ("ahonorat")
* Vasil Kulakov ("coyl") & Lyubov Agadjanyan ("shayenblue")
* Aliaksei Berkau ("alexeiberkov")
* Mizunashi Mana ("mizunashi-mana")
Also huge shoutout for everyone who has put up a pull request that was pulled! Check out the 30+ contributors we have in the [Contributors View](https://github.com/pcottle/learnGitBranching/graphs/contributors)

View file

@ -84,7 +84,7 @@ var expectTreeAsync = function(command, expectedJSON, startJSON) {
console.log(JSON.stringify(getHeadlessSummary(headless)));
}
return compareAnswer(headless, expectedJSON);
}, 'trees should be equal', 400);
}, 'trees should be equal', 500);
};
var expectLevelSolved = function(levelBlob) {

View file

@ -147,7 +147,9 @@ exports.dialog = {
' * オプションで```define hint```でヒントを定義します',
' * ```define name```で名前を編集します',
' * オプションで```edit dialog```で良い感じに開始時のダイアログを定義します',
' * ```finish```コマンドを打つことであなたのlevelがJSONで出力されます'
' * ```finish```コマンドを打つことであなたのlevelがJSONで出力されます',
'',
'*Note: このダイアログは`help builder`で何回でも表示できます!活用してください!*'
]
}
}],

View file

@ -237,6 +237,8 @@ exports.dialog = {
'',
'何か詰まったことがあったら、右下メニューの?ボタンを押してみてください',
'',
'それから、不自然な記号が出てきたときは顔を左方向に傾けてみるといいかもしれません :Pペロッ',
'',
'それでは教材の選択画面に進んでみることにします。',
'',
'(なお、日本語版製作者のフォークサイトは[こちら](http://remore.github.io/learnGitBranching-ja/)になります。)'

View file

@ -965,7 +965,7 @@ exports.strings = {
'es_AR': 'Podés ocultar esta ventana con "hide start"',
'pt_BR': 'Você pode ocultar esta janela com "hide start"',
'fr_FR': 'Vous pouvez masquer cette fenêtre avec "hide start"',
'ja' : 'このウィンドウは"hide start"で閉じれます',
'ja' : 'このウィンドウは"hide start"かクリックで閉じれます',
'ru_RU': 'Можно скрыть это окно при помощи "hide start"'
},
///////////////////////////////////////////////////////////////////////////

View file

@ -93,7 +93,7 @@ var sequenceInfo = exports.sequenceInfo = {
about: {
'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry',
'de_DE': 'Eine Portion Git-Wahnsinn zum Thema Navigation',
'ja': '更にgitの素晴らしさを堪能しよう',
'ja' : '更にgitの素晴らしさを堪能しよう',
'fr_FR' : 'Le prochain excellent plat de pur git. J\'espère que vous êtes affamés',
'es_AR': 'La próxima porción de 100% maravillas git. Espero que estés hambriento',
'pt_BR': 'A próxima porção de maravilhas do git. Faminto?',
@ -173,7 +173,7 @@ var sequenceInfo = exports.sequenceInfo = {
'es_AR': 'Ponete cómodo con modificar el directorio fuente',
'pt_BR': 'Fique confortável em modificar a árvore de códigos',
// INTL out of sync :(
'ja': '話題のrebaseってどんなものだろうって人にオススメ',
'ja' : '話題のrebaseってどんなものだろうって人にオススメ',
'ko': '그 좋다고들 말하는 rebase에 대해 알아봅시다!',
'zh_CN': '大家都在说的 rebase 究竟是神马?看看吧!',
'zh_TW': '大家都在說的 rebase 到底是什麼啊?來看看吧!',
@ -238,4 +238,3 @@ exports.getTabForSequence = function(sequenceName) {
info.tab :
'main';
};

View file

@ -5,7 +5,7 @@ exports.level = {
"es_AR": "Introducción a los commits de Git",
"pt_BR": "Introdução aos commits no Git",
"fr_FR": "Introduction aux commits avec Git",
"ja": "Gitのコミット",
"ja" : "Gitのコミット",
'ko': 'Git 커밋 소개',
'zh_CN': 'Git Commits简介',
'zh_TW': '介紹 git commit ',
@ -22,7 +22,7 @@ exports.level = {
"fr_FR": "Il suffit de saisir 'git commit' deux fois pour réussir !",
"zh_CN": "敲两次 'git commit' 就好啦!",
"zh_TW": "輸入兩次 'git commit' 就可以完成!",
"ja": "'git commit'コマンドを2回打てば完成!",
"ja" : "'git commit'コマンドを2回打てば完成!",
"ko": "'git commit'이라고 두 번 치세요!",
"ru_RU": "Попробуй дважды выполнить команду 'git commit' ;)"
},
@ -121,7 +121,7 @@ exports.level = {
"options": {
"markdowns": [
"## Gitのコミット",
"コミットによって、ディレクトリ中の全てのファイルのスナップショットを記録します。巨大なコピー&ペーストのようなものですが、実はそれよりずっと良いものです。",
"コミットによって、ディレクトリ中の全てのファイルのスナップショットを記録します。巨大なコピー&ペーストのようなものですが、実際にはそれよりずっと良いものです。",
"",
"Gitではコミットを可能な限り軽量に保つために、コミット毎にフォルダ全体をコピーしません。実際にはGitは、コミットを直前のバージョンから一つ先のバージョンへの「変更の固まり」あるいは「差分」として記録します。後で出てきますが、ほとんどのコミットが親を持っているのはそういう理由からです。",
"",

View file

@ -190,7 +190,7 @@ exports.level = {
"`git rebase`コマンドでそれをやってみましょう。"
],
"afterMarkdowns": [
"できこれでbugFixブランチの作業内容はmasterブランチのすぐ先に移動したので、見た目が一本になってスッキリしました。",
"できましこれでbugFixブランチの作業内容はmasterブランチのすぐ先に移動したので、見た目が一本になってスッキリしました。",
"",
"気を付けてほしいのは、C3コミットはどこかに残ってるということツリーの中で半透明にしてあります、そしてC3'はC1との接続が切れているC3のコピーがmasterブランチ上に作られているということです。",
"",

View file

@ -476,7 +476,7 @@ exports.level = {
"",
"タグは、ソースリストの優秀な「アンカー標識」として作用するので、Gitには最も近く関係のある「アンカー」タグの別名を*記述するため*のコマンドがあります。そして、そのコマンドは`git describe`と呼ばれています!",
"",
"Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(こは、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。"
"Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(このような状況は、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を走らせ終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。"
]
}
},

View file

@ -67,14 +67,7 @@ exports.level = {
"* Then we will re-order the commits back to how they were previously with `git rebase -i`",
"* Finally, we will move master to this updated part of the tree to finish the level (via the method of your choosing)",
"",
"There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique.",
"Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree ",
"",
"That being said, I can compare levels now based on structure and relative apostrophe differences. As long as your tree's `master` branch has the same structure and relative apostrophe differences, I'll give full credit"
@ -108,20 +101,14 @@ exports.level = {
"* Nous allons réordonner les commits dans l'ordre original avec `git rebase -i`",
"* Finalement, nous allons déplacer master vers la nouvelle tête de l'arbre (avec la méthode de votre choix)",
"",
"Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez-vous sur cette technique."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez-vous sur cette technique.",
"",
"Pour terminer, Faites attentions au but -- Du au fait que nous déplacons les commmits 2 fois, ils se retrouvent les deux avec une apostrophe. une deuxième apostrophe est ajouté sur le commit que nous modifions, ce qui nous donnes l'arbre finale ",
"",
"Ceci étant dit, Je peux comparer le résultat avec la stuctures et les différentes apostophes. Tant que votre arbre master a la même structure et apostrophe le niveau sera considéré réussi."
]
}
}
},
]
},
"es_AR": {
@ -149,20 +136,14 @@ exports.level = {
"* Después vamos a reordenar los commits a como estaban con `git rebase -i`",
"* Finalmente, vamos a mover master a esta parte actualizada de nuestor árbol de commits para terminar el nivel (usando el método que prefieras)",
"",
"Hay varias maneras de lograr este objetivo en general (ya te veo haciéndole ojitos al cherry-pick), y veremos algunos más después, pero por ahora concentrémonos en esta técnica."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Hay varias maneras de lograr este objetivo en general (ya te veo haciéndole ojitos al cherry-pick), y veremos algunos más después, pero por ahora concentrémonos en esta técnica.",
"",
"Por último, prestá atención al estado final acá -- como movemos los commits dos veces, ambos quedan con un apóstrofe. El commit que corregimos tiene un apóstrofe extra, y así nos queda nuestro árbol final",
"",
"Habiendo dicho eso, puedo comparar los niveles basándome ahora en la estructura y las diferencias relativas de apóstrofes. Mientras que tu rama `master` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo"
]
}
}
},
]
},
"pt_BR": {
@ -190,20 +171,14 @@ exports.level = {
"* Vamos, então, reordenar os commits na mesma ordem que estavam anteriormente com `git rebase -i`",
"* Finalmente, moveremos o master para essa parte atualizada da árvore para finalizar o nível (usando o método de sua escolha)",
"",
"Há muitas formas de alcançar o objetivo final (eu vejo o cherry-pick passando pela sua mente), e veremos mais delas depois, mas por enquanto foquemos nesta técnica."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Há muitas formas de alcançar o objetivo final (eu vejo o cherry-pick passando pela sua mente), e veremos mais delas depois, mas por enquanto foquemos nesta técnica.",
"",
"Por último, preste atenção no estado do \"objetivo\" aqui -- como nós movemos os commits duas vezes, ambos ficam com um apóstrofo. Um apóstrofo adicional é colocado no commit que sofreu o \"amend\", o que nos dá a forma final da árvore ",
"",
"Tendo dito isto, posso avaliar a resposta baseado na estrutura e nas diferenças relativas de número de apóstrofos. Desde que o ramo `master` da sua árvore tenha a mesma estrutura, e o número de apóstrofos seja igual a menos de uma constante, darei a você todos os pontos para esta tarefa"
]
}
}
},
]
},
"de_DE": {
@ -231,20 +206,14 @@ exports.level = {
"* Dann sortieren wir die Commit mit einem erneuten `git rebase -i` wieder in die alte Reihenfolge.",
"* Schließlich aktualisieren wir den `master` auf das Ende unseres fertigen Baums, um diesen Level abzuschließen.",
"",
"Es gibt sehr viele Wege um das Endziel dieses Levels zu erreichen (ich sehe, du schielst auf `cherry-pick`) und wir werden uns später noch andere ansehen. Aber für's erste lass uns diese Methode ausprobieren."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Es gibt sehr viele Wege um das Endziel dieses Levels zu erreichen (ich sehe, du schielst auf `cherry-pick`) und wir werden uns später noch andere ansehen. Aber für's erste lass uns diese Methode ausprobieren.",
"",
"Beachte den geschilderten Zielzustand. Da wir die Commits zweimal umsortieren bekommen sie jedesmal ein Apostroph hinzugefügt (weil sie jedesmal kopiert werden). Ein weiteres Apostroph entsteht durch den `commit --amend`.",
"",
"Zuguterletzt noch eine Bemerkung: ich kann Level nun auf Struktur und Apostroph-Differenz prüfen. So lange wie dein `master` am Ende dieselbe Strukutr und Apostroph-Differenz aufweist wie der Ziel-`master`, ist der Level bestanden."
]
}
}
},
]
},
"ja": {
@ -272,18 +241,12 @@ exports.level = {
"* `git rebase -i`コマンドを再度使って、先頭に持ってきていたコミットを元に戻す",
"* 最後に、レベルクリアのためにmasterブランチを先頭に持ってくる",
"",
"クリアのための方法はいくつもありますがcherry-pickを使うこともできます、別の回答はまた後程の章で見ることにして、今回は上記の方法でやってみることにしましょう。"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"クリアのための方法はいくつもありますがcherry-pickを使うこともできます、別の回答はまた後程の章で見ることにして、今回は上記の方法でやってみることにしましょう。",
"",
"最後に、ゴール時点での状態に気を付けてください。今回2回ほどコミットを動かしますから、コミットへのポインタにはアポストロフィ'が追加されます。commit --amendコマンドの実行でできたコミットには更にもう1つのアポストロフィが追加されます。 "
]
}
}
},
]
},
"zh_CN": {
@ -311,18 +274,12 @@ exports.level = {
"* 接着再用 `git rebase -i` 来将他们按最开始的顺序重新排好",
"* 最后我们把 master 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!",
"",
"当然还有许多方法可以完成这个任务(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"当然还有许多方法可以完成这个任务(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。",
"",
"啊最后还要提醒你一下最终的形式 —— 因为我们把这个提交移动了两次所以会分别产生一个省略提交both get an apostrophe appended。还有一个省略提交是因为我们为了实现最终效果去修改提交而添加的。"
]
}
}
},
]
},
"zh_TW": {
@ -350,18 +307,12 @@ exports.level = {
"* 接著再用 `git rebase -i` 來將他們按照最開始的順序重新排好",
"* 最後我們把 master 移到這個修改的最前端(用你自己喜歡的方法),就大功告成啦!",
"",
"當然還有許多方法可以完成這個任務(我知道你在想 cherry-pick 啦),之後我們會多點關注這些技巧啦,但現在暫時只注意上面這種方法。"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"當然還有許多方法可以完成這個任務(我知道你在想 cherry-pick 啦),之後我們會多點關注這些技巧啦,但現在暫時只注意上面這種方法。",
"",
"啊!最後還要提醒你一下最後所產生的 commit tree因為我們把 commit 移動了兩次,所以會分別產生一個 apostrophe(單引號) commit。還有一個 apostrophe commit 是因為我們修改 commit 而加進來的。"
]
}
}
},
]
},
"ko": {
@ -389,18 +340,12 @@ exports.level = {
"* 다시 `git rebase -i` 명령으로 이 전의 커밋 순서대로 되돌려 놓습니다",
"* 마지막으로, master를 지금 트리가 변경된 부분으로 이동합니다. (편하신 방법으로 하세요)",
"",
"이 목표를 달성하기 위해서는 많은 방법이 있는데요(체리픽을 고민중이시죠?), 체리픽은 나중에 더 살펴보기로 하고, 우선은 위의 방법으로 해결해보세요."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"이 목표를 달성하기 위해서는 많은 방법이 있는데요(체리픽을 고민중이시죠?), 체리픽은 나중에 더 살펴보기로 하고, 우선은 위의 방법으로 해결해보세요.",
"",
"최종적으로, 목표 결과를 눈여겨 보세요 -- 우리가 커밋을 두 번 옮겼기 때문에, 두 커밋 모두 따옴표 표시가 붙어있습니다. 정정한(amend) 커밋은 따옴표가 추가로 하나 더 붙어있습니다."
]
}
}
},
]
},
"ru_RU": {
@ -428,20 +373,14 @@ exports.level = {
"* Переставить всё обратно при помощи `git rebase -i`",
"* И наконец, переместить master на изменённуй часть дерева, чтобы закончить уровень.",
"",
"Этот уровень можно закончить несколькими способами, но в этом уровне нужно сосредоточиться на вышеописанном методе."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Этот уровень можно закончить несколькими способами, но в этом уровне нужно сосредоточиться на вышеописанном методе.",
"",
"Обрати внимание на итоговое состояние в этом уровне так как мы дважды перемещаем коммиты, они каждый получать по апострофу. Ещё один апостроф добавляется, когда мы делаем commit --amend.",
"",
"Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."
]
}
}
},
]
}
}

View file

@ -264,7 +264,7 @@ exports.level = {
"markdowns": [
"## コミットをやりくりする その2",
"",
"*注この一つ前のレベル「コミットをやりくりする」をクリアしていない人は、まずそちらの問題をクリアしてきてください*",
"*注この一つ前のレベル「コミットをやりくりする」をクリアしていない人は、まずそちらの問題をクリアしてきてください*",
"",
"前回見てきたように、コミット順序の変更のために、私たちは`rebase -i`コマンドを利用しました。ツリーの先頭に変更対象のコミットがあれば、--amendオプションを使うことで容易に変更を書きかえて、元の順序に戻すことができます。",
"",

View file

@ -434,9 +434,9 @@ exports.level = {
"markdowns": [
"## コードの移動",
"",
"今まででは、gitの基本をひたすら見てきました -- コミット、ブランチ、そしてソースツリーの中でいろいろなポジションへのアクセスなどです。これらの概念だけで、gitリポジトリの力を90%使いこなすことができ、開発者の主なニーズを満たしています。",
"今まででは、gitの基本をひたすら見てきました -- コミットしたりブランチを派生したり、そしてソースツリーの中の色々な場所に移動することなどです。これらの概念だけで、gitリポジトリの力を90%使いこなすことができ、開発者の主な需要を満たしています。",
"",
"しかし最後の10%はより複雑なワークフローやちょっとトラブった時にとても役に立つこともあります。これから取り上げる次の課題は「コードの移動」 - つまり開発者が、「このコードをここに置き、そのコードをそこに置きたい」と言うときに、安易かつ具体的に利用できる方法を勉強します。",
"しかし最後の10%はより複雑なワークフローやちょっとトラブった時にとても役にたちます。これから取り上げる次の課題は「作業内容の移動」 - 詳しく言えば、「この作業はここに置き、その作業はそこに置きたい」と言う開発者のために、優しく具体的で正確にその方法をお教えしましょう。",
"",
"ちょっと複雑に聞こえるかもしれませんが、概念は簡単です。"
]
@ -448,11 +448,11 @@ exports.level = {
"markdowns": [
"## Git Cherry-pick",
"",
"このシリーズの一つ目のコマンドは、`git cherry-pick`。次の形になります:",
"このシリーズの一つ目のコマンドは、`git cherry-pick`。このコマンドの使い方は、次の形になります:",
"",
"* `git cherry-pick <Commit1> <Commit2> <...>`",
"",
"現在の位置(`HEAD`)より下の一連のコミットをコピーしたいという意を単純に表す方法です。分かりにくいところが少ないので、個人的に私がとても好きなコマンドです。",
"現在の位置(`HEAD`)下に一連のコミットをコピーしたいという意を単純に表す方法です。分かりにくいところが少ないので、個人的に私がとても好きなコマンドです。",
"",
"デモを見ていきましょう!",
""
@ -463,10 +463,10 @@ exports.level = {
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"このリポジトリには、現在`side`ブランチから`master`にコピーしたいコードがあります。この前学んできたrebaseコマンドでは実現可能ですが、cherry-pickの動作を見ていきましょう。"
"このリポジトリには、現在`side`ブランチから`master`にコピーしたいコードがあります。この前に学んだrebaseコマンドでも実現可能ですが、ここではcherry-pickの動作を見ていきましょう。"
],
"afterMarkdowns": [
"それだけで終わりです! コミット`C2` と `C4`を取得したかったーそしてgitが現在の位置の直下に落としました。単純ですね!"
"これだけで終わりです!コミット`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;"
@ -476,7 +476,7 @@ exports.level = {
"type": "ModalAlert",
"options": {
"markdowns": [
"このレベルをクリアするには、つのブランチからmasterにコードをコピーしてください。どのコミットを取得するかについてはゴールのビジュアライズをみてください。",
"このレベルをクリアするには、つのブランチからmasterにコードをコピーしてください。どのコミットを取得するかについてはゴールのツリーをみてください。",
""
]
}

View file

@ -615,7 +615,7 @@ exports.level = {
"beforeMarkdowns": [
"### HEADの分離",
"",
"HEADの分離とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:",
"HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:",
"",
"HEAD -> master -> C1",
""

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spéficier la cible à rebaser",
"zh_CN": "你可以使用 branch 或者是相对位置HEAD~)來指定 rebase 的目标",
"zh_TW": "你可以指定 branch 或者是相對位置HEAD~)來表示 rebase 的目標",
"ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase"
"ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase",
"ja" : "リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます"
},
"name": {
"en_US": "Interactive Rebase Intro",
@ -491,9 +492,9 @@ exports.level = {
"markdowns": [
"## Git インタラクティブrebase",
"",
"どのコミットを操りたいか(そしてそれを指定するハッシュ)がわかる時にGit cherry-pickはとても便利で、その簡単さはとてもありがたいです。 ",
"どのコミットを操りたいか(そしてそれを指定するハッシュ)がわかる時に`git cherry-pick`はとても便利で、その簡単さはとてもありがたいです。 ",
"",
"しかし、どのコミットを操りたいかがわからない時はどうでしょうありがたいことに、そんな時にぴったりのコマンドがgitにその備わっています。このためにgitのインタラクティブrebaseを使えます。rebaseしたい一連のコミットを一括で見るベストな方法です。",
"しかし、どのコミットを操りたいかがわからない時はどうでしょうありがたいことに、そんな時にぴったりのコマンドがgitに備わっています。このためにgitのインタラクティブrebaseを使えます。rebaseしたい一連のコミットを一括で見るベストな方法です。",
"",
"具体的に見てみましょう..."
]
@ -519,7 +520,7 @@ exports.level = {
"",
"* UIウィンドウのなかで順番を調整するだけでコミットの順番を変えられますこちらのダイアログでは、マウスでドラッグアンドドロップで操作します。",
"* 特定のコミットを丸ごと除くこともできます。除きたいコミットを指定するには`pick`をオフにします。",
"* 最後に、コミットを組み合わせられます。技術的に制限があるため、あいにくこちらのレベルには出てきませんがのでその詳細の説明を省きますが、短く言いますと、複数のコミットを一つにまとめることができる機能です。",
"* 最後に、コミットを組み合わせられます。技術的に制限があり再現できないのでその詳細な説明を省きますが、短く言いますと、複数のコミットを一つにまとめることができる機能です。",
"",
"さて、例を見てみましょう。"
]

View file

@ -619,7 +619,7 @@ exports.level = {
"markdowns": [
"このレベルをクリアするには、`bugFix`の親コミットをチェックアウトしてください。その操作により`HEAD`が分離されます。",
"",
"ハッシュを使用してもいいですが、その代わりに相対リファレンスをトライしてみましょう!"
"ハッシュを使用してもいいですが、その代わりに相対リファレンスをしてみましょう!"
]
}
}

View file

@ -290,7 +290,7 @@ exports.level = {
"",
"Gitでは変更を元に戻す方法がたくさんあります。コミットと同じように、低レベルな動作ファイル別だったりファイルの中の一部だったりも高レベルな動作変更のまとまりのキャンセルもできます。このアプリケーションでは後者の方法について紹介します。",
"",
"基本的なアンドゥの方法が2つあります -- 一つは`git reset`を使う方法で、もう1つは`git revert`を使う方法です。次のダイアログで一つ一つを見ていきます。",
"基本的な巻き戻しの方法は2つあります -- 一つは`git reset`を使う方法で、もう1つは`git revert`を使う方法です。次のダイアログで一つ一つを見ていきます。",
""
]
}

View file

@ -14,7 +14,7 @@ exports.level = {
"pt_BR": "Fazendo mais de 9000 rebases",
"fr_FR": "Rebaser plus de 1000 fois",
"ko": "9천번이 넘는 리베이스",
"ja": "9000回以上のrebase",
"ja" : "9000回以上のrebase",
"zh_CN": "N次Rebase",
"zh_TW": "N次Rebase",
"ru_RU": "Rebase over 9000 раз"
@ -25,7 +25,7 @@ exports.level = {
"es_AR": "Acordate, la manera más eficiente podría ser actualizar master sólo al final...",
"pt_BR": "Lembre-se, a forma mais eficiente pode ser atualizar o master por último...",
"fr_FR": "Rappelez-vous, la façon la plus efficace peut être de mettre à jour master seulement à la fin ...",
"ja": "最も効率的なやり方はmasterを最後に更新するだけかもしれない・・・",
"ja" : "最も効率的なやり方はmasterを最後に更新するだけかもしれない・・・",
"ko": "아마도 master를 마지막에 업데이트하는 것이 가장 효율적인 방법일 것입니다...",
"zh_CN": "记住最后更新master分支可能是最高效的方法。",
"zh_TW": "要記住喔! 把 master branch 留到最後更新可能是最有效率的方法。",
@ -132,9 +132,9 @@ exports.level = {
"",
"さあ、いくつものブランチが出てきます。このブランチたち全てをmasterブランチにリベースしましょう。",
"",
"おエライさん方が今回の仕事を少しトリッキーにしてくれました -― コミットはすべて一列のシーケンシャルな状態にしてほしいそうです。つまり私たちが作るリポジトリの最終的なツリーの状態は、`C7'`が最後に来て、`C6'`がその一つ上に来て、、と順に積み重なるイメージです。",
"おエライさん方が今回の仕事を少しトリッキーにしてくれました -- コミットはすべて一列の連続した状態にしてほしいそうです。つまり私たちが作るリポジトリの最終的なツリーの状態は、`C7'`が最後に来て、`C6'`がその一つ上に来て、、と順に積み重なるイメージです。",
"",
"試行錯誤してツリーが汚くなってきたら、`reset`コマンドを使ってツリーの状態を初期化してください。模範解答をチェックして、それよりも簡単なコマンドで済ませられるかどうかを考えるのも忘れずに!"
"試行錯誤してツリーが汚くなってきたら、`reset`コマンドを使ってツリーの状態を初期化してください。模範解答をチェックして、それよりも簡単なコマンドで済ませられるかどうかを考えるのも忘れずに!"
]
}
}

View file

@ -430,13 +430,13 @@ exports.level = {
"markdowns": [
"## Gitリモート",
"",
"リモートのリポジトリというのはそんなに複雑なものでもありません。クラウドコンピューティングが普及している現在の世界では、gitリモートの裏には何か不思議な仕組みが動いていると思いやすいのですが、実は別のコンピュータ上に保存されているあなたのリポジトリのコピーにすぎません。普通の場合では、インターネットを媒体に使いこの別のコンピューターと対話し、コミットを交互にやり取りすることができます。",
"リモートのリポジトリというのはそんなに複雑なものでもありません。クラウドコンピューティングが普及している現在の世界では、gitリモートの裏には何か不思議な仕組みが動いていると思いやすいのですが、実は別のコンピュータ上に保存されているあなたのリポジトリのコピーにすぎません。通常、インターネットを媒体に使って別のコンピュータと対話し、コミットを交互にやり取りすることができます。",
"",
"とはいえ、リモートリポジトリにはいくつかの素晴らしい特徴があります:",
"",
"- まず、リモートはバックアップの役割を果たします。ご存知の通り、ローカルのgitリポジトリは以前の状態にファイルを復帰する機能を持っているのですが、その情報はすべてローカルに保存されています。gitリポジトリを別のコンピュータにも保存することで、ローカルのデータがすべて失われたとしても、保存状態からコーディングを続けられます。",
"- まず、リモートはバックアップの役割を果たします。ご存知の通り、ローカルのgitリポジトリは以前の状態にファイルを復帰する機能を持っているのですが、その情報はすべてローカルに保存されています。gitリポジトリを別のコンピュータにも保存することで、ローカルのデータがすべて失われたとしても、保存状態からコーディングを続けられます。",
"",
"- それよりも大切なこととして、リモートではコードをより一般的に公開できます!プロジェクトのコピーが別の場所に保存されているため、友達などが簡単にそのプロジェクトに参加したり最近の変更をpullしたりできます。",
"- それよりも大切なこととして、リモートではコードをより一般的に公開できますプロジェクトのコピーが別の場所に保存されているため、友達などが簡単にそのプロジェクトに参加したり最近の変更をpullしたりできます。",
"",
"最近ではリモートリポジトリに関するデータをビジュアル的に表示するウェブサイト([Github](https://github.com/)や[Phabricator](http://phabricator.org/)など)の使用が人気を集めていますが、リモートリポジトリは_そのいずれの_ウェブサイトの裏にも使われています。なので理解する必要があります。"
]
@ -450,7 +450,7 @@ exports.level = {
"",
"今までLearn Git Branchingでは_ローカル_リポジトリの様々な作業branch, merge, rebaseなどに焦点を当ててきました。しかし、これからはリモートリポジトリの作業を学びますので、レッスンのために環境をセットアップする必要があります。そのコマンドは`git clone`になります。",
"",
"普通の場合では`git clone`はリモートリポジトリgithubなどからを_ローカル_にコピーする時に使います。しかしLearn Git Branchingでは少し違ったように使います -- ここでは`git clone`が_ローカルリポジトリ_をリモートにコピーします。本当のコマンドの逆の動作になっているのですが、このようにcloneとリモートリポジトリのつながりが見えてきますので今のところは例として使いましょう。",
"通常、`git clone`はリモートリポジトリgithubなどからを_ローカル_にコピーする時に使います。しかしLearn Git Branchingでは少し違ったように使います -- ここでは`git clone`が_ローカルリポジトリ_をリモートにコピーします。本当のコマンドの逆の動作になっているのですが、学んでいくうちにcloneとリモートリポジトリのつながりが見えてくるはずです。なので、今はとりあえず例として使ってみましょう。",
""
]
}

View file

@ -6,7 +6,7 @@ exports.level = {
"en_US": "Faking Teamwork",
"fr_FR": "Simulation du travail d'équipe",
"de_DE": "Teamarbeit simulieren",
"ja" : "擬似チームワーク",
"ja" : "擬似的なチーム作業",
"es_AR": "Simulando el trabajo en equipo",
"pt_BR": "Simulando trabalho em equipe",
"zh_CN": "模拟团队合作",
@ -17,7 +17,7 @@ exports.level = {
"en_US": "remember you can specify the number of commits to fake",
"fr_FR": "rappelez-vous que vous pouvez spécifier le nombre de commits à simuler",
"de_DE": "Nicht vergessen, du kannst angeben wieviele Commits simuliert werden sollen.",
"ja" : "擬似作成するコミット数を指定できるのをお忘れなく",
"ja" : "擬似的に作成するコミット数を指定できるのをお忘れなく",
"es_AR": "Acordate que podés especificar cuántos commits simular",
"pt_BR": "Lembre-se que você pode especificar quantos commits quer simular",
"zh_CN": "记住为fake中的commit指定数量",
@ -456,6 +456,62 @@ exports.level = {
}
}
]
},
"ja": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## 連携のシミュレーション",
"",
"ここでは少し奇怪なものを取り扱います -- これは次回以降の幾つかのレッスンのためのもので、リモートセクションで変更点の反映方法を教えるのに必要なものです。",
"",
"つまり、私たちには時にはリモートの特定のブランチや特定の数のコミットを、同僚/友人/共同開発者の一人が更新した「ふりをする」ことが必要だというわけです。",
"",
"これを行うために、私たちは適切に選んだ名前のコマンド`git fakeTeamwork`を導入しました!とても明白でしょう?では、デモを見てみましょう。",
"",
"*注もちろん、本当のgit上にこのようなコマンドは存在しません変更は、「実在する」同僚や友人が行ってくれるでしょうからここではレッスンのために「擬似的に」導入しているにすぎません*"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"`fakeTeamwork`のデフォルトの動作は、単にmasterの上にコミットを乗っけるだけです"
],
"afterMarkdowns": [
"ではいってみましょう -- リモートには新しいコミットが更新され、それはまだ私たちの手元にはダウンロードされていません。なぜなら、`git fetch`を走らせていませんからね。"
],
"command": "git fakeTeamwork",
"beforeCommand": "git clone"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"さらに特定の数のコミット、または追加するブランチをコマンドで指定することもできます。"
],
"afterMarkdowns": [
"一つのコマンドで、チームメイトが3個のコミットをリモートの`foo`ブランチにプッシュするという動作を再現することができました。"
],
"command": "git fakeTeamwork foo 3",
"beforeCommand": "git branch foo; git clone"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"今後のレベルはどんどん難しくなっていくでしょうから、このレベルでも私たちはあなたに少々多くのことを求めます。",
"",
"先に行くには、リモートを作り(`git clone`で)、リモートに幾つかの変更を再現して、自身のリポジトリにコミットし、変更を取り込む必要があります。これは、このリモートのセクションでやった幾つかのレッスンの内容と似ていますね!"
]
}
}
]
}
}
};

View file

@ -544,7 +544,7 @@ exports.level = {
"",
"リモートGitを用いた作業は、本当にただ単なる他のリポジトリ_への_、または他のリポジトリ_からの_データの転送に集約されます。コミットを転送できる限り、Gitで管理されている全ての種類の更新が共有できます例えば作業や、新しいファイル、新しいアイデア、ラブレターなどです。",
"",
"このレベルでは、リモートリポジトリ_から_どうやってデータを取ってくる方法を学びます -- このコマンドは`git fetch`と名付けられています。",
"このレベルでは、リモートリポジトリ_から_データを取ってくる方法を学びます -- このコマンドは`git fetch`と名付けられています。",
"",
"リモートリポジトリの情報を私たちが更新するように、_リモート_ブランチも情報を更新することができることが分かるでしょう。これは前のレッスンでのリモートブランチの働きに結びつきます。"
]
@ -576,7 +576,7 @@ exports.level = {
"",
"`git fetch`は本質的には、_実際_のリモートリポジトリと同じように見えるような形でリモートリポジトリの_ローカル_の情報に同期しますちょうど今のように。",
"",
"あなたは前のレッスンでのことを覚えていると思いますが、リモートブランチはリモートリポジトリと最後に同期した時での状態を保持しているという話をしました。`git fetch`はそのリモートと同期する方法なのです!これでリモートブランチと`git fetch`の関係性は明らかになったでしょう?",
"前のレッスンでのことを覚えていると思いますが、リモートブランチはリモートと最後に同期した時での状態を保持しているという話をしました。`git fetch`はそのリモートと同期する方法なのです!これでリモートブランチと`git fetch`の関係性は明らかになったでしょう?",
"",
"`git fetch`は、通常インターネットを通してリモートリポジトリと対話します(`http://`または`git://`プロトコル経由で)。",
""
@ -591,7 +591,7 @@ exports.level = {
"",
"`git fetch`は、しかしながら、_あなたの_ローカルの状態は変更しません。あなたの`master`ブランチや他のもの、今現在のあなたのファイルシステムが見せているものを更新しないのです。",
"",
"これは理解する上で重要なことです。なぜなら、多くの技術者は`git fetch`がリモートの状態をローカルの作業場に反映してくれると思っているからです。必要なデータはダウンロードされるかもしれませんが、ローカルのファイルを実際に変更するというようなことは_してくれない_のです。私たちは、この後のレッスンでもこのようなコマンドを学びます:D",
"これは理解する上で重要なことです。なぜなら、多くの技術者は`git fetch`がリモートの状態をローカルの作業場に反映してくれると思っているからです。必要なデータはダウンロードされるかもしれませんが、ローカルのファイルを実際に変更するというようなことは_してくれない_のです。私たちは、この後のレッスンでもこのようなコマンドを学びます :D",
"",
"なので、この1日が終わる頃には、あなたは`git fetch`のダウンロードステップの動作が分かるようになるでしょう。"
]

View file

@ -20,7 +20,7 @@ exports.level = {
"es_AR": "Prestá atención al orden del objetivo",
"ot_BR": "Preste atenção na ordem da visualização do objetivo",
"de_DE": "Beachte die Reihenfolge in der Zieldarstellung",
"ja" : "ゴールのビジュアライズの順番を参照",
"ja" : "ゴールのツリーの順番を参考にすること",
"fr_FR": "regardez l'ordre dans la fenêtre de visualisation d'objectif",
"ru_RU": "проверьте сортировку в визуализации цели"
},
@ -1168,6 +1168,149 @@ exports.level = {
}
}
]
},
"ja": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## 分かれた作業",
"",
"これまでは、どのようにして`pull`でコミットを取り込み、`push`で自身の変更を反映するかを見てきました。単純なようにみえます。では何故人々は混乱するのでしょうか?",
"",
"その難しさは、リポジトリの履歴が*分岐*することに起因します。この詳細について説明する前に、まずは例を見てみましょう。",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"月曜日にリポジトリをクローンし、ある表面の機能をちょっと弄ることを想像してみてください。金曜日までに、あなたはその機能を公開する準備ができる -- しかし、ああなんということでしょう!あなたの同僚達は、あなたの機能が依存していた(そして、廃れた)コードの束をその週の内に書き換えていました。彼らはリモートリポジトリにコミットを共有して公開し、今や*あなたの*作業は*古い*バージョンのもはや適切でないプロジェクトに基づいていることになります。",
"",
"この場合、`git push`コマンドは曖昧になってしまいます。あなたが`git push`を走らせたとき、gitはリモートリポジトリは月曜の状態に変更を戻すべきでしょうかそれとも、新しいコードを取り除かないで追加しようとしてみるべきでしょうかまたは、あなたの変更が完全に古いものになってしまったため、全て無視するべきなのでしょうか",
"",
"この状況履歴が分岐をしているときではまったくもって曖昧なので、gitはあなたの変更を`push`することを許可しません。実際には、あなたの作業を共有する前に最新のリモートの状態を取り込むことを強制します。"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"話しすぎましたね!この状況での動作をみてみましょう!"
],
"afterMarkdowns": [
"見ましたか?コマンドが失敗して、何も起こりませんでした。あなたの最近の`C3`コミットはリモートの`C1`コミットに依存しているため、`git push`は失敗しました。リモートには`C2`が更新されているので、gitはあなたのプッシュを拒否します。"
],
"command": "git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"ではこの状況を解決するにはどうしたらいいでしょう?簡単です、リモートブランチの最新の状態にあなたの作業が基づくようにすればいいのです。",
"",
"いくつか方法はありますが、最も簡単なのはあなたの作業をリベースで移動させることです。それがどのようなものか、さあみてみましょう。"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"今、プッシュをする前に代わりにリベースをしてみましょう。"
],
"afterMarkdowns": [
"わお!私たちは`git fetch`でローカルのリモートブランチを更新し、私たちの作業をリベースさせてリモートの新しい変更に適用させ、`git push`でそれをプッシュしました。"
],
"command": "git fetch; git rebase o/master; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"リモートリポジトリが更新されたとき、他に自身の作業を更新する方法はあるでしょうか?もちろん、あります!今度は同じことを`merge`を代わりに使ってやってみましょう。",
"",
"`git merge`はあなたの作業を移動しませんが代わりにマージコミットを作ります、リモートの変更を全て取り込みgitに通知する方法なのです。この通知とは、リモートブランチが今やあなた自身のブランチの*親*を指していることになるため、あなたのリモートブランチの全ての変更を反映しているコミットを指します。",
"",
"この状況の例を見てみましょう。"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"リベースの代わりに今度はマージを用います。"
],
"afterMarkdowns": [
"わお!私たちは`git fetch`でローカルのリモートブランチを更新し、私たちの作業を*マージ*して(リモートの新しい変更を反映するために)、`git push`でそれをプッシュしました。"
],
"command": "git fetch; git merge o/master; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"素晴らしい!多くのコマンドを打たないでこれを実現する方法はあるでしょうか?",
"",
"もちろん -- あなたが既に知っているコマンドです。`git pull`は、`fetch`して`merge`するためのより短い書き方です。さらに便利なことに、`git pull --rebase`は`fetch`して`rebase`することの省略形です!",
"",
"コマンドを省略した場合を見てみましょう。"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"まずは、`--rebase`から"
],
"afterMarkdowns": [
"前と一緒です!そしてとても短いです。"
],
"command": "git pull --rebase; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"そして通常使う`pull`で試してみましょう"
],
"afterMarkdowns": [
"ここでも、前と同じです!"
],
"command": "git pull; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"この取り込み作業の流れ、リベースとマージ、そしてプッシュはとてもよく行います。次回以降のレッスンではより複雑なパターンの作業を学びますが、今は習ったことをとりあえず試してみましょう。",
"",
"このレベルをクリアするには、以下のステップを踏みます:",
"",
"* あなたのリポジトリをクローン",
"* 擬似的に幾つかの同僚の変更を真似る1コミット",
"* あなた自身の作業をコミット1コミット",
"* あなたの作業を*リベース*で公開"
]
}
}
]
}
}
};

View file

@ -19,7 +19,7 @@ exports.level = {
"es_AR": "¡Prestá atención al árbol final!",
"pt_BR": "Preste atenção na árvore do objetivo!",
"de_DE": "Beachte den Ziel-Baum!",
"ja" : "ゴールツリーに注意",
"ja" : "ゴールツリーをよく見てください",
"fr_FR": "Respectez l'arbre représentant l'objectif !"
},
"compareOnlyMaster": true,
@ -339,6 +339,51 @@ exports.level = {
}
]
},
"ja": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## なぜマージではいけないのか?",
"",
"新しい更新をリモートにプッシュするため、あなたがする必要があるのはリモートからの最近の変更の*組み込み*です。それは、リモートブランチ(例えば、`o/master`)にリベース*か*マージのどちらかをあなたがする必要があるということを意味します。",
"",
"もしどっちの方法でも行うことができるなら、なぜこれまでのレッスンでは、リベースに焦点を当ててきたのでしょう?リモートへの作業で、なぜ`merge`を推してこなかったのでしょうか?",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"開発コミュニティで、マージとリベースの間でのトレードオフについては多くの議論がなされています。ここでは一般的なリベースのメリット/デメリットを紹介しましょう:",
"",
"メリット:",
"",
"* リベースは全てが直線上にあるので、あなたのコミットツリーをとても綺麗にみせます。",
"",
"デメリット:",
"",
"* リベースは、コミットツリーの(見ため上の)履歴を改変してしまいます。",
"",
"例えば、`C1`コミットは*過去*の`C3`コミットにリベースすることができます。それは、実際には前に完了しているのにもかかわらず、`C1'`の作業がまるで`C3`の後に行われたものであるかのように見えるようになります。",
"",
"幾人かの開発者は、履歴をそのまま保持するのが好みで、マージを選択します。その他(例えば私は)きれいなコミットツリーを好むのでリベースを選択します。つまるところ、好みの問題というわけですね :D"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"このレベルでは、前回のレベルを*マージ*を代わりに使って解いてみてください。ちょっと難しいかもしれませんが、このレッスンのポイントを把握するのに十分な知見を得られるはずです。"
]
}
}
]
},
"ru_RU": {
"childViews": [
{

View file

@ -507,7 +507,7 @@ exports.level = {
"",
"今や私たちはリモートリポジトリから`git fetch`でデータを取ってくる方法を知っているので、今度は私たちの作業にその変更を反映することを学びましょう!",
"",
"実際には多くの方法があり、ローカルで利用可能な新しいコミットがあった場合、あなたはそれらが他のブランチの普通のコミットであるかのようにそれらを組み込むことができます。これは、あなたが次のようなコマンドを実行することで行えます:",
"実際には多くの方法があり、ローカルに利用可能なリモートの新しいコミットがある場合、あなたはそのコミットを他のブランチの通常のコミットと同じように、自分の作業に組み込むことができます。これは、あなたが次のようなコマンドを実行することで行えます:",
"",
"* `git cherry-pick o/master`",
"* `git rebase o/master`",

View file

@ -20,7 +20,7 @@ exports.level = {
"es_AR": "¡Acordate que tenés que clonar antes de pushear!",
"pt_BR": "Lembre-se de clonar antes de fazer o push!",
"de_DE": "Denk dran, dass du einen Clone brauchst bevor du Pushen kannst!",
"ja" : "Pushできる前にまずリポジトリをcloneする必要があるのをお忘れなく",
"ja" : "Pushができるようになるには、まずリポジトリをcloneする必要があるのをお忘れなく",
"fr_FR": "Rappelez-vous que vous devez cloner avant de pouvoir faire un push !",
"ru_RU": "Помните, что прежде чем push-ить вам нужно сколнировать репозиторий!"
},
@ -360,6 +360,49 @@ exports.level = {
}
}
]
},
"ja": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Push",
"",
"さて、私たちは変更をリモートからダウンロードしてきて、ローカルの自分の作業に取り込むことができるようになりました。それは素晴らしいことですが、例えば他の誰かに_自分の_作業を共有する場合はどうすればいいでしょう",
"",
"そうですね、共有する作業をアップロードする方法は作業をダウンロードするものと対照的です。`git pull`の反対はなんでしょう? `git push`です!",
"",
"`git push`は_あなたの_変更をリモートに対話的にアップロードし、リモートにあなたの新しい変更を取り込みます。`git push`が完了すれば、全ての友人たちがあなたの作業をリモートからダウンロードすることができます。",
"",
"`git push`は、あなたの作業を「公開する」コマンドと考えることができます。このコマンドは微妙な点をいくつか持っていますが、とりあえずは初歩から始めてみましょう。。。",
"",
"*注:引数なしの`git push`の挙動は、`push.default`と呼ばれるgitの設定値によって異なります。この設定のデフォルト値は、使用しているgitのバージョンに依存しますが、私たちのレッスンでは`upstream`という値を使用します。これはあまり大きな問題ではありませんが、あなたのプロジェクトにプッシュする前にあなたのgitの設定を確認する価値はあるでしょう。*"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"ここにリモートにはないいくつかの変更点があります。これをアップロードしてみましょう!"
],
"afterMarkdowns": [
"さて、いってみましょう -- リモートはコミット`C2`を受け取り、リモート上の`master`ブランチは`C2`の位置に更新され、私たち*自身*のリモートブランチ(`o/master`)も良い具合に更新されました。全てが同期されました!"
],
"command": "git push",
"beforeCommand": "git clone; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"このレベルを終えるには、単純に二つの新しいコミットをリモートに共有してください。けれども覚悟しておいてください。なぜなら、レッスンは少々難しいことを取り扱っているからです。"
]
}
}
]
}
}
};

View file

@ -34,7 +34,7 @@ exports.level = {
"markdowns": [
"## Push arguments",
"",
"Great! Now that you know about remote tracking branches we can start to uncover some of mystery behind how git push, fetch, and pull work. We're going to tackle one command at a time but the concepts between them are very similar.",
"Great! Now that you know about remote tracking branches we can start to uncover some of the mystery behind how git push, fetch, and pull work. We're going to tackle one command at a time but the concepts between them are very similar.",
"",
"First we'll look at `git push`. You learned in the remote tracking lesson that git figured out the remote *and* the branch to push to by looking at the properties of the currently checked out branch (the remote that it \"tracks\"). This is the behavior with no arguments specified, but git push can optionally take arguments in the form of:",
"",

View file

@ -20,7 +20,7 @@ exports.level = {
"es_AR": "¡Push Master!",
"pt_BR": "Push Master!",
"de_DE": "Push Master!",
"ja": "Push Master!",
"ja" : "Push Master!",
"fr_FR": "Maître du push !",
"ru_RU": "Push Мастер!"
},
@ -449,6 +449,59 @@ exports.level = {
}
}
]
},
"ja": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## 機能別のブランチ(フィーチャーブランチ)をマージする",
"",
"今や、あなたは`fetch`、`pull`、`push`を十分に使えるようになったでしょうから、そのスキルを新しい作業の流れで試してみましょう。",
"",
"大きなプロジェクトの開発者にとって、フィーチャーブランチ(`master`を除く)上で全ての作業を行い、完成したら一度でその作業を統合するというような流れが一般的です。これは前のレッスンの内容(他のブランチからリモートにプッシュされるような状況のところが)に似ていますが、ここではもう一歩踏み込んで解説しましょう。",
"",
"開発者は、`master`ブランチにいるときプッシュとプルしかしません -- `master`は常にリモート(`o/master`)に追従した状態のままにします。",
"",
"この作業の流れでは、私たちは二つのことを組み合わせています:",
"",
"* `master`にフィーチャーブランチの作業を統合し、",
"* リモートへの`push`と`pull`を行う"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"`master`の更新と作業の反映の方法を手早く復習しましょう。"
],
"afterMarkdowns": [
"我々はここで二つのコマンドを動かしました:",
"",
"* リモートから新しいコミットを我々の作業にリベースし、",
"* リモートに我々の作業を公開しました"
],
"command": "git pull --rebase; git push",
"beforeCommand": "git clone; git commit; git fakeTeamwork"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"このレベルはかなり難しいです -- ここに解答の一般的な道のりを示しておきます:",
"",
"* 三つのフィーチャーブランチ、`side1`、`side2`、`side3`があります。",
"* この機能をそれぞれ、この順に、リモートにプッシュしてください。",
"* リモートが更新されたなら、次はより良く作業を統合する方法を紹介しましょう。",
"",
":O これはきつそうだ!このレベルを完了させることは大きな一歩となります。幸運を祈ります。"
]
}
}
]
}
}
};

View file

@ -482,7 +482,7 @@ exports.level = {
"",
"これに基づいて、`o/master`と名付けられたブランチを見てみると、`master`はブランチの名前、`o`はリモートの名前であることが分かります。",
"",
"多くの開発者は、実際にはメインのリモート名として`o`ではなく`origin`を使います。これは一般的には、Gitが`git clone`した時に`origin`という名前をリモートに付与ためです。",
"多くの開発者は、実際にはメインのリモート名として`o`ではなく`origin`を使います。これは一般的には、Gitが`git clone`した時に`origin`という名前をリモートに付与するためです。",
"",
"残念ながら、`origin`という長い名前は私たちのUIには合いませんでした。なので、私たちは短い`o`を使っています覚えておいてもらいたいのは、実際のGitでは、リモートはおそらく`origin`と名付けられるであろうということです!)",
"",