diff --git a/src/js/dialogs/confirmShowSolution.js b/src/js/dialogs/confirmShowSolution.js index 4b50e1f2..f101e73f 100644 --- a/src/js/dialogs/confirmShowSolution.js +++ b/src/js/dialogs/confirmShowSolution.js @@ -49,6 +49,16 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¿Estás seguro de que quieres ver la solución?', + '', + '¡Creo en ti! ¡Ánimo!' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/levelBuilder.js b/src/js/dialogs/levelBuilder.js index 4442c09b..26f41c05 100644 --- a/src/js/dialogs/levelBuilder.js +++ b/src/js/dialogs/levelBuilder.js @@ -94,6 +94,25 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Bienvenido al constructor de niveles!', + '', + 'Estos son los pasos principales:', + '', + ' * Prepara el entorno inicial usando comandos de Git', + ' * Define el árbol inicial con ```define start```', + ' * Introduce la serie de comandos de git que representan la solución óptima', + ' * Crea el árbol objetivo con ```define goal```. El objetivo también determina la solución', + ' * Opcionalmente, crea pistas con ```define hint```', + ' * Dale un nombre con ```define name```', + ' * Opcionalmente, crea un mensaje inicial con ```edit dialog```', + ' * ¡Introduce el comando ```finish``` para obtener tu nivel en formato JSON!' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/nextLevel.js b/src/js/dialogs/nextLevel.js index ce4de5c5..0a617699 100644 --- a/src/js/dialogs/nextLevel.js +++ b/src/js/dialogs/nextLevel.js @@ -67,6 +67,17 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Buen trabajo!', + '', + 'Resolviste el nivel en *{numCommands}* comandos; ', + 'nuestra mejor solución usa {best}.' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { diff --git a/src/js/dialogs/sandbox.js b/src/js/dialogs/sandbox.js index 96512c66..04c42957 100644 --- a/src/js/dialogs/sandbox.js +++ b/src/js/dialogs/sandbox.js @@ -78,6 +78,62 @@ exports.dialog = { ] } }], + 'es_ES': [{ + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Bienvenid@ a Learn Git Branching!', + '', + 'Esta aplicación está diseñada para ayudar a los principantes ', + 'a manejar los poderosos conceptos que hay detrás del trabajo ', + 'con ramas (branches) en Git. Esperamos que disfrutes la aplicación ', + 'y tal vez incluso ¡que aprendas algo! ', + '', + '# ¡Demo!', + '', + 'Si no viste la demo, mírala en esta dirección:', + '', + '[https://pcottle.github.io/learnGitBranching/?demo](https://pcottle.github.io/learnGitBranching/?demo)', + '', + '¿Harto de este mensaje? Agrégale `?NODEMO` a la URL para dejar de verlo, como en este link:', + '', + '[https://pcottle.github.io/learnGitBranching/?NODEMO](?NODEMO)' + ] + } + }, { + type: 'ModalAlert', + options: { + markdowns: [ + '## Comandos de Git', + '', + 'Tienes una gran variedad de comandos de git en este sandbox. Estos incluyen: ', + '', + ' * commit', + ' * branch', + ' * checkout', + ' * cherry-pick', + ' * reset', + ' * revert', + ' * rebase', + ' * merge' + ] + } + }, { + type: 'ModalAlert', + options: { + markdowns: [ + '## ¡Comparte!', + '', + 'Comparte tus árboles con tus amigos usando `export tree` e `import tree`', + '', + '¿Tienes una buena lección que compartir? Prueba construyendo un nivel con `build level` o prueba el nivel de un amigo con `import level`', + '', + 'Para ver todos los comandos disponibles, escribe `show commands`. Hay algunas joyitas como `undo` y `reset`', + '', + 'Por ahora, empecemos con los `levels`...' + ] + } + }], 'pt_BR': [{ type: 'ModalAlert', options: { diff --git a/src/js/intl/strings.js b/src/js/intl/strings.js index 7d66ede6..c808ba08 100755 --- a/src/js/intl/strings.js +++ b/src/js/intl/strings.js @@ -26,7 +26,7 @@ exports.strings = { 'zh_CN': '要不要试试下一关 *“{nextLevel}”*?', 'zh_TW': '下一關是*「{nextLevel}」*,您要繼續闖關嗎?', 'es_AR': '¿Querés seguir con *"{nextLevel}"*, el próximo nivel?', - 'es_ES': '¿Quieres seguir al nivel *"{nextLevel}"*, el próximo nivel?', + 'es_ES': '¿Quieres pasar al nivel *"{nextLevel}"*, el próximo nivel?', 'pt_BR': 'Você gostaria de ir para o próximo nível: *"{nextLevel}"*?', 'gl' : '¿Gustaríache ir o seguinte nivel: *"{nextLevel}"*?', 'fr_FR': 'Voulez-vous passer à *"{nextLevel}"*, le prochain niveau ?', @@ -78,7 +78,7 @@ exports.strings = { 'zh_CN': '注意! Mercurial 会进行主动垃圾回收,需要将你的提交树縮小。', 'zh_TW': '注意! Mercurial 會積極地做垃圾收集,而且會因此把你的 tree 給縮小。', 'es_AR': '¡Cuidado! Mercurial hace garbage collection agresivamente y necesita eliminar tu árbol', - 'es_ES': '¡Cuidado! Mercurial hace la colección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.', + 'es_ES': '¡Cuidado! Mercurial hace la recolección de basura agresivamente (para administrar memoria) y necesita podar tu árbol.', 'pt_BR': 'Cuidado! O Mercurial faz coleção de lixo agressiva e precisa prunar sua árvore', 'gl' : '¡Coidado! Mercurial fai que recolección de lixo agresivamente (para limpar memoria) e precisa podar a túa árbore.', 'fr_FR': 'Attention, Mercurial supprime de façon agressive et nécessite un prune du repository', @@ -112,7 +112,7 @@ exports.strings = { 'zh_CN': '本 App 没有 status 命令哦,因为根本没有 stage 缓存文件。可以用 hg summary 代替哦', 'zh_TW': '本 App 没有 status 命令哦,因为根本没有 stage 缓存文件。可以用 hg summary 代替哦', 'es_AR': 'No hay un comando status para esta aplicación, dado que no hay archivos que indexar. Probá hg summary, en cambio', - 'es_ES': 'No hay un comando status para esta aplicación, porque que no hay archivos que indexar. Prueba el comando hg summary, en cambio', + 'es_ES': 'No hay un comando status para esta aplicación, porque no hay archivos que indexar. Prueba el comando hg summary', 'pt_BR': 'Não existe um comando status para este aplicativo, já que não há staging de arquivos. Tente hg summary', 'gl' : 'Non hai un comando status para esta aplicación, xa que non hai ficheiros que indexar. Proba hg summary', 'fr_FR': 'Il n\'y a pas de commande status pour cette application, car il n\'y a pas de fichier stagé. Essayez hg summary à la place.', @@ -248,7 +248,7 @@ exports.strings = { 'zh_TW': '你的 origin 分支已經失去了與 remote 遠端分支的同步,所以無法執行 fetch 命令', 'de_DE': 'Dein origin Branch ist nicht auf dem Stand des Remote Branch und fetch kann nicht ausgeführt werden', 'es_AR': 'Tu rama origin está desincronizada con la rama remota, por lo que no se puede hacer el fetch', - 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que un fetch no se puede realizar.', + 'es_ES': 'Tu rama origin no está sicronizada con la rama remota, así que el fetch no se puede realizar.', 'pt_BR': 'O fetch não pode ser realizado pois o ramo de origem está fora de sincronia com o ramo remoto', 'gl' : 'O fetch non pode ser realizado xa que a rama de orixe non está sincronizada ca rama remota', 'fr_FR': 'Votre branche origin n\'est plus synchronisée avec la branche distante et fetch ne peut pas être appliqué. Essayez avec l\'option --force', @@ -264,7 +264,7 @@ exports.strings = { 'zh_TW': '遠端倉庫與你的本地倉庫產生了分歧,故此上傳操作無法通過簡單地快進實現(因此你的 push 被拒絕了)。請 pull 下來遠端裡最新的更改,與本地合併之後再試一次。你可以通過 git pull 或 git pull --rebase 實現。', 'de_DE': 'Das entfernte Repository weicht von deinem lokalen Repository ab, daher können deine Änderungen nicht mit einem einfachen fast forward hochgeladen werden (und daher ist dein push abgelehnt worden). Bitte pull erst die neuen Änderungen in das lokale Repository, integriere sie in den Branch und versuch es nochmal. Das kannst du mit git pull oder git pull --rebase machen', 'es_AR': 'El repositorio remoto divergió de tu repositorio local, por lo que subir tus cambios no es un simple fast forward (y por eso se rechazó tu push). Por favor, hacé pull de los nuevos cambios en el repositorio remoto, incorporalos a esta rama y probá de nuevo. Podés hacerlo con git pull o git pull --rebase', - 'es_ES': 'El depósito remoto se ha desviado del depósito local. Subir cambios no es un avance rápido sencillo (por eso fue rechazado tu push). Por favor haz pull para descaragar los cambios en el depósito remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"', + 'es_ES': 'El repositorio remoto se ha desviado del repositorio local. Subir cambios no es un avance en cámara rápida (por eso fue rechazado tu push). Por favor haz pull para descargar los cambios en el repositorio remoto para que los incorpores en la rama actual. Los cambios se pueden hacer pull con el comando "git pull" o "git pull --rebase"', 'pt_BR': 'O repositório remoto divergiu do repositório local, então enviar suas mudanças não é um simples fast forward (e por isso seu push foi rejeitado). Por favor, faça pull das novas mudanças do repositório remoto, incorpore-os a este ramo, e tente novamente. Você pode fazê-lo com git pull ou git pull --rebase', 'gl' : 'O repositorio remoto diverxe do teu repositorio local. Subir os cambios non é un fast-forward (avance rápido) e por iso foi rechazado o teu push. Por favor, fai un pull dos novos cambios do repositorio remoto e inclúeos na túa rama actual. Os cambios pódense facer co comando "git pull" ou "git pull --rebase"', 'fr_FR': 'Le dépôt distant a divergé de votre référentiel local, donc l\'envoi de vos modifications n\'est pas en simple avance rapide (et donc votre envoi a été rejeté). Veuillez récupérer les nouveaux changements depuis le dépôt distant, les intégrer dans cette branche, et essayez à nouveau. Vous pouvez le faire avec git pull ou git pull --rebase', @@ -741,7 +741,7 @@ exports.strings = { 'zh_CN': '抱歉,为了显示的需要,我们需要一个短些的分支名称。您使用的名称将被截断到9个字符,即 "{branch}"', 'zh_TW': '抱歉,為了顯示的需要,我們需要一個短一點的 branch 名稱。您使用的將會被截斷到剩下9個字元,即"{branch}"', 'es_AR': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', - 'es_ES': 'Perdón, necesitamos mantener los nombres de los branches cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', + 'es_ES': 'Perdón, necesitamos mantener los nombres de las ramas cortos para visualizarlos. El nombre de tu rama se truncó a 9 caracteres, resultando en "{branch}"', 'pt_BR': 'Desculpe, precisamos manter os nomes dos ramos curtos para visualizá-los. O nome do seu ramo foi truncado para 9 caracteres, resultando em "{branch}"', 'gl' : 'Desculpe, precisamos manter os nomes das ramas curtas para poder velas. O nome da súa rama foi truncada a 9 letras, resultado en "{branch}"', 'fr_FR': 'Désolé, nous devons garder les noms de branches courts pour la visualisation. Votre nom de branche a été tronqué à 9 caractères, devenant "{branch}"', diff --git a/src/js/stores/LocaleStore.js b/src/js/stores/LocaleStore.js index 7daec1a1..1d024576 100644 --- a/src/js/stores/LocaleStore.js +++ b/src/js/stores/LocaleStore.js @@ -26,7 +26,8 @@ var langLocaleMap = { var headerLocaleMap = { 'zh-CN': 'zh_CN', 'zh-TW': 'zh_TW', - 'pt-BR': 'pt_BR' + 'pt-BR': 'pt_BR', + 'es-ES': 'es_ES' }; var supportedLocalesList = Object.values(langLocaleMap) diff --git a/src/levels/advanced/multipleParents.js b/src/levels/advanced/multipleParents.js index be68aaf9..6d2f76d8 100644 --- a/src/levels/advanced/multipleParents.js +++ b/src/levels/advanced/multipleParents.js @@ -9,6 +9,7 @@ exports.level = { "de_DE": "Mehrere Vorgänger", "ja" : "複数の親", "es_AR": "Múltiples padres", + "es_ES": "Múltiples padres", "pt_BR": "Múltiplos pais", "gl" : "Múltiples pais", "zh_TW": "多個 parent commit", @@ -24,6 +25,7 @@ exports.level = { 'fr_FR': 'Utilisez "git branch bugWork" avec un commit pour créer une référence manquante', "zh_CN": "使用 `git branch bugWork` 加上一个目标提交记录来创建消失的引用。", "es_AR": "Usá `git branch bugWork` sobre algún commit para crear la referencia faltante", + "es_ES": "Usa `git branch bugWork` sobre algún commit para crear la referencia que falta", "pt_BR": "Use `git branch bugWork` com um commit alvo para criar a referência que falta", "gl" : "Usa `git branch bugWork` sobre calquera commit para crear a referencia que falta", "zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。", @@ -468,6 +470,93 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Especificando los padres", + "", + "Como el modificador de `~`, `^` también acepta un número opcional después de él.", + "", + "En lugar de especificar cuántas generaciones hacia atrás ir (como `~`), el modificador de `^` especifica por cuál de las referencias padres seguir en un commit de merge. Recuerda que un commit de merge tiene múltiples padres, por lo que el camino a seguir es ambiguo.", + "", + "Git normalmente sigue el \"primer\" padre de un commit de merge, pero especificando un número junto con `^` cambia este comportamiento predefinido.", + "", + "Demasiada charla, veámoslo en acción.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos un commit de merge. Si hacemos checkout de `master^`, sin modificadores, vamos a seguir al primer padre después del commit de merge. ", + "", + "(*En nuestras visualizaciones, el primer padre se ubica directamente arriba del commit de merge.*)" + ], + "afterMarkdowns": [ + "Fácil -- esto es a lo que estamos acostumbrados." + ], + "command": "git checkout master^", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ahora tratemos de especificar el segundo padre, en cambio..." + ], + "afterMarkdowns": [ + "¿Ves? Seguimos al otro padre hacia arriba." + ], + "command": "git checkout master^2", + "beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Los modificadores de `^` y `~` son muy poderosos a la hora de movernos en un árbol:" + ], + "afterMarkdowns": [ + "¡Rapidísimo!" + ], + "command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Más loco aún, ¡estos modificadores pueden encadenarse entre sí! Mira esto:" + ], + "afterMarkdowns": [ + "El mismo movimiento que antes, pero todo en uno." + ], + "command": "git checkout HEAD~^2~2", + "beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Ponlo en práctica", + "", + "Para completar este nivel, crea una nueva rama en la ubicación indicada.", + "", + "Obviamente sería muy fácil especificar el commit directamente (algo como `C6`), pero te reto a usar los modificadores de los que estuvimos hablando, mejor" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/index.js b/src/levels/index.js index 69c23590..5c85899d 100644 --- a/src/levels/index.js +++ b/src/levels/index.js @@ -59,6 +59,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'まずはここから', 'fr_FR': 'Séquence d\'introduction', 'es_AR': 'Secuencia introductoria', + 'es_ES': 'Secuencia introductoria', 'pt_BR': 'Sequência introdutória', 'gl' : 'Secuencia introductoria', 'zh_CN': '基础篇', @@ -74,6 +75,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'gitの基本的なコマンド群をほどよいペースで学ぶ', 'fr_FR': 'Une introduction en douceur à la majorité des commandes git', 'es_AR': 'Una breve introducción a la mayoría de los comandos de git', + 'es_ES': 'Una breve introducción a la mayoría de los comandos de git', 'pt_BR': 'Uma breve introdução à maioria dos comandos do git', 'gl' : 'Unha breve introducción á maioría dos comandos de git', 'zh_CN': '循序渐进地介绍 Git 主要命令', @@ -91,6 +93,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '次のレベルに進もう', 'fr_FR': 'Montée en puissance', 'es_AR': 'Acelerando', + 'es_ES': 'Acelerando', 'pt_BR': 'Acelerando', 'gl' : 'Alixeirando', 'zh_CN': '高级篇', @@ -106,6 +109,7 @@ var sequenceInfo = exports.sequenceInfo = { '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', + 'es_ES': 'La próxima ración de git. Espero que estés hambriento', 'pt_BR': 'A próxima porção de maravilhas do git. Faminto?', 'gl' : 'A próxima porción das marabillas de git. Agardo que estés esfameado', 'zh_CN': '要开始介绍 Git 的超棒特性了,快来吧!', @@ -124,6 +128,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'Push及びPullコマンド -- Gitリモート', 'fr_FR': 'Push & Pull -- dépôts gits distants !', 'es_AR': 'Push & Pull -- Git Remotes!', + 'es_ES': 'Push y Pull -- Git Remotes!', 'pt_BR': 'Push & Pull -- repositórios remotos no Git!', 'gl' : 'Push & Pull -- Repositorios remotos no Git!', 'zh_CN': 'Push & Pull —— Git 远程仓库!', @@ -139,6 +144,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '自分のコードをより広く公開しましょう', 'de_DE': 'Zeit Eure 1en und 0en zu teilen; Coding mit sozialer Komponente', 'es_AR': 'Hora de compartir sus 1\'s y 0\'s, chicos; programar se volvió social!', + 'es_ES': 'Hora de compartir vuestros 1\'s y 0\'s, chicos; programar se volvió social!', 'pt_BR': 'Hora de compartilhar seus 1\'s e 0\'s, crianças; programar agora é social!', 'gl' : 'Hora de compartilos seus 1\' e 0\'s, rapaces; programar agora é social!', 'zh_CN': '是时候分享你的代码了,让编码变得社交化吧', @@ -157,6 +163,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '"origin"とその先へ -- Gitリモート上級編', 'fr_FR': 'Vers l\'infini et au-delà -- dépôts distants version avancée', 'es_AR': 'Hasta el origin y más allá -- Git Remotes avanzado!', + 'es_ES': 'Hasta el origen y más allá -- Git Remotes avanzado!', 'pt_BR': 'Até a origin e além -- repositórios remotos avançados!', 'gl' : 'Ata á orixe e máis aló -- repositorios remotos avanzados!', 'zh_CN': '关于 origin 和它的周边 —— Git 远程仓库高级操作', @@ -171,6 +178,7 @@ var sequenceInfo = exports.sequenceInfo = { 'fr_FR': 'Et vous pensiez qu\'être un dictateur bienfaisant serait amusant...', 'ja' : '絶えず上級者の仕事は存在する。。。', 'es_AR': 'Y pensabas que ser un dictador benévolo sería divertido...', + 'es_ES': 'Y pensabas que ser un dictador benévolo sería divertido...', 'pt_BR': 'E você achava que ser um déspota esclarecido seria mais divertido...', 'gl' : 'E pensabas que ser un dictador benévolo sería divertido...', 'zh_CN': '做一名仁慈的独裁者一定会很有趣……', @@ -188,6 +196,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Code Umherschieben', 'fr_FR': 'Déplacer le travail', 'es_AR': 'Moviendo el trabajo por ahí', + 'es_ES': 'Moviendo el trabajo por ahí', 'pt_BR': 'Movendo trabalho por aí', 'gl' : 'Movendo o traballo por ahí', 'ja' : 'コードの移動', @@ -203,6 +212,7 @@ var sequenceInfo = exports.sequenceInfo = { 'de_DE': 'Gewöhn dich daran, den Git-Baum zu verändern', 'fr_FR': 'Soyez à l\'aise pour modifier l\'arbre Git', 'es_AR': 'Ponete cómodo con modificar el directorio fuente', + 'es_ES': 'Ponte cómodo cuando modifiques el directorio fuente', 'pt_BR': 'Fique confortável em modificar a árvore de códigos', 'gl' : 'Ponte cómodo modificando a árbore de git', 'ko' : '작업 트리를 수정하는건 식은죽 먹기지요 이제', @@ -221,6 +231,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '様々なtips', 'fr_FR': 'Un assortiment', 'es_AR': 'Bolsa de gatos', + 'es_ES': 'Un poco de todo', 'pt_BR': 'Sortidos', 'gl' : 'Todo mesturado', 'ko' : '종합선물세트', @@ -236,6 +247,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : 'gitを使う上での様々なtipsやテクニックなど', 'fr_FR': 'Un assortiment de techniques et astuces pour utiliser Git', 'es_AR': 'Un rejunte de técnicas, trucos y tips sobre Git', + 'es_ES': 'Un batiburrillo de técnicas, trucos y sugerencias sobre Git', 'pt_BR': 'Técnicas, truques e dicas sortidas sobre Git', 'gl' : 'Mestura de técnicas, trucos e consellos', 'ko' : 'Git을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다', @@ -253,6 +265,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '上級トピック', 'fr_FR': 'Sujets avancés', 'es_AR': 'Temas avanzados', + 'es_ES': 'Temas avanzados', 'pt_BR': 'Temas avançados', 'gl' : 'Temas avanzados', 'zh_CN': '高级话题', @@ -268,6 +281,7 @@ var sequenceInfo = exports.sequenceInfo = { 'ja' : '勇気ある人のみ!', 'fr_FR': 'Pour les plus courageux !', 'es_AR': '¡Para los verdaderos valientes!', + 'es_ES': '¡Para los verdaderos valientes!', 'pt_BR': 'Para os verdadeiros valentes!', 'gl' : '¡Para os verdadeiros valerosos!', 'zh_CN': '只为真正的勇士!', diff --git a/src/levels/intro/branching.js b/src/levels/intro/branching.js index 1b22ce64..039559d8 100644 --- a/src/levels/intro/branching.js +++ b/src/levels/intro/branching.js @@ -7,6 +7,7 @@ exports.level = { "ja" : "Gitのブランチ", "ko": "Git에서 브랜치 쓰기", "es_AR": "Brancheando en Git", + "es_ES": "Creando ramas en Git", "pt_BR": "Ramos no Git", "gl" : "Ramas en Git", "fr_FR": "Gérer les branches avec Git", @@ -21,6 +22,7 @@ exports.level = { "de_DE": 'Lege mit "git branch " einen neuen Branch an und checke ihn mit "git checkout aus', "ja" : "ブランチの作成(\"git branch [ブランチ名]\")と、チェックアウト(\"git checkout [ブランチ名]\")", "es_AR": "Hacé una nueva rama con \"git branch [nombre]\" y cambiá a ella con \"git checkout [nombre]\"", + "es_ES": "Crea una nueva rama con \"git branch [nombre]\" y sitúate en ella con \"git checkout [nombre]\"", "pt_BR": "Crie um novo ramo com \"git branch [nome]\" e mude para ele com \"git checkout [nome]\"", "gl" : "Crea unha nova rama con \"git branch [nome]\" e cambiate a ela facendo \"git checkout [nome]\"", "fr_FR": "Faites une nouvelle branche avec \"git branch [nom]\" positionnez-vous dans celle-ci avec \"git checkout [nom]\"", @@ -282,9 +284,9 @@ exports.level = { "brancheá temprano, y brancheá seguido", "```", "", - "Como no hay consumo extra de alamcenamiento ni memoria al hacer varias ramas, es más fácil dividir lógicamente tu trabajo que tener un par de ramas grandes.", + "Como no hay consumo extra de almacenamiento ni memoria al hacer varias ramas, es más fácil dividir lógicamente tu trabajo que tener un par de ramas grandes.", "", - "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recordá que una rama escencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"." + "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recordá que una rama esencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"." ] } }, @@ -346,6 +348,84 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas en Git", + "", + "Las ramas (branches) en Git son increíblemente livianas. Son sólo referencias a un commit específico - nada más. Por esto es que tantos entusiastas de Git siguen el mantra:", + "", + "```", + "crea ramas al principio y hazlo también de manera frecuente", + "```", + "", + "Como no hay consumo extra de almacenamiento ni memoria al crear varias ramas, lógicamente es más fácil dividir tu trabajo que trabajar solamente con un par de ramas grandes.", + "", + "Cuando empecemos a mezclar ramas y commits, vamos a ver cómo se combinan estas dos herramientas. Por ahora, en cambio, simplemente recuerda que una rama esencialmente dice \"Quiero incluir el trabajo de este commit y todos su ancestros\"." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos cómo son las ramas en la práctica.", + "", + "Ahora vamos a crear una rama nueva llamada `newImage`" + ], + "afterMarkdowns": [ + "Ahí está, ¡eso es todo lo que hay que hacer para crear una rama! La rama `newImage` ahora referencia al commit `C1`" + ], + "command": "git branch newImage", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Pongamos algo de trabajo en esta nueva rama. Aprieta el botón de aquí abajo" + ], + "afterMarkdowns": [ + "¡Vaya! ¡La rama `master` avanzó, pero `newImage` no! Eso es porque no estábamos \"en\" la rama nueva, y por eso el asterisco (*) estaba en `master`" + ], + "command": "git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Digámosle a git que queremos hacer checkout a esa rama con", + "", + "```", + "git checkout [name]", + "```", + "", + "Esto va a situarnos en esa rama antes de hacer un commit con nuestros cambios" + ], + "afterMarkdowns": [ + "¡Ahí estamos! Nuestros cambios se registraron en nuestra nueva rama" + ], + "command": "git checkout newImage; git commit", + "beforeCommand": "git branch newImage" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Perfecto! Ya estás listo para trabajar con ramas. Cuando se cierre esta ventana,", + "crea una nueva rama llamada `bugFix` y cámbiate a ella" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/intro/commits.js b/src/levels/intro/commits.js index b86b0228..fe290ce6 100644 --- a/src/levels/intro/commits.js +++ b/src/levels/intro/commits.js @@ -3,6 +3,7 @@ exports.level = { "en_US": "Introduction to Git Commits", "de_DE": "Einführung in Git Commits", "es_AR": "Introducción a los commits de Git", + "es_ES": "Introducción a los commits de Git", "pt_BR": "Introdução aos commits no Git", "gl" : "Introducción ós commits de Git", "fr_FR": "Introduction aux commits avec Git", @@ -21,6 +22,7 @@ exports.level = { "en_US": "Just type in 'git commit' twice to finish!", "de_DE": "Gib einfach zweimal 'git commit' ein um den Level abzuschließen", "es_AR": "¡Simplemente tipeá 'git commit' dos veces para terminar!", + "es_ES": "¡Simplemente escribe 'git commit' dos veces para terminar!", "pt_BR": "Simplesmente digite 'git commit' duas vezes para concluir!", "gl" : "Simplemente escribe 'git commit' dúas veces para terminar.", "fr_FR": "Il suffit de saisir 'git commit' deux fois pour réussir !", @@ -175,7 +177,7 @@ exports.level = { "## Commits de Git", "Un commit en un repositorio git registra un snapshot de todos los archivos en tu directorio. Es como un _gran_ copy&paste, ¡pero incluso mejor!", "", - "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que commiteás. Puede (cuando es posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.", + "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que commiteás. Puede (cuando sea posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.", "", "Git mantiene, también, un historial de qué commits se hicieron cuándo. Es por eso que la mayoría de los commits tienen commits ancestros arriba suyo -- designamos esto con flechas en nuestra visualización. ¡Mantener el historial es genial para todos los que trabajan en el proyecto!", "", @@ -208,6 +210,48 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commits de Git", + "Un commit en un repositorio git registra un snapshot de todos los archivos en tu directorio. Es como un _gran_ copy&paste, ¡pero incluso mejor!", + "", + "Git pretende mantener los commits tan livianos como sea posible, por lo que no copia ciegamente el directorio completo cada vez que haces un commit. Puede (cuando es posible) comprimir un commit como un conjunto de cambios (o un _\"delta\"_) entre una versión de tu repositorio y la siguiente.", + "", + "Git mantiene, también, un historial de qué commits se hicieron y cuándo. Es por eso que la mayoría de los commits tienen commits ancestros encima -- designamos esto con flechas en nuestra visualización. ¡Mantener el historial es genial para todos los que trabajan en el proyecto!", + "", + "Hay un montón en lo que ahondar, pero por ahora puedes pensar en los commits como snapshots de tu proyecto. Los commits son muy livianos, y ¡cambiar de uno a otro es terriblemente rápido!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos cómo se ve esto en la práctica. A la derecha tenemos una visualización de un (pequeño) repositorio git. Hay dos commits: el commit inicial, `C0`, y un commit que lo sigue, `C1`, que podría tener algunos cambios interesantes.", + "", + "Dale al botón de abajo para crear un nuevo commit" + ], + "afterMarkdowns": [ + "¡Allá va! Increíble. Acabamos de hacer cambios al repositorio y los guardamos como un commit. El commit que acabamos de crear tiene un padre, `C1`, que referencia al commit en el que se basó este." + ], + "command": "git commit", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Venga, inténtalo ahora! Cuando se cierre esta ventana, crea dos commits para completar el nivel." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/intro/merging.js b/src/levels/intro/merging.js index b8cc1855..f5a52d51 100644 --- a/src/levels/intro/merging.js +++ b/src/levels/intro/merging.js @@ -5,6 +5,7 @@ exports.level = { "en_US": "Merging in Git", "de_DE": "Mergen in git", "es_AR": "Mergeando en Git", + "es_ES": "Haciendo merge en Git", "pt_BR": "Merge no Git", "gl" : "Merge en Git", "fr_FR": "Faire des 'merge' (fusions de branches) avec Git", @@ -21,6 +22,7 @@ exports.level = { "de_DE": "Denk dran in der angegebenen Reihenfolge zu committen (erst bugFix, dann master)", "ja"   : "指示された順番でコミットすること(masterの前にbugFixで)", "es_AR": "Acordate de commitear en el orden especificado (bugFix antes de master)", + "es_ES": "Acuérdate de hacer commit en el orden especificado (bugFix antes de master)", "pt_BR": "Lembre-se de commitar na ordem especificada (bugFix antes de master)", "gl" : "Lembrate de facer commit na orde específica (bugFix antes de master)", "fr_FR": "Pensez à faire des commits dans l'ordre indiqué (bugFix avant master)", @@ -252,7 +254,7 @@ exports.level = { "", "¡Genial! Ya sabemos cómo commitear y cómo crear ramas. Ahora tenemos que aprender algún modo de unificar el trabajo de dos ramas diferentes. Esto nos va a permitir abrir una nueva rama de desarrollo, implementar alguna nueva funcionalidad, y después unirla de nuevo con el trabajo principal.", "", - "El primer método para combinarlas que vamos a explorar es `git merge`. Mergear en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres escencialmente significa \"Quiero incluir todo el trabajo de este padre de acá y este otro padre de acá, *y* del conjunto de todos sus ancestros\"", + "El primer método para combinarlas que vamos a explorar es `git merge`. Mergear en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres esencialmente significa \"Quiero incluir todo el trabajo de este padre de acá y este otro padre de acá, *y* del conjunto de todos sus ancestros\"", "", "Es más simple visualizarlo, veámoslo a continuación" ] @@ -311,6 +313,75 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo merge en ramas", + "", + "¡Genial! Ya sabemos cómo crear un commit y cómo crear ramas. Ahora tenemos que aprender algún modo de unificar el trabajo de dos ramas diferentes. Esto nos va a permitir abrir una nueva rama de desarrollo, implementar alguna nueva funcionalidad, y después unirla de nuevo con el trabajo principal.", + "", + "El primer método para combinarlas que vamos a explorar es `git merge`. Hacer merge en Git crea un commit especial que tiene dos padres diferentes. Un commit con dos padres escencialmente significa \"Quiero incluir todo el trabajo de estos dos padres , *y* del conjunto de todos sus ancestros\"", + "", + "Es más simple visualizarlo, veámoslo a continuación" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos dos ramas, y cada una tiene un commit que le es único. Esto significa que ninguna de las ramas incluye \"todo el trabajo\" que hay en nuestro repositorio. Hagamos un merge para solucionar eso.", + "", + "Vamos a `merge`ar la rama `bugFix` a `master`" + ], + "afterMarkdowns": [ + "¡Caramba! ¿Viste eso? Antes de nada, `master` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `master` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `master` ahora contiene todo el trabajo que hay en el repositorio.", + "", + "Además, ¿viste cómo cambiaron los colores de los commits? Para ayudar al aprendizaje, he incluido algunas convenciones de colores. Cada rama tiene un color propio. Cada commmit se vuelve del color resultante de mezclar los colores de todas las ramas que lo contienen.", + "", + "Así que aquí vemos que el color de la rama `master` participa en la mezcla de todos los commits, pero que el de `bugFix` no. Arreglemos eso..." + ], + "command": "git merge bugFix", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hagamos merge de `master` a `bugFix`:" + ], + "afterMarkdowns": [ + "Como `bugFix` era un ancestro de `master`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `master`.", + "", + "Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Genial!" + ], + "command": "git checkout bugFix; git merge master", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, sigue estos pasos:", + "", + "* Crea una nueva rama, llamada `bugFix`", + "* Haz checkout de la rama `bugFix` usando `git checkout bugFix`", + "* Crea un commit", + "* Vuelve a `master` con `git checkout`", + "* Crea otro commit", + "* Haz merge de la rama `bugFix` a `master` usando `git merge`", + "", + "*Recuerda: siempre puedes volver a ver este mensaje escribiendo \"objective\"!*" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/intro/rebasing.js b/src/levels/intro/rebasing.js index b16786a5..49dccfb9 100644 --- a/src/levels/intro/rebasing.js +++ b/src/levels/intro/rebasing.js @@ -6,6 +6,7 @@ exports.level = { "de_DE": "Einführung in Rebase", "ja" : "Rebaseの解説", "es_AR": "Introducción a rebase", + "es_ES": "Introducción a rebase", "pt_BR": "Introdução ao rebase", "gl" : "Introducción a rebase", "fr_FR": "Introduction à rebase", @@ -22,6 +23,7 @@ exports.level = { "ja" : "初めにbugFixを指した状態でコミットする", "fr_FR": "Assurez-vous de bien faire votre commit sur bugFix en premier", "es_AR": "Asegurate de commitear desde bugFix primero", + "es_ES": "Asegúrate de hacer commit desde bugFix primero", "pt_BR": "O bugFix precisa ser commitado primeiro", "gl" : "Asegurate de facer o commit dende bugFix primeiro", "ko": "bugFix 브랜치에서 먼저 커밋하세요", @@ -244,7 +246,7 @@ exports.level = { "markdowns": [ "## Git Rebase", "", - "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Rebasear escencialmente agarra un conjunto de commits, los \"copia\", y los aplica sobre algún otro lado.", + "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Rebasear esencialmente agarra un conjunto de commits, los \"copia\", y los aplica sobre algún otro lado.", "", "Aunque esto pueda sonar confuso, la ventaja de rebasear es que puede usarse para conseguir una secuencia de commits lineal, más bonita. El historial / log de commits del repositorio va a estar mucho más claro si sólo usás rebase.", "", @@ -303,6 +305,73 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Rebase", + "", + "El segundo modo de combinar el trabajo de distintas ramas es el *rebase*. Hacer rebase escencialmente selecciona un conjunto de commits, los \"copia\", y los aplica en algún otro lado.", + "", + "Aunque esto pueda sonar confuso, la ventaja de hacer rebase es que puede usarse para conseguir una secuencia de commits lineal, más bonita. El historial / log de commits del repositorio va a estar mucho más claro si sólo usas rebase.", + "", + "Veámoslo en acción..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos dos ramas otra vez. Observa que la rama bugFix está actualmente seleccionada (tiene un asterisco)", + "", + "Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de master. De ese modo, parecería que esas dos tareas se desarrollaron secuencialmente, cuando en realidad se hicieron en paralelo.", + "", + "Hagámoslo usando el comando `git rebase`" + ], + "afterMarkdowns": [ + "¡Genial! Ahora el trabajo de nuestra rama bugFix está justo encima del de master, y tenemos una secuencia lineal de commits.", + "", + "Nota que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3' es la \"copia\" que rebaseamos sobre master.", + "", + "El único problema es que master todavía no se actualizó, resolvámoslo ahora..." + ], + "command": "git rebase master", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ahora estamos parados sobre la rama `master`. Avancemos y hagamos rebase sobre `bugFix`..." + ], + "afterMarkdowns": [ + "¡Ahí está! Como `master` era un ancestro de `bugFix`, git simplemente movió la referencia de `master` hacia adelante en la historia." + ], + "command": "git rebase bugFix", + "beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, haz lo siguiente:", + "", + "* Haz checkout de una nueva rama llamada `bugFix`", + "* Crea un commit", + "* Vuelve a la rama master y crea otro commit", + "* Haz checkout en bugFix otra vez y haz rebase sobre master", + "", + "¡Misión cumplida!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/mixed/describe.js b/src/levels/mixed/describe.js index d4b24bc7..1f343372 100644 --- a/src/levels/mixed/describe.js +++ b/src/levels/mixed/describe.js @@ -1,856 +1,921 @@ exports.level = { - 'goalTreeString': '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null},"bugFix":{"target":"C7","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"tags":{"v0":{"target":"C0","id":"v0","type":"tag"},"v1":{"target":"C3","id":"v1","type":"tag"}},"HEAD":{"target":"bugFix","id":"HEAD"}}', - 'solutionCommand': 'git commit ', - 'startTree': '{"branches":{"master":{"target":"C2","id":"master","remoteTrackingBranchID":null},"side":{"target":"C4","id":"side","remoteTrackingBranchID":null},"bugFix":{"target":"C6","id":"bugFix","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"tags":{"v0":{"target":"C0","id":"v0","type":"tag"},"v1":{"target":"C3","id":"v1","type":"tag"}},"HEAD":{"target":"bugFix","id":"HEAD"}}', - 'name': { - 'en_US': 'Git Describe', - 'fr_FR': 'Git describe', - 'de_DE': 'Git Describe', - 'ja': 'Git Describe', - 'es_AR': 'Git Describe', - 'pt_BR': 'Git Describe', - 'gl': 'Git Describe', - 'zh_TW': 'git describe', - 'zh_CN': 'Git Describe', - 'ru_RU': 'Git describe', - 'ko': 'Git describe(묘사)', - 'uk': 'Git Describe', - 'vi': 'Git Describe(mô tả)' + "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C7\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", + "solutionCommand": "git commit ", + "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", + "name": { + "en_US": "Git Describe", + "fr_FR": "Git describe", + "de_DE": "Git Describe", + "ja" : "Git Describe", + "es_AR": "Git Describe", + "es_ES": "Git Describe", + "pt_BR": "Git Describe", + "gl" : "Git Describe", + "zh_TW": "git describe", + "zh_CN": "Git Describe", + "ru_RU": "Git describe", + "ko" : "Git describe(묘사)", + "uk" : "Git Describe", + "vi": "Git Describe(mô tả)" }, - 'hint': { - 'en_US': 'Just commit once on bugFix when you\'re ready to move on', - 'fr_FR': 'Faites un commit sur bugFix quand vous êtes prêt', - 'de_DE': 'Committe nur einmal auf bugFix, wenn du soweit bist', - 'ja': '次に進む準備が整ったなら、bugFixに対して一回commitしてください', - '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', - 'gl': 'Simplemente fai commit en bugFix cando estés listo para continuar.', - 'zh_TW': '當你要移動的時候,只要在 bugFix 上面 commit 就好了', - 'zh_CN': '当你准备好时,在 bugFix 分支上面提交一次就可以了', - 'ru_RU': 'Когда закончишь, просто сделай commit', - 'ko': '다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.', - 'uk': 'Просто зроби один коміт в bugFix коли ти будеш готовий іти далі', - 'vi': 'Đơn giản là hãy commit một lẩn ở bugFix là xong rồi' + "hint": { + "en_US": "Just commit once on bugFix when you're ready to move on", + "fr_FR": "Faites un commit sur bugFix quand vous êtes prêt", + "de_DE": "Committe nur einmal auf bugFix, wenn du soweit bist", + "ja" : "次に進む準備が整ったなら、bugFixに対して一回commitしてください", + "es_AR": "Simplemente commiteá una vez en bugFix cuando estés listo para seguir", + "es_ES": "Simplemente crea un commit en la rama bugFix cuando estés listo para seguir", + "pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar", + "gl" : "Simplemente fai commit en bugFix cando estés listo para continuar.", + "zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了", + "zh_CN": "当你准备好时,在 bugFix 分支上面提交一次就可以了", + "ru_RU": "Когда закончишь, просто сделай commit", + "ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다.", + "uk" : "Просто зроби один коміт в bugFix коли ти будеш готовий іти далі", + "vi": "Đơn giản là hãy commit một lẩn ở bugFix là xong rồi" }, - 'startDialog': { - 'en_US': { - 'childViews': [ + "startDialog": { + "en_US": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Because tags serve as such great "anchors" in the codebase, git has a command to *describe* where you are relative to the closest "anchor" (aka tag). And that command is called `git describe`!', - '', - 'Git describe can help you get your bearings after you\'ve moved many commits backwards or forwards in history; this can happen after you\'ve completed a git bisect (a debugging search) or when sitting down at a coworkers computer who just got back from vacation.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Because tags serve as such great \"anchors\" in the codebase, git has a command to *describe* where you are relative to the closest \"anchor\" (aka tag). And that command is called `git describe`!", + "", + "Git describe can help you get your bearings after you've moved many commits backwards or forwards in history; this can happen after you've completed a git bisect (a debugging search) or when sitting down at a coworkers computer who just got back from vacation." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Git describe takes the form of:', - '', - '`git describe `', - '', - 'Where `` is anything git can resolve into a commit. If you don\'t specify a ref, git just uses where you\'re checked out right now (`HEAD`).', - '', - 'The output of the command looks like:', - '', - '`__g`', - '', - 'Where `tag` is the closest ancestor tag in history, `numCommits` is how many commits away that tag is, and `` is the hash of the commit being described.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe takes the form of:", + "", + "`git describe `", + "", + "Where `` is anything git can resolve into a commit. If you don't specify a ref, git just uses where you're checked out right now (`HEAD`).", + "", + "The output of the command looks like:", + "", + "`__g`", + "", + "Where `tag` is the closest ancestor tag in history, `numCommits` is how many commits away that tag is, and `` is the hash of the commit being described." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Let\'s look at a quick example. For this tree below:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Let's look at a quick example. For this tree below:" ], - 'afterMarkdowns': [ - 'The command `git describe master` would output:', - '', - '`v1_2_gC2`', - '', - 'Whereas `git describe side` would output:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "The command `git describe master` would output:", + "", + "`v1_2_gC2`", + "", + "Whereas `git describe side` would output:", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'That\'s pretty much all there is to git describe! Try describing a few of the locations in this level to get a feel for the command.', - '', - 'Once you\'re ready, just go ahead and commit once to finish the level. We\'re giving you a freebie :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "That's pretty much all there is to git describe! Try describing a few of the locations in this level to get a feel for the command.", + "", + "Once you're ready, just go ahead and commit once to finish the level. We're giving you a freebie :P" ] } } ] }, - 'fr_FR': { - 'childViews': [ + "fr_FR": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git describe', - '', - 'Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s\'appelle `git describe` !', - '', - 'Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l\'apparition d\'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l\'ordinateur d\'un collègue.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git describe", + "", + "Parce ce que les tags sont de très bonnes références dans le code, git à une commande pour *décrire* (describe) la différence entre le commit et le tag le plus récent. Cette commande s'appelle `git describe` !", + "", + "Git describe peut vous aider lorsque vous vous êtes beaucoup déplacé; cela peut arriver après un git bisect (chercher l'apparition d'un bug) ou lorsque vous revenez de vacances après 3 semaines sur l'ordinateur d'un collègue." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Git describe s\'écrit comme suit :', - '', - '`git describe `', - '', - 'où `` est un n\'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.', - '', - 'Le résultat de la commande ressemble à :', - '', - '`__g`', - '', - 'où `tag` est le tag le plus proche dans l\'historique, `numCommits` le nombre de commits avec le tag, et `` le hash/identifiant du commit décrit.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe s'écrit comme suit :", + "", + "`git describe `", + "", + "où `` est un n'importe quelle chose que git peut résoudre en un commit. Si vous ne spécifiez pas de ref, `HEAD` est pris par défaut.", + "", + "Le résultat de la commande ressemble à :", + "", + "`__g`", + "", + "où `tag` est le tag le plus proche dans l'historique, `numCommits` le nombre de commits avec le tag, et `` le hash/identifiant du commit décrit." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Regardons un petit exemple. Prenons cet arbre :' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Regardons un petit exemple. Prenons cet arbre :" ], - 'afterMarkdowns': [ - 'La commande`git describe master` donne le résultat :', - '', - '`v1_2_gC2`', - '', - 'alors que `git describe side` donne :', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "La commande`git describe master` donne le résultat :", + "", + "`v1_2_gC2`", + "", + "alors que `git describe side` donne :", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Ceci résume bien git describe ! Amusez-vous à utiliser cette commande avec d\'autres endroits dans ce niveau pour bien comprendre describe.', - '', - 'Lorsque vous serez prêt, faites simplement un commit pour finir le niveau. Un petit niveau bonus :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ceci résume bien git describe ! Amusez-vous à utiliser cette commande avec d'autres endroits dans ce niveau pour bien comprendre describe.", + "", + "Lorsque vous serez prêt, faites simplement un commit pour finir le niveau. Un petit niveau bonus :P" ] } } ] }, - 'zh_TW': { - 'childViews': [ + "zh_TW": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### git describe', - '', - '因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來*顯示*離你最近的錨點(也就是 tag),而且這個指令叫做 `git describe`!', - '', - '當你已經完成了一個 `git bisect`(一個找尋有 bug 的 commit 的指令),或者是當你使用的是你跑去度假的同事的電腦時, `git describe` 可以幫助你了解你離最近的 tag 差了多少個 commit。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### git describe", + "", + "因為 tag 在 commit tree 上表示的是一個錨點,git 有一個指令可以用來*顯示*離你最近的錨點(也就是 tag),而且這個指令叫做 `git describe`!", + "", + "當你已經完成了一個 `git bisect`(一個找尋有 bug 的 commit 的指令),或者是當你使用的是你跑去度假的同事的電腦時, `git describe` 可以幫助你了解你離最近的 tag 差了多少個 commit。" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '`git describe` 的使用方式:', - '', - '`git describe `', - '', - '`` 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(`HEAD`)。', - '', - '指令的輸出就像這樣:', - '', - '`__g`', - '', - '`` 表示的是離 `` 最近的 tag, `numCommits` 是表示這個 tag 離 `` 有多少個 commit, `` 表示的是你所給定的 `` 所表示的 commit 的前七個 id。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "`git describe` 的使用方式:", + "", + "`git describe `", + "", + "`` 是任何一個可以被 git 解讀成 commit 的位置,如果你沒有指定的話,git 會以你目前所在的位置為準(`HEAD`)。", + "", + "指令的輸出就像這樣:", + "", + "`__g`", + "", + "`` 表示的是離 `` 最近的 tag, `numCommits` 是表示這個 tag 離 `` 有多少個 commit, `` 表示的是你所給定的 `` 所表示的 commit 的前七個 id。" ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '讓我們來看一個例子,對於下面的 tree:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "讓我們來看一個例子,對於下面的 tree:" ], - 'afterMarkdowns': [ - '`git describe master` 會輸出:', - '', - '`v1_2_gC2`', - '', - '`git describe side` 會輸出:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "`git describe master` 會輸出:", + "", + "`v1_2_gC2`", + "", + "`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' + "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` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!', - '', - '當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!", + "", + "當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P" ] } } ] }, - 'zh_CN': { - 'childViews': [ + "zh_CN": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - '由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来**描述**离你最近的锚点(也就是标签),它就是 `git describe`!', - '', - 'Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "由于标签在代码库中起着“锚点”的作用,Git 还为此专门设计了一个命令用来**描述**离你最近的锚点(也就是标签),它就是 `git describe`!", + "", + "Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 `git bisect`(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '`git describe` 的​​语法是:', - '', - '`git describe `', - '', - '`` 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(`HEAD`)。', - '', - '它输出的结果是这样的:', - '', - '`__g`', - '', - '`tag` 表示的是离 `ref` 最近的标签, `numCommits` 是表示这个 `ref` 与 `tag` 相差有多少个提交记录, `hash` 表示的是你所给定的 `ref` 所表示的提交记录哈希值的前几位。', - '', - '当 `ref` 提交记录上有某个标签时,则只输出标签名称' + "type": "ModalAlert", + "options": { + "markdowns": [ + "`git describe` 的​​语法是:", + "", + "`git describe `", + "", + "`` 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(`HEAD`)。", + "", + "它输出的结果是这样的:", + "", + "`__g`", + "", + "`tag` 表示的是离 `ref` 最近的标签, `numCommits` 是表示这个 `ref` 与 `tag` 相差有多少个提交记录, `hash` 表示的是你所给定的 `ref` 所表示的提交记录哈希值的前几位。", + "", + "当 `ref` 提交记录上有某个标签时,则只输出标签名称" ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '让我们来看一个例子,对于下面的提交树:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "让我们来看一个例子,对于下面的提交树:" ], - 'afterMarkdowns': [ - '`git describe master` 会输出:', - '', - '`v1_2_gC2`', - '', - '`git describe side` 会输出:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "`git describe master` 会输出:", + "", + "`v1_2_gC2`", + "", + "`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' + "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` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!', - '', - '当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!", + "", + "当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P" ] } } ] }, - 'es_AR': { - 'childViews': [ + "es_AR": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Como los tags sirven tanto para marcar "hitos" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al "hito" más cercano (digamos, "tag"). Y ese comamndo se llama ¡`git describe`!', - '', - 'Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sentás en la computadora de un compañero de trabajo que recién vuelve de unas vacaciones.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Como los tags sirven tanto para marcar \"hitos\" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al \"hito\" más cercano (digamos, \"tag\"). Y ese comamndo se llama ¡`git describe`!", + "", + "Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sentás en la computadora de un compañero de trabajo que recién vuelve de unas vacaciones." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Git describe tiene la siguiente forma:', - '', - '`git describe `', - '', - 'Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificás ninguna referencia, git simplemente usa el commit en que estás parado ahora (`HEAD`).', - '', - 'La salida de ese comando se ve así:', - '', - '`__g`', - '', - 'Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe tiene la siguiente forma:", + "", + "`git describe `", + "", + "Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificás ninguna referencia, git simplemente usa el commit en que estás parado ahora (`HEAD`).", + "", + "La salida de ese comando se ve así:", + "", + "`__g`", + "", + "Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Veamos un ejemplo breve. Para este árbol de commits:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos un ejemplo breve. Para este árbol de commits:" ], - 'afterMarkdowns': [ - 'El comando `git describe master` mostraría:', - '', - '`v1_2_gC2`', - '', - 'Mientras que `git describe side` debería mostrar:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "El comando `git describe master` mostraría:", + "", + "`v1_2_gC2`", + "", + "Mientras que `git describe side` debería mostrar:", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '¡Eso es prácticamente todo lo que hay sobre git describe! Probá describiendo algunas referencias en este nivel para amigarte con el comando.', - '', - 'Cuando estés listo, hacé un commit para terminar el nivel. Te estamos dando una gratis :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Eso es prácticamente todo lo que hay sobre git describe! Probá describiendo algunas referencias en este nivel para amigarte con el comando.", + "", + "Cuando estés listo, hacé un commit para terminar el nivel. Te estamos dando una gratis :P" ] } } ] }, - 'pt_BR': { - 'childViews': [ + "es_ES": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Devido ao fato de as tags servirem como "âncoras" tão boas no código, o Git tem um comando para *descrever* onde você está com relação à "âncora" (tag) mais próxima. Esse comando é chamado `git describe`!', - '', - 'O git describe pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Como los tags sirven tanto para marcar \"hitos\" en el código, git tiene un comando para *describir* (_describe_) dónde estás relativo al \"hito\" más cercano (digamos, \"tag\"). Y ese comamndo se llama ¡`git describe`!", + "", + "Git describe puede ayudarte a saber dónde estás después de que te hayas movido varios commits hacia adelante o atrás en la historia. Esto puede pasarte después de que termines un git bisect (una búsqueda que te ayuda a debuggear problemas) o cuando te sientas delante de la computadora de un compañero de trabajo que acaba de volver de unas vacaciones." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'O git describe é chamado da seguinte forma:', - '', - '`git describe `', - '', - 'Onde `` é qualquer coisa que o git possa resolver como uma referência a um commit. Se você não especificar o ref, o Git usa simplesmente o commit atual (`HEAD`).', - '', - 'A saída do comando é mais ou menos assim:', - '', - '`__g`', - '', - 'Onde `tag` é a tag ancestral mais próxima no histórico, `numCommits` é o número de commits de distância da tag, e `` é o hash do commit sendo descrito.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe tiene la siguiente forma:", + "", + "`git describe `", + "", + "Donde `` es cualquier cosa que git puede resolver a un commit. Si no especificas ninguna referencia, git simplemente usa el commit en el que estás parado ahora (`HEAD`).", + "", + "La salida de ese comando se ve así:", + "", + "`__g`", + "", + "Donde `tag` es el tag más cercano en la historia, `numCommits` dice a cuántos commits de ese tag estás, y `` es el hash del commit que estás describiendo." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Vejamos um exemplo rápido. Para a árvore abaixo:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos un ejemplo breve. Para este árbol de commits:" ], - 'afterMarkdowns': [ - 'O comando `git describe master` daria a saída:', - '', - '`v1_2_gC2`', - '', - 'Enquanto `git describe side` daria:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "El comando `git describe master` mostraría:", + "", + "`v1_2_gC2`", + "", + "Mientras que `git describe side` debería mostrar:", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'É basicamente disso que se trata o git describe! Tente descrever alguns locais da árvore para sentir como o comando se comporta.', - '', - 'Uma vez que você estiver satisfeito, apenas faça um commit que o nível será finalizado. Essa é de graça :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Eso es prácticamente todo lo que hay sobre git describe! Prueba con algunas referencias en este nivel para familiarizarte con el comando.", + "", + "Cuando estés listo, crea un commit para terminar el nivel. Te estamos dando una gratis :P" ] } } ] }, - 'gl': { - 'childViews': [ + "pt_BR": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Como as tags fan a función de "áncora" no repositorio, Git ten un comando para *describir* ónde podes estar ti en relación á "áncora" (tag) máis próxima. Ese comando chámase `git describe`!', - '', - 'Git describe pode axudar a recuperar a túa posición despois de mover moitos commits para atrás ou para adiante na historia; esto pode suceder depois de que fagas un git bisect (unha búsqueda para atopar erros) ou cando te sentas no ordenador dun colega que chegou das vacacións.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Devido ao fato de as tags servirem como \"âncoras\" tão boas no código, o Git tem um comando para *descrever* onde você está com relação à \"âncora\" (tag) mais próxima. Esse comando é chamado `git describe`!", + "", + "O git describe pode ajudar a recuperar a sua orientação depois de você ter se movido muitos commits para trás ou para frente no histórico; isso pode acontecer depois de você completar um git bisect (uma busca para debug) ou quando se sentar no computador de um colega que acabou de voltar de férias." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Git describe lánzase do seguinte xeito:', - '', - '`git describe `', - '', - 'Onde `` é qualquera cousa que git poida resolver como unha referencia a un commit. Se non especificas a ref, git usará o commit actual no que se esté traballando (`HEAD`).', - '', - 'A resposta do comando é algo semellante a esto:', - '', - '`__g`', - '', - 'Onde `tag` é a tag anterior máis próxima na historia, `numCommits` é o número de commits de distancia ó tag, e `` é o hash do commit no que estamos.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "O git describe é chamado da seguinte forma:", + "", + "`git describe `", + "", + "Onde `` é qualquer coisa que o git possa resolver como uma referência a um commit. Se você não especificar o ref, o Git usa simplesmente o commit atual (`HEAD`).", + "", + "A saída do comando é mais ou menos assim:", + "", + "`__g`", + "", + "Onde `tag` é a tag ancestral mais próxima no histórico, `numCommits` é o número de commits de distância da tag, e `` é o hash do commit sendo descrito." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Vexamos un exemplo rápido. Para a árbore de abaixo:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vejamos um exemplo rápido. Para a árvore abaixo:" ], - 'afterMarkdowns': [ - 'O comando `git describe master` daría a saída:', - '', - '`v1_2_gC2`', - '', - 'Mentres que `git describe side` daría:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "O comando `git describe master` daria a saída:", + "", + "`v1_2_gC2`", + "", + "Enquanto `git describe side` daria:", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '¡Básicamente é iso do que trata git describe! Intenta descubrir algúns locais da árbore para sentir como se comporta o comando.', - '', - 'Cando estés listo, fai un commit para que o nivel remate. Esa é a gracia.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "É basicamente disso que se trata o git describe! Tente descrever alguns locais da árvore para sentir como o comando se comporta.", + "", + "Uma vez que você estiver satisfeito, apenas faça um commit que o nível será finalizado. Essa é de graça :P" ] } } ] }, - 'de_DE': { - 'childViews': [ + "gl" : { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Weil Tags so super als "Anker" im Repository dienen können bietet Git einen Befehl um zu *beschreiben* wo du dich relativ zum nächsten "Anker" (also Tag) befindest. Und der heißt `git describe`.', - '', - 'Er hilft dir dabei, dir einen Überblick zu verschaffen nachdem du viele Commits im Log zurück- oder vorgegangen bist; das kann vorkommen nachdem du ein `git bisect` (eine Fehlersuche) abgeschlossen hast oder wenn du dich an den Rechner eines Kollegen setzt, der gerade aus dem Urlaub gekommen ist.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Como as tags fan a función de \"áncora\" no repositorio, Git ten un comando para *describir* ónde podes estar ti en relación á \"áncora\" (tag) máis próxima. Ese comando chámase `git describe`!", + "", + "Git describe pode axudar a recuperar a túa posición despois de mover moitos commits para atrás ou para adiante na historia; esto pode suceder depois de que fagas un git bisect (unha búsqueda para atopar erros) ou cando te sentas no ordenador dun colega que chegou das vacacións." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Der Befehl ist folgendermaßen aufgebaut:', - '', - '`git describe `', - '', - 'Dabei ist `` jeder beliebige Name, der einem Commit zugeordnet ist (Branch, Tag etc). Wenn du keinen angibst benutzt Git `HEAD`, also den aktuellen Checkout.', - '', - 'Die Befehlsausgabe sieht so aus:', - '', - '`__g`', - '', - '`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den HEAD zeigt.', - '', - '**Achtung**: `` und `` erscheint nur, wenn HEAD nicht auf ein Tag zeigt. `git describe` verarbeitet standardmässig nur annotierte Tags. Um nicht annotierte tags zu sehen, verwende bitte`git describe --tags`.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe lánzase do seguinte xeito:", + "", + "`git describe `", + "", + "Onde `` é qualquera cousa que git poida resolver como unha referencia a un commit. Se non especificas a ref, git usará o commit actual no que se esté traballando (`HEAD`).", + "", + "A resposta do comando é algo semellante a esto:", + "", + "`__g`", + "", + "Onde `tag` é a tag anterior máis próxima na historia, `numCommits` é o número de commits de distancia ó tag, e `` é o hash do commit no que estamos." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Schauen wir uns das schnell an einem Beispiel an. Für den folgenden Baum:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos un exemplo rápido. Para a árbore de abaixo:" ], - 'afterMarkdowns': [ - 'Der Befehl `git describe master` würde folgendes ausgeben:', - '', - '`v1_2_gC2`', - '', - 'Wohingegen `git describe side` dies ausgeben würde:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "O comando `git describe master` daría a saída:", + "", + "`v1_2_gC2`", + "", + "Mentres que `git describe side` daría:", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Das ist so ziemlich alles, was es über `git describe` zu wissen gibt. Versuch ein paar Orte in diesem Level damit auszugeben, um ein Gefühl dafür zu bekommen.', - '', - 'Sobald du fertig bist, mach einfach einen Commit um den Level abzuschließen. Der geht auf\'s Haus. :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Básicamente é iso do que trata git describe! Intenta descubrir algúns locais da árbore para sentir como se comporta o comando.", + "", + "Cando estés listo, fai un commit para que o nivel remate. Esa é a gracia." ] } } ] }, - 'ja': { - 'childViews': [ + "de_DE": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'タグは、ソースリストの優秀な「アンカー(標識)」として作用するので、Gitには最も近く関係のある「アンカー」(タグの別名)を*記述するため*のコマンドがあります。そして、そのコマンドは`git describe`と呼ばれています!', - '', - 'Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(このような状況は、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を走らせ終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Weil Tags so super als \"Anker\" im Repository dienen können bietet Git einen Befehl um zu *beschreiben* wo du dich relativ zum nächsten \"Anker\" (also Tag) befindest. Und der heißt `git describe`.", + "", + "Er hilft dir dabei, dir einen Überblick zu verschaffen nachdem du viele Commits im Log zurück- oder vorgegangen bist; das kann vorkommen nachdem du ein `git bisect` (eine Fehlersuche) abgeschlossen hast oder wenn du dich an den Rechner eines Kollegen setzt, der gerade aus dem Urlaub gekommen ist." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Gitの`describe`は、以下の形式をとります:', - '', - '`git describe <参照>`', - '', - '`<参照>`には、Gitが解釈可能なコミットの参照表現(ブランチやタグの指定、コミットハッシュなど)をいれます。もし、何も入力しなかった場合、Gitは現在の位置のコミット(`HEAD`)を使います。', - '', - 'コマンドの結果は以下のようになります:', - '', - '`<タグ>_<コミット数>_g<ハッシュ>`', - '', - '`<タグ>`には履歴の一番最新のタグ名が、`<コミット数>`にはそのタグから幾つのコミットがあったか、`<ハッシュ>`はそのコミットのハッシュがそれぞれ入ります。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Der Befehl ist folgendermaßen aufgebaut:", + "", + "`git describe `", + "", + "Dabei ist `` jeder beliebige Name, der einem Commit zugeordnet ist (Branch, Tag etc). Wenn du keinen angibst benutzt Git `HEAD`, also den aktuellen Checkout.", + "", + "Die Befehlsausgabe sieht so aus:", + "", + "`__g`", + "", + "`` ist dabei der nächstliegende Tag in den Vorgänger-Commits, `` zeigt an, wieviele Commits dieses Tag entfernt ist und `` ist das SHA des Commits, auf den HEAD zeigt.", + "", + "**Achtung**: `` und `` erscheint nur, wenn HEAD nicht auf ein Tag zeigt. `git describe` verarbeitet standardmässig nur annotierte Tags. Um nicht annotierte tags zu sehen, verwende bitte`git describe --tags`." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '軽い例を見てみましょう。この木においての例は以下のようになります:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Schauen wir uns das schnell an einem Beispiel an. Für den folgenden Baum:" ], - 'afterMarkdowns': [ - 'コマンド`git describe master`の結果は以下のようになります:', - '', - '`v1_2_gC2`', - '', - 'さらに`git describe side`の結果は以下のようになります:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "Der Befehl `git describe master` würde folgendes ausgeben:", + "", + "`v1_2_gC2`", + "", + "Wohingegen `git describe side` dies ausgeben würde:", + "", + "`v2_1_gC4`" ], - 'command': 'git tag v2 C3', - 'beforeCommand': 'git commit; go -b side HEAD~1; gc; gc; git tag v1 C0' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '`describe`によってGitの情報が簡潔に全て記述されます!このレベルでは、このコマンドの感触をつかむため幾つかの場所で`describe`をしてみてください。', - '', - '終わったら、最新のコミットに行き一度コミットを行えばこのレベルを終了することができます。この先では、いくつかの挑戦課題を用意しています :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Das ist so ziemlich alles, was es über `git describe` zu wissen gibt. Versuch ein paar Orte in diesem Level damit auszugeben, um ein Gefühl dafür zu bekommen.", + "", + "Sobald du fertig bist, mach einfach einen Commit um den Level abzuschließen. Der geht auf's Haus. :P" ] } } ] }, - 'ru_RU': { - 'childViews': [ + "ja": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает, как далеко текущее состоянии от ближайшего тега. И эта команда называется `git describe`', - '', - 'Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали `git bisect` или если вы недавно вернулись из отпуска =)' + "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": "ModalAlert", + "options": { + "markdowns": [ + "Gitの`describe`は、以下の形式をとります:", + "", + "`git describe <参照>`", + "", + "`<参照>`には、Gitが解釈可能なコミットの参照表現(ブランチやタグの指定、コミットハッシュなど)をいれます。もし、何も入力しなかった場合、Gitは現在の位置のコミット(`HEAD`)を使います。", + "", + "コマンドの結果は以下のようになります:", + "", + "`<タグ>_<コミット数>_g<ハッシュ>`", + "", + "`<タグ>`には履歴の一番最新のタグ名が、`<コミット数>`にはそのタグから幾つのコミットがあったか、`<ハッシュ>`はそのコミットのハッシュがそれぞれ入ります。" ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Посмотрим на простой пример. Для дерева, показанного ниже:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "軽い例を見てみましょう。この木においての例は以下のようになります:" ], - 'afterMarkdowns': [ - 'Команда `git describe master` выведет:', - '', - '`v1_2_gC2`', - '', - 'Тогда как `git describe side` выведет:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "コマンド`git describe master`の結果は以下のようになります:", + "", + "`v1_2_gC2`", + "", + "さらに`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' + "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`. Попробуй выполнить команду на нескольких коммитах.', - '', - 'Как только наиграешься, просто сделай один коммит, и уровень будет пройден.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "`describe`によってGitの情報が簡潔に全て記述されます!このレベルでは、このコマンドの感触をつかむため幾つかの場所で`describe`をしてみてください。", + "", + "終わったら、最新のコミットに行き一度コミットを行えばこのレベルを終了することができます。この先では、いくつかの挑戦課題を用意しています :P" ] } } ] }, - 'ko': { - 'childViews': [ + "ru_RU": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - '커밋 트리에서 태그가 훌륭한 "닻"역할을 하기 때문에, git에는 여러분이 가장 가까운 "닻(태그)"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!', - '', - 'Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает, как далеко текущее состоянии от ближайшего тега. И эта команда называется `git describe`", + "", + "Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали `git bisect` или если вы недавно вернулись из отпуска =)" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Git describe 는 다음의 형태를 가지고 있습니다:', - '', - '`git describe `', - '', - '``에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).', - '', - '명령어의 출력은 다음과 같은 형태로 나타납니다:', - '', - '`__g`', - '', - '`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. ``는 묘사하고있는 커밋의 해시를 나타냅니다.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe выглядит примерно так:", + "", + "`git describe `", + "", + "Где `ref` — это что-либо, что указывает на конкретный коммит. Если не указать `ref`, то git будет считать, что указано текущее положение (`HEAD`).", + "", + "Вывод команды выглядит примерно так:", + "", + "`__g`", + "", + "Где `tag` – это ближайший тег в истории изменений, `numCommits` – это на сколько далеко мы от этого тега, а `hash` – это хеш коммита, который описывается." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '간단한 예제를 확인해 봅시다. 아래의 트리에서:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Посмотрим на простой пример. Для дерева, показанного ниже:" ], - 'afterMarkdowns': [ - '`git describe master` 명령은 다음을 출력합니다:', - '', - '`v1_2_gC2`', - '', - '`git describe side`는 다음을 출력합니다:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "Команда `git describe master` выведет:", + "", + "`v1_2_gC2`", + "", + "Тогда как `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' + "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를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.', - '', - '준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Это, в общем-то, всё, что можно сказать про `git describe`. Попробуй выполнить команду на нескольких коммитах.", + "", + "Как только наиграешься, просто сделай один коммит, и уровень будет пройден." ] } } ] }, - 'uk': { - 'childViews': [ + "ko": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Git Describe', - '', - 'Через те, що таги є такими чудовими "орієнтирами" по коду, git також має команду *описати* (describe) де ти є відносно найближчого "орієнтира" (тобто тага). І ця команда називається `git describe`!', - '', - 'Git describe допоможе тобі знайти себе після того як ти перестрибнеш на кілька комітів по історії вперед чи назад; це може статися після того як ти закінчив git bisect (пошук-дебаггер) чи коли тебе попросили підійти до колеги, котрий щойно прийшов з відпустки.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "커밋 트리에서 태그가 훌륭한 \"닻\"역할을 하기 때문에, git에는 여러분이 가장 가까운 \"닻(태그)\"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!", + "", + "Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Git describe має наступну форму:', - '', - '`git describe <посилання>`', - '', - 'Де `<посилання>` -- це будь-що, що вказує на конкретний коміт. Якщо ти не вкажеш посилання, git використає поточну локацію (`HEAD`).', - '', - 'Вивід команди виглядає як:', - '', - '`<таг>_<к-ть комітів>_g<хеш>`', - '', - 'де `таг` -- це найближчий попередній таг з історії; `к-ть комітів` -- це наскільки далеко цей таг в історії, а `<хеш>` -- це хеш коміту, який описується.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe 는 다음의 형태를 가지고 있습니다:", + "", + "`git describe `", + "", + "``에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).", + "", + "명령어의 출력은 다음과 같은 형태로 나타납니다:", + "", + "`__g`", + "", + "`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. ``는 묘사하고있는 커밋의 해시를 나타냅니다." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Розгляньмо короткий приклад. Для дерева нижче:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "간단한 예제를 확인해 봅시다. 아래의 트리에서:" ], - 'afterMarkdowns': [ - 'Команда `git describe master` виведе:', - '', - '`v1_2_gC2`', - '', - 'коли `git describe side` виведе:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "`git describe master` 명령은 다음을 출력합니다:", + "", + "`v1_2_gC2`", + "", + "`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' + "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. Спробуй виконати describe для різних місць в дереві комітів щоб набити руку.', - '', - 'Як будеш готовий, просто закоміть щось щоб закінчити цей рівень. Трохи шари :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.", + "", + "준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P" ] } } ] }, - 'vi': { - 'childViews': [ + "uk": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '### Mô tả của Git', - '', - 'Bởi gì thẻ đóng vai trò như là "mỏ neo" trên cây lịch sử rất tốt rồi, git cũng có lệnh để *mô tả* tương quan của bạn dến vị trí "mỏ neo" (thẻ) gần nhất. Và đó là `git describe`!', - '', - '`git descripe` có thể giúp bạn định hướng sau khi dịch chuyển qua lại nhiều lần trên cây lịch sử; đặc biệt là sau khi sử dụng `git bisect` (công cụ tìm kiếm lỗi của git) hoặc khi sử dụng máy của đồng nghiệp mới đi nghỉ mát về.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Git Describe", + "", + "Через те, що таги є такими чудовими \"орієнтирами\" по коду, git також має команду *описати* (describe) де ти є відносно найближчого \"орієнтира\" (тобто тага). І ця команда називається `git describe`!", + "", + "Git describe допоможе тобі знайти себе після того як ти перестрибнеш на кілька комітів по історії вперед чи назад; це може статися після того як ти закінчив git bisect (пошук-дебаггер) чи коли тебе попросили підійти до колеги, котрий щойно прийшов з відпустки." ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Cú pháp sử dụng Git describe như sau:', - '', - '`git describe `', - '', - 'Trong đó `` là bất kỳ thứ gì mà git có thể dùng để xác định commit. Nếu bạn không chỉ định tham chiếu, git sẽ dùng vị trí hiện tại của bạn (`HEAD`).', - '', - 'Đầu ra của câu lệnh sẽ như sau:', - '', - '`__g`', - '', - 'Trong đó `` là thẻ tổ tiên gần nhất, `` là số lượng commit tính từ tham chiếu đến thẻ, và `` là mã băm của commit được mô tả.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Git describe має наступну форму:", + "", + "`git describe <посилання>`", + "", + "Де `<посилання>` -- це будь-що, що вказує на конкретний коміт. Якщо ти не вкажеш посилання, git використає поточну локацію (`HEAD`).", + "", + "Вивід команди виглядає як:", + "", + "`<таг>_<к-ть комітів>_g<хеш>`", + "", + "де `таг` -- це найближчий попередній таг з історії; `к-ть комітів` -- це наскільки далеко цей таг в історії, а `<хеш>` -- це хеш коміту, який описується." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Cùng xem nhanh một ví dụ trên cây lịch sử phía dưới:' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Розгляньмо короткий приклад. Для дерева нижче:" ], - 'afterMarkdowns': [ - 'Câu lệnh `git describe master` sẽ cho kết quả:', - '', - '`v1_2_gC2`', - '', - 'Trong khi `git describe side` sẽ cho kết quả:', - '', - '`v2_1_gC4`' + "afterMarkdowns": [ + "Команда `git describe master` виведе:", + "", + "`v1_2_gC2`", + "", + "коли `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' + "command": "git tag v2 C3", + "beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Từng đó thông tin là khá đủ về git describe! Hãy thử dùng `git describe` trên vài vị trí để hiểu về lệnh này.', - '', - 'Một khi bạn đã sẵn sàng thì chỉ cần commit 1 lần là qua bài này. Bài này dễ chơi rồi nhé :P' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ось і все що ти маєш знати про git describe. Спробуй виконати describe для різних місць в дереві комітів щоб набити руку.", + "", + "Як будеш готовий, просто закоміть щось щоб закінчити цей рівень. Трохи шари :P" + ] + } + } + ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Mô tả của Git", + "", + "Bởi gì thẻ đóng vai trò như là \"mỏ neo\" trên cây lịch sử rất tốt rồi, git cũng có lệnh để *mô tả* tương quan của bạn dến vị trí \"mỏ neo\" (thẻ) gần nhất. Và đó là `git describe`!", + "", + "`git descripe` có thể giúp bạn định hướng sau khi dịch chuyển qua lại nhiều lần trên cây lịch sử; đặc biệt là sau khi sử dụng `git bisect` (công cụ tìm kiếm lỗi của git) hoặc khi sử dụng máy của đồng nghiệp mới đi nghỉ mát về." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Cú pháp sử dụng Git describe như sau:", + "", + "`git describe `", + "", + "Trong đó `` là bất kỳ thứ gì mà git có thể dùng để xác định commit. Nếu bạn không chỉ định tham chiếu, git sẽ dùng vị trí hiện tại của bạn (`HEAD`).", + "", + "Đầu ra của câu lệnh sẽ như sau:", + "", + "`__g`", + "", + "Trong đó `` là thẻ tổ tiên gần nhất, `` là số lượng commit tính từ tham chiếu đến thẻ, và `` là mã băm của commit được mô tả." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Cùng xem nhanh một ví dụ trên cây lịch sử phía dưới:" + ], + "afterMarkdowns": [ + "Câu lệnh `git describe master` sẽ cho kết quả:", + "", + "`v1_2_gC2`", + "", + "Trong khi `git describe side` sẽ cho kết quả:", + "", + "`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": [ + "Từng đó thông tin là khá đủ về git describe! Hãy thử dùng `git describe` trên vài vị trí để hiểu về lệnh này.", + "", + "Một khi bạn đã sẵn sàng thì chỉ cần commit 1 lần là qua bài này. Bài này dễ chơi rồi nhé :P" ] } } diff --git a/src/levels/mixed/grabbingOneCommit.js b/src/levels/mixed/grabbingOneCommit.js index 5ad92542..30c527fd 100644 --- a/src/levels/mixed/grabbingOneCommit.js +++ b/src/levels/mixed/grabbingOneCommit.js @@ -19,6 +19,7 @@ exports.level = { "fr_FR": "Choisir seulement 1 commit", "de_DE": "Einen Commit pflücken", "es_AR": "Tomando un único commit", + "es_ES": "Tomando un único commit", "pt_BR": "Pegando um único commit", "gl" : "Escollendo un único commit", "ja": "一つのコミットのみを取得", @@ -33,6 +34,7 @@ exports.level = { "de_DE": "Vergiss nicht: hier kommst du mit interaktivem Rebase oder Cherry-Picking weiter", "fr_FR": "Souvenez-vous, les rebases interactifs ou cherry-pick sont vos amis ici.", "es_AR": "Acordate, el rebase interactivo o cherry-pick son tus amigos acá", + "es_ES": "Recuerda, el rebase interactivo y el cherry-pick son tus amigos", "pt_BR": "Lembre-se, o rebase interativo ou o cherry-pick são seus amigos aqui", "gl" : "Recorda, o rebase interativo ou cherry-pick é un dos teus colegas aquí", "ja": "このレベルではインタラクティブモードのrebaseやcherry-pickがクリアのカギです", @@ -159,6 +161,45 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Commits localmente stackeados", + "", + "Esta es una escena que suele pasar cuando uno desarrolla: estoy tratando de encontrar un bug bastante escurridizo. Para ayudar en mi tarea de detective, agrego un par de comandos de debug, y algunas sentencias para imprimir el estado de mi sistema.", + "", + "Todas estas cosas de imprimir y debuggear estan en su propia rama. Finalmente encuentro el problema, lo soluciono, ¡y disfruto!", + "", + "El único problema es que ahora necesito llevar mi `bugFix` a la rama `master`. Si simplemente fast-forwardeo `master`, entonces `master` va a tener todos mis agregados de debugging, lo cual no es deseable. Tiene que haber otro modo..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Necesitamos decirle a git que sólo copie uno de los commits. Esto es tal como los niveles anteriores de mover commits por ahí -- podemos usar los mismos comandos:", + "", + "* `git rebase -i`", + "* `git cherry-pick`", + "", + "Para conseguir este resultado." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este es un nivel más avanzado, así que debes decidir cuál de los dos comandos quieres usar, pero para completar el nivel asegurate de que `master` recibe el commit que `bugFix` referencia." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/mixed/jugglingCommits.js b/src/levels/mixed/jugglingCommits.js index d430db0f..cf500f73 100644 --- a/src/levels/mixed/jugglingCommits.js +++ b/src/levels/mixed/jugglingCommits.js @@ -23,6 +23,7 @@ exports.level = { "de_DE": "Jonglieren mit Commits", "fr_FR": "Jongler avec les commits", "es_AR": "Haciendo malabares con los commits", + "es_ES": "Haciendo malabares con los commits", "pt_BR": "Malabarismo com commits", "gl" : "Argallando cos commits", "ja": "コミットをやりくりする", @@ -37,6 +38,7 @@ exports.level = { "de_DE": "Der erste Befehl ist git rebase -i HEAD~2", "fr_FR": "La première commande est git rebase -i HEAD~2", "es_AR": "El primer comando es git rebase -i HEAD~2", + "es_ES": "El primer comando es git rebase -i HEAD~2", "pt_BR": "O primeiro comando é git rebase -i HEAD~2", "gl" : "O primeiro comando é git rebase -i HEAD~2", "ja": "最初に打つコマンドはgit rebase -i HEAD~2", @@ -125,7 +127,7 @@ exports.level = { "markdowns": [ "## Haciendo malabares con los commits", "", - "Estaes otra situación algo común. Tenés algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).", + "Esta es otra situación algo común. Tenés algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).", "", "El tema es que a veces tenés que hacer una pequeña modificación a un commit previo. En este caso, la gente de diseño requiere que cambiemos ligeramente las dimensiones de `newImage`, ¡incluso aunque ese commit ya esté atrás en nuestra historia!" ] @@ -140,7 +142,7 @@ exports.level = { "* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de todo con `git rebase -i`", "* Vamos a hacer `commit --amend` para aplicar la ligera modificación", "* 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)", + "* Finalmente, vamos a mover master a esta parte actualizada de nuestro á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.", "", @@ -152,6 +154,41 @@ exports.level = { }, ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo malabares con los commits", + "", + "Esta es otra situación algo común. Tienes algunos cambios (`newImage`) y otro conjunto de cambios (`caption`) que están relacionados, entonces están apilados en tu repositorio uno encima del otro (es decir, uno después del otro).", + "", + "El tema es que a veces tienes que hacer una pequeña modificación a un commit previo. En este caso, la gente de diseño requiere que cambiemos ligeramente las dimensiones de `newImage`, ¡incluso aunque ese commit ya se encuentre atrás en nuestra historia!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Superaremos esta dificultad haciendo lo siguiente:", + "", + "* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de los demás con `git rebase -i`", + "* Vamos a hacer `commit --amend` para aplicar la ligera modificación", + "* Después vamos a reordenar los commits a como estaban con `git rebase -i`", + "* Finalmente, vamos a mover master a esta parte actualizada de nuestro á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.", + "", + "Por último, presta atención al estado final -- 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": { "childViews": [ { diff --git a/src/levels/mixed/jugglingCommits2.js b/src/levels/mixed/jugglingCommits2.js index 9cd9670e..9ed088f7 100644 --- a/src/levels/mixed/jugglingCommits2.js +++ b/src/levels/mixed/jugglingCommits2.js @@ -21,6 +21,7 @@ exports.level = { "en_US": "Juggling Commits #2", "fr_FR": "Jongler avec les commits #2", "es_AR": "Haciendo malabares con los commits #2", + "es_ES": "Haciendo malabares con los commits #2", "pt_BR": "Malabarismo com commits #2", "gl" : "Argallando cos commits #2", "de_DE": "Jonglieren mit Commits Teil 2", @@ -35,6 +36,7 @@ exports.level = { "en_US": "Don't forget to forward master to the updated changes!", "fr_FR": "N'oubliez pas d'appliquer les changements depuis la branche master", "es_AR": "¡No te olvides de avanzar master a los cambios actualizados!", + "es_ES": "¡No te olvides de avanzar master a los cambios actualizados!", "pt_BR": "Não se esqueça de avançar a referência do master para as mudanças efetuadas!", "gl" : "¡Non te esquezas de avanzar master ós cambios actualizados!", "de_DE": "Vergiss nicht den master auf die aktuelle Version vorzuspulen", @@ -176,6 +178,49 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo malabares con los commits #2", + "", + "*Si no completaste Haciendo malabares con los commits #1 (el nivel anterior), hazlo antes de continuar*", + "", + "Como viste en el último nivel, usamos `rebase -i` para reordenar los commits. Una vez que el commit que queríamos cambiar se encontraba arriba de todo, pudimos `--amend`earlo fácilmente y reordenarlo a como queríamos.", + "", + "El único problema con esto es que hay mucho reordenamiento, que puede generar conflictos al rebasear. Veamos otro método usando `git cherry-pick`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Recuerda que git cherry-pick va a traer un commit de cualquier parte del árbol sobre HEAD (siempre que ese otro commit no sea un ancestro de HEAD).", + "", + "Una pequeña demo para refrescar la idea:" + ], + "afterMarkdowns": [ + "¡Bien! Sigamos..." + ], + "command": "git cherry-pick C2", + "beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Entonces, en este nivel vamos a lograr el mismo objetivo de corregir `C2`, pero sin usar `rebase -i`. Te dejo a ti el darte cuenta cómo :D", + "", + "Recuerda, la cantidad exacta de apóstrofes (') en el commit no es importante, sólo la diferencia relativa. Por ejemplo, le voy a dar una puntuación a un árbol que coincida con el objetivo pero cuyos commits tengan todos un apóstrofe extra" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { @@ -354,7 +399,7 @@ exports.level = { "markdowns": [ "## 提交的技巧 #2", "", - "*如果你还没有完成“提交的技巧 #1”(前一关)的话,请选通过以后再来!*", + "*如果你还没有完成“提交的技巧 #1”(前一关)的话,请先通过以后再来!*", "", "正如你在上一关所见到的,我们可以使用 `rebase -i` 对提交记录进行重新排序。只要把我们想要的提交记录挪到最前端,我们就可以很轻松的用 `--amend` 修改它,然后把它们重新排成我们想要的顺序。", "", diff --git a/src/levels/mixed/tags.js b/src/levels/mixed/tags.js index 23b28b77..96cffdd0 100644 --- a/src/levels/mixed/tags.js +++ b/src/levels/mixed/tags.js @@ -7,6 +7,7 @@ exports.level = { "de_DE": "Git Tags", "ja" : "Gitのタグ", "es_AR": "Tags en git", + "es_ES": "Tags en git", "pt_BR": "Tags no Git", "gl" : "Etiquetas en git", "fr_FR": "Git Tags", @@ -23,6 +24,7 @@ exports.level = { "de_DE": "Du kannst den Checkout entweder direkt auf den Commit oder das Tag machen.", "ja" : "コミットを直接チェックアウトできますが、簡単にタグでチェックアウトすることも可能!", "es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!", + "es_ES": "Puedes hacer checkout directamente el commit, ¡o simplemente el tag!", "pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!", "gl" : "Podes saltar directamente ó commit, ¡ou a etiqueta, que é máis doado!", "zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上", @@ -293,6 +295,58 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Tags en git", + "", + "Como aprendiste en lecciones anteriores, las ramas pueden moverse fácilmente, y en general van referenciando distintos commits a medida que el trabajo se va completando en ellas. Las ramas cambian fácilmente, suelen ser temporales, y siempre cambiantes.", + "", + "Si ese es el caso, te podrías estar preguntando si hay una manera de marcar *permanentemente* puntos en la historia de tu proyecto. Para cosas como releases mayores o grandes merges, ¿hay algún modo de marcar esos commits con algo más permanente que un branch?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Seguro que hay! Los tags de git soportan exactamente este caso de uso -- marcan (bastante) permanentemente determinados commits como \"hitos\" que puedes referenciar como a un branch.", + "", + "Aún más importante, los tags no avanzan cuando se crean nuevos commits. No puedes hacer checkout a un tag y completar el trabajo en ese tag - los tags son marcas fijas en el árbol de commits que designan ciertos puntos.", + "", + "Veamos cómo se ven los tags en práctica..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Creemos un tag en `C1`, que es nuestro prototipo de la versión 1" + ], + "afterMarkdowns": [ + "¡Ahí está! Bastante simple. Nombramos al tag `v1` y referenciamos explícitamente al commit `C1`. Si no especificas el commit, git va a usar al apuntado por `HEAD`" + ], + "command": "git tag v1 C1", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, simplemente crea los tags en la visualización final y después haz checkout con `v1`. Observa cómo entras en el estado detached -- esto es porque no puedes hacer commit directamente sobre el tag `v1`.", + "", + "En el próximo nivel vamos a examinar un caso de uso más interesante para los tags." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/cherryPick.js b/src/levels/rampup/cherryPick.js index 23026ff0..91fb8135 100644 --- a/src/levels/rampup/cherryPick.js +++ b/src/levels/rampup/cherryPick.js @@ -12,6 +12,7 @@ exports.level = { "de_DE": "Einführung Cherry-picking", "ja" : "cherry-pick入門", "es_AR": "Introducción a cherry-pick", + "es_ES": "Introducción a cherry-pick", "pt_BR": "Introdução ao cherry-pick", "gl" : "Introuducción a cherry-pick", "zh_CN": "Git Cherry-pick", @@ -27,6 +28,7 @@ exports.level = { "de_DE": "git cherry-pick gefolgt von Commit-Namen.", "ja" : "git cherry-pickの後にコミット名を追加", "es_AR": "git cherry-pick seguido de los nombres de los commits", + "es_ES": "git cherry-pick seguido de los nombres de los commits", "pt_BR": "git cherry-pick seguido dos nomes dos commits", "gl" : "git cherry-pick seguido das referencias a commits", "zh_CN": "git cherry-pick 后面要跟提交的名字", @@ -208,6 +210,63 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moviendo el trabajo por ahí", + "", + "Hasta ahora cubrimos lo básico de git -- hacer commits, crear ramas, y movernos por el árbol de commits. Estos conceptos alcanzan para aprovechar el 90% del poder de los repositorios de git y cubrir las necesidades principales de los desarrolladores.", + "", + "El 10% restante, sin embargo, puede ser bastante útil en flujos de trabajo complejos (o cuando te metiste en algún problema complicado). El próximo concepto que vamos a cubrir es el de \"mover el trabajo por ahí\" -- en otras palabras, una forma que tienen los desarrolladores de decir \"Quiero este trabajo aquí y este otro allí\" de una manera precisa, elocuente y flexible.", + "", + "Puede parecer un montón, pero es un concepto bastante simple." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Cherry-pick", + "", + "El primer comando en esta serie se llama `git cherry-pick`. Tiene la siguiente forma:", + "", + " `git cherry-pick <...>`", + "", + "Es una manera bastante directa de decir que quieres copiar una serie de commits sobre tu ubicación actual (`HEAD`). Personalmente amo `cherry-pick` porque hay muy poca magia involucrada y es bastante simple de entender.", + "", + "¡Veamos una demo!", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "A continuación tenemos un repositorio con algo de trabajo en la rama `side` que queremos copiar a `master`. Podríamos lograrlo con un rebase (y ya aprendimos cómo), pero veamos cómo se comporta cherry-pick." + ], + "afterMarkdowns": [ + "¡Eso es todo! Queríamos los commits `C2` y `C4` y git los aplicó justo donde estábamos. ¡Tan simple como eso!" + ], + "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": [ + "Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a master. Puedes ver qué commits queremos en la visualización del objetivo.", + "" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/detachedHead.js b/src/levels/rampup/detachedHead.js index ecfdd436..adf557a6 100644 --- a/src/levels/rampup/detachedHead.js +++ b/src/levels/rampup/detachedHead.js @@ -1,1043 +1,1123 @@ exports.level = { - 'goalTreeString': '{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"C4","id":"HEAD"}}', - 'solutionCommand': 'git checkout C4', - 'startTree': '{"branches":{"master":{"target":"C2","id":"master"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}', - 'name': { - 'en_US': 'Detach yo\' HEAD', - 'es_AR': 'Desatacheá tu HEAD', - 'pt_BR': 'Solte a sua cabeça', - 'gl': 'Abandona o teu HEAD', - 'fr_FR': 'Détacher votre HEAD', - 'zh_CN': '分离 HEAD', - 'zh_TW': '分離 HEAD', - 'de_DE': 'Den Kopf abtrennen', - 'ja': 'HEADの分離', - 'ru_RU': 'Теряем голову, или detached HEAD', - 'ko': 'HEAD 분리하기', - 'uk': 'Втрачаємо голову чи detached HEAD', - 'vi': 'Tháo đầu cái nào' + "goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"C4\",\"id\":\"HEAD\"}}", + "solutionCommand": "git checkout C4", + "startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\"},\"bugFix\":{\"target\":\"C4\",\"id\":\"bugFix\"}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}", + "name": { + "en_US": "Detach yo' HEAD", + "es_AR": "Desatacheá tu HEAD", + "es_ES": "Desatachea tu HEAD", + "pt_BR": "Solte a sua cabeça", + "gl" : "Abandona o teu HEAD", + "fr_FR": "Détacher votre HEAD", + "zh_CN": "分离 HEAD", + "zh_TW": "分離 HEAD", + "de_DE": "Den Kopf abtrennen", + "ja" : "HEADの分離", + "ru_RU": "Теряем голову, или detached HEAD", + "ko" : "HEAD 분리하기", + "uk": "Втрачаємо голову чи detached HEAD", + 'vi': "Tháo đầu cái nào" }, - 'hint': { - 'en_US': 'Use the label (hash) on the commit for help!', - 'es_AR': '¡Usá la etiqueta (hash) sobre el commit para ayudarte!', - 'pt_BR': 'Use o identificador (hash) sobre o commit para te ajudar!', - 'gl': '¡Usa a etiqueta (hash) sobre o commit para axudarte!', - 'de_DE': 'Benutze den Bezeichner (den Hash) des Commits.', - 'ja': 'コミットのラベル(hash)を使用', - 'fr_FR': 'Utilisez le label (identifiant) du commit pour aider !', - 'zh_TW': '使用 commit 上的標籤(hash)來幫助你!', - 'zh_CN': '使用提交记录上的标签(哈希值)来指定提交记录!', - 'ru_RU': 'Ориентируйся по идентификаторам (hash) коммитов.', - 'ko': '커밋에 있는 라벨(hash)을 활용하세요!', - 'uk': 'Орієнтуйся по індентифікаторам (hash) комітів.', - 'vi': 'Dùng mã băm (hash) của commit để hoàn thành!' + "hint": { + "en_US": "Use the label (hash) on the commit for help!", + "es_AR": "¡Usá la etiqueta (hash) sobre el commit para ayudarte!", + "es_ES": "¡Usa la etiqueta (hash) sobre el commit para ayudarte!", + "pt_BR": "Use o identificador (hash) sobre o commit para te ajudar!", + "gl" : "¡Usa a etiqueta (hash) sobre o commit para axudarte!", + "de_DE": "Benutze den Bezeichner (den Hash) des Commits.", + "ja" : "コミットのラベル(hash)を使用", + "fr_FR": "Utilisez le label (identifiant) du commit pour aider !", + "zh_TW": "使用 commit 上的標籤(hash)來幫助你!", + "zh_CN": "使用提交记录上的标签(哈希值)来指定提交记录!", + "ru_RU": "Ориентируйся по идентификаторам (hash) коммитов.", + "ko" : "커밋에 있는 라벨(hash)을 활용하세요!", + "uk": "Орієнтуйся по індентифікаторам (hash) комітів.", + "vi": "Dùng mã băm (hash) của commit để hoàn thành!" }, - 'startDialog': { - 'en_US': { - 'childViews': [ + "startDialog": { + "en_US": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Moving around in Git', - '', - 'Before we get to some of the more advanced features of Git, it\'s important to understand different ways to move through the commit tree that represents your project.', - '', - 'Once you\'re comfortable moving around, your powers with other git commands will be amplified!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moving around in Git", + "", + "Before we get to some of the more advanced features of Git, it's important to understand different ways to move through the commit tree that represents your project.", + "", + "Once you're comfortable moving around, your powers with other git commands will be amplified!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'First we have to talk about "HEAD". HEAD is the symbolic name for the currently checked out commit -- it\'s essentially what commit you\'re working on top of.', - '', - 'HEAD always points to the most recent commit which is reflected in the working tree. Most git commands which make changes to the working tree will start by changing HEAD.', - '', - 'Normally HEAD points to a branch name (like bugFix). When you commit, the status of bugFix is altered and this change is visible through HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "First we have to talk about \"HEAD\". HEAD is the symbolic name for the currently checked out commit -- it's essentially what commit you're working on top of.", + "", + "HEAD always points to the most recent commit which is reflected in the working tree. Most git commands which make changes to the working tree will start by changing HEAD.", + "", + "Normally HEAD points to a branch name (like bugFix). When you commit, the status of bugFix is altered and this change is visible through HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Let\'s see this in action. Here we will reveal HEAD before and after a commit.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Let's see this in action. Here we will reveal HEAD before and after a commit." ], - 'afterMarkdowns': [ - 'See! HEAD was hiding underneath our `master` branch all along.' + "afterMarkdowns": [ + "See! HEAD was hiding underneath our `master` branch all along." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Detaching HEAD', - '', - 'Detaching HEAD just means attaching it to a commit instead of a branch. This is what it looks like beforehand:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Detaching HEAD", + "", + "Detaching HEAD just means attaching it to a commit instead of a branch. This is what it looks like beforehand:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'And now it\'s', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "And now it's", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'To complete this level, let\'s detach HEAD from `bugFix` and attach it to the commit instead.', - '', - 'Specify this commit by its hash. The hash for each commit is displayed on the circle that represents the commit.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "To complete this level, let's detach HEAD from `bugFix` and attach it to the commit instead.", + "", + "Specify this commit by its hash. The hash for each commit is displayed on the circle that represents the commit." ] } } ] }, - 'es_AR': { - 'childViews': [ + "es_AR": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Moviéndose por ahí con Git', - '', - 'Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.', - '', - 'Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moviéndose por ahí con Git", + "", + "Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.", + "", + "Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'Primero tenemos que hablar de "HEAD". HEAD es el nombre simbólico del commit actualmente checkouteado -- es, básicamente, el commit sobre el que estás trabajando.', - '', - 'HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.', - '', - 'Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando commiteás, el estado de bugFix se altera y este cambio es visible a través de HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Primero tenemos que hablar de \"HEAD\". HEAD es el nombre simbólico del commit actualmente checkouteado -- es, básicamente, el commit sobre el que estás trabajando.", + "", + "HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.", + "", + "Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando commiteás, el estado de bugFix se altera y este cambio es visible a través de HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Veamoslo en acción. Acá vamos a ver a HEAD antes y después de un commit.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veámoslo en acción. Acá vamos a ver a HEAD antes y después de un commit." ], - 'afterMarkdowns': [ - '¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo.' + "afterMarkdowns": [ + "¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Detacheando HEAD', - '', - 'Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Detacheando HEAD", + "", + "Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'Y así queda ahora:', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "Y así queda ahora:", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Para completar este nivel, detacheemos HEAD de `bugFix` y ataccheemosla al commit, en cambio.', - '', - 'Especificá este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, detacheemos HEAD de `bugFix` y atacheemosla al commit, en cambio.", + "", + "Especificá este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa." ] } } ] }, - 'pt_BR': { - 'childViews': [ + "es_ES": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Movendo-se no Git', - '', - 'Antes de seguirmos para algumas funcionalidades mais avançadas do Git, é importante entender as diferentes formas de se mover através da árvore de commits que representa o seu projeto.', - '', - 'Uma vez que você estiver confortável em se mover ao redor, seus poderes utilizando outros comandos do Git serão amplificados!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Moviéndote por ahí con Git", + "", + "Antes de meternos en algunas de las funcionalidades más avanzadas de git, es importante entender las distintas maneras de moverse por el árbol de commits que representa tu proyecto.", + "", + "Una vez que estés cómodo moviendote por ahí, tus poderes con los otros comandos de git ¡van a amplificarse!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'Primeiro temos que conversar sobre a "cabeça" ("HEAD"). HEAD é um nome simbólico para o commit atualmente ativo (que sofreu checkout por último) -- é essencialmente o commit sobre o qual você está trabalhando no momento.', - '', - 'O HEAD sempre aponta para o commit mais recentemente copiado sobre a árvore de trabalho (arquivos do projeto). A maioria dos comandos do git que realizam mudanças sobre a árvore de trabalho começarão mudando o HEAD.', - '', - 'Normalmente o HEAD aponta para o nome de um ramo (por exemplo, bugFix). Quando você commita, o status do bugFix é alterado e essa mudança ocorre também sobre o HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Primero tenemos que hablar de \"HEAD\". HEAD es el nombre simbólico del commit sobre el que hemos hecho checkout -- es, básicamente, el commit sobre el que estás trabajando.", + "", + "HEAD siempre apunta al commit más reciente, reflejado en el árbol de commits. La mayoría de los comandos de git que hacen cambios al árbol de commits empiezan modificando HEAD.", + "", + "Normalmente HEAD apunta al nombre de una rama (como bugFix). Cuando creas un commit, el estado de bugFix se altera y este cambio es visible a través de HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Vejamos isto em ação. Aqui vamos mostrar o HEAD antes e depois de um commit.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit." ], - 'afterMarkdowns': [ - 'Veja! O HEAD estava se escondendo ao lado do nosso `master` esse tempo todo.' + "afterMarkdowns": [ + "¡Ves! HEAD estuvo oculta bajo nuestra rama `master` todo este tiempo." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Soltando a cabeça', - '', - 'Soltar o HEAD significa anexá-lo a um commit em vez de anexá-lo a um ramo. Antes do estado solto ("detached"), é assim como se parece:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Detacheando HEAD", + "", + "Detachear (_des-adjuntar_) HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'E agora é', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "Y así queda ahora:", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Para completar este nível, vamos soltar o HEAD do `bugFix` e em vez disso anexá-lo ao commit.', - '', - 'Especifique o commit por meio do hash correspondente. O hash de cada commit é mostrado dentro do círculo que representa o commit (a letra C seguida de um número).' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, detaheemos HEAD de `bugFix` y atacheemosla al commit, en cambio.", + "", + "Especifica este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa." ] } } ] }, - 'gl': { - 'childViews': [ + "pt_BR": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Movéndose en Git', - '', - 'Antes de seguir con algunhas das funcionalidades máis avanzadas de Git, é importante entender as diferentes formas de se mover a través da árbore de commits que representa o teu proxecto.', - '', - '¡Unha vez que te sintas ben ó teu redor, os teus poderes empregando outros comandos de git serán amplificados!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Movendo-se no Git", + "", + "Antes de seguirmos para algumas funcionalidades mais avançadas do Git, é importante entender as diferentes formas de se mover através da árvore de commits que representa o seu projeto.", + "", + "Uma vez que você estiver confortável em se mover ao redor, seus poderes utilizando outros comandos do Git serão amplificados!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'Primeiro temos que falar sobre o "commit actual" ("HEAD"). HEAD é un nome simbólico para o commit atualmente ativo (o último checkout que se fixo) -- é esencialmente o commit sobre o cal estás traballando nese momento.', - '', - 'O HEAD sempre apunta para o commit máis recentemente copiado sobre a árbore de traballo (arquivos do proxecto). A maioría dos comandos de git que fan algún cambio sobre a árbore de traballo empezarán movendo o HEAD.', - '', - 'Normalmente o HEAD apunta para o nome dunha rama (por exemplo, bugFix). Quando fagas commit, o status do bugFix é alterado e ese cambio ocorre tamén sobre o HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Primeiro temos que conversar sobre a \"cabeça\" (\"HEAD\"). HEAD é um nome simbólico para o commit atualmente ativo (que sofreu checkout por último) -- é essencialmente o commit sobre o qual você está trabalhando no momento.", + "", + "O HEAD sempre aponta para o commit mais recentemente copiado sobre a árvore de trabalho (arquivos do projeto). A maioria dos comandos do git que realizam mudanças sobre a árvore de trabalho começarão mudando o HEAD.", + "", + "Normalmente o HEAD aponta para o nome de um ramo (por exemplo, bugFix). Quando você commita, o status do bugFix é alterado e essa mudança ocorre também sobre o HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vejamos isto em ação. Aqui vamos mostrar o HEAD antes e depois de um commit." ], - 'afterMarkdowns': [ - 'Ves! O HEAD estivo ó lado do noso `master` todo este tempo.' + "afterMarkdowns": [ + "Veja! O HEAD estava se escondendo ao lado do nosso `master` esse tempo todo." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Soltando a cabeza', - '', - 'Soltar o HEAD significa apuntar a un commit en vez de apuntar a unha rama. Antes do estado solo ("detached"), é así como aparece:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Soltando a cabeça", + "", + "Soltar o HEAD significa anexá-lo a um commit em vez de anexá-lo a um ramo. Antes do estado solto (\"detached\"), é assim como se parece:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'E agora é', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "E agora é", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Para completar este nivel, imos soltar o HEAD de `bugFix` e en vez diso apuntamos ó commit.', - '', - 'Especifica o commit por medio do hash correspondente. O hash de cada commit está dentro do círculo que representa ó commit (a letra C seguida dun número).' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nível, vamos soltar o HEAD do `bugFix` e em vez disso anexá-lo ao commit.", + "", + "Especifique o commit por meio do hash correspondente. O hash de cada commit é mostrado dentro do círculo que representa o commit (a letra C seguida de um número)." ] } } ] }, - 'fr_FR': { - 'childViews': [ + "gl": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Se déplacer dans Git', - '', - 'Avant que nous découvrions quelques-unes des fonctionnalités les plus avancées de Git, il est important de comprendre les différents manières de se déplacer dans l\'arbre des commits qui représente votre projet.', - '', - 'Une fois que ces déplacements seront aisés, votre puissance avec les autres commandes de git sera amplifiée !', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Movéndose en Git", + "", + "Antes de seguir con algunhas das funcionalidades máis avanzadas de Git, é importante entender as diferentes formas de se mover a través da árbore de commits que representa o teu proxecto.", + "", + "¡Unha vez que te sintas ben ó teu redor, os teus poderes empregando outros comandos de git serán amplificados!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'Premièrement nous avons parlé de "HEAD". HEAD est le nom symbolique pour le commit sur lequel nous nous situons actuellement -- plus simplement c\'est le commit sur lequel nous travaillons.', - '', - 'HEAD pointe toujours sur le commit le plus récent dans l\'arbre des commits. La plupart des commandes git qui modifient l\'arbre des commits vont commencer par modifier HEAD.', - '', - 'Normalement HEAD pointe sur le nom d\'une branche (comme bugFix). Quand vous effectuez un commit, le statut de bugFix est modifié et ce changement est visible par le biais de HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Primeiro temos que falar sobre o \"commit actual\" (\"HEAD\"). HEAD é un nome simbólico para o commit atualmente ativo (o último checkout que se fixo) -- é esencialmente o commit sobre o cal estás traballando nese momento.", + "", + "O HEAD sempre apunta para o commit máis recentemente copiado sobre a árbore de traballo (arquivos do proxecto). A maioría dos comandos de git que fan algún cambio sobre a árbore de traballo empezarán movendo o HEAD.", + "", + "Normalmente o HEAD apunta para o nome dunha rama (por exemplo, bugFix). Quando fagas commit, o status do bugFix é alterado e ese cambio ocorre tamén sobre o HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Voyons cela en action. Ici nous allons indiquer où se situe HEAD avant et après un commit.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit." ], - 'afterMarkdowns': [ - 'Vous voyez ! HEAD était caché en dessous de la branche `master` tout le long.' + "afterMarkdowns": [ + "Ves! O HEAD estivo ó lado do noso `master` todo este tempo." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Détacher HEAD', - '', - 'Détacher HEAD signifie simplement que l\'on attache HEAD à un commit au lieu d\'une branche. Voilà à quoi cela ressemble actuellement :', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Soltando a cabeza", + "", + "Soltar o HEAD significa apuntar a un commit en vez de apuntar a unha rama. Antes do estado solo (\"detached\"), é así como aparece:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'Et maintenant c\'est', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "E agora é", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Pour terminer ce niveau, détacher HEAD de `bugFix` et attachez-le plutôt au commit.', - '', - 'Spécifiez le commit par son identifiant (hash). Le hash de chaque commit est affiché dans le rond qui représente le commit.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, imos soltar o HEAD de `bugFix` e en vez diso apuntamos ó commit.", + "", + "Especifica o commit por medio do hash correspondente. O hash de cada commit está dentro do círculo que representa ó commit (a letra C seguida dun número)." ] } } ] }, - 'de_DE': { - 'childViews': [ + "fr_FR": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Navigation durch Git', - '', - 'Bevor wir uns einige fortgeschrittene Konzepte in Git ansehen ist es wichtig, verschiedene Wege zum Navigieren durch den Commit-Baum, der das Projekt enthält, zu kennen.', - '', - 'Sobald du das drauf hast, vergrößern sich deine Möglichkeiten in allen anderen Git-Befehlen.', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Se déplacer dans Git", + "", + "Avant que nous découvrions quelques-unes des fonctionnalités les plus avancées de Git, il est important de comprendre les différents manières de se déplacer dans l'arbre des commits qui représente votre projet.", + "", + "Une fois que ces déplacements seront aisés, votre puissance avec les autres commandes de git sera amplifiée !", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'Erst mal müssen wir über `HEAD` reden. `HEAD` ist ein Alias für den Commit, der gerade ausgecheckt ist -- es ist im Prinzip der Commit, an den du deinen nächsten Commit hängst.', - '', - '`HEAD` zeigt immer auf den neuesten Commit. Die meisten Git-Befehle, die den Baum verändern, fangen damit an dass sie `HEAD` verschieben.', - '', - 'Normalerweise zeigt `HEAD` auf einen Branch-Namen (z.B. `bugFix`). Wenn du einen Commit machst, wird `bugFix` auf diesen Commit geschoben, und `HEAD` (da es auf `bugFix` zeigt) automatisch auch.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Premièrement nous avons parlé de \"HEAD\". HEAD est le nom symbolique pour le commit sur lequel nous nous situons actuellement -- plus simplement c'est le commit sur lequel nous travaillons.", + "", + "HEAD pointe toujours sur le commit le plus récent dans l'arbre des commits. La plupart des commandes git qui modifient l'arbre des commits vont commencer par modifier HEAD.", + "", + "Normalement HEAD pointe sur le nom d'une branche (comme bugFix). Quand vous effectuez un commit, le statut de bugFix est modifié et ce changement est visible par le biais de HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Schauen wir uns das mal in Aktion an. Wir werden hier `HEAD` vor und nach dem Commit anzeigen.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Voyons cela en action. Ici nous allons indiquer où se situe HEAD avant et après un commit." ], - 'afterMarkdowns': [ - 'Siehst du? `HEAD` war die ganze Zeit unter `master` versteckt.' + "afterMarkdowns": [ + "Vous voyez ! HEAD était caché en dessous de la branche `master` tout le long." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### HEAD abkoppeln', - '', - '`HEAD` abzukoppeln bedeutet, es direkt an einen bestimmten Commit zu hängen, anstatt an einen Branch. Wir gelangen dadurch in den "detached HEAD state". So sieht\'s vorher aus:', - '', - '`HEAD` -> `master` -> `C1`', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Détacher HEAD", + "", + "Détacher HEAD signifie simplement que l'on attache HEAD à un commit au lieu d'une branche. Voilà à quoi cela ressemble actuellement :", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'Und jetzt:', - '', - '`HEAD` -> `C1`' + "afterMarkdowns": [ + "Et maintenant c'est", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Um diesen Level abzuschließen, lass uns mal `HEAD` von `bugFix` abkoppeln und an den Commit hängen.', - '', - 'Gib den Commit mit seinem Hash an. Der Hash jedes Commits steht in dem Kreis, der den Commit darstellt.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Pour terminer ce niveau, détacher HEAD de `bugFix` et attachez-le plutôt au commit.", + "", + "Spécifiez le commit par son identifiant (hash). Le hash de chaque commit est affiché dans le rond qui représente le commit." ] } } ] }, - 'zh_CN': { - 'childViews': [ + "de_DE": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## 在提交树上移动', - '', - '在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。', - '', - '一旦熟悉了如何在 Git 提交树上移动,你驾驭其它命令的能力也将水涨船高!', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Navigation durch Git", + "", + "Bevor wir uns einige fortgeschrittene Konzepte in Git ansehen ist es wichtig, verschiedene Wege zum Navigieren durch den Commit-Baum, der das Projekt enthält, zu kennen.", + "", + "Sobald du das drauf hast, vergrößern sich deine Möglichkeiten in allen anderen Git-Befehlen.", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - '我们首先看一下 “HEAD”。 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。', - '', - 'HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。', - '', - 'HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Erst mal müssen wir über `HEAD` reden. `HEAD` ist ein Alias für den Commit, der gerade ausgecheckt ist -- es ist im Prinzip der Commit, an den du deinen nächsten Commit hängst.", + "", + "`HEAD` zeigt immer auf den neuesten Commit. Die meisten Git-Befehle, die den Baum verändern, fangen damit an dass sie `HEAD` verschieben.", + "", + "Normalerweise zeigt `HEAD` auf einen Branch-Namen (z.B. `bugFix`). Wenn du einen Commit machst, wird `bugFix` auf diesen Commit geschoben, und `HEAD` (da es auf `bugFix` zeigt) automatisch auch." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '下面咱们通过实际操作看一下。我们将会观察提交前后 HEAD 的位置。' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Schauen wir uns das mal in Aktion an. Wir werden hier `HEAD` vor und nach dem Commit anzeigen." ], - 'afterMarkdowns': [ - '看到了吗? HEAD 指向了 `master`,随着提交向前移动。', - '', - '(译者注:实际这些命令并不是真的在查看 HEAD 指向,看下一屏就了解了。如果想看 HEAD 指向,可以通过 `cat .git/HEAD` 查看,', - '如果 HEAD 指向的是一个引用,还可以用 `git symbolic-ref HEAD` 查看它的指向。但是该程序不支持这两个命令)' + "afterMarkdowns": [ + "Siehst du? `HEAD` war die ganze Zeit unter `master` versteckt." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### 分离的 HEAD', - '', - '分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示: ', - '', - 'HEAD -> master -> C1', - '', - 'HEAD 指向 master, master 指向 C1' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### HEAD abkoppeln", + "", + "`HEAD` abzukoppeln bedeutet, es direkt an einen bestimmten Commit zu hängen, anstatt an einen Branch. Wir gelangen dadurch in den \"detached HEAD state\". So sieht's vorher aus:", + "", + "`HEAD` -> `master` -> `C1`", + "" ], - 'afterMarkdowns': [ - '现在变成了', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "Und jetzt:", + "", + "`HEAD` -> `C1`" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '想完成此关,从 `bugFix` 分支中分离出 HEAD 并让其指向一个提交记录。', - '', - '通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Um diesen Level abzuschließen, lass uns mal `HEAD` von `bugFix` abkoppeln und an den Commit hängen.", + "", + "Gib den Commit mit seinem Hash an. Der Hash jedes Commits steht in dem Kreis, der den Commit darstellt." ] } } ] }, - 'zh_TW': { - 'childViews': [ + "zh_CN": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## 在 git 中前後移動', - '', - '在接觸 git 的更多進階的主題之前,我們先學習用不同的方法在你的 project 中的 commit tree 上面移動。', - '', - '一旦能夠熟練地在 commit tree 中隨意地移動,你使用其它的 git 指令也會更厲害!', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 在提交树上移动", + "", + "在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。", + "", + "一旦熟悉了如何在 Git 提交树上移动,你驾驭其它命令的能力也将水涨船高!", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - '我們首先看一下 "HEAD",HEAD 是一個 reference,它是指向目前所 checkout 的 commit,基本上,其實就是你目前所在的 commit。', - '', - '在 commit tree 中,HEAD 總是指向最近的一次commit。大部份 git 的指令如果要修改 commit tree 的狀態的話,都會先改變 HEAD 所指向的 commit。', - '', - 'HEAD 通常指向一個 branch 的名稱(比如 bugFix)。當你 commit 的時候,改變了 bugFix 的狀態,這一個變化可以從 HEAD 的改變中看到。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "我们首先看一下 “HEAD”。 HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。", + "", + "HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。", + "", + "HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。" ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '在實際的例子中。我們將會觀察 commit 前後 HEAD 的位置。' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "下面咱们通过实际操作看一下。我们将会观察提交前后 HEAD 的位置。" ], - 'afterMarkdowns': [ - '看吧!HEAD 一直藏在 `master` 分支的後面。' + "afterMarkdowns": [ + "看到了吗? HEAD 指向了 `master`,随着提交向前移动。", + "", + "(译者注:实际这些命令并不是真的在查看 HEAD 指向,看下一屏就了解了。如果想看 HEAD 指向,可以通过 `cat .git/HEAD` 查看,", + "如果 HEAD 指向的是一个引用,还可以用 `git symbolic-ref HEAD` 查看它的指向。但是该程序不支持这两个命令)" ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### 分離 HEAD', - '', - '分離 HEAD 就是讓其指向一個 commit 而不是 branch 的名稱。這是指令執行之前的樣子:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### 分离的 HEAD", + "", + "分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示: ", + "", + "HEAD -> master -> C1", + "", + "HEAD 指向 master, master 指向 C1" ], - 'afterMarkdowns': [ - '現在變成了', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "现在变成了", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '想要完成這一個關卡,從 `bugFix` 分離出 HEAD 並且讓它指向一個 commit。', - '', - '通過 hash 值可以指定 commit。每個 commit 的 hash 值顯示在各自的圓圈中。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "想完成此关,从 `bugFix` 分支中分离出 HEAD 并让其指向一个提交记录。", + "", + "通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。" ] } } ] }, - 'ja': { - 'childViews': [ + "zh_TW": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## 任意の位置への移動', - '', - 'Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。', - '', - '移動方法が身につけば、他のgitコマンドをよりうまく扱えるようになるでしょう!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 在 git 中前後移動", + "", + "在接觸 git 的更多進階的主題之前,我們先學習用不同的方法在你的 project 中的 commit tree 上面移動。", + "", + "一旦能夠熟練地在 commit tree 中隨意地移動,你使用其它的 git 指令也會更厲害!", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'まずは"HEAD"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語です -- ようするに今作業中のコミットを表します。', - '', - 'HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。', - '', - 'HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "我們首先看一下 \"HEAD\",HEAD 是一個 reference,它是指向目前所 checkout 的 commit,基本上,其實就是你目前所在的 commit。", + "", + "在 commit tree 中,HEAD 總是指向最近的一次commit。大部份 git 的指令如果要修改 commit tree 的狀態的話,都會先改變 HEAD 所指向的 commit。", + "", + "HEAD 通常指向一個 branch 的名稱(比如 bugFix)。當你 commit 的時候,改變了 bugFix 的狀態,這一個變化可以從 HEAD 的改變中看到。" ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "在實際的例子中。我們將會觀察 commit 前後 HEAD 的位置。" ], - 'afterMarkdowns': [ - 'ほら、HEADが元から`master`ブランチの下に隠れていたんですね!' + "afterMarkdowns": [ + "看吧!HEAD 一直藏在 `master` 分支的後面。" ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### HEADの分離', - '', - 'HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### 分離 HEAD", + "", + "分離 HEAD 就是讓其指向一個 commit 而不是 branch 的名稱。這是指令執行之前的樣子:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'そして実行後はこう:', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "現在變成了", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。', - '', - 'このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸に刻まれています。' + "type": "ModalAlert", + "options": { + "markdowns": [ + "想要完成這一個關卡,從 `bugFix` 分離出 HEAD 並且讓它指向一個 commit。", + "", + "通過 hash 值可以指定 commit。每個 commit 的 hash 值顯示在各自的圓圈中。" ] } } ] }, - 'ru_RU': { - 'childViews': [ + "ja": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Прогулка по Git', - '', - 'Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по дереву коммитов вашего проекта.', - '', - 'Как только вы научитесь свободно передвигаться по дереву коммитов, ваши возможности в Git приумножатся.', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## 任意の位置への移動", + "", + "Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。", + "", + "移動方法が身につけば、他のgitコマンドをよりうまく扱えるようになるでしょう!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'В первую очередь, поговорим о "HEAD". HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем.', - '', - 'HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.', - '', - 'Обычно HEAD указывает на имя ветки (например, `bugFix`). Когда вы делаете коммит, статус ветки `bugFix` меняется и это изменение видно через HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "まずは\"HEAD\"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語です -- ようするに今作業中のコミットを表します。", + "", + "HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。", + "", + "HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。" ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Посмотрим, как это работает. Обратите внимание на то, где находится HEAD до и после коммита.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。" ], - 'afterMarkdowns': [ - 'Вот! HEAD всё это время скрывался за веткой `master`.' + "afterMarkdowns": [ + "ほら、HEADが元から`master`ブランチの下に隠れていたんですね!" ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Detaching HEAD', - '', - 'Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### HEADの分離", + "", + "HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'А вот что получилось теперь', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "そして実行後はこう:", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Чтобы пройти уровень, давай отделим HEAD от ветки `bugFix` и присвоим его последнему коммиту в этой же ветке.', - '', - 'Укажи коммит при помощи его идентификатора (hash). Hash для каждого коммита указан в кружке на схеме.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。", + "", + "このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸に刻まれています。" ] } } ] }, - 'ko': { - 'childViews': [ + "ru_RU": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Git에서 여기저기로 옮겨다니기', - '', - 'Git의 고급기능들에 대해 더 알아보기 전에, 여러분의 프로젝트를 표현하는 커밋 트리\(commit tree\)에서 이동 할 수 있는 여러가지 방법들을 아는것이 중요합니다.', - '', - '여기저기 이동하는 것에 익숙해지면, 여러분이 다른 git 명령어들을 사용하는 능력도 아주 좋아질 것입니다!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Прогулка по Git", + "", + "Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по дереву коммитов вашего проекта.", + "", + "Как только вы научитесь свободно передвигаться по дереву коммитов, ваши возможности в Git приумножатся.", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - '먼저"HEAD"에 대해 이야기해 봅시다. HEAD는 현재 체크아웃된 커밋을 가리킵니다. -- 다시 말하자면 현재 작업중인 커밋입니다.', - '', - 'HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작합니다.', - '', - '일반적으로 HEAD는 브랜치의 이름을 가리키고있습니다(bugFix와 같이). 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능합니다.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "В первую очередь, поговорим о \"HEAD\". HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данным момент работаем.", + "", + "HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.", + "", + "Обычно HEAD указывает на имя ветки (например, `bugFix`). Когда вы делаете коммит, статус ветки `bugFix` меняется и это изменение видно через HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '직접 확인해 봅시다. 여기서 우리는 보이지 않던 HEAD를 커밋전, 후에 드러낼 것입니다.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Посмотрим, как это работает. Обратите внимание на то, где находится HEAD до и после коммита." ], - 'afterMarkdowns': [ - '보세요! HEAD가 `master`브랜치 아래에 숨어 있던 거군요.' + "afterMarkdowns": [ + "Вот! HEAD всё это время скрывался за веткой `master`." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### HEAD 분리하기', - '', - 'HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Detaching HEAD", + "", + "Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - '이제는 이렇게 되는군요', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "А вот что получилось теперь", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.', - '', - '각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Чтобы пройти уровень, давай отделим HEAD от ветки `bugFix` и присвоим его последнему коммиту в этой же ветке.", + "", + "Укажи коммит при помощи его идентификатора (hash). Hash для каждого коммита указан в кружке на схеме." ] } } ] }, - 'uk': { - 'childViews': [ + "ko": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Прогулянка по Git', - '', - 'Перед тим як ми перейдемо до складніших можливостей гіта, важливо розуміти різні способи переміщення по дереву комітів твого проекту.', - '', - 'Дуже важливо щоб тобі було комфортно переміщатись по репозиторію, так як цей навик тобі знадобиться для використання в більшості команд git!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git에서 여기저기로 옮겨다니기", + "", + "Git의 고급기능들에 대해 더 알아보기 전에, 여러분의 프로젝트를 표현하는 커밋 트리\(commit tree\)에서 이동 할 수 있는 여러가지 방법들을 아는것이 중요합니다.", + "", + "여기저기 이동하는 것에 익숙해지면, 여러분이 다른 git 명령어들을 사용하는 능력도 아주 좋아질 것입니다!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD (голова)', - '', - 'Спочатку розберемось з "HEAD". HEAD це символьне ім’я поточного вибраного коміта -- по суті це той коміт з яким ти зараз працюєш.', - '', - 'HEAD завжди вказує на найновіший коміт з робочого дерева. Більшість команд що змінюють локальне дерево комітів, також модифікують HEAD.', - '', - 'Зазвичай HEAD вказує на ім’я бранча (наприклад bugFix). Коли ти комітиш, змінюється статус гілки bugFix й це можна побачити подивившись на HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "먼저\"HEAD\"에 대해 이야기해 봅시다. HEAD는 현재 체크아웃된 커밋을 가리킵니다. -- 다시 말하자면 현재 작업중인 커밋입니다.", + "", + "HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작합니다.", + "", + "일반적으로 HEAD는 브랜치의 이름을 가리키고있습니다(bugFix와 같이). 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능합니다." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Розберемось з цим на практиці. Зараз ми перевіримо HEAD до та після коміту.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "직접 확인해 봅시다. 여기서 우리는 보이지 않던 HEAD를 커밋전, 후에 드러낼 것입니다." ], - 'afterMarkdowns': [ - 'Ти диви! HEAD весь цей час ховався за гілкою `master`.' + "afterMarkdowns": [ + "보세요! HEAD가 `master`브랜치 아래에 숨어 있던 거군요." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Відокремлюємо голову', - '', - 'Detached HEAD (відокремлена голова) просто означає що HEAD посилається на коміт, а не на якусь гілку. Ось як це виглядає спочатку:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### HEAD 분리하기", + "", + "HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'А в стані detached head:', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "이제는 이렇게 되는군요", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Щоб пройти цей рівень, давайте відокремимо голову від гілки `bugFix` й натомість спрямуємо її на якийсь коміт.', - '', - 'Вкажи цей коміт за його hash (хеш, ідентифікатором). Хеш кожного коміту відображений в кружечку що символізує коміт.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.", + "", + "각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다." ] } } ] }, - 'vi': { - 'childViews': [ + "uk": { + "childViews": [ { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## Dịch chuyển trong Git', - '', - 'Trước khi học thêm vài chức năng nâng cao trong Git, ta cần phải biết cách dịch chuyển qua lại các commit có trong kho chứa.', - '', - 'Một khi bạn đã thành thao với chuyển dịch, khả năng sử dụng các lệnh git của bạn đã được nâng cao!', - '', - '', - '', - '', - '' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Прогулянка по Git", + "", + "Перед тим як ми перейдемо до складніших можливостей гіта, важливо розуміти різні способи переміщення по дереву комітів твого проекту.", + "", + "Дуже важливо щоб тобі було комфортно переміщатись по репозиторію, так як цей навик тобі знадобиться для використання в більшості команд git!", + "", + "", + "", + "", + "" ] } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - '## HEAD', - '', - 'Đầu tiên hãy bàn về "HEAD". HEAD là cái tên biểu tượng cho commit iện tại đang được trỏ đến -- về căn bản nó là commit mà bạn đang làm việc.', - '', - 'HEAD luôn luôn trỏ đến commit gần nhất được phản ánh trong cây làm việc. Hầu hết các lệnh git mà làm thay đổi nội dung cây làm việc thường bắt đầu với HEAD.', - '', - 'Bình thường HEAD thì trỏ tới tên nhánh (ví dụ bugFix). Khi bạn commit, thì trạng thái của bugFix được thay đổi và thay đổi này được trông thấy thông qua HEAD.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD (голова)", + "", + "Спочатку розберемось з \"HEAD\". HEAD це символьне ім’я поточного вибраного коміта -- по суті це той коміт з яким ти зараз працюєш.", + "", + "HEAD завжди вказує на найновіший коміт з робочого дерева. Більшість команд що змінюють локальне дерево комітів, також модифікують HEAD.", + "", + "Зазвичай HEAD вказує на ім’я бранча (наприклад bugFix). Коли ти комітиш, змінюється статус гілки bugFix й це можна побачити подивившись на HEAD." ] } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - 'Xem thử thực tế nào. Ở đây ta sẽ bộc lộ HEAD trước và sau khi commit.' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Розберемось з цим на практиці. Зараз ми перевіримо HEAD до та після коміту." ], - 'afterMarkdowns': [ - 'Thấy chứ? HEAD đã ẩn dưới nhánh `master` suốt.' + "afterMarkdowns": [ + "Ти диви! HEAD весь цей час ховався за гілкою `master`." ], - 'command': 'git checkout C1; git checkout master; git commit; git checkout C2', - 'beforeCommand': '' + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" } }, { - 'type': 'GitDemonstrationView', - 'options': { - 'beforeMarkdowns': [ - '### Tháo HEAD', - '', - 'Tháo HEAD đơng giản nghĩa là dán nó vào một commit thay vì một nhánh. Lúc trước thì nó trông như thế này:', - '', - 'HEAD -> master -> C1', - '' + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Відокремлюємо голову", + "", + "Detached HEAD (відокремлена голова) просто означає що HEAD посилається на коміт, а не на якусь гілку. Ось як це виглядає спочатку:", + "", + "HEAD -> master -> C1", + "" ], - 'afterMarkdowns': [ - 'Và bây giờ thì nó thế này', - '', - 'HEAD -> C1' + "afterMarkdowns": [ + "А в стані detached head:", + "", + "HEAD -> C1" ], - 'command': 'git checkout C1', - 'beforeCommand': '' + "command": "git checkout C1", + "beforeCommand": "" } }, { - 'type': 'ModalAlert', - 'options': { - 'markdowns': [ - 'Để hoàn thành cấp độ này, hãy tháo HEAD khỏi `bugFix` thay vì đó hãy dán nó vào commit.', - '', - 'Chỉ rõ commit bằng mã băm (hash) của nó. Mã băm của mỗi commit nằm trong trong vòng tròn biểu thị commit đó.' + "type": "ModalAlert", + "options": { + "markdowns": [ + "Щоб пройти цей рівень, давайте відокремимо голову від гілки `bugFix` й натомість спрямуємо її на якийсь коміт.", + "", + "Вкажи цей коміт за його hash (хеш, ідентифікатором). Хеш кожного коміту відображений в кружечку що символізує коміт." + ] + } + } + ] + }, + "vi": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Dịch chuyển trong Git", + "", + "Trước khi học thêm vài chức năng nâng cao trong Git, ta cần phải biết cách dịch chuyển qua lại các commit có trong kho chứa.", + "", + "Một khi bạn đã thành thao với chuyển dịch, khả năng sử dụng các lệnh git của bạn đã được nâng cao!", + "", + "", + "", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## HEAD", + "", + "Đầu tiên hãy bàn về 'HEAD'. HEAD là cái tên biểu tượng cho commit iện tại đang được trỏ đến -- về căn bản nó là commit mà bạn đang làm việc.", + "", + "HEAD luôn luôn trỏ đến commit gần nhất được phản ánh trong cây làm việc. Hầu hết các lệnh git mà làm thay đổi nội dung cây làm việc thường bắt đầu với HEAD.", + "", + "Bình thường HEAD thì trỏ tới tên nhánh (ví dụ bugFix). Khi bạn commit, thì trạng thái của bugFix được thay đổi và thay đổi này được trông thấy thông qua HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Xem thử thực tế nào. Ở đây ta sẽ bộc lộ HEAD trước và sau khi commit." + ], + "afterMarkdowns": [ + "Thấy chứ? HEAD đã ẩn dưới nhánh `master` suốt." + ], + "command": "git checkout C1; git checkout master; git commit; git checkout C2", + "beforeCommand": "" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "### Tháo HEAD", + "", + "Tháo HEAD đơng giản nghĩa là dán nó vào một commit thay vì một nhánh. Lúc trước thì nó trông như thế này:", + "", + "HEAD -> master -> C1", + "" + ], + "afterMarkdowns": [ + "Và bây giờ thì nó thế này", + "", + "HEAD -> C1" + ], + "command": "git checkout C1", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Để hoàn thành cấp độ này, hãy tháo HEAD khỏi `bugFix` thay vì đó hãy dán nó vào commit.", + "", + "Chỉ rõ commit bằng mã băm (hash) của nó. Mã băm của mỗi commit nằm trong trong vòng tròn biểu thị commit đó." ] } } diff --git a/src/levels/rampup/interactiveRebase.js b/src/levels/rampup/interactiveRebase.js index 7b5adb41..6d09eafe 100644 --- a/src/levels/rampup/interactiveRebase.js +++ b/src/levels/rampup/interactiveRebase.js @@ -9,6 +9,7 @@ exports.level = { "hint": { "en_US": "you can use either branches or relative refs (HEAD~) to specify the rebase target", "es_AR": "podés usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase", + "es_ES": "puedes usar tanto ramas como referencias relativas (HEAD~) para especificar el objetivo del rebase", "pt_BR": "Você pode usar ou ramos ou referências relativas (HEAD~) para especificar o alvo do rebase", "gl" : "Podes usar ramas ou referencias relativas (HEAD~) para especificar o obxectivo do rebase", "de_DE": "Du kannst entweder Branches oder relative Ref-Angaben (z.B. HEAD~) benutzen, um das Ziel des Rebase anzugeben.", @@ -24,6 +25,7 @@ exports.level = { "name": { "en_US": "Interactive Rebase Intro", "es_AR": "Introducción al rebase interactivo", + "es_ES": "Introducción al rebase interactivo", "pt_BR": "Introdução ao rebase interativo", "gl" : "Introducción ó rebase interativo", "de_DE": "Einführung Interactive Rebase", @@ -321,7 +323,7 @@ exports.level = { "", "Si incluís esta opción, git abrirá una UI para mostrarte qué commits están a punto de ser copiados sobre el objetivo del rebase. También muestra sus hashes y mensajes, que ayuda mucho para saber qué es cada commit.", "", - "Para el git \"de verdad\", la UI signfica abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo." + "Para el git \"de verdad\", la UI significa abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo." ] } }, @@ -362,6 +364,71 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## git rebase interactivo", + "", + "git cherry-pick es genial cuando sabes qué commits quieres (_y_ sabes sus hashes) -- es dificil superar la simpleza que provee.", + "", + "Pero ¿qué pasa cuando no sabes qué commits quieres? Por suerte ¡git te cubre en esta situación, también! Podemos usar el rebase interactivo para esto -- es la mejor manera de revisar una serie de commits que estás a punto de rebasear.", + "", + "Entremos en los detalles..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Todo rebase interactivo significa usar el comando `rebase` con la opción `-i`.", + "", + "Si incluyes esta opción, git abrirá una UI para mostrarte qué commits están a punto de ser copiados sobre el objetivo del rebase. También muestra sus hashes y mensajes, que ayuda mucho para saber qué es cada commit.", + "", + "Para el git \"de verdad\", la UI signfica abrir un archivo en un editor de textos como `vim`. Para nuestro propósito, hice una pequeña interfaz que se comporta de ese mismo modo." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Cuando el diálogo de rebase interactivo se abre, tienes la capacidad de hacer 3 cosas:", + "", + "* Puedes reordenar los commits con solamente cambiar su orden en la UI (en nuestra ventana, eso significa hacer drag & drop con el mouse).", + "* Puedes elegir ignorar completamente algunos commits. Esto se designa con `pick` -- no hacerle `pick` a algún commit significa que quieres ignorarlo.", + "* Finalmente, puedes _squashear_ commits. Desafortunadamente, nuestros niveles no soportan esto por cuestiones logísticas, por lo que voy a ahorrarte los detalles. Resumiendo, te permite combinar varios commits en uno solo.", + "", + "¡Genial! Veamos un ejemplo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Cuando aprietes el botón, va a aparecer una ventana de rebase interactivo. Reordena los commits (siéntete libre de ignorar alguno, también) ¡y observa el resultado!" + ], + "afterMarkdowns": [ + "¡Zas! Git copió los commits exactamente de la misma manera que lo especificaste en la UI" + ], + "command": "git rebase -i HEAD~4 --aboveAll", + "beforeCommand": "git commit; git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar el nivel, haz un rebase interactivo y alcanza el orden que se muestra en la visualización objetivo. Recuerda que siempre puedes hacer `undo` y `reset` para arreglar errores :D" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/relativeRefs.js b/src/levels/rampup/relativeRefs.js index 7f9c7f8e..458dea2d 100644 --- a/src/levels/rampup/relativeRefs.js +++ b/src/levels/rampup/relativeRefs.js @@ -9,6 +9,7 @@ exports.level = { "zh_CN": "相对引用(^)", "zh_TW": "相對引用(^)", "es_AR": "Referencias relativas (^)", + "es_ES": "Referencias relativas (^)", "pt_BR": "Referências relativas (^)", "gl" : "Referencias relativas (^)", "de_DE": "Relative Referenzen (^)", @@ -23,6 +24,7 @@ exports.level = { "ja" : "相対リファレンス(^)を思い出して!", "de_DE": "Denk an den Dach-Operator (^)!", "es_AR": "¡No te olvides del operador ^!", + "es_ES": "¡No te olvides del operador ^!", "pt_BR": "Não se esqueça do operador circunflexo (^)", "gl" : "Non se esqueza do operador circunflexo (^)", "zh_CN": "记住操作符(^)!", @@ -333,6 +335,81 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Referencias relativas", + "", + "Moverse por git usando los hashes de los commits puede volverse un tanto tedioso. En el mundo real no vas a tener una visualización de commits tan linda en la terminal, así que vas a tener que usar `git log` para ver los hashes.", + "", + "Peor aún, los hashes en general son mucho más largos en el git real, también. Por ejemplo, el hash del commit que introduje en el nivel anterior es `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. No es algo particularmente fácil de nombrar...", + "", + "Lo interesante es que git es bastante astuto con los hashes. Sólo requiere que especifiques una cantidad de caracteres suficientes para identificar unívocamente al commit. Entonces, yo podría simplemente tipear `fed2` en lugar de esa cadena larga de arriba." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Como ya dije, especificar los commits por su hash no es la manera más conveniente, y por eso git tiene referencias relativas. ¡Son geniales!", + "", + "Con las referencias relativas puedes arrancar de algún lugar recordable (como la rama `bugFix`, o `HEAD`) y trabajar desde ahí.", + "", + "Los commits relativos son poderosos, pero ahora vamos a presentar sólo dos formas simples:", + "", + "* Moverse un commit hacia atrás con `^`", + "* Moverse una cantidad de commits hacia atrás con `~`" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos el operador ^ primero. Cada vez que le agregas eso al nombre de una referencia, le estás diciendo a git que use el padre del commit especificado.", + "", + "Entonces, decir `master^` es equivalente a \"el primer padre de `master`\".", + "", + "`master^^` es el _abuelo_ (segunda generación de ancestros) de `master`", + "", + "Veamos el commit que está antes de master aquí" + ], + "afterMarkdowns": [ + "¡Zas! Ahí está. Mucho más simple que escribir el hash de ese commit" + ], + "command": "git checkout master^", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "También puedes referenciar a `HEAD` como una referencia relativa. Usémoslo un par de veces para movernos hacia atrás en nuestro árbol" + ], + "afterMarkdowns": [ + "¡Fácil! Podemos volver en el tiempo con `HEAD^`" + ], + "command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^", + "beforeCommand": "git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, haz checkout sobre el padre del commit de `bugFix`. Esto va a detachear a `HEAD`.", + "", + "Puedes especificar el hash si quieres, pero mejor ¡trata de usar la referencia relativa!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/relativeRefs2.js b/src/levels/rampup/relativeRefs2.js index 4a9829b4..69bc40fd 100644 --- a/src/levels/rampup/relativeRefs2.js +++ b/src/levels/rampup/relativeRefs2.js @@ -8,6 +8,7 @@ exports.level = { "zh_CN": "这一关至少要用到一次直接引用 (即哈希值)", "zh_TW": "這一關至少要用到一次直接參考(hash)", "es_AR": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel", + "es_ES": "Vas a necesitar usar al menos una referencia directa (hash) para completar este nivel", "pt_BR": "Você precisará usar pelo menos uma referência direta (hash) para completar este nível", "gl" : "Precisarás usar polo menos unha referencia directa (hash) para completar este nivel", "de_DE": "Du musst mindestens einen Hash benutzen, um dieses Level zu schaffen", @@ -22,6 +23,7 @@ exports.level = { "de_DE": "Relative Referenzen #2 (~)", "ja" : "相対リファレンス その2 (~)", "es_AR": "Referencias relativas #2 (~)", + "es_ES": "Referencias relativas #2 (~)", "pt_BR": "Referências relativas #2 (~)", "gl" : "Referencias relativas #2 (~)", "fr_FR": "Références relatives #2 (~)", @@ -172,6 +174,75 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### El operador \"~\"", + "", + "Digamos que quieres moverte un montón de niveles atrás en tu árbol de commits. Podría ser tedioso escribir `^` muchas veces, por lo que git tiene el operador ~.", + "", + "", + "El operador ~ (opcionalmente) toma una cantidad que especifica la cantidad de padres que quieres volver hacia atrás. Veámoslo en acción" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Especifiquemos una cantidad de commits hacia atrás con `~`." + ], + "afterMarkdowns": [ + "¡Zas! Bien conciso -- las referencias relativas la rompen." + ], + "command": "git checkout HEAD~4", + "beforeCommand": "git commit; git commit; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forzando las ramas", + "", + "Ahora que eres un experto en las referencias relativas, *usémoslas* para algo.", + "", + "Una de las formas más comunes en que uso las referencias relativas es para mover las ramas. Puedes reasignar directamente una rama a un commit usando la opción `-f`. Algo así como:", + "", + "`git branch -f master HEAD~3`", + "", + "Mueve (forzadamente) la rama master tres padres por detrás de HEAD." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos ese comando previo en acción" + ], + "afterMarkdowns": [ + "¡Allá vamos! Las referencias relativas nos proporcionaron una manera concisa de referenciar a `C1`, y forzar la rama (`-f`) nos dio una manera rápida de mover la rama a esa ubicación" + ], + "command": "git branch -f master HEAD~3", + "beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Ahora que viste las referencias relativas y el forzar ramas combinados, usémoslos para resolver el siguiente nivel.", + "", + "Para completar este nivel, mueve `HEAD`, `master` y `bugFix` a sus destinos finales." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rampup/reversingChanges.js b/src/levels/rampup/reversingChanges.js index c7457c0e..2b5c188f 100644 --- a/src/levels/rampup/reversingChanges.js +++ b/src/levels/rampup/reversingChanges.js @@ -9,6 +9,7 @@ exports.level = { "ja" : "変更を元に戻す", "fr_FR": "Annuler des changements avec Git", "es_AR": "Revirtiendo cambios en git", + "es_ES": "Revirtiendo cambios en git", "pt_BR": "Revertendo mudanças no Git", "gl" : "Revertindo cambios en git", "ko" : "Git에서 작업 되돌리기", @@ -24,6 +25,7 @@ exports.level = { "de_DE": "Beachte, dass revert und reset unterschiedliche Argumente benötigen", "fr_FR": "Notez que `revert` et `reset` n'ont pas les mêmes arguments.", "es_AR": "Notá que revert y reset toman parámetros distintos", + "es_ES": "Observa que revert y reset utilizan parámetros distintos", "pt_BR": "Lembre que revert e reset recebem parâmetros diferentes", "gl" : "Lembra que revert e reset usan parámetros distintos", "zh_CN": "注意 revert 和 reset 使用的参数不同。", @@ -161,6 +163,69 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Revirtiendo cambios en git", + "", + "Hay varias maneras de revertir cambios en git. Y, tal como al commitear, revertir cambios en git tiene tanto un componente de bajo nivel (indexar archivos o fragmentos individualmente) como un componente de alto nivel (cómo son efectivamente revertidos los cambios). Nuestra aplicación se va a concentrar en esto último.", + "", + "Hay dos formas principales de deshacer cambios en git -- uno es usando `git reset` y el otro es usando `git revert`. Vamos a ver cada uno de ellos a continuación", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Reset", + "", + "`git reset` deshace los cambios moviendo la referencia de una rama hacia atrás en el tiempo a un commit anterior. En este sentido puedes imaginarlo como \"reescribir la historia\". `git reset` va a mover la rama hacia atrás, como si el commit nunca se hubiera hecho.", + "", + "Veamos cómo es eso:" + ], + "afterMarkdowns": [ + "¡Genial! git simplemente movió la referencia de la rama master atrás hacia `C1`. Ahora tu repositorio local está en un estado como si `C2` nunca hubiera ocurrido" + ], + "command": "git reset HEAD~1", + "beforeCommand": "git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "## Git Revert", + "", + "Mientras que resetear los cambios funciona estupendamente para ramas locales en tu máquina, su método de \"reescribir la historia\" no funciona para ramas remotas que otros están usando.", + "", + "Para revertir cambios y *compartir* esa _revertida_ con otros, necesitamos usar `git revert`. Veámoslo en acción" + ], + "afterMarkdowns": [ + "Extraño. Hay un nuevo commit aplicado sobre el que queríamos revertir. Eso es porque este nuevo commit `C2'` introduce *cambios* - sólo que esos cambios son exactamente los necesarios para revertir los que introdujo `C2`.", + "", + "Cuando utilices revert, puedes hacer push sobre ese cambio para compartirlo con otros." + ], + "command": "git revert HEAD", + "beforeCommand": "git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, deshaz los dos commits más recientes, tanto en `local` como en `pushed`.", + "", + "Ten en cuenta que `pushed` es una rama remota y `local` es una rama local -- eso debería ayudarte a elegir qué métodos usar." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rebase/manyRebases.js b/src/levels/rebase/manyRebases.js index 291b2e9a..81ecf091 100644 --- a/src/levels/rebase/manyRebases.js +++ b/src/levels/rebase/manyRebases.js @@ -11,6 +11,7 @@ exports.level = { "en_US": "Rebasing over 9000 times", "de_DE": "10000 Rebases unter dem `HEAD`", "es_AR": "Rebaseando más de 9000 veces", + "es_ES": "Rebaseando más de 9000 veces", "pt_BR": "Fazendo mais de 9000 rebases", "gl" : "Facendo máis de 9000 rebases", "fr_FR": "Rebaser plus de 1000 fois", @@ -26,6 +27,7 @@ exports.level = { "en_US": "Remember, the most efficient way might be to only update master at the end...", "de_DE": "Nicht vergessen: die effizienteste Möglichkeit könnte sein, schließlich einfach nur den master zu aktualisieren ...", "es_AR": "Acordate, la manera más eficiente podría ser actualizar master sólo al final...", + "es_ES": "Recuerda, 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...", "gl" : "Lembra, a forma máis eficiente pode ser actualizar a rama master ó final...", "fr_FR": "Rappelez-vous, la façon la plus efficace peut être de mettre à jour master seulement à la fin ...", @@ -74,6 +76,24 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rebaseando múltiples ramas", + "", + "Fíjate, ¡hay un montón de ramas aquí! Rebaseemos todo el trabajo de esas ramas sobre master.", + "", + "La gente de administración nos está haciendo las cosas un poco complicadas, igual -- quieren que nuestros commits estén todos en orden secuencial. Esto significa que nuestro árbol final tendría que tener `C7` al final, `C6` antes de ese, y así siguiendo, todos en orden.", + "", + "Si te haces un lío durante el proceso, siéntete libre de usar `reset` para empezar de nuevo. ¡Asegúrate de verificar tu solución y ver si puedes realizarla en un número inferior de commandos!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/rebase/selectiveRebase.js b/src/levels/rebase/selectiveRebase.js index d5030f9d..288390b1 100644 --- a/src/levels/rebase/selectiveRebase.js +++ b/src/levels/rebase/selectiveRebase.js @@ -12,6 +12,7 @@ exports.level = { "fr_FR": "Branche spaghetti", "de_DE": "Branch-Spaghetti", "es_AR": "Enslada de branches", + "es_ES": "Ensalada de ramas", "pt_BR": "Espaguete de ramos", "gl" : "Espaguete de ramas", "ja": "ブランチスパゲッティ", @@ -26,6 +27,7 @@ exports.level = { "fr_FR": "Faites attention à tout faire dans le bon ordre ! La branche one d'abord, puis la seconde, puis la troisième", "de_DE": "Stelle sicher, dass du alles in der richtigen Reihenfolge machst! Branche erst one, dann two, dann three.", "es_AR": "¡Asegurate de hacer las cosas en el orden correcto! Brancheá `one` primero, después `two`, y después `three`.", + "es_ES": "¡Asegúrate de hacer las cosas en el orden correcto! Crea primero la rama `one`, después `two`, y después `three`.", "pt_BR": "Certifique-se de fazer tudo na ordem correta! Crie o ramo `one` primeiro, depois `two`, depois `three`.", "gl" : "¡Afiánzate de facer as cousas no orde correcto! Crea ramas `one` de primeiras, e logo `two` e `three`.", "ja": "全て正しい順番で処理すること!oneが最初で、次がtwo、最後にthreeを片付ける。", @@ -97,6 +99,26 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ensalada de ramas", + "", + "¡Vaya, vaya! Tenemos un _pequeño_ objetivo al que llegar en este nivel.", + "", + "La rama `master` se encuentra algunos commits por delante de `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de master.", + "", + "La rama `one` necesita reordenarse, y eliminar `C5`. `two` necesita sólo reordenamiento, y `three` ¡sólo necesita un commit!", + "", + "Vamos a dejar que intentes resolver este -- asegúrate de mirar la solución, después, usando `show solution`. " + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/clone.js b/src/levels/remote/clone.js index 465491c7..540488d7 100644 --- a/src/levels/remote/clone.js +++ b/src/levels/remote/clone.js @@ -7,6 +7,7 @@ exports.level = { "de_DE": "Clone Einführung", "ja" : "Clone入門", "es_AR": "Introducción a clone", + "es_ES": "Introducción a clone", "pt_BR": "Introdução à clonagem", "gl" : "Introducción a clone", "zh_CN": "Git Clone", @@ -23,6 +24,7 @@ exports.level = { "ja" : "単にgit clone!", "zh_CN": "只要 git clone 就可以了!", "es_AR": "Simplemente hacé git clone!", + "es_ES": "¡Simplemente escribe `git clone`!", "pt_BR": "Basta fazer um git clone!", "gl" : "¡Chega con facer git clone!", "zh_TW": "只要 git clone 就好了", @@ -162,7 +164,7 @@ exports.level = { "", "- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.", "", - "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como el la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" + "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) o [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" ] } }, @@ -172,7 +174,7 @@ exports.level = { "markdowns": [ "## Nuestro comando para crear remotos", "", - "Hasta este punto, Learn Git Branching se centró en eseñar las bases del trabajo _local_ con repositorios (branchear, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`", + "Hasta este punto, Learn Git Branching se centró en enseñar las bases del trabajo _local_ con repositorios (branchear, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`", "", "Técnicamente, `git clone` en el mundo real es el comando que usarías para crear copias _locales_ de un repositorio remoto (uno de GitHub, por ejemplo). Acá usamos este comando de un modo un tanto distinto, en cambio -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que es el significado técnicamente opuesto al del comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a vivir con ello por ahora.", "" @@ -203,6 +205,63 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Remotes", + "", + "Los repositorios remotos no son _tan_ complicados. En el mundo actual de la computación en la nube es bastante facil pensar que hay un montón de magia detrás de los remotes de git, pero en realidad sólo son copias de tu repositorio en otra computadora. Típicamente vas a hablar con esta otra computadora a través de Internet, lo que permite transferir commits de un lado a otro.", + "", + "Habiendo dicho eso, los repositorios remotos tienen un par de propiedades interesantes:", + "", + "- Primero y principal, los remotos ¡son un backup genial! Los repositorios locales de git tienen la habilidad de restaurar archivos a un estado previo (como ya sabes), pero toda esa información se encuentra almacenada localmente. Al tener copias de tu repositorio git en otras computadoras, puedes perder todos tus datos locales y aún así retomar el trabajo en el punto donde lo habías dejado.", + "", + "- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, tus amigos pueden contribuir a tu proyecto (o bajarse los últimos cambios) de un modo muy sencillo.", + "", + "Se volvió bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [Github](https://github.com/) or [Phabricator](http://phabricator.org/)), pero esos repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Nuestro comando para crear remotos", + "", + "Hasta este punto, Learn Git Branching se centró en enseñar las bases del trabajo _local_ con repositorios (crear ramas, mergear, rebasear, etc). Sin embargo, ahora que queremos aprender sobre el trabajo con repositorios remotos, necesitamos un comando para inicializar nuestro entorno para esas lecciones. Ese comando será `git clone`", + "", + "Técnicamente, `git clone` en el mundo real es el comando que usarías para crear copias _locales_ de un repositorio remoto (uno de GitHub, por ejemplo). Aquí usamos este comando de un modo un tanto distinto, en cambio -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que es el significado técnicamente opuesto al del comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a vivir con ello por ahora.", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Comencemos despacio y simplemente veamos cómo se ve un repositorio remoto en nuestra visualización.", + "" + ], + "afterMarkdowns": [ + "¡Ahí está! Ahora tenemos un repositorio remoto de nuestro proyecto. Parece bastante similar, salvando algunos cambios visuales para hacer evidente la distinción -- en niveles posteriores vas a ver cómo compartir trabajo entre estos repositorios." + ], + "command": "git clone", + "beforeCommand": "" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente ejecuta `git clone` en tu repositorio existente. El verdadero aprendizaje viene en las próximas lecciones." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fakeTeamwork.js b/src/levels/remote/fakeTeamwork.js index ee018853..d5ceb56c 100644 --- a/src/levels/remote/fakeTeamwork.js +++ b/src/levels/remote/fakeTeamwork.js @@ -8,6 +8,7 @@ exports.level = { "de_DE": "Teamarbeit simulieren", "ja" : "擬似的なチーム作業", "es_AR": "Simulando el trabajo en equipo", + "es_ES": "Simulando el trabajo en equipo", "pt_BR": "Simulando trabalho em equipe", "gl" : "Simulando o traballo no repositorio", "zh_CN": "模拟团队合作", @@ -23,6 +24,7 @@ exports.level = { "de_DE": "Nicht vergessen, du kannst angeben wieviele Commits simuliert werden sollen.", "ja" : "擬似的に作成するコミット数を指定できるのをお忘れなく", "es_AR": "Acordate que podés especificar cuántos commits simular", + "es_ES": "Recuerda que puedes especificar cuántos commits simular", "pt_BR": "Lembre-se que você pode especificar quantos commits quer simular", "gl" : "Lembra que podes especifar cantos commits queres simular", "zh_CN": "记住你可以指定仿真提交的个数", @@ -151,7 +153,7 @@ exports.level = { "", "Entonces, hay algo medio tramposo acá -- para algunas de las lecciones siguientes, necesitamos explicarte cómo bajar cambios introducidos en el repositorio remoto.", "", - "Eso significa que escencialmente tenemos que \"hacer de cuenta\" que el repositorio remoto fue actualizado por alguún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.", + "Eso significa que esencialmente tenemos que \"hacer de cuenta\" que el repositorio remoto fue actualizado por algún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.", "", "Para lograr esto, introdujimos el bien llamado comando ¡`git fakeTeamwork`! Es bastante auto-explicativo: simula trabajo de nuestros colegas. Veamos una demo..." ] @@ -195,6 +197,60 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Simulando la colaboración", + "", + "Entonces, hay algo un poco tramposo -- para algunas de las lecciones siguientes, necesitamos explicarte cómo descargar cambios introducidos en el repositorio remoto.", + "", + "Eso significa que escencialmente tenemos que \"tener en cuenta\" que el repositorio remoto fue actualizado por algún colega, amigo o colaborador tuyo, incluso a veces en alguna rama específica o una cantidad determinada de commits.", + "", + "Para lograr esto, introdujimos el bien llamado comando ¡`git fakeTeamwork`! Es bastante autoexplicativo: simula trabajo de nuestros colegas. Veamos una demo..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "El comportamiento por default de `fakeTeamwork` es simplemente crear un commit en master" + ], + "afterMarkdowns": [ + "Ahí está: el remoto se actualizó con un nuevo commit, y todavía no nos bajamos ese commit porque aún no hicimos `git fetch`." + ], + "command": "git fakeTeamwork", + "beforeCommand": "git clone" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "También puedes especificar la cantidad de commits o la ramma agregándolos al comando" + ], + "afterMarkdowns": [ + "Con un único comando simulamos que un compañero de equipo pusheó tres commits a la rama `foo` de nuestro remoto" + ], + "command": "git fakeTeamwork foo 3", + "beforeCommand": "git branch foo; git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Los niveles siguientes van a ser algo difíciles, así que vamos a exigirte un poco más en este nivel.", + "", + "Anímate y crea un remoto (con `git clone`), simula algunos cambios en ese remoto, haz commit en tu repo local, y luego haz pull de esos cambios. ¡Es como si fueran varias lecciones en una!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fetch.js b/src/levels/remote/fetch.js index 274ed8c6..8934dfa5 100644 --- a/src/levels/remote/fetch.js +++ b/src/levels/remote/fetch.js @@ -8,6 +8,7 @@ exports.level = { "de_DE": "Git Fetch", "ja" : "Git Fetch", "es_AR": "git fetch", + "es_ES": "git fetch", "pt_BR": "Git Fetch", "gl" : "Git Fetch", "zh_CN": "Git Fetch", @@ -23,6 +24,7 @@ exports.level = { "de_DE": "Einfach git fetch ausführen!", "ja" : "単にgit fetchを実行!", "es_AR": "Simplemente ¡hacé git fetch!", + "es_ES": "Simplemente ¡escribe git fetch!", "pt_BR": "Simplesmente chame git fetch!", "gl" : "¡Sinxelamente fai git fetch!", "zh_CN": "只需要运行 git fetch 命令!", @@ -219,7 +221,7 @@ exports.level = { "* baja los commits que el remoto tiene pero no están en nuestro repositorio local, y...", "* actualiza a dónde apuntan nuestras ramas remotas (por ejemplo, `o/master`)", "", - "`git fetch` escencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).", + "`git fetch` esencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).", "", "Si recordás la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que hablaste con ellos. ¡`git fetch` es la manera en que hablás con esos remotos! Espero que ahora esté clara la conexión entre las ramas remotas y `git fetch`.", "", @@ -252,6 +254,79 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Fetch", + "", + "Trabajar con remotos en git en realidad se reduce a transferir datos _de_ y _hacia_ otros repositorios. Mientras podamos mandar commits de un lado al otro, podemos compartir cualquier tipo de actualización registrada por git (y, por ende, compartir trabajo, archivos nuevos, ideas nuevas, cartas de amor, etc).", + "", + "En esta lección aprenderemos cómo traer (hacer `fetch`) datos _desde_ un repositorio remoto - el comando para esto se llama, convenientemente, `git fetch`).", + "", + "Vas a notar que a medida que actualicemos nuestra representación de nuestro repositorio remoto, nuestras ramas _remotas_ van a actualizarse para reflejar esa nueva representación. Esto está ligado a la lección anterior sobre ramas remotas" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Antes de entrar en los detalles de `git fetch`, veámoslo en acción. Aquí tenemos un repositorio remoto que contiene dos commits que nuestro repositorio local no tiene." + ], + "afterMarkdowns": [ + "¡Allá vamos! Bajamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/master` fue actualizada para reflejar este cambio." + ], + "command": "git fetch", + "beforeCommand": "git clone; git fakeTeamwork 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué hace fetch?", + "", + "`git fetch` hace dos simples pasos, y sólo dos simples pasos:", + "", + "* baja los commits que el remoto tiene pero no están en nuestro repositorio local, y...", + "* actualiza a dónde apuntan nuestras ramas remotas (por ejemplo, `o/master`)", + "", + "`git fetch` escencialmente sincroniza nuestra representación _local_ del repositorio remoto con el _verdadero_ estado del repositorio remoto (en este momento).", + "", + "Si recuerdas la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que hablaste con ellos. ¡`git fetch` es la manera en la que hablas con esos remotos! Espero que ahora esté clara la conexión entre las ramas remotas y `git fetch`.", + "", + "Usualmente, `git fetch` habla con el repositorio a través de internet (usando un protocolo como `http://` o `git://`).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué *no* hace fetch?", + "", + "Sin embargo, `git fetch` no modifica en absoluto _tu_ estado local. No va a actualizar tu rama `master` ni va a cambiar nada sobre cómo se ve tu sistema de archivos en este momento.", + "", + "Es importante entender esto, porque un montón de desarrolladores piensan que correr `git fetch` hará que su estado local refleje el estado del remoto. `git fetch` puede descargar los datos necesarios para hacerlo, pero *no* cambia ninguno de tus archivos locales. Vamos a aprender otros comandos para hacer eso más adelante :D", + "", + "Entonces, después de todo, puedes pensar sobre `git fetch` como un proceso de descarga." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente ejecuta `git fetch` y bájate todos los commits" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fetchArgs.js b/src/levels/remote/fetchArgs.js index 1a49d189..92dd8016 100644 --- a/src/levels/remote/fetchArgs.js +++ b/src/levels/remote/fetchArgs.js @@ -8,6 +8,7 @@ exports.level = { "zh_CN": "Git fetch 的参数", "zh_TW": "fetch 的參數", "es_AR": "Parámetros de fetch", + "es_ES": "Parámetros de fetch", "pt_BR": "Parâmetros do fetch", "gl" : "Parámetros de fetch", "de_DE": "Optionen für Fetch", @@ -23,6 +24,7 @@ exports.level = { "zh_CN": "注意下提交对象的 id 是如何交换的! 你可以通过 `help level` 重新阅读本关卡的所有对话框!", "zh_TW": "注意 commit 的 id 是怎麼被交換的!你可以透過 `help level` 來閱讀對話視窗!", "es_AR": "¡Prestá atención a cómo podrían haberse invertido los ids de los commits! Podés volver a leer toda la lección usando \"help level\"", + "es_ES": "¡Presta atención a cómo podrían haberse invertido los ids de los commits! Puedes volver a leer toda la lección usando \"help level\"", "pt_BR": "Preste atenção em como os identificadores dos commits podem ter trocado! Você pode ler os slides novamente com \"help level\"", "gl" : "Preste atención en como poderían invertirse os ids dos commits! Podes volver ler toda a lección usando \"help level\"", "de_DE": "Beachte wie die Commit IDs getauscht wurden! Du kannst den Einführungsdialog mit \"help level\" erneut anzeigen", @@ -345,7 +347,7 @@ exports.level = { "", "Este es el único problemita, igual: `` es ahora un lugar en el *remoto*, y `` es un lugar *local* en donde poner esos commits. Es exactamente lo opuesto a git push, y eso tiene sentido dado que ¡estamos transfiriendo los datos en la dirección opuesta!", "", - "Habiendo dicho esto, dificilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas." + "Habiendo dicho esto, difícilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas." ] } }, @@ -402,6 +404,129 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de git fetch", + "", + "Acabamos de aprender todo sobre los parámetros de push, como el parámetro ``, e incluso las referencias separadas por dos puntos (`:`). ¿Podremos usar todo ese conocimiento para `git fetch`, también?", + "", + "¡Dalo por hecho! Los parámetros para `git fetch` son realmente *muy, muy* similares a los de `git push`. Es el mismo tipo de conceptos, pero aplicados en la dirección opuesta (dado que ahora estás bajando commits en lugar de subirlos).", + "", + "Veamos los conceptos de a uno en uno..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### El parámetro ``", + "", + "Si especificas un lugar con git fetch como en el comando siguiente:", + "", + "`git fetch origin foo`", + "", + "Git va a ir a la rama `foo` en el remoto, va a traer todos los commits que no estén presentes localmente, y luego los aplicará sobre la rama `o/foo` localmente.", + "", + "Veámoslo en acción (refresquemos el concepto)." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Especificando un lugar..." + ], + "afterMarkdowns": [ + "Sólo bajamos los commits de `foo` y los ubicamos en `o/foo`" + ], + "command": "git fetch origin foo", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Te podrás estar preguntando \"¿Por qué git aplicó esos commits sobre la rama `origin/foo` en lugar de aplicarlos sobre la rama `foo` local? Pensé que el parámetro `` era un lugar que existía tanto local como remotamente\"", + "", + "Bueno, git hace una excepción especial en este caso, porque podrías tener trabajo en la rama `foo` que no quieras mezclar. Esto hace referencia a la lección anterior sobre `git fetch` - no actualiza tus ramas locales no-remotas, sólo descarga los commits (para que pueadas verlos o mergearlos después).", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "\"Bueno, y, en ese caso, ¿qué pasa si explícitamente defino el origen y destino con `:`?\"", + "", + "Si te sientes lo suficientemente seguro como para traer commits *directamente* a una rama local, entonces, sí, puedes especificarlo usando una referencia con dos puntos. No puedes traer commits a una rama que sobre la que hayas hecho checkout, pero en cualquier otro caso git te lo va a permitir.", + "", + "Este es el único problema, igual: `` es ahora un lugar en el *remoto*, y `` es un lugar *local* en donde poner esos commits. Es exactamente lo opuesto a git push, y eso tiene sentido dado que ¡estamos transfiriendo los datos en la dirección opuesta!", + "", + "Habiendo dicho esto, difícilmente alguien use esto en la práctica. Lo estoy presentando principalmente como un modo de conceptualizar que `fetch` y `push` son bastante similares, sólo que en direcciones opuestas." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos esta locura en acción:" + ], + "afterMarkdowns": [ + "¡Caramba! Mira: git resolvió `foo~1` como un lugar en el origin y bajó esos commits a `bar` (que era una rama local). Observa como `foo` y `o/foo` no fueron actualizados, dado que especificamos un destino." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué pasa si el destino no existe antes de ejecutar este comando? Veamos el último ejemplo pero sin que `bar` exista de antemano." + ], + "afterMarkdowns": [ + "Mira: es IGUAL que git push. Git creó el destino localmente antes de hacer el fetch, tal como git creará el destino en el remoto antes de hacer push (si no existiera)." + ], + "command": "git fetch origin foo~1:bar", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Sin argumentos?", + "", + "Si `git fetch` no recibe ningún argumento, simplemente descarga todos los commits del remoto a todas las ramas remotas..." + ], + "afterMarkdowns": [ + "Bastante simple, pero merece la pena verlo al menos una vez." + ], + "command": "git fetch", + "beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Bueno, demasiada charla. Para completar este nivel, haz fetch sólo de los commits especificados en la visualización del objetivo. ¡Familiarízate con esos comandos!", + "", + "Vas a tener que especificar el origen y el destino para ambos comandos fetch. Presta atención al objetivo dado que ¡los IDs pueden estar invertidos!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/fetchRebase.js b/src/levels/remote/fetchRebase.js index b5ca6fca..9c7af23d 100644 --- a/src/levels/remote/fetchRebase.js +++ b/src/levels/remote/fetchRebase.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "偏离的提交历史", "zh_TW": "diverged history", "es_AR": "Historia divergente", + "es_ES": "Historia divergente", "pt_BR": "Histórico divergente", "gl" : "Histórico diverxente", "de_DE": "Abweichende History", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "按照目标中的提交树的顺序进行检出", "zh_TW": "確認視覺化的目標中的順序", "es_AR": "Prestá atención al orden del objetivo", + "es_ES": "Presta atención al orden del objetivo", "pt_BR": "Preste atenção na ordem da visualização do objetivo", "gl" : "Presta atención ó orixe do obxectivo", "de_DE": "Beachte die Reihenfolge in der Zieldarstellung", @@ -462,6 +464,149 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Trabajo divergente", + "", + "Hasta ahora hemos visto cómo hacer pull a commits de otros y cómo hacer push a los nuestros. Parece bastante simple, así que ¿cómo puede confundirse tanto la gente?", + "", + "La dificultad viene cuando la historia de los repositorios *diverge*. Antes de entrar en detalles, veamos un ejemplo...", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Imagínate que clonas un repositorio el lunes y empiezas a desarrollar algo. Para el viernes ya estás listo para publicar tu trabajo, pero, ¡vaya! Tus colegas también han estado escribiendo código durante la semana, haciendo que tu trabajo quede desactualizado (y obsoleto). Además, ellos publicaron esos commits en el repositorio remoto, así que ahora *tu* trabajo está basado en una versión *vieja* del proyecto, que ya no le interesa a nadie.", + "", + "En este caso, el comando `git push` es ambiguo. Si ejecutas `git push`, ¿git debería cambiar el repositorio a como estaba el lunes? ¿Debería tratar de agregar tu código sin eliminar el código nuevo? ¿O debería ignorar completamente tus cambios porque están desactualizados?", + "", + "Como hay tanta ambiguedad en esta situación (en la que la historia divirgió), git no te permite hacer push de tus cambios. En cambio, te fuerza a integrar el último estado del repositorio remoto antes de poder compartir tu trabajo." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¡Demasiada charla, veámoslo en acción!" + ], + "afterMarkdowns": [ + "¿Ves? No pasó nada, porque el comando falla. `git push` falla porque `C3`, tu commit más reciente, está basado en el remoto sobre `C1`. El remoto fue actualizado a `C2` desde entonces, por lo que git rechaza tu push" + ], + "command": "git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Cómo puedes resolver esta situación? Es fácil, todo lo que tienes que hacer es basar tu trabajo en la versión más reciente de la rama remota.", + "", + "Hay un par de maneras de hacer esto, pero la más simple es mover tu trabajo haciendo un rebase. Probémoslo a ver cómo se ve." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Ahora, si hacemos rebase antes de hacer push..." + ], + "afterMarkdowns": [ + "¡Zas! Actualizamos nuestra representación local del remoto con `git fetch`, hacemos rebase de nuestro trabajo para reflejar los nuevos cambios del remoto, y después los subimos con `git push`" + ], + "command": "git fetch; git rebase o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Hay otra manera de actualizar mi trabajo si actualizaron el repositorio remoto? ¡Claro que sí! Veamos cómo hacer lo mismo pero usando `merge`.", + "", + "Por más que `git merge` no mueva tu trabajo (sólo crea un commit de merge), es un modo de decirle a git que integraste todos los cambios del remoto. Esto es porque ahora una rama remota pasó a ser un *ancestro* de tu propia rama, lo que significa que tu commit refleja los cambios de todos los commits de la rama remota.", + "", + "Veamos una muestra..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Si en lugar de hacer rebase hacemos un merge..." + ], + "afterMarkdowns": [ + "¡Zas! Actualizamos nuestra representación local del remoto usando `git fetch`, *mergeamos* el nuevo trabajo junto con el nuestro (para reflejar los nuevos cambios en el remoto), y después los subimos usando `git push`" + ], + "command": "git fetch; git merge o/master; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Asombroso! ¿Hay forma de hacer esto sin escribir tantos comandos?", + "", + "¡Claro que sí! Ya sabes que `git pull` es simplemente un atajo para hacer fetch y merge. Convenientemente, ¡`git pull --rebase` es un atajo para hacer fetch y rebase!", + "", + "Veamos estos atajos funcionando." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Primero con `--rebase`..." + ], + "afterMarkdowns": [ + "¡Igual que antes! Sólo que bastante más corto." + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Y ahora un `pull` común" + ], + "afterMarkdowns": [ + "Otra vez, ¡exactamente lo mismo que antes!" + ], + "command": "git pull; git push", + "beforeCommand": "git clone; git fakeTeamwork; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Toda este tinglado de hacer fetch, rebase/merge y push es bastante común. En lecciones futuras vamos a ver formas más complejas de estos flujos de trabajo, pero por ahora vamos a probar esto que acabamos de ver.", + "", + "Para resolver este nivel, haz lo siguiente:", + "", + "* Clona tu repositorio", + "* Simula algo de trabajo de un colega (1 commit)", + "* Haz commit de algún cambio tuyo (1 commit)", + "* Publica tu trabajo *rebaseando*" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/mergeManyFeatures.js b/src/levels/remote/mergeManyFeatures.js index b06c89d0..cd5c4629 100644 --- a/src/levels/remote/mergeManyFeatures.js +++ b/src/levels/remote/mergeManyFeatures.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "合并远程仓库", "zh_TW": "merge with remotes", "es_AR": "Mergeando con los remotos", + "es_ES": "Haciendo merge con los remotos", "pt_BR": "Merge com remotos", "gl" : "Merge cos repos remotos", "de_DE": "Änderungen vom Remote zusammenführen", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "注意目标树!", "zh_TW": "注意最後要完成的目標!", "es_AR": "¡Prestá atención al árbol final!", + "es_ES": "¡Presta atención al árbol final!", "pt_BR": "Preste atenção na árvore do objetivo!", "gl" : "Presta atención á arbore final!", "de_DE": "Beachte den Ziel-Baum!", @@ -169,6 +171,51 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## ¿Por qué no hacer merge?", + "", + "Para hacer push con tus novedades al remoto, todo lo que tienes que hacer es *integrar* los últimos cambios del remoto con los tuyos. Eso significa que puedes hacer tanto rebase como merge con la rama remota (por ejemplo, `o/master`).", + "", + "Así que si puedes hacer cualquiera de las dos, ¿por qué las lecciones sólo se han centrado en rebasear hasta ahora? ¿Por qué no dedicarle algo de amor al `merge` cuando trabajamos con remotos?", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Hay mucho debate entre los desarrolladores sobre los pros y contras de mergear vs rebasear. Aquí te mostraré los pros y contras de rebasear:", + "", + "Pros:", + "", + "* Rebasear hace que tu árbol de commits se vea bastante limpio, porque todos los commits siguen una única línea", + "", + "Contras:", + "", + "* Rebasear modifica la historia (aparente) de tu árbol de commits.", + "", + "Por ejemplo, el commit `C1` puede rebasearse para que aparezca *después* de `C3`. Entonces, parece que el trabajo de `C1'` se hizo después de `C3`, cuando en realizad se había hecho antes.", + "", + "Algunos desarrolladores prefieren preservar la historia, por lo que deciden mergear. Otros (como yo) preferimos tener un árbol de commits limpios, y preferimos rebasear. Todo es una cuestión de preferencias :D" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, tratemos de resolver el nivel anterior, pero *mergeando*. Puede volverse un poco cuesta arriba, pero ilustra la idea bastante bien." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pull.js b/src/levels/remote/pull.js index 59802a2a..a57313af 100644 --- a/src/levels/remote/pull.js +++ b/src/levels/remote/pull.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "Git Pull", "zh_TW": "git pull", "es_AR": "git pull", + "es_ES": "git pull", "pt_BR": "Git Pull", "gl" : "Git Pull", "de_DE": "Git Pull", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "运行 git pull 命令就可以了!", "zh_TW": "只要下 git pull 這個指令即可", "es_AR": "Simplemente ¡hacé git pull!", + "es_ES": "Simplemente ¡ejecuta git pull!", "pt_BR": "Basta executar git pull!", "gl" : "Sinxelamente fai git pull!", "de_DE": "Führe einfach git pull aus.", @@ -210,6 +212,65 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Git Pull", + "", + "Ahora que vimos cómo traer datos de un repositorio remoto con `git fetch`, ¡actualicemos nuestro trabajo local para reflejar esos cambios!", + "", + "Realmente hay varias formas de hacer esto: una vez que tienes los commits disponibles localmente, puedes integrarlos como si fueran commits comunes de otras ramas. Esto significa que podrías ejecutar comandos como:", + "", + "* `git cherry-pick o/master`", + "* `git rebase o/master`", + "* `git merge o/master`", + "* etc., etc.", + "", + "De hecho, el flujo de trabajo de *fetchear* cambios remotos y después *mergearlos* es tan común que git incluye un comando que hace ambas cosas de una: ¡`git pull`!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos primero un `fetch` y un `merge` ejecutados secuencialmente" + ], + "afterMarkdowns": [ + "Zas: descargamos `C3` con un `fetch` y luego lo mergeamos con `git merge o/master`. Ahora nuestra rama `master` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)" + ], + "command": "git fetch; git merge o/master", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué pasaría si en cambio utilizásemos `git pull`?" + ], + "afterMarkdowns": [ + "¡Lo mismo! Eso debería dejar bien claro que `git pull` es básicamente un atajo para hacer `git fetch` seguido por un merge con la rama que hayamos descargado." + ], + "command": "git pull", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Exploraremos los detalles de `git pull` después (incluyendo sus opciones y parámetros), pero por ahora probémoslo en este nivel.", + "", + "Recuerda: puedes ejecutar este comando simplemente con `fetch` y `merge`, pero eso te costaría un comando extra :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pullArgs.js b/src/levels/remote/pullArgs.js index 3b624b29..f976280e 100644 --- a/src/levels/remote/pullArgs.js +++ b/src/levels/remote/pullArgs.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "Git pull 的参数", "zh_TW": "pull 的參數", "es_AR": "Parámetros de pull", + "es_ES": "Parámetros de pull", "pt_BR": "Parâmetros do pull", "gl" : "Parámetros de pull", "de_DE": "Optionen für Pull", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "记住, 你可以通过 fetch/pull 创建本地分支", "zh_TW": "記住,你可以透過 fetch 以及 pull 來建立一個新的 local 的 branch", "es_AR": "Acordate de que podés crear nuevas ramas locales usando los parámetros de fetch/pull", + "es_ES": "Recuerda que puedes crear nuevas ramas locales usando los parámetros de fetch/pull", "pt_BR": "Lembre-se que você pode criar novos ramos locais com parâmetros de fetch/pull", "gl" : "Lémbrate que podes crear novas ramas locais con parámetros de fetch/pull", "de_DE": "Du kannst neue lokale Branches mittels fetch / pull erstellen", @@ -255,6 +257,80 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de git pull", + "", + "Ahora que sabes prácticamente *todo* lo que hay que saber sobre los parámetros de `git fetch` y `git push`, casi no queda nada por cubrir del comando git pull :)", + "", + "Eso es porque git pull es simplemente un atajo para hacer un fetch seguido de un merge. Puedes imaginártelo como ejecutar git fetch con los *mismos* parámetros, y después hacer merge de ello hacia donde esos commits hayan ido a parar.", + "", + "Esto aplica incluso cuando utilizas parámetros rebuscados en exceso. Veamos algunos ejemplos:" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Estos son algunos comandos equivalentes de git:", + "", + "`git pull origin foo` equivale a:", + "", + "`git fetch origin foo; git merge o/foo`", + "", + "Y...", + "", + "`git pull origin bar~1:bugFix` equivale a:", + "", + "`git fetch origin bar~1:bugFix; git merge bugFix`", + "", + "¿Ves? git pull es simplemente un atajo para un fetch + merge, y todo lo que le importa a git pull es dónde terminaron esos commits (el parámetro `destino` que determina durante el fetch).", + "", + "Veamos una demostración:" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Si especificamos el lugar desde donde hacer fetch, todo ocurre como antes, pero sólo mergeamos lo que se fetcheó" + ], + "afterMarkdowns": [ + "¡Ves! Especificando `master` descargamos los commits a `o/master` como siempre. Después mergeamos `o/master` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo." + ], + "command": "git pull origin master", + "beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Esto funciona con origen y destino, también? ¡Más vale! Veámoslo:" + ], + "afterMarkdowns": [ + "Caramba, eso es una BARBARIDAD en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del master del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!" + ], + "command": "git pull origin master:foo", + "beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "OK: para terminar, intenta alcanzar el estado del objetivo. Vas a necesitar descargar algunos commits, crear algunas ramas nuevas, y mergear esas ramas junto con otras, pero no debería llevar demasiados comandos :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { @@ -731,7 +807,7 @@ exports.level = { "", "`git fetch origin bar~1:bugFix; git merge bugFix`", "", - "보이죠? git pull은 그저 fetch + merge의 축양형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).", + "보이죠? git pull은 그저 fetch + merge의 축약형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).", "", "직접 확인해봅시다:" ] diff --git a/src/levels/remote/push.js b/src/levels/remote/push.js index a124d771..538799b2 100644 --- a/src/levels/remote/push.js +++ b/src/levels/remote/push.js @@ -10,6 +10,7 @@ exports.level = { "zh_CN": "Git Push", "zh_TW": "git push", "es_AR": "git push", + "es_ES": "git push", "pt_BR": "Git Push", "gl" : "Git Push", "de_DE": "Git Push", @@ -25,6 +26,7 @@ exports.level = { "zh_CN": "推送之前需要先克隆", "zh_TW": "push 之前你需要先 clone", "es_AR": "¡Acordate que tenés que clonar antes de pushear!", + "es_ES": "¡Recuerda que tienes que clonar antes de hacer push!", "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する必要があるのをお忘れなく", @@ -162,6 +164,47 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## git push", + "", + "Entendido, entonces ya descargué los cambios de un repositorio remoto y los integré en mi trabajo localmente. Esto suena muy bien... pero ¿cómo comparto _mis_ cambios con el resto?", + "", + "Bueno, la forma de subir el trabajo compartido es la opuesta a cómo descargar trabajo. Y ¿qué es lo opuesto a `git pull`? ¡`git push`!", + "", + "`git push` es el responsable de subir _tus_ cambios a un remoto específico y de actualizar ese remoto para incluir tus nuevos commits. Cuando `git push` termina, todos tus amigos pueden descargar tu trabajo del remoto.", + "", + "Puedes imaginarte `git push` como un comando para \"publicar\" tu trabajo. Tiene un par de sutilezas con las que vamos a meternos pronto, pero empecemos poco a poco." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Aquí tenemos algunos cambios que nuestro remoto no tiene. ¡Subámoslos!" + ], + "afterMarkdowns": [ + "Ahí está: el remoto recibió el commit `C2`, la rama `master` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/master`) también fue actualizado. ¡Todo está en sincronía!" + ], + "command": "git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, simplemente comparte dos nuevos commits con el remoto. Igualmente, no te confíes, ¡las lecciones van a empezar a complicarse!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pushArgs.js b/src/levels/remote/pushArgs.js index 5fb6db85..fcf95676 100644 --- a/src/levels/remote/pushArgs.js +++ b/src/levels/remote/pushArgs.js @@ -10,6 +10,7 @@ exports.level = { "zh_CN": "Git push 的参数", "zh_TW": "git push 的參數", "es_AR": "Parámetros de git push", + "es_ES": "Parámetros de git push", "pt_BR": "Parâmetros do git push", "gl" : "Parámetros de git push", "de_DE": "Optionen für Git Push", @@ -25,6 +26,7 @@ exports.level = { "zh_CN": "你可以利用“objective”来阅读对话窗口的最后一页", "zh_TW": "你可以利用 \"objective\" 來閱讀對話視窗的最後一頁", "es_AR": "Siempre podés ver el último mensaje tipeando \"objective\"", + "es_ES": "Siempre puedes ver el último mensaje escribiendo \"objective\"", "pt_BR": "Você sempre pode rever o último slide com o comando \"objective\"", "gl" : "Ti sempre podes desfacer último mensaxe escribindo \"objective\"", "de_DE": "Du kannst dir die Zielsetzung des Levels immer wieder mit \"objective\" anzeigen lassen", @@ -191,7 +193,7 @@ exports.level = { "markdowns": [ "## Parámetros de push", "", - "¡Genial! Ahora que sabés acerca de las ramas que trackean remotos podemos empezar a develar algo del misterio detrás de git push, fetch y pull. Vamos a atacar de a un comando a la vez, pero los conceptos entre ellos son muy similares.", + "¡Genial! Ahora que sabés acerca de las ramas que trackean remotos podemos empezar a desvelar algo del misterio detrás de git push, fetch y pull. Vamos a atacar de a un comando a la vez, pero los conceptos entre ellos son muy similares.", "", "Veamos primero `git push`. Ya aprendiste en la lección sobre ramas remotas que git determinó el remoto *y* la rama a la que pushear mirando las propiedades de la rama actual (el remoto al que \"trackea\"). Este es el comportamiento default para cuando no se especifican parámetros, pero git push toma, opcionalmente, parámetros de la forma:", "", @@ -255,6 +257,78 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Parámetros de push", + "", + "¡Genial! Ahora que has aprendido sobre las ramas que trackean remotos podemos empezar a desvelar algo del misterio detrás de git push, fetch y pull. Vamos a atacar un comando cada vez, pero los conceptos entre ellos son muy similares.", + "", + "Veamos primero `git push`. Ya aprendiste en la lección sobre ramas remotas que git determinó el remoto *y* la rama a la que pushear mirando las propiedades de la rama actual (el remoto al que \"trackea\"). Este es el comportamiento por defecto para cuando no se especifican parámetros, pero git push toma, opcionalmente, parámetros de la forma:", + "", + "`git push `", + "", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¿Qué será este parámetro ``, te preguntarás? Vamos a entrar en detalle, pero primero un ejemplo. Ejecutar el comando:", + "", + "`git push origin master`", + "", + "se traduce así al español:", + "", + "*Vete a la rama llamada \"master\" en mi repositorio, coge todos los commits, y después vete a la rama \"master\" del remoto llamado \"origin\". Copia ahí todos los commits que falten, y avísame cuando termines.*", + "", + "Especificando `master` como el parámetro \"lugar\", le dijimos a git de dónde traer los commits, y a dónde mandarlos. Es, básicamente, el \"lugar\" o \"ubicación\" que sincronizar entre ambos repositorios.", + "", + "Ten en cuenta que, como le dijimos a git todo lo que necesitaba saber (especificando ambos parámetros), ¡ignora totalmente dónde estamos parados en este momento¡" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos un ejemplo especificando los parámetros. Date cuenta dónde estamos parados en este ejemplo." + ], + "afterMarkdowns": [ + "¡Ahí está! Se actualizó `master` en el remoto, porque especificamos esos parámetros." + ], + "command": "git checkout C0; git push origin master", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Y si no especificabamos los parámetros? ¿Qué hubiera pasado?" + ], + "afterMarkdowns": [ + "El comando falla (como puedes ver), porque `HEAD` no está sobre ninguna rama que apunte a algún remoto." + ], + "command": "git checkout C0; git push", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Perfecto. Para este nivel, actualicemos tanto `foo` como `master` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pushArgs2.js b/src/levels/remote/pushArgs2.js index 5683a235..a6864401 100644 --- a/src/levels/remote/pushArgs2.js +++ b/src/levels/remote/pushArgs2.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "Git push 参数 2", "zh_TW": "git push 的參數,延伸討論!", "es_AR": "¡Más! Parámetros de git push", + "es_ES": "¡Más! Parámetros de git push", "pt_BR": "Parâmetros do git push -- expandido", "gl" : "Parámetros de git push -- ampliado", "de_DE": "Optionen für Git Push -- noch mehr!", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "如果你认输的话,可以通过“show solution”查看解决方案 :P", "zh_TW": "如果你失敗了,可以利用 \"show solution\" 來找到解答:P", "es_AR": "Recordá que podés admitir tu derrota y tipear \"show solution\" para ver la solución :P", + "es_ES": "Recuerda que puedes admitir tu derrota y escribir \"show solution\" para ver la solución :P", "pt_BR": "Lembre-se que você pode admitir que foi derrotado e digitar \"show solution\" :P", "gl" : "Lembrate que podes admitir que fuches derrotado e escribir \"show solution\" para amosala solución :P", "de_DE": "Vergiss nicht dass du aufgeben kannst, indem du \"show solution\" eingibst :P", @@ -183,9 +185,9 @@ exports.level = { "", "Acordate de la lección anterior que cuando especificamos `master` como el parámetro lugar de git push, especificamos tanto el *origen* del que sacar los commits como el *destino* al que enviarlos.", "", - "Podrías estár preguntándote ¿Y si quisieramos que el origen y el destino sean distintos? ¿Si quisieras pushear los commits de la rama local `foo` a la rama `bar` del remote?", + "Podrías estar preguntándote ¿Y si quisiéramos que el origen y el destino sean distintos? ¿Si quisieras pushear los commits de la rama local `foo` a la rama `bar` del remote?", "", - "Bueno, lamentablemente eso no se puede hacer en git... ¡Bazinga! Claro que se puede :)... git es extremadísimamente flexible (casi casi que demsiado).", + "Bueno, lamentablemente eso no se puede hacer en git... ¡Bazinga! Claro que se puede :)... git es extremadísimamente flexible (casi casi que demasiado).", "", "Veamos cómo hacerlo a continuación..." ] @@ -201,7 +203,7 @@ exports.level = { "", "Esto se lo suele llamar refspec con dos puntos. Refspec es simplemente un nombre cool para una ubicación que git puede entender (como la rama `foo`, o incluso `HEAD~1`)", "", - "Una vez que especificás tanto el origen como el destino independientemente, podés ponerte bastante cómodo y preciso con los comandos remotos. ¡Veámos una demo!" + "Una vez que especificás tanto el origen como el destino independientemente, podés ponerte bastante cómodo y preciso con los comandos remotos. ¡Veamos una demo!" ] } }, @@ -222,7 +224,7 @@ exports.level = { "type": "GitDemonstrationView", "options": { "beforeMarkdowns": [ - "¿Y qué hay si el destino que al querés pushear no existe? ¡No hay drama! Simplemente dale un nombre al branch y git se va a encargar de creártelo en el remoto." + "¿Y qué hay si el destino al que querés pushear no existe? ¡No hay drama! Simplemente dale un nombre al branch y git se va a encargar de creártelo en el remoto." ], "afterMarkdowns": [ "Genial, simplemente fluye :D" @@ -243,6 +245,76 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Detalles sobre el parámetro ``", + "", + "Recuerda de la lección anterior que cuando especificamos `master` como el parámetro lugar de git push, especificamos tanto el *origen* del que sacar los commits como el *destino* al que enviarlos.", + "", + "Podrías estar preguntándote ¿Y si quisiéramos que el origen y el destino fuesen distintos? ¿Si quisieras hacer push de los commits de la rama local `foo` a la rama `bar` del remote?", + "", + "Bueno, lamentablemente eso no se puede hacer en git... ¡zasca! Claro que se puede :)... git es extremadamente flexible (casi casi que demasiado).", + "", + "Veamos cómo hacerlo a continuación..." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para especificar tanto el origen como el destino de ``, simplemente únelos usando el signo `dos puntos`:", + "", + "`git push origin :`", + "", + "A esto se le suele llamar refspec con dos puntos. Refspec es simplemente un nombre genial para una ubicación que git puede entender (como la rama `foo`, o incluso `HEAD~1`)", + "", + "Una vez que especificas tanto el origen como el destino independientemente, puedes ponerte bastante cómodo y preciso con los comandos remotos. ¡Veamos una demo!" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Recuerda: `origen` es cualquier ubicación que git pueda entender:" + ], + "afterMarkdowns": [ + "¡Vaya! Ese commando es bastante rompedor, pero tiene sentido: git resolvió `foo^` a una ubicación, subió cualquier commit de ahí que aún no estuviera en el remoto, y luego actualizó el destino." + ], + "command": "git push origin foo^:master", + "beforeCommand": "git clone; go -b foo; git commit; git commit" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Y qué ocurre si el destino al que quieres hacer push no existe? ¡Sin problema! Simplemente dale un nombre a la rama y git se va a encargar de creártelo en el remoto." + ], + "afterMarkdowns": [ + "Genial, simplemente fluye :D" + ], + "command": "git push origin master:newBranch", + "beforeCommand": "git clone; git commit" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para este nivel, trata de llegar al objetivo final, y recuerda el formato:", + "", + "`:`" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/pushManyFeatures.js b/src/levels/remote/pushManyFeatures.js index 66599bd7..f5d52c01 100644 --- a/src/levels/remote/pushManyFeatures.js +++ b/src/levels/remote/pushManyFeatures.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "你随时都可以使用 undo 或 reset 命令。", "zh_TW": "你隨時都可以使用 undo 或 reset 指令。", "es_AR": "Acordate que siempre podés usar los comandos reset y undo", + "es_ES": "Recuerda que siempre puedes usar los comandos reset y undo", "pt_BR": "Lembre-se que você sempre pode usar undo ou reset", "gl" : "Lembra que sempre podes usar undo ou reset", "de_DE": "Denk dran, du kannst immer undo oder reset benutzen, um deine Befehle zurück zu nehmen.", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "推送主分支", "zh_TW": "push master!", "es_AR": "¡Push Master!", + "es_ES": "¡Push Master!", "pt_BR": "Push Master!", "gl" : "Empurra ó Master!", "de_DE": "Push Master!", @@ -193,6 +195,59 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Haciendo merge con ramas de trabajo", + "", + "Ahora que estás cómodo fetcheando, pulleando y pusheando, pongamos a prueba estas habilidades con un nuevo flujo de trabajo.", + "", + "Es bastante común que los desarrolladores en los grandes proyectos trabajen sobre ramas específicas para cada tarea (feature branches o ramas de trabajo) basadas en `master`, y que las integren sólo cuando estén listas. Esto es similar a la lección anterior, en la que hicimos push de las ramas periféricas al remoto, pero aquí tenemos un paso más.", + "", + "Algunos desarrolladores sólo pushean y pullean cuando están en `master`: de ese modo, `master` siempre se mantiene actualizado con el remoto (`o/master`).", + "", + "Entonces, en este flujo de trabajo combinamos dos cosas:", + "", + "* integramos el trabajo de las ramas específicas a `master`, y", + "* pusheamos y pulleamos del remoto" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Refresquemos un poco cómo actualizar `master` y pushear nuestro trabajo." + ], + "afterMarkdowns": [ + "Ahora ejecutamos dos comandos que:", + "", + "* rebasearon nuestro trabajo sobre los nuevos commits del remoto, y", + "* publicamos nuestro trabajo en ese remoto" + ], + "command": "git pull --rebase; git push", + "beforeCommand": "git clone; git commit; git fakeTeamwork" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este nivel es bastante pesado. Aquí tienes algunas ideas para resolverlo:", + "", + "* Tenemos tres ramas específicas -- `side1` `side2` and `side3`", + "* Queremos hacer push de cada una de esas ramas, en orden, al remoto", + "* El remoto fue actualizado, así que vamos a tener que integrar esos cambios también", + "", + ":O ¡Genial! ¡Éxito! Completar este nivel representa un gran avance." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/remoteBranches.js b/src/levels/remote/remoteBranches.js index 76f5781b..47ce8e58 100644 --- a/src/levels/remote/remoteBranches.js +++ b/src/levels/remote/remoteBranches.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "远程分支", "zh_TW": "remote branch (遠端分支)", "es_AR": "Ramas remotas", + "es_ES": "Ramas remotas", "pt_BR": "Ramos remotos", "gl" : "Ramas remotas", "de_DE": "Branches auf entfernten Servern", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "注意顺序 —— 先在 master 分支上提交!", "zh_TW": "注意順序的問題喔!先在 master branch 上面送 commit", "es_AR": "Prestá atención al orden: ¡commiteá sobre master primero!", + "es_ES": "Presta atención al orden: ¡haz commit sobre master primero!", "pt_BR": "Preste atenção na ordem: commite no master primeiro!", "gl" : "Preta atención á orde: fai commit no master primeiro", "de_DE": "Beachte die Sortierung -- committe zuerst auf dem master!", @@ -167,7 +169,7 @@ exports.level = { "", "Lo primero que habrás notado es que apareció una nueva rama en tu repositorio local llamada `o/master`. A este tipo de ramas se las llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven un propósito específico.", "", - "Las ramas remotas reflejan el _estado_ de los repositorios remotos (como estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.", + "Las ramas remotas reflejan el _estado_ de los repositorios remotos (cómo estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.", "", "Las ramas remotas tienen la propiedad especial de que cuando las checkouteás, pasás al modo detached `HEAD`. Git lo hace a propósito porque no podés trabajar en esas ramas directamente: tenés que trabajar en algún otro lado y después compartir tu trabajo con el remoto (tras lo que tus ramas remotas se actualizarán)." ] @@ -216,6 +218,67 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Ramas remotas de git", + "", + "Ahora que viste `git clone` en acción, ahondemos en lo que realmente cambió.", + "", + "Lo primero que habrás notado es que apareció una nueva rama en tu repositorio local llamada `o/master`. A este tipo de ramas se las llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven un propósito específico.", + "", + "Las ramas remotas reflejan el _estado_ de los repositorios remotos (cómo estaban la última vez que hablaste con ellos). Te ayudan a entender las diferencias entre tu trabajo local y el trabajo que ya está publicado - un paso crítico antes de compartir tu trabajo con los demás.", + "", + "Las ramas remotas tienen la propiedad especial de que cuando haces checkout sobre ellas, pasas al modo detached `HEAD`. Git lo hace a propósito porque no puedes trabajar en esas ramas directamente: tienes que trabajar en algún otro lado y después compartir tu trabajo con el remoto (tras lo que tus ramas remotas se actualizarán)." + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Qué es `o/`?", + "", + "Podrías estar preguntándote qué significa ese `o/` al principio de las ramas remotas. Bueno, las ramas remotas también tienen una convención de nombres obligatoria -- se muestran con el formato:", + "", + "* `/`", + "", + "Entonces, si observas una rama llamada `o/master`, el nombre de la rama es `master`, y el nombre del remoto es `o`.", + "", + "La mayoría de los desarrolladores llaman `origin` a su remoto en lugar de `o`. Esto es tan común que git efectivamente crea tu remoto llamándolo `origin` cuando haces `git clone` de un repositorio.", + "", + "Desafortunadamente el nombre `origin` completo no entra en nuestra UI (interfaz de usuario), así que usamos `o` para abreviar :(Simplemente recuerda que cuando uses el git real, tu remoto ¡probablemente se llame `origin`!", + "", + "Queda mucho por aprender, así que veámoslo en acción." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Hagamos checkout sobre una rama remota a ver qué pasa" + ], + "afterMarkdowns": [ + "Como ves, git nos puso en el modo detached `HEAD` y no actualizó `o/master` cuando creamos un nuevo commit. Esto ocurre porque `o/master` sólo va a actualizarse cuando el remoto se actualice." + ], + "command": "git checkout o/master; git commit", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Para completar este nivel, haz commit una vez sobre `master` y otra vez después de checkoutear `o/master`. Esto te va a ayudar a aprender cómo las ramas remotas funcionan distinto, y que sólo se actualizan para reflejar el estado del remoto." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/sourceNothing.js b/src/levels/remote/sourceNothing.js index f8922fd1..bcc482a1 100644 --- a/src/levels/remote/sourceNothing.js +++ b/src/levels/remote/sourceNothing.js @@ -11,6 +11,7 @@ exports.level = { "zh_CN": "没有 source 的 source", "zh_TW": "沒有 source", "es_AR": "Origen de nada", + "es_ES": "Origen de nada", "pt_BR": "Origem vazia", "gl" : "Orixen de nada", "de_DE": "Die Quelle des Nichts", @@ -26,6 +27,7 @@ exports.level = { "zh_CN": "本关的 branch 命令被禁用了,你只能用 fetch!", "zh_TW": "在本關卡中,不允許使用 branch 指令,因此你只能使用 fetch!", "es_AR": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!", + "es_ES": "El comando branch está deshabilitado para este nivel, así que ¡vas a tener que usar fetch!", "pt_BR": "O comando branch está desabilitado para este nível, então você terá de usar o fetch!", "gl" : "O comando branch está deshabilitado para este nivel, entón terás que empregar o comando fetch!", "de_DE": "Der branch Befehl ist für diesen Level inaktiv, du musst also fetch benutzen", @@ -151,7 +153,7 @@ exports.level = { "markdowns": [ "### Rarezas de ``", "", - "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que tecnicamente podés especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:", + "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que técnicamente podés especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:", "", "* `git push origin :side`", "* `git fetch origin :bugFix`", @@ -196,6 +198,59 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Rarezas de ``", + "", + "Git abusa del parámetro `` de dos extrañas maneras. Estos dos abusos vienen del hecho de que técnicamente puedes especificar \"la nada\" como un `origen` válido tanto para git push como para git fetch. El modo de especificar la nada es a través de un parámetro vacío:", + "", + "* `git push origin :side`", + "* `git fetch origin :bugFix`", + "", + "Veamos qué hacen estos..." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "¿Qué hace el hacer push de \"nada\" a una rama remota? ¡La elimina!" + ], + "afterMarkdowns": [ + "Ahí está, eliminamos la rama `foo` exitosamente del remoto haciendo push con \"nada\". Tiene algo de sentido..." + ], + "command": "git push origin :foo", + "beforeCommand": "git clone; git push origin master:foo" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Finalmente, hacer fetch de \"nada\" a un lugar local en realidad crea una nueva rama" + ], + "afterMarkdowns": [ + "Bastante extraño, pero bueno, da igual. Así es git." + ], + "command": "git fetch origin :bar", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "Este es un nivel breve: simplemente elimina una rama remota y crea una nueva usando `git fetch` para completarlo." + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/src/levels/remote/tracking.js b/src/levels/remote/tracking.js index 87618e3e..7c5ba042 100644 --- a/src/levels/remote/tracking.js +++ b/src/levels/remote/tracking.js @@ -7,6 +7,7 @@ exports.level = { "zh_CN": "远程追踪", "zh_TW": "remote tracking", "es_AR": "Trackeando remotos", + "es_ES": "Trackeando remotos", "pt_BR": "Seguindo remotos", "gl" : "Traceando os remotos", "de_DE": "Remote Tracking", @@ -22,6 +23,7 @@ exports.level = { "zh_CN": "记住,有两种设置 remote tracking 的方法!", "zh_TW": "記住喔,有兩個方式可以去設定 remote tracking", "es_AR": "¡Acordate de que hay dos formas de trackear un remoto!", + "es_ES": "¡Recuerda que hay dos formas de trackear un remoto!", "pt_BR": "Lembre-se que há duas formas de seguir um ramo remoto!", "gl" : "¡Lembrate de que hai dúas formas de seguir unha rama remota!", "de_DE": "Nicht vergessen, es gibt zwei Arten Remote Tracking einzurichten!", @@ -313,7 +315,7 @@ exports.level = { "markdowns": [ "### ¿Puedo especificarlo yo?", "", - "¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso signfica que podés correr `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!", + "¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso significa que podés correr `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!", "", "Hay dos formas de establecer esta propiedad. La primera es checkoutear una nueva rama usando una rama remota como la referencia especificada. Ejecutar", "", @@ -389,6 +391,126 @@ exports.level = { } ] }, + "es_ES": { + "childViews": [ + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Ramas que trackean remotos", + "", + "Una de las cosas que te pueden haber parecido \"mágicas\" de las últimas lecciones es que git sabía que la rama `master` estaba relacionada con `o/master`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `master` del remoto con la rama `master` local, pero esta conexión es bien evidente en dos escenarios:", + "", + "* Durante una operación de pull, los commits se descargan a `o/master` y después se *mergean* a la rama `master`. El objetivo implícito del merge se determina con esta conexión.", + "* Durante un push, el trabajo de la rama `master` se sube a la rama `master` del remoto (que estaba representada localmente por `o/master`). El *destino* del push se determina con esta conexión entre `master` y `o/master`.", + "" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "## Trackeando remotos", + "", + "Resumiendo, esta conexión entre `master` y `o/master` se explica simplemente por la propiedad de \"trackear (seguir) remotos\" de las ramas. La rama `master` está configurada para trackear `o/master` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `master`.", + "", + "Podrías estar pensando cómo esa propiedad apareció en tu rama `master` si no ejecutaste ningún comando para especificarlo. Bueno, cuando clonas un repositorio con git, esta propiedad es asignada por ti automáticamente.", + "", + "Durante un clone, git crea una rama remota por cada rama en el remoto (por ejemplo, ramas como `o/master`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `master`.", + "", + "Una vez completado el git clone, sólo tienes una única rama local (para que no te asustes) pero puedes ver todas las ramas del remoto (si fueses curioso). ¡Es lo mejor de ambos mundos!", + "", + "Esto también explica por qué podrías ver un mensaje como este durante la clonación:", + "", + " local branch \"master\" set to track remote branch \"o/master\"", + "", + " rama local \"master\" establecida para trackear la rama remota \"o/master\"" + ] + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### ¿Puedo especificarlo yo?", + "", + "¡Claro que sí! Puedes hacer que cualquier rama que quieras trackee `o/master`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `master`. Eso significa que puedes ejecutar `git push` en una rama llamada `absolutamenteNoEsMaster` y ¡que tu trabajo se pushee a la rama `master` del remoto!", + "", + "Hay dos formas de establecer esta propiedad. La primera es hacer checkout sobre una nueva rama usando una rama remota como la referencia especificada. Ejecutar", + "", + "`git checkout -b absolutamenteNoEsMaster o/master`", + "", + "Crea una nueva rama llamada `absolutamenteNoEsMaster` y la hace trackear a `o/master`." + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Basta de charla, ¡veamos un ejemplo! Vamos a hacer checkout de una nueva rama llamada `foo` y hacer que trackee a `master` en el remoto." + ], + "afterMarkdowns": [ + "Como puedes ver, usamos el objetivo implícito de merge `o/master` para actualizar la rama `foo`. ¡Observa cómo `master` no fue actualizada!" + ], + "command": "git checkout -b foo o/master; git pull", + "beforeCommand": "git clone; git fakeTeamwork" + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Lo mismo aplica para git push" + ], + "afterMarkdowns": [ + "Zas. Hacemos push de nuestro trabajo a la rama `master` del remoto incluso cuando nuestra rama se llamaba totalmente distinto" + ], + "command": "git checkout -b foo o/master; git commit; git push", + "beforeCommand": "git clone" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "### Forma número 2", + "", + "Otra forma de especificar la rama a trackear es usar la opción `git branch -u`. Ejecutando", + "", + "`git branch -u o/master foo`", + "", + "establecemos que la rama `foo` trackee a `o/master`. Si encima estás parado en `foo`, incluso puedes obviarlo:", + "", + "`git branch -u o/master`", + "" + ] + } + }, + { + "type": "GitDemonstrationView", + "options": { + "beforeMarkdowns": [ + "Veamos rápidamente esta otra forma de especificar la rama a trackear..." + ], + "afterMarkdowns": [ + "Lo mismo que antes, sólo que con un comando bastante más explícito. ¡Muy útil!" + ], + "command": "git branch -u o/master foo; git commit; git push", + "beforeCommand": "git clone; git checkout -b foo" + } + }, + { + "type": "ModalAlert", + "options": { + "markdowns": [ + "¡Perfecto! Para este nivel, haz push de tu trabajo a la rama `master` del remoto *sin* estar parado sobre `master` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P" + ] + } + } + ] + }, "pt_BR": { "childViews": [ { diff --git a/yarn.lock b/yarn.lock index e0639cbb..5f477b4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2873,9 +2873,9 @@ minizlib@^1.1.1: minipass "^2.2.1" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1"