From 006d21b4322303d12877396e19ddd7e23b05ca2c Mon Sep 17 00:00:00 2001 From: Andriy Moroz Date: Fri, 8 Jul 2016 18:22:55 +0300 Subject: [PATCH] Add missing Ukrainian translation --- src/levels/index.js | 8 +- src/levels/remote/fetchArgs.js | 129 ++++++++++++++++++++++++- src/levels/remote/fetchRebase.js | 2 +- src/levels/remote/mergeManyFeatures.js | 51 +++++++++- src/levels/remote/pull.js | 2 +- src/levels/remote/pullArgs.js | 80 ++++++++++++++- src/levels/remote/push.js | 2 +- src/levels/remote/pushArgs.js | 81 +++++++++++++++- src/levels/remote/pushArgs2.js | 76 ++++++++++++++- src/levels/remote/pushManyFeatures.js | 59 ++++++++++- src/levels/remote/sourceNothing.js | 59 ++++++++++- src/levels/remote/tracking.js | 124 +++++++++++++++++++++++- 12 files changed, 650 insertions(+), 23 deletions(-) diff --git a/src/levels/index.js b/src/levels/index.js index b8fac579..f62e044b 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -77,7 +77,7 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '循序漸進地介紹 git 主要命令', 'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다', 'ru_RU': 'Хорошо подобранное введение в основные команды git', - 'uk': 'Гарно підібране введення в основні команди git' + 'uk' : 'Гарно підібране введення в основні команди git' } }, rampup: { @@ -104,7 +104,7 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_CN': '接下来是 Git 的超赞特性。迫不及待了吧!', 'zh_TW': '接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!', 'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?', - 'uk' : 'Наступна порція абсолютної git-дивожнечі. Зголодніли?', + 'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли', 'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다' } }, @@ -149,7 +149,7 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_CN': '关于 origin 和 其它仓库 -- Git Gemotes 高级命令', 'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令', 'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes', - 'uk' : 'Через origin – до зірок. Продвинуте використання Git Remotes', + 'uk' : 'Через origin – до зірок. Прогресивне використання Git Remotes', 'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소' }, about: { @@ -162,7 +162,7 @@ var sequenceInfo = exports.sequenceInfo = { 'zh_TW': '而且你會覺得做一個仁慈的獨裁者會很有趣...', 'de_DE': 'Git Remotes für Fortgeschrittene', 'ru_RU': 'Весело было быть всесильным мудрым правителем...', - 'uk' : 'Й ти думав що бути всесильним диктатором буде весело...', + 'uk' : 'А ти думав, що бути всесильним диктатором весело...', 'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...' } }, diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index 353e4eda..793cd8aa 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -12,7 +12,8 @@ exports.level = { "de_DE": "Optionen für Fetch", "ja" : "Fetchの引数", "ru_RU": "Аргументы для fetch", - "ko" : "Fetch의 인자들" + "ko" : "Fetch의 인자들", + "uk" : "Аргументи для fetch" }, "hint": { "en_US": "Pay attention how the commit ids may have swapped! You can read slides again with \"help level\"", @@ -24,7 +25,8 @@ exports.level = { "de_DE": "Beachte wie die Commit IDs getauscht wurden! Du kannst den Einführungsdialog mit \"help level\" erneut anzeigen", "ja" : "コミットIDの入れ替わりに注意!スライドを復習するには`help level`を実行", "ru_RU": "Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой \"help level\"", - "ko" : "커밋 ID가 바뀔수도있으니 주의하세요! \"help level\"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다." + "ko" : "커밋 ID가 바뀔수도있으니 주의하세요! \"help level\"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.", + "uk" : "Зверни увагу на те, що номери комітів можуть мінятися! Слайди уроку можна переглянути ще раз командою \"help level\"" }, "startDialog": { "en_US": { @@ -1133,6 +1135,129 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Аргументи git fetch", + "", + "Отже, ми вже вивчили все про аргументи git push, про корисний параметр `` і про формат запису з двокрапкою (`:`). Чи знадобляться нам ці зання про вивченні `git fetch`?", + "", + "Ще б пак! Аргументи для `git fetch` насправді *дуже, дуже* схожі на `git push`. Принцип той самий, з точністю до напрямку (бо ми скачуєм коміти, а не закачуєм).", + "", + "Розглянемо це крок за кроком..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Параметр ``", + "", + "Якщо вказати параметр `` для команди git fetch наприклад так:", + "", + "`git fetch origin foo`", + "", + "git піде у віддалену гілку `foo`, візьме всі коміти, яких немає локально і закине в локальну гілку `o/foo`.", + "", + "Давайте подивимось на це в дії (просто щоб пригадати)." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Вказуючи ``..." + ], + "afterMarkdowns": [ + "Ми скачуєм коміти лише з `foo` і кладемо їх в `o/foo`" + ], + "command": "git fetch origin foo", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ти можеш подумати, чому git закинув ці коміти в гілку `o/foo` замість того, що покласти їх відразу в локальну гілку `foo`? Я думав, що параметр `` одночасно вказує місце звідки взяти і куди поставити?", + "", + "Ну, git робить невеликий вийняток в цьому випадку, оскільки ти, ймовірно, маєш якусь роботу в `foo` і не хочеш там нічого зіпсувати! Пригадай з попереднього уроку про `git fetch` -- він не оновлює твої локальні (не віддалені -- без `o/`) гілки, він тільки скачує коміти (так щоб їх можна було переглянути/змерджити пізніше).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "\"Ну, в такому разі, що буде, якщо якно вказати і джерело і призначення `:`?\"", + "", + "Якщо ти почуваєшся достатньо впевненим і хочеш скачати віддалені коміти *прямо* в свою локальну гілку, тоді - так, ти можеш так написати використавши синтаксис з двокрапкою. Єдиний вийняток - таким способом не можна витягувати зміни в поточну локальну гілку, в будь-яку іншу - без проблем.", + "", + "Тепер в нас `` вказує на *віддалений репозиторій*, а `` - *локальне* місце кути скачаються коміти. Це повна протилежність тому, як було в git push, що з рештою має сенс оскільки ми передаємо дані у протилежному напрямку!", + "", + "Насправді, розробники рідко використовують такий спосіб на практиці. І він показаний тут лише для повноти описання наскільки `fetch` і `push` схожі, відрізняючись лише напрямом дії." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Давайте подивимось на це божевілля в дії:" + ], + "afterMarkdowns": [ + "Ого! Дивись, git прийняв `foo~1` як джерело скачав коміти в `bar` (локальна гілка). Зауваж, що `foo` і `o/foo` не оновлювались, оскільки ми явно вказали звідки і куди передавати коміти." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "А якщо вказаного місця призначення не існує на момент виконання команди? Давайте подивимось на попередній слайд але без гілки `bar`." + ], + "afterMarkdowns": [ + "Бачиш, все як і в випадку з git push. Git створив локальну гілку-призначення перед скачуванням, так само як створить гілку-призначення на віддаленій стороні перед пушем (якщо її не існувало, звичайно)." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Без аргументів?", + "", + "Якщо `git fetch` запущено без аргументів, він просто скачає всі коміти з віддаленого репозиторія в віддалені (`o/`) гілки..." + ], + "afterMarkdowns": [ + "Все дуже просто, але варто було згадати ще раз." + ], + "command": "git fetch", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "OК, досить розмов! Щоб пройти цей рівень, скачай лише вказані на візуалізації коміти. Прояви фантазію підбираючи команди!", + "", + "Тобі потрібно вказати і джерело і призначення для обох fetch-команд. Слідкуй за змінами на візуалізації, ID комітів можуть змінюватися!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index 60a3c63e..f183b765 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -1322,7 +1322,7 @@ exports.level = { "type": "ModalAlert", "options": { "markdowns": [ - "## Diverged Work", + "## Розбіжності в історії", "", "Ми розглянули як витягувати (`pull`) коміти інших та як завантажувати (`push`) свої власні коміти. Це виявилось не надто складно, то як же так, що в людей дуже часто виникають з цим труднощі?", "", diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index 09e01382..859e1a53 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -12,7 +12,8 @@ exports.level = { "ja" : "リモートとのmerge", "fr_FR": "Fusionner avec les branches distantes", "ru_RU": "Слияние с удалённым репозиторием", - "ko" : "원격 작업과 merge하기" + "ko" : "원격 작업과 merge하기", + "uk" : "Мердж з віддаленим репозиторієм" }, "hint": { "en_US": "Pay attention to the goal tree!", @@ -24,7 +25,8 @@ exports.level = { "ja" : "ゴールツリーをよく見てください!", "fr_FR": "Respectez l'arbre représentant l'objectif !", "ru_RU": "Внимательно посмотрите на цель уровня!", - "ko" : "goal을 잘 살펴보세요!" + "ko" : "goal을 잘 살펴보세요!", + "uk" : "Уважно подивись як має виглядати результат!" }, "compareOnlyMaster": true, "startDialog": { @@ -477,6 +479,51 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Чому б не змерджити?", + "", + "Для того, щоб віддалений сервер прийняв твої зміни, треба *об'єднати* їх з останніми змінами на сервері. Це означає ребейс *або* мердж з віддаленою гілкою (напр. `o/master`).", + "", + "Хмм, якщо можна використати один із цих методів, для чого нам додаткові уроки про ребейс? Чому ніхто не любить `merge` працюючи з віддаленим сервером?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "В спільноті розробників давно ведуться суперечки щодо переваг і недоліків мерджингу і ребейсу. Ось головні з них для ребейсу:", + "", + "За:", + "", + "* Ребейс дозволяє тримати дерево комітів чистим, оскільки все вибудовується в пряму лінію", + "", + "Проти:", + "", + "* Ребейс змінює історію в дереві комітів.", + "", + "Наприклад, коміт `C1` можна ребейснути *на* `C3`. Як результат `C1'` буде йти після `C3`, хоча насправді його зробили раніше.", + "", + "Деякі розробники люблять зберігати історії і тому вибирають мерджинг. Інші (як і я) воліють мати чисте дерево комітів і віддають перевагу ребейсу. Це питання смаку :D" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "На цьому рівні давайте спробуємо вирішити попереднє завдання з використанням *мерджу*. Можливо вийде не так охайно, але добре покаже різницю в підходах." + ] + } + } + ] } } }; diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index 1cac0859..aaaac380 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -613,7 +613,7 @@ exports.level = { "markdowns": [ "Ми розглянемо `git pull` більш детально пізніше (включаючи різні опції та аргументи), наразі просто спробуємо цю команду.", "", - "Не забувай -- щоб пройти цей рівень, достатньо використати `fetch` а потім `merge`, але це буде тобі коштувати одну зайву команду :P" + "Не забувай -- щоб пройти цей рівень, достатньо використати `fetch`, а потім `merge`, але це буде тобі коштувати одну зайву команду :P" ] } } diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index cb2eb1ec..623fdaad 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -12,7 +12,8 @@ exports.level = { "ja" : "Pullの引数", "fr_FR": "Arguments de pull", "ru_RU": "Аргументы для pull", - "ko" : "pull 인자들" + "ko" : "pull 인자들", + "uk" : "Аргументи pull" }, "hint": { "en_US": "Remember that you can create new local branches with fetch/pull arguments", @@ -24,7 +25,8 @@ exports.level = { "ja" : "Fetchとpullの引数を利用してローカルで新規ブランチを作成できるのをお忘れなく", "fr_FR": "Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull", "ru_RU": "Напоминаю, что новые ветки можно создавать и с помощью команд fetch/pull", - "ko" : "fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요." + "ko" : "fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.", + "uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами" }, "startDialog": { "en_US": { @@ -692,6 +694,80 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Аргументи git pull", + "", + "Зараз, коли ти знаєш майже *все*, що можна знати про аргументи для `git fetch` і `git push`, дійсно майже нема чого розповідати про git pull :)", + "", + "Це тому, що git pull, зрештою, *просто* зручне об'єднання fetch і merge. Його можна собі уявляти як git fetch і git merge виконані з *однаковими* аргументами.", + "", + "Це працює незалежно від складності переданих аргументів. Давайте розглянемо:" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ось декілька еквівалентних команд git:", + "", + "`git pull origin foo` це те саме, що й:", + "", + "`git fetch origin foo; git merge o/foo`", + "", + "А...", + "", + "`git pull origin bar~1:bugFix` аналог:", + "", + "`git fetch origin bar~1:bugFix; git merge bugFix`", + "", + "Бачиш? git pull це просто зручне скорочення для fetch + merge. А все, про що дбає git pull, це те, куди в результаті підуть коміти (а про це йому говорить аргумент `destination`).", + "", + "Давайте подивимось демонстрацію:" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Якщо ми вказуємо місце призначення для fetch, fetch виконується як звичайно, але мердж відбудеться з тим, що ми щойно стягнули" + ], + "afterMarkdowns": [ + "От бачиш, вказавши `master`, ми скачали коміти в `o/master` як завжди. Потім змерджили `o/master` в поточну гілку." + ], + "command": "git pull origin master", + "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Чи це працює також при вказанні `source` і `destination`? І не сумнівайся! Ось приклад:" + ], + "afterMarkdowns": [ + "Ого, стільки роботи однією командою. Ми створили локальну гілку з назвою `foo`, скачали в неї коміти з віддаленого master, а потім змерджили `foo` в поточну гілку `bar`!" + ], + "command": "git pull origin master:foo", + "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Добре, для завершення, спробуй досягти стану репозиторію показаного на візуалізації. Треба буде скачати відсутні коміти, створити нові гілки і змерджити їх в інші гілки, але не надто великою кількістю команд! :P" + ] + } + } + ] } } }; diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index a7cd9334..84b58510 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -25,7 +25,7 @@ exports.level = { "ja" : "Pushができるようになるには、まずリポジトリをcloneする必要があるのをお忘れなく", "fr_FR": "Rappelez-vous que vous devez cloner avant de pouvoir faire un push !", "ru_RU": "Помните, что прежде чем push-ить вам нужно склонировать репозиторий!", - "uk" : "Пам’ятай, що перед тим як щось push-нуть потрібно склонувати репозиторій!", + "uk" : "Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!", "ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!" }, "startDialog": { diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index eeb86f39..d7ec2dae 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -15,7 +15,8 @@ exports.level = { "ja" : "Git pushの引数", "fr_FR": "Arguments de git push", "ru_RU": "Аргументы git push", - "ko" : "git push의 인자들" + "ko" : "git push의 인자들", + "uk" : "Аргументи git push" }, "hint": { "en_US": "You can always look at the last slide of the dialog with \"objective\"", @@ -27,7 +28,8 @@ exports.level = { "ja" : "ダイアログの最後のスライドを参照するには\"objective\"を実行", "fr_FR": "Vous pouvez toujours regarder le dernier slide des dialogues en tapant \"objective\".", "ru_RU": "Вы всегда можете ознакомиться с последним слайдом, воспользовавшись \"objective\".", - "ko" : "대화창의 마지막 슬라이드를 \"objective\"로 다시 볼 수 있습니다." + "ko" : "대화창의 마지막 슬라이드를 \"objective\"로 다시 볼 수 있습니다.", + "uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\"" }, "startDialog": { "en_US": { @@ -684,6 +686,81 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Аргумeнти git push", + "", + "Чудово! А зараз коли ти знаєш все про відслідковування віддалених гілок, ми можемо розглянути деяку магію, що відбувається при git push, fetch, і pull. Ми розглянемо лише окремі команди для розуміння загального принципу.", + "", + "Спочатку глянемо на `git push`. З уроку про відслідковування віддалених гілок ми знаємо, що git визначає куди і в *яку* гілку робити push дивлячись на локальну поточну гілку (і віддалену, за якою вона \"слідкує\"). Це поведінка `push` без аргументів, але git push може приймати необов'язкові аргументи в форматі:", + "", + "`git push `", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ви спитаєте, що таке аргумент ``? Ми скоро вдамося в детальні пояснення, але спочатку -- приклад. Виконання команди:", + "", + "`git push origin master`", + "", + "буквально перекладається як:", + "", + "*Піди в гілку, що називається \"master\" в моєму репозиторії, візьми всі коміти, піди у віддалений \"master\", що називається \"origin.\" Додай ті коміти, яких немає в цій гілці і надрукуй, що саме ти зробив.*", + "", + "Вказуючи `master` в якості аргумента \"place\", ми сказали git-у *звідки* взяти коміти і *куди* їх додати. (\"Place\") - фактично точка синхронізації двох репозиторіїв.", + "", + "Пам'ятайте, що оскільки ми надали git-у всю необхідну інформацію (вказавши обидва аргументи), не має значення яка гілка є зараз поточною!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Давайте розглянемо приклад використання аргументів. Зверніть увагу на поточну гілку в цьому прикладі." + ], + "afterMarkdowns": [ + "Ось так! `master` у віддаленому репозиторії обновився, оскільки ми вказали його в аргументах." + ], + "command": "git checkout C0; git push origin master", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "А якщо не вказувати аргументів? Що станеться?" + ], + "afterMarkdowns": [ + "Команда поверне помилку (як можна побачити), оскільки локальний `HEAD` не співпадає з відповідною віддаленою гілкою." + ], + "command": "git checkout C0; git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "OК, на цьому рівні давайте оновимо віддалені гілки `foo` і `master`. Для ускладнення ми заборонимо використовувати `git checkout`!", + "", + "*Пам'ятай, віддалені гілки позначені префіксом `o/` оскільки повний префікс `origin/` не влазить в наш UI. Але не хвилюйся ", + "про це... ти можеш використовувати `origin` посилаючись на віддалений репозиторій.*" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 5716c791..7fe5ddd9 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -12,7 +12,8 @@ exports.level = { "ja" : "Git pushの引数 -- 拡張編!", "fr_FR": "Arguments de git push -- toujours plus !", "ru_RU": "Аргументы для push -- расширенная версия!", - "ko" : "git push 인자 -- 확장판!" + "ko" : "git push 인자 -- 확장판!", + "uk" : "Розширені аргументи git push!" }, "hint": { "en_US": "Remember you can admit defeat and type in \"show solution\" :P", @@ -24,7 +25,8 @@ exports.level = { "ja" : "降参して解説を見るには\"show solution\"を実行できるのをお忘れなく", "fr_FR": "N'oubliez pas que vous pouvez toujours déclarer forfait avec \"show solution\" :P", "ru_RU": "Помните, Вы всегда можете признать своё поражение, набрав команду \"show solution\" (показать решение) :P", - "ko" : "혹시 아세요? 패배를 인정하고 \"show solution\"을 입력할 수 있다는 걸요 :P" + "ko" : "혹시 아세요? 패배를 인정하고 \"show solution\"을 입력할 수 있다는 걸요 :P", + "uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P" }, "startDialog": { "en_US": { @@ -656,6 +658,76 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Детальніше про аргумент ``", + "", + "З попереднього уроку нам відомо, що коли ми вказуємо `master` в якості аргумента place для git push, ми задаємо і гілку *звідки* брати нові коміти і гілку *куди* їх буде перенесено.", + "", + "Тут ти можеш задуматись, а чи можуть гілки звідки беремо і куди переносимо бути різними? Що, коли потрібно коміти з локальної гілки `foo` перенести у віддалену гілку `bar`?", + "", + "Нажаль в git це неможливо... жартую! Звичайно, що можливо :)... git просто неймовірно гнучкий (іноді аж занадто).", + "", + "Давай подивимось як це робиться..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Для того, щоб в одному аргументі `` вказати і місце звідки і куди, треба їх просто розділити двокрапкою:", + "", + "`git push origin :`", + "", + "Такий запис називають \"colon refspec\". Тут refspec - це просто зручна назва місця, яке git може ідентифікувати (наприклад, гілка `foo` чи просто `HEAD~1`)", + "", + "Можливість вказати два різних місця, дає велику свободу і гнучкість в роботі з віддаленим репозиторієм. Давайте подивимось демонстрацію!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Пам'ятай, `source` -- це будь-яка назва місця зрозуміла гіту:" + ], + "afterMarkdowns": [ + "Опа! Це доволі незвична команда, але тут все має сенс -- git, знаючи куди вказує `foo^`, завантажив на віддалену сторону ще відсутні там коміти і оновив місце призначення." + ], + "command": "git push origin foo^:master", + "beforeCommand": "git clone; go -b foo; git commit; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "А що, коли вказаного місця призначення не існує? Ніяких проблем! Просто вкажи назву гілки і гіт створить її на віддаленому сервері." + ], + "afterMarkdowns": [ + "Спритно, еге-ж? :D" + ], + "command": "git push origin master:newBranch", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "На цьому рівні спробуй досягти стану ропозиторію, показаного у візуалізації і пам'ятай про формат запису з двокрапкою:", + "", + "`:`" + ] + } + } + ] } } }; diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index 89e330c0..49ea33a1 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -12,7 +12,8 @@ exports.level = { "ja" : "undoやresetコマンドをいつでも使用することができるのをお忘れなく", "fr_FR": "Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.", "ru_RU": "Помни - ты всегда можешь отменить команды с помощью undo или reset", - "ko" : "명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요" + "ko" : "명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요", + "uk" : "Пам'ятай, ти в будь який момент можеш використовувати команди undo або reset" }, "name": { "en_US": "Push Master!", @@ -24,7 +25,8 @@ exports.level = { "ja" : "Push Master!", "fr_FR": "Maître du push !", "ru_RU": "Push Мастер!", - "ko" : "Push Master!" + "ko" : "Push Master!", + "uk" : "Push Maйстер!" }, "compareOnlyMasterHashAgnostic": true, "startDialog": { @@ -557,6 +559,59 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Мердж гілок з фічами", + "", + "Тепер, коли ти вже впевнено володієш засобами `pull` та `push`, час перевірити ці знання в новому процесі.", + "", + "Зазвичай розробники працюють над якимось фічами в окремій гілці (не в `master`), а потім, коли роботу закінчено, інтегрують її. Це схоже на попередній урок (де окремі гілки пушили у віддалений репозиторій), але тут буде ще один додатковий крок.", + "", + "Деякі розробники виконують push і pull лише в гілці `master` -- тож `master` завжди буде актуальним і синхронізованим з віддаленою гілкою (`o/master`).", + "", + "Отже для цього процесу ми об'єднуємо дві речі:", + "", + "* інтеграцію гілки з фічею в `master`, і", + "* пул та пуш для синхронізації з віддаленим репозиторієм" + ] + } + }, + { + "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 Чимале завдання! Успіху! Виконання цього рівня буде великим кроком." + ] + } + } + ] } } }; diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index 0cb1c81e..f17d9fe8 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -12,7 +12,8 @@ exports.level = { "ja" : "無のsource", "fr_FR": "Source de rien du tout", "ru_RU": "Пустой источник", - "ko" : "Source가 없다" + "ko" : "Source가 없다", + "uk" : "Нема джерела" }, "hint": { "en_US": "The branch command is disabled for this level so you'll have to use fetch!", @@ -24,7 +25,8 @@ exports.level = { "ja" : "このレベルではbranchコマンドが無効になっているのでfetchを使うしかない!", "fr_FR": "La commande branch est désactivée pour ce niveau, vous devrez donc utiliser fetch !", "ru_RU": "Команда branch недоступна на этом упражнении, пользуйтесь командой fetch!", - "ko" : "branch 명령이 비활성화 되어있습니다. fetch를 사용해야 되요!" + "ko" : "branch 명령이 비활성화 되어있습니다. fetch를 사용해야 되요!", + "uk" : "Команда branch недоступна на цьому уроці, користуйся командою fetch!", }, "startDialog": { "en_US": { @@ -503,6 +505,59 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Неочевидні способи використання ``", + "", + "Git має два хитрі способи використання ``. Оба випливають з факту, що формально (і цілком легально) ти можеш не вказувати джерело (`source`) як для git push так і для git fetch. Ось, як саме ти можеш це зробити:", + "", + "* `git push origin :side`", + "* `git fetch origin :bugFix`", + "", + "Давай подивимось, що в результаті вийде..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Що буде, якщо спробувати запушити \"ніщо\" у гілку віддаленого репозиторію? Git її видалить!" + ], + "afterMarkdowns": [ + "Ось, ми успішно видалили гілку `foo` на віддаленому сервері запушивши в неї \"ніщо\". Ну, ніби все правильно..." + ], + "command": "git push origin :foo", + "beforeCommand": "git clone; git push origin master:foo" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "І останнє, скачування \"ніщо\" в локальний репозиторій створює нову гілку" + ], + "afterMarkdowns": [ + "Дуже дивно, але такий він, git!" + ], + "command": "git fetch origin :bar", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Це швидкий рівень -- просто видали одну віддалену гілку і створи нову локальну гілку використовуючи `git fetch`!" + ] + } + } + ] } } }; diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 49b66a27..38bb5a44 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -12,7 +12,8 @@ exports.level = { "ja" : "リモートのトラッキング", "fr_FR": "Suivi de branche distante", "ru_RU": "Слежка за удалённым репозиторием", - "ko" : "원격 저장소 추적하기" + "ko" : "원격 저장소 추적하기", + "uk" : "Слідкуємо за віддаленим репозиторієм" }, "hint": { "en_US": "Remember there are two ways to set remote tracking!", @@ -24,7 +25,8 @@ exports.level = { "ja" : "リモートトラッキングを設定する方法が二つあるのをお忘れなく!", "fr_FR": "Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !", "ru_RU": "Помни, есть два способа установить слежку за удалённым репозиторием!", - "ko" : "원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!" + "ko" : "원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!", + "uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!" }, "startDialog": { "en_US": { @@ -1201,6 +1203,124 @@ exports.level = { } } ] + }, + "uk": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Гілки віддаленого стеження", + "", + "Одна з речей в попередніх уроках, яка могла виглядати \"магією\", це те, що гіт якось знає, що локальна гілка `master` відповідає віддаленій `o/master`. Звичайно, ці гілки мають схожі назви і це логічно -- співставити віддалену гілку `master` з `master` локальною, однак цей зв'язок добре видно в двох випадках:", + "", + "* Під час операції `pull`, коміти попадають в `o/master`, а вже потім *мерджаться* в локальний `master`. Гілка в яку відбудеться мердж якраз і визначається цим зв'язком.", + "* Під час операції `push`, коміти з гілки `master` переносяться у віддалений `master` (який локально представлений як `o/master`). *Гілка-призначення* для `push` визначена зв'язком між `master` і `o/master`.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Гілки віддаленого стеження", + "", + "В двох словах, цей зв'язок між `master` та `o/master` і є тим \"віддаленим стеженням\" визначеним для гілки. Гілка `master` налаштована стежити за `o/master` -- це визначає неявну ціль для мерджу і неявне призначення під час операції `push` для гілки `master`.", + "", + "Ви можете подумати, а як же такий зв'язок було встановлено, якщо я не виконував жодної команди? Ну, коли гіт клонує репозиторій, він встановлює цей зв'язок автоматично.", + "", + "Під час клонування гіт створює гілки для стеження за кожною гілкою віддаленого репозиторію (напр. `o/master`). Потім він створює локальну гілку, що пов'язана і стежить за активною гілкою у віддаленому репозиторії, яка в більшості випадків називається `master`.", + "", + "Після закінчення клонування у вас буде лише одна локальна гілка (щоб не перевантажувати) але ви можете переглянути всі віддалені гілки (якщо буде цікаво). Такий собі розумний компроміс!", + "", + "Це пояснює чому ви бачите наступне повідомлення під час клонування:", + "", + " local branch \"master\" set to track remote branch \"o/master\"" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### А можу я сам вибирати?", + "", + "Так, ти можеш! Ти можеш вибрати довільну гілку яка слідкуватиме за `o/master`, і тоді для цієї гілки `push` та `merge` автоматично працюватимуть з `master`. Це означає, що виконання `git push` в гілці з назвою `totallyNotMaster` (зовсім не master) може зберегти локальні коміти у віддалену гілку `master`!", + "", + "Є два шляхи встановити такий зв'язок. Перший - створити нову гілку з явним вказанням зв'язку (за ким слідкувати). Виконання", + "", + "`git checkout -b totallyNotMaster o/master`", + "", + "створить гілку `totallyNotMaster`, яка слідкує за `o/master`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Досить розмов, подивимось в дії! Створимо нову гілку `foo` і змусимо її слідкувати за віддаленою гілкою `master`." + ], + "afterMarkdowns": [ + "Як видно з результату, при оновленні `foo` було використано автоматичний зв'язок з `o/master` під час операції `merge`. Зверніть увагу, master не було оновлено!" + ], + "command": "git checkout -b foo o/master; git pull", + "beforeCommand": "git clone; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Це також справджується і для git push" + ], + "afterMarkdowns": [ + "Ка-бум!. Ми запушили наші зміни у віддалений `master` не зважаючи на те, що локальна гілка називалась зовсім по-іншому." + ], + "command": "git checkout -b foo o/master; git commit; git push", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Спосіб №2", + "", + "Інший спосіб вказати за якою віддаленою гілкою слідкувати -- просто використовувати опцію `git branch -u`. Виконання", + "", + "`git branch -u o/master foo`", + "", + "заставить гілку `foo` слідкувати за `o/master`. Якщо `foo` є поточною гілкою, її можна навіть не вказувати:", + "", + "`git branch -u o/master`", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Давайте подивимось на цей спосіб швидко вказати віддалену гілку для відслідковування..." + ], + "afterMarkdowns": [ + "Як і перший спосіб, але своя окрема команда." + ], + "command": "git branch -u o/master foo; git commit; git push", + "beforeCommand": "git clone; git checkout -b foo" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "ОК! На цьому рівні давай збережемо свою роботу у віддалену гілку `master` *без* переходу на локальну `master`. Про решту здогадайся сам, раз ти вже дойшов до цього рівня :P" + ] + } + } + ] } } };