diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index 06a4b27e..acf25dcd 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -10,7 +10,8 @@ exports.level = { "es_AR": "Git Describe", "pt_BR": "Git Describe", "zh_TW": "git describe", - "zh_CN": "git describe" + "zh_CN": "git describe", + "ru_RU": "Git describe" }, "hint": { "en_US": "Just commit once on bugFix when you're ready to move on", @@ -20,7 +21,8 @@ exports.level = { "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar", "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了", - "zh_CN": "当你要移动的时候,只要在 bugFix 上面 commit 就好了" + "zh_CN": "当你要移动的时候,只要在 bugFix 上面 commit 就好了", + "ru_RU": "Когда закончишь, просто сделай commit" }, "startDialog": { "en_US": { @@ -463,6 +465,70 @@ exports.level = { } } ] + }, + "ru_RU": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает как далеко текущее состоянии от ближайшего тега. И эта команда называется `git describe`", + "", + "Git describe помогает сориентироваться, после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали git bisect или если вы недавно вернулись из отпуска =)" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe выглядить примерно так:", + "", + "`git describe `", + "", + "Где `ref` это что-либо, что указывает на конкретный коммит. Если не указать `ref`, то git будет считать, что указано текущее положение (`HEAD`).", + "", + "Вывод команды выглядит примерно так:", + "", + "`__g`", + "", + "Где `tag` – это ближайший тег в истории изменений, `numCommits` – это на сколько далеко мы от этого тега, а `hash` – это хеш коммита, который описывается." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Посмотрим на простой пример. Для дерева, показанного ниже:" + ], + "afterMarkdowns": [ + "Команда `git describe master` выведет:", + "", + "`v1_2_gC2`", + "", + "Whereas `git describe side` would output:", + "Тогда как `git describe side` выведет:", + "", + "`v2_1_gC4`" + ], + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Это, в общем-то всё, что можно сказать про git describe. Попробуй выполнить команду на нескольких коммитах.", + "", + "Как только наиграешься, просто сделай один коммит и уровень будет пройден." + ] + } + } + ] } } }; diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 47a4c104..6b3e3bad 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -22,7 +22,8 @@ exports.level = { "pt_BR": "Pegando um único commit", "ja": "一つのコミットのみを取得", "zh_CN": "只取一个 commit", - "zh_TW": "只取一個 commit" + "zh_TW": "只取一個 commit", + "кг_КГ": "Выберем один коммит." }, "hint": { "en_US": "Remember, interactive rebase or cherry-pick is your friend here", @@ -33,7 +34,8 @@ exports.level = { "ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです", "ko": "대화식 리베이스(rebase -i)나 or 체리픽(cherry-pick)을 사용하세요", "zh_CN": "记住,交互式 rebase 或者 cherry-pick 会很有帮助", - "zh_TW": "記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助" + "zh_TW": "記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助", + "ru_RU": "Не забывай, что интерактивный rebase и cherry-pick – это твои друзья!" }, "startDialog": { "en_US": { @@ -390,6 +392,43 @@ exports.level = { } } ] + }, + "ru_RU": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Вот ситуация, которая часто случается при разработке: мы пытаемся отследить ошибку, но она не очень очевидна. Для того, чтобы достичь успеха на этом поприще, мы используем несколько команд для отладки и вывода", + "", + "Каждая отладочная команда или команды вывода находится в своём коммите. В итоге, мы нашли ошибку, исправили её и порадовались!", + "", + "Но проблема в том, что мы хотим добавить в `master` только исправление ошибки из ветки `bugFix`. Если мы воспользуемся простым fast-forward, то в `master` попадут также отладочные команды. Должен быть другой способ..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Надо заставить git копировать тольк один из коммитов. Это почти как в предыдущем уровне – мы можем использовать уже известные нам команды: ", + "", + "* `git rebase -i`", + "* `git cherry-pick`", + "", + "Чтобы достичь желаемого результата." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "В этом уровне тебе решать, какую команду использовать, но чтобы закончить уровень, убедись, что в мастер попал коммит, на который ссылается `bugFix`" + ] + } + } + ] } } }; diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index 12848828..f1e88a27 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -26,7 +26,8 @@ exports.level = { "pt_BR": "Malabarismo com commits", "ja": "コミットをやりくりする", "zh_CN": "提交变换戏法", - "zh_TW": "commit 的戲法" + "zh_TW": "commit 的戲法", + "ru_RU": "Жонглируем коммитами" }, "hint": { "en_US": "The first command is git rebase -i HEAD~2", @@ -37,7 +38,8 @@ exports.level = { "ja": "最初に打つコマンドはgit rebase -i HEAD~2", "ko": "첫번째 명령은 git rebase -i HEAD~2 입니다", "zh_CN": "第一个命令是 'git rebase -i HEAD~2'", - "zh_TW": "第一個命令是 'git rebase -i HEAD~2'" + "zh_TW": "第一個命令是 'git rebase -i HEAD~2'", + "ru_RU": "Первой командой должна быть git rebase -i HEAD~2" }, "startDialog": { "en_US": { @@ -400,6 +402,47 @@ exports.level = { } } ] + }, + "ru_RU": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Жонглируем коммитами", + "", + "Вот ещё одна ситуация, которая часто случается. Есть некоторые изменения (`newImage`) и другие изменения (`caption`), которые связаны, так что находятся друг подверх друга в репозитории.", + "", + "Штука в том, что иногда нужно внести небольшие изменения в более ранний коммит. В таком случае надо немного поменять `newImage`, несмотря на то, что коммит уже в прошлом!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Преодолеть эти трудности можно следующим образом:", + "", + "* Переставить коммит так, чтобы нужный находился наверху при помощи `git rebase -i`", + "* Внести изменения при помощи `commit --amend`", + "* Переставить всё обратно при помощи `git rebase -i`", + "* И наконец, переместить master на изменённуй часть дерева, чтобы закончить уровень.", + "", + "Этот уровень можно закончить несколькими способами, но в этом уровне нужно сосредоточиться на вышеописанном методе." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Обрати внимание на итоговое состояние в этом уровне – так как мы дважды перемещаем коммиты, они каждый получать по апострофу. Ещё один апостроф добавляется, когда мы делаем commit --amend.", + "", + "Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов." + ] + } + } + ] } } }; diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index eafd2399..fe86278b 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -25,7 +25,8 @@ exports.level = { "de_DE": "Jonglieren mit Commits Teil 2", "ja": "コミットをやりくりする その2", "zh_CN": "提交交换戏法 #2", - "zh_TW": "commit 的戲法 #2" + "zh_TW": "commit 的戲法 #2", + "ru_RU": "Жонглируем коммитами №2" }, "hint": { "en_US": "Don't forget to forward master to the updated changes!", @@ -36,7 +37,8 @@ exports.level = { "ja": "masterのポインタを先に進めることを忘れずに!", "ko": "master를 변경 완료한 커밋으로 이동(forward)시키는 것을 잊지 마세요!", "zh_CN": "别忘记了将 master 快进到最新的更新上!", - "zh_TW": "別忘記了將 master 推到最新的 commit 上面!" + "zh_TW": "別忘記了將 master 推到最新的 commit 上面!", + "ru_RU": "Не забудь переместить master на последние изменения." }, "startDialog": { "en_US": { @@ -417,6 +419,49 @@ exports.level = { } } ] + }, + "ru_RU": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Жонглируем коммитами №2", + "", + "*Перед прохождением этого уровня обязательно надо пройти предыдущий уровен – 'Жонглиуем коммитами №1'*", + "", + "В прошлом уровне мы использовали `rebase -i`, чтобы переставлять коммиты. Как только нужный нам коммит оказывался в конце, мы могли спокойно изменить его при помощи --ammend и переставить обратно.", + "", + "Единственная проблема тут - это множеств перестановок, которые могут спровоцировать конфликты. Посмотрим, как с этой же задачей справиться cherry-pick" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Важно помнить, что cherry-pick поместить любой коммит сразу после HEAD (только, если этот коммит не является предком HEAD)", + "", + "Вот небольшое демо для напоминания:" + ], + "afterMarkdowns": [ + "Ок! Едем дальше!" + ], + "command": "git cherry-pick C2", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Итек, в этом уровне нужно достичь того же эффекта, но без использования `rebase -i`. Остальное – по усмотрению.", + "", + "Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов." + ] + } + } + ] } } }; diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 914ef672..ca898f34 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -10,7 +10,8 @@ exports.level = { "pt_BR": "Tags no Git", "fr_FR": "Git Tags", "zh_CN": "Git Tags", - "zh_TW": "git tag" + "zh_TW": "git tag", + "ru_RU": "Теги" }, "hint": { "en_US": "you can either check out the commit directly or simply checkout the tag!", @@ -20,7 +21,8 @@ exports.level = { "es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!", "pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!", "zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上", - "zh_CN": "你可以直接 checkout 到 commit 上,或是简单的 checkout 到 tag 上" + "zh_CN": "你可以直接 checkout 到 commit 上,或是简单的 checkout 到 tag 上", + "ru_RU": "Можно делать checkout по хешу коммита или просто по тегу" }, "startDialog": { "en_US": { @@ -386,6 +388,58 @@ exports.level = { } } ] + }, + "ru_RU": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Теги", + "", + "В прошлый уроках мы усвоили, что ветки просто двигать туда-сюда и они часто ссылаются на разные коммиты, как на изменения данных в ветке. Ветки просто изменить, они часто временны и постоянно меняют своё состояние.", + "", + "В таком случае, где взять *постоянную* ссылку на момент в истории изменений? Для таких вещей, как релиз, большие слияния нужно нечто более постоянное, чем ветка.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Такое средство имеется. Git предоставляет нам теги, чья основная задача – ссылаться постоянно на конкретный коммит.", + "", + "Важно, что после создания они никогда не сменят своего положения, так что можно с лёгкостью сделать checkout конкретного момента в истории изменений", + "", + "Посмотрим на это на практике." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Создадим тег на `C1`, который бутед нашей версией 1" + ], + "afterMarkdowns": [ + "Готово! Всё просто. Мы назвали тег `v1` и заставили его ссылкаться на `C1` явным образом. Если конкретный коммит не указан, гит пометит тегом `HEAD`" + ], + "command": "git tag v1 C1", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Чтобы пройти этот уровень, просто создай теги как показано на визуализации и потом перейди на тег `v1`. Обрати внимание, что ты перейдёшь в состояние `detached HEAD`, так как нельзя сделать коммит прамо в тег v1.", + "", + "В следующем уровне, мы попробуем более интересные способы применения тегов." + ] + } + } + ] } } };