From 265354740719ee76d969289d150905b7ed437565 Mon Sep 17 00:00:00 2001 From: Peter Cottle Date: Tue, 21 Nov 2023 11:36:49 -0500 Subject: [PATCH] rebuild for prod --- build/{bundle-e63057f7.js => bundle-33be7bef.js} | 2 +- index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename build/{bundle-e63057f7.js => bundle-33be7bef.js} (67%) diff --git a/build/bundle-e63057f7.js b/build/bundle-33be7bef.js similarity index 67% rename from build/bundle-e63057f7.js rename to build/bundle-33be7bef.js index 9d4e2412e..3f08197f6 100644 --- a/build/bundle-e63057f7.js +++ b/build/bundle-33be7bef.js @@ -200,4 +200,4 @@ object-assign * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -"use strict";var i,a,n,r;if("object"==typeof performance&&"function"==typeof performance.now){var s=performance;o.unstable_now=function(){return s.now()}}else{var c=Date,l=c.now();o.unstable_now=function(){return c.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var m=null,u=null,d=function(){if(null!==m)try{var e=o.unstable_now();m(!0,e),m=null}catch(e){throw setTimeout(d,0),e}};i=function(e){null!==m?setTimeout(i,0,e):(m=e,setTimeout(d,0))},a=function(e,t){u=setTimeout(e,t)},n=function(){clearTimeout(u)},o.unstable_shouldYield=function(){return!1},r=o.unstable_forceFrameRate=function(){}}else{var h=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var g=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof g&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var f=!1,b=null,v=-1,k=5,w=0;o.unstable_shouldYield=function(){return o.unstable_now()>=w},r=function(){},o.unstable_forceFrameRate=function(e){0>e||125>>1,a=e[i];if(!(void 0!==a&&0D(r,o))void 0!==c&&0>D(c,r)?(e[i]=c,e[s]=o,i=s):(e[i]=r,e[n]=o,i=n);else{if(!(void 0!==c&&0>D(c,o)))break e;e[i]=c,e[s]=o,i=s}}}return t}return null}function D(e,t){var o=e.sortIndex-t.sortIndex;return 0!==o?o:e.id-t.id}var x=[],M=[],j=1,E=null,T=3,q=!1,S=!1,G=!1;function V(e){for(var t=A(M);null!==t;){if(null===t.callback)_(M);else{if(!(t.startTime<=e))break;_(M),t.sortIndex=t.expirationTime,z(x,t)}t=A(M)}}function B(e){if(G=!1,V(e),!S)if(null!==A(x))S=!0,i(R);else{var t=A(M);null!==t&&a(B,t.startTime-e)}}function R(e,t){S=!1,G&&(G=!1,n()),q=!0;var i=T;try{for(V(t),E=A(x);null!==E&&(!(E.expirationTime>t)||e&&!o.unstable_shouldYield());){var r=E.callback;if("function"==typeof r){E.callback=null,T=E.priorityLevel;var s=r(E.expirationTime<=t);t=o.unstable_now(),"function"==typeof s?E.callback=s:E===A(x)&&_(x),V(t)}else _(x);E=A(x)}if(null!==E)var c=!0;else{var l=A(M);null!==l&&a(B,l.startTime-t),c=!1}return c}finally{E=null,T=i,q=!1}}var I=r;o.unstable_IdlePriority=5,o.unstable_ImmediatePriority=1,o.unstable_LowPriority=4,o.unstable_NormalPriority=3,o.unstable_Profiling=null,o.unstable_UserBlockingPriority=2,o.unstable_cancelCallback=function(e){e.callback=null},o.unstable_continueExecution=function(){S||q||(S=!0,i(R))},o.unstable_getCurrentPriorityLevel=function(){return T},o.unstable_getFirstCallbackNode=function(){return A(x)},o.unstable_next=function(e){switch(T){case 1:case 2:case 3:var t=3;break;default:t=T}var o=T;T=t;try{return e()}finally{T=o}},o.unstable_pauseExecution=function(){},o.unstable_requestPaint=I,o.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var o=T;T=e;try{return t()}finally{T=o}},o.unstable_scheduleCallback=function(e,t,r){var s=o.unstable_now();switch("object"==typeof r&&null!==r?r="number"==typeof(r=r.delay)&&0s?(e.sortIndex=r,z(M,e),null===A(x)&&e===A(M)&&(G?n():G=!0,a(B,r-s))):(e.sortIndex=c,z(x,e),S||q||(S=!0,i(R))),e},o.unstable_wrapCallback=function(e){var t=T;return function(){var o=T;T=t;try{return e.apply(this,arguments)}finally{T=o}}}},{}],44:[function(e,t,o){"use strict";t.exports=e("./cjs/scheduler.production.min.js")},{"./cjs/scheduler.development.js":42,"./cjs/scheduler.production.min.js":43}],45:[function(e,t,o){"use strict";t.exports=e("./cjs/scheduler-tracing.production.min.js")},{"./cjs/scheduler-tracing.development.js":40,"./cjs/scheduler-tracing.production.min.js":41}],46:[function(e,t,o){(function(t,i){(function(){var a=e("process/browser.js").nextTick,n=Function.prototype.apply,r=Array.prototype.slice,s={},c=0;function l(e,t){this._id=e,this._clearFn=t}o.setTimeout=function(){return new l(n.call(setTimeout,window,arguments),clearTimeout)},o.setInterval=function(){return new l(n.call(setInterval,window,arguments),clearInterval)},o.clearTimeout=o.clearInterval=function(e){e.close()},l.prototype.unref=l.prototype.ref=function(){},l.prototype.close=function(){this._clearFn.call(window,this._id)},o.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},o.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},o._unrefActive=o.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},o.setImmediate="function"==typeof t?t:function(e){var t=c++,i=!(arguments.length<2)&&r.call(arguments,1);return s[t]=!0,a((function(){s[t]&&(i?e.apply(null,i):e.call(null),o.clearImmediate(t))})),t},o.clearImmediate="function"==typeof i?i:function(e){delete s[e]}}).call(this)}).call(this,e("timers").setImmediate,e("timers").clearImmediate)},{"process/browser.js":22,timers:46}],47:[function(e,t,o){(function(e){(function(){!function(e,i){"object"==typeof o&&void 0!==t?t.exports=i():"function"==typeof define&&define.amd?define("underscore",i):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var t=e._,o=e._=i();o.noConflict=function(){return e._=t,o}}())}(this,(function(){var t="1.13.2",o="object"==typeof self&&self.self===self&&self||"object"==typeof e&&e.global===e&&e||Function("return this")()||{},i=Array.prototype,a=Object.prototype,n="undefined"!=typeof Symbol?Symbol.prototype:null,r=i.push,s=i.slice,c=a.toString,l=a.hasOwnProperty,m="undefined"!=typeof ArrayBuffer,u="undefined"!=typeof DataView,d=Array.isArray,h=Object.keys,p=Object.create,g=m&&ArrayBuffer.isView,f=isNaN,b=isFinite,v=!{toString:null}.propertyIsEnumerable("toString"),k=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],w=Math.pow(2,53)-1;function y(e,t){return t=null==t?e.length-1:+t,function(){for(var o=Math.max(arguments.length-t,0),i=Array(o),a=0;a=0&&o<=w}}function Q(e){return function(t){return null==t?void 0:t[e]}}var X=Q("byteLength"),Z=$(X),K=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var J=m?function(e){return g?g(e)&&!P(e):Z(e)&&K.test(c.call(e))}:W(!1),Y=Q("length");function ee(e,t){t=function(e){for(var t={},o=e.length,i=0;i":">",'"':""","'":"'","`":"`"},Le=Ne(Oe),Ue=Ne(ye(Oe)),We=ie.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},$e=/(.)^/,Qe={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Xe=/\\|'|\r|\n|\u2028|\u2029/g;function Ze(e){return"\\"+Qe[e]}var Ke=/^\s*(\w|\$)+\s*$/;var Je=0;function Ye(e,t,o,i,a){if(!(i instanceof t))return e.apply(o,a);var n=xe(e.prototype),r=e.apply(n,a);return C(r)?r:n}var et=y((function(e,t){var o=et.placeholder,i=function(){for(var a=0,n=t.length,r=Array(n),s=0;s1)it(s,t-1,o,i),a=i.length;else for(var c=0,l=s.length;c0&&(o=t.apply(this,arguments)),e<=1&&(t=null),o}}var lt=et(ct,2);function mt(e,t,o){t=Ie(t,o);for(var i,a=te(e),n=0,r=a.length;n0?0:a-1;n>=0&&n0?r=n>=0?n:Math.max(n+c,r):c=n>=0?Math.min(n+1,c):n+c+1;else if(o&&n&&c)return i[n=o(i,a)]===a?n:-1;if(a!=a)return(n=t(s.call(i,r,c),U))>=0?n+r:-1;for(n=e>0?r:c-1;n>=0&&n0?0:r-1;for(a||(i=t[n?n[s]:s],s+=e);s>=0&&s=3;return t(e,Ve(o,a,4),i,n)}}var Ct=yt(1),zt=yt(-1);function At(e,t,o){var i=[];return t=Ie(t,o),kt(e,(function(e,o,a){t(e,o,a)&&i.push(e)})),i}function _t(e,t,o){t=Ie(t,o);for(var i=!ot(e)&&te(e),a=(i||e).length,n=0;n=0}var Mt=y((function(e,t,o){var i,a;return V(t)?a=t:(t=je(t),i=t.slice(0,-1),t=t[t.length-1]),wt(e,(function(e){var n=a;if(!n){if(i&&i.length&&(e=Ee(e,i)),null==e)return;n=e[t]}return null==n?n:n.apply(e,o)}))}));function jt(e,t){return wt(e,Ge(t))}function Et(e,t,o){var i,a,n=-1/0,r=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,c=(e=ot(e)?e:we(e)).length;sn&&(n=i);else t=Ie(t,o),kt(e,(function(e,o,i){((a=t(e,o,i))>r||a===-1/0&&n===-1/0)&&(n=e,r=a)}));return n}var Tt=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function qt(e){return e?H(e)?s.call(e):D(e)?e.match(Tt):ot(e)?wt(e,qe):we(e):[]}function St(e,t,o){if(null==t||o)return ot(e)||(e=we(e)),e[Pe(e.length-1)];var i=qt(e),a=Y(i);t=Math.max(Math.min(t,a),0);for(var n=a-1,r=0;r1&&(i=Ve(i,t[1])),t=ce(e)):(i=Ft,t=it(t,!1,!1),e=Object(e));for(var a=0,n=t.length;a1&&(o=t[1])):(t=wt(it(t,!1,!1),String),i=function(e,o){return!xt(t,o)}),Pt(e,i,o)}));function Nt(e,t,o){return s.call(e,0,Math.max(0,e.length-(null==t||o?1:t)))}function Ot(e,t,o){return null==e||e.length<1?null==t||o?void 0:[]:null==t||o?e[0]:Nt(e,e.length-t)}function Lt(e,t,o){return s.call(e,null==t||o?1:t)}var Ut=y((function(e,t){return t=it(t,!0,!0),At(e,(function(e){return!xt(t,e)}))})),Wt=y((function(e,t){return Ut(e,t)}));function $t(e,t,o,i){A(t)||(i=o,o=t,t=!1),null!=o&&(o=Ie(o,i));for(var a=[],n=[],r=0,s=Y(e);rt?(i&&(clearTimeout(i),i=null),s=l,r=e.apply(a,n),i||(a=n=null)):i||!1===o.trailing||(i=setTimeout(c,m)),r};return l.cancel=function(){clearTimeout(i),s=0,i=a=n=null},l},debounce:function(e,t,o){var i,a,n,r,s,c=function(){var l=He()-a;t>l?i=setTimeout(c,t-l):(i=null,o||(r=e.apply(s,n)),i||(n=s=null))},l=y((function(l){return s=this,n=l,a=He(),i||(i=setTimeout(c,t),o&&(r=e.apply(s,n))),r}));return l.cancel=function(){clearTimeout(i),i=n=s=null},l},wrap:function(e,t){return et(t,e)},negate:st,compose:function(){var e=arguments,t=e.length-1;return function(){for(var o=t,i=e[t].apply(this,arguments);o--;)i=e[o].call(this,i);return i}},after:function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},before:ct,once:lt,findKey:mt,findIndex:dt,findLastIndex:ht,sortedIndex:pt,indexOf:ft,lastIndexOf:bt,find:vt,detect:vt,findWhere:function(e,t){return vt(e,Se(t))},each:kt,forEach:kt,map:wt,collect:wt,reduce:Ct,foldl:Ct,inject:Ct,reduceRight:zt,foldr:zt,filter:At,select:At,reject:function(e,t,o){return At(e,st(Ie(t)),o)},every:_t,all:_t,some:Dt,any:Dt,contains:xt,includes:xt,include:xt,invoke:Mt,pluck:jt,where:function(e,t){return At(e,Se(t))},max:Et,min:function(e,t,o){var i,a,n=1/0,r=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,c=(e=ot(e)?e:we(e)).length;si||void 0===o)return 1;if(o'})),a="https://learngitbranching.js.org/?locale="+m.getDefaultLocale(),i.push(''),$("head").prepend(i),n.command){var r=unescape(n.command);e.mainVis.customEvents.on("gitEngineReady",(function(){p.trigger("commandSubmitted",r)}))}};function C(){i.$=$;e("../views");var t=e("../models/collections"),o=e("../views/commandViews"),a=e("../react_views/CommandHistoryView.jsx"),n=e("../react_views/MainHelperBarView.jsx");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new o.CommandPromptView({el:$("#commandLineBar")}),s.render(r.createElement(n),document.getElementById("helperBarMount")),s.render(r.createElement(a,{commandCollection:this.commandCollection}),document.getElementById("commandDisplay"))}e("../util").isBrowser()&&$(document).ready(b),o.getEvents=function(){return f},o.getSandbox=function(){return h},o.getEventBaton=function(){return p},o.getCommandUI=function(){return d},o.getLevelDropdown=function(){return g},o.init=b},{"../actions/LocaleActions":51,"../intl":67,"../models/collections":75,"../react_views/CommandHistoryView.jsx":77,"../react_views/MainHelperBarView.jsx":83,"../sandbox/":85,"../stores/LocaleStore":89,"../util":96,"../util/eventBaton":95,"../views":106,"../views/commandViews":104,"../views/levelDropdownView":107,backbone:1,events:4,jquery:18,raphael:30,react:39,"react-dom":33}],53:[function(e,t,o){var i=e("../intl"),a=e("../util/errors"),n=e("../git/commands"),r=e("../mercurial/commands"),s=a.CommandProcessError,c=(a.CommandResult,{git:n.commandConfig,hg:r.commandConfig}),l={execute:function(e,t,o,i){if(!c[e][t])throw new Error("i don't have a command for "+t);var a=c[e][t];if(a.delegate)return this.delegateExecute(a,o,i);a.execute.call(this,o,i)},delegateExecute:function(e,t,o){var i=e.delegate.call(this,t,o);i.multiDelegate?i.multiDelegate.forEach((function(e){o.setOptionsMap(e.options||{}),o.setGeneralArgs(e.args||[]),c[e.vcs][e.name].execute.call(this,t,o)}),this):(e=c[i.vcs][i.name],c[i.vcs][i.name].execute.call(this,t,o))},blankMap:function(){return{git:{},hg:{}}},getShortcutMap:function(){var e=this.blankMap();return this.loop((function(t,o,i){t.sc&&(e[i][o]=t.sc)}),this),e},getOptionMap:function(){var e=this.blankMap();return this.loop((function(t,o,i){var a=t.displayName||o,n={};(t.options||[]).forEach((function(e){n[e]=!1})),e[i][a]=n})),e},getRegexMap:function(){var e=this.blankMap();return this.loop((function(t,o,i){var a=t.displayName||o;e[i][a]=t.regex})),e},getCommandsThatCount:function(){var e=this.blankMap();return this.loop((function(t,o,i){t.dontCountForGolf||(e[i][o]=t.regex)})),e},loop:function(e,t){Object.keys(c).forEach((function(t){var o=c[t];Object.keys(o).forEach((function(i){var a=o[i];e(a,i,t)}))}))}};function m(e,t,o){if(this.vcs=e,this.method=t,this.rawOptions=o,this.supportedMap=l.getOptionMap()[e][t],void 0===this.supportedMap)throw new Error("No option map for "+t);this.generalArgs=[]}m.prototype.explodeAndSet=function(){for(var e=0;e"]}},{type:"ModalAlert",options:{markdowns:["## Git 명령어","","연습 모드에서 쓸 수 있는 다양한 git명령어는 다음과 같습니다",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## 공유해주세요!","","`export tree` 와 `import tree`로 여러분의 친구들에게 트리를 공유해주세요","","훌륭한 학습 자료가 있으신가요? `build level`로 레벨을 만들어 보시거나, 친구의 레벨을 `import level`로 가져와서 실험해보세요","","이제 레슨을 시작해봅시다..."]}}],fr_FR:[{type:"ModalAlert",options:{markdowns:["## Bienvenue sur Learn Git Branching !","","Cette application a été conçue pour aider les débutants à saisir ","les puissants concepts derrière les branches en travaillant ","avec git. Nous espérons que vous apprécierez cette application et ","que vous apprendrez peut-être quelque chose d'intéressant !","","# Démo !","","Si vous n'avez pas vu la démo, vous pouvez le faire là :","","[https://pcottle.github.io/learnGitBranching/?locale=fr_FR&demo](https://pcottle.github.io/learnGitBranching/?locale=fr_FR&demo)","","Agacé par ce dialogue ? Ajoutez `NODEMO` à l'URL pour le supprimer, en lien ci-dessous pour votre commodité :","","[https://pcottle.github.io/learnGitBranching/?locale=fr_FR&NODEMO](https://pcottle.github.io/learnGitBranching/?locale=fr_FR&NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Commandes Git","","Il existe une large variété de commandes git disponibles dans le mode bac à sable. Sont incluses :",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Partager, c'est se soucier !","","Partagez des arbres avec vos amis via `export tree` et `import tree`","","Vous avez une grande leçon à partager ? Essayez de construire un niveau avec `build level` ou essayez le niveau d'un ami avec `import level`","","Pour voir la gamme complète des commandes, tapez `show commands`. Il y a quelques perles telles que `undo` et `reset`","","Mais tout de suite commencez sur les `levels`…"]}}],ru_RU:[{type:"ModalAlert",options:{markdowns:["## Добро пожаловать в LearnGitBranching!","","Это приложение создано, чтобы помочь новичкам постичь ","мощные возможности ветвления и работы ","с git. Мы надеемся, что вам понравится эта игра ","и может вы что-то усвоите!","","# Демо!","","Если ты не видел демонстрацию – посмотри её тут:","","[https://pcottle.github.io/learnGitBranching/?locale=ru_RU&demo](https://pcottle.github.io/learnGitBranching/?locale=ru_RU&demo)","","Достало это сообщение? Добавь `NODEMO` к адресу и навсегда забудь о нём, ниже ссылка для удобства:","","[https://pcottle.github.io/learnGitBranching/?locale=ru_RU&NODEMO](?locale=ru_RU&NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Команды Git","","В нашей песочнице можно использовать множество команд:",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Бог велел – делись!","","Ты можешь делиться результатами с друзьями при помощи `export tree` и `import tree`","","Хочешь создать классный уровень? Сделай это при помощи `build level` или добавь уровень друга при помощи `import level`","","Команда `show commands` покажет все доступные инструкции. Там есть очень полезные, например `undo` и `reset`","","А пока просто начни игру при помощи `levels`..."]}}],uk:[{type:"ModalAlert",options:{markdowns:["## Ласкаво просимо до Learn Git Branching","","Хочеш вивчити Git? Тоді ти знайшов те, що шукав!",'"Learn Git Branching" — це найбільш візуальний та інтерактивний спосіб вивчення Git в Інтернеті. ',"Ти зможеш проходити захопливі рівні, дивитися ","покрокові інструкції з використання потужних функцій Git, навіть трохи ","розважитись в процесі навчання.","","Після цього діалогу побачиш список доступних рівнів. Якщо ти новачок, ","просто почни з першого рівня. Якщо вже знаєш основи Git, ","спробуй більш складні рівні в кінці.","","P.S. Хочеш перейти одразу до пісочниці наступного разу?","Спробуй ","[це спеціальне посилання.](https://pcottle.github.io/learnGitBranching/?locale=uk&NODEMO)"]}}],vi:[{type:"ModalAlert",options:{markdowns:["## Chào mừng đến với Học Nhánh Git","","Bạn có hứng thú học Git? Bạn đến đúng nơi rồi đấy! ",'"Học Nhánh Git" là cách trực quan và hiệu quả nhất để học Git trên web; ',"thông qua một loạt các thử thách cấp độ thú vị, bạn sẽ từng bước tìm hiểu sức mạnh của Git.","","Sau khi hộp thoại này đóng lại, bạn sẽ thấy nhiều cấp độ mà chúng tôi cung cấp. ","Nếu bạn là người mới thì hãy bắt đầu từ bài đầu tiên. Nếu bạn đã có hiểu biết cơ bản về Git, ","hãy thử những bài mang tính thách thức hơn phía sau.","","Bạn có thể dùng lệnh `show commands` để xem tất cả các lệnh được hỗ trợ.","","Ghi chú: Nếu muốn trực tiếp vào hộp cát (sandbox) ở lần sau?","Hãy dùng","[đường link đặc biệt này của chúng tôi](https://pcottle.github.io/learnGitBranching/?locale=vi&NODEMO)","","Tái bút: GitHub đã đổi tên cho nhánh mặc định là `main` thay vì `master` ","nhằm tránh dùng thuật ngữ có xu hướng thiên vị [(xem chi tiết tại đây)](https://github.com/github/renaming). ",'Để bắt kịp xu hướng công nghệ này, chúng tôi cũng đã cập nhật "Học Nhánh Git" sử ',"dụng `main` thay thế cho `master` trong các bài học. Việc đổi tên được thực hiện khá nhất quán cho đến ","thời điểm hiện tại, nhưng nếu bạn phát hiện bất kỳ lỗi nào, đừng ngần ngại mà gửi một pull request (PR), hoặc tạo một vấn đề (New issue)."]}}],sl_SI:[{type:"ModalAlert",options:{markdowns:["## Dobrodošel na učenju Git Branchanja","","Bi se rad naučil Git? No, prišel si na pravo mesto! ",'"Learn Git Branching" je najbolj vizualen in interaktiven način učenja Git-a ',"na spletu; zagrizel boš v zanimive stopnje, po korakih boš spoznaval osupljive ","funkcije in kaj pa veš, morda ti bo celo zabavno. ;)","","Za tem oknom boš videl kopico stopenj, ki so na razpolago. Če si ","začetnik, kar pogumno, začni s prvo. Če pa že poznaš Git osnove, ","se preizkusi v zahtevnejših stopnjah.","","Vidiš lahko vse ukaze, ki so na voljo, z ukazom `show commands` v terminalu.","","PS: Bi šel rad naslednjič naravnost v peskovnik?","Poizkusi s","[to posebno povezavo](https://pcottle.github.io/learnGitBranching/?locale=sl_SI&NODEMO)"]}}],pl:[{type:"ModalAlert",options:{markdowns:["## Witaj w Learn Git Branching!","","Jesteś zainteresowany nauką Gita? Cóż, trafiłeś we właściwe miejsce!",'"Learn Git Branching" jest najbardziej wizualnym i interaktywnym sposobem na naukę gita w sieci.',"Czekają na Ciebie ekscytujące poziomy, demonstracje zaawansowanych funkcji krok po kroku. Może nawet będziesz się dobrze bawić.","","Po tym oknie dialogowym zobaczysz różnorodność poziomów, które mamy do zaoferowania.","Jeśli jesteś początkujący, po prostu zacznij od pierwszego poziomu.","Jeśli znasz już podstawy gita, wypróbuj niektóre z naszych późniejszych, bardziej wymagających poziomów.","","Możesz zobaczyć wszystkie komendy wpisując `show commands` w terminalu.","","Chcesz następnym razem przejść prosto do trybu piaskownicy? Kilknij [tutaj](https://pcottle.github.io/learnGitBranching/?locale=pl&NODEMO)","","PS. GitHub zaczął nazywać domyślną gałąź `main` zamiast `master`, aby odejść od tendencyjnej terminologii. [(więcej informacji tutaj)](https://github.com/github/renaming)",,'Zgodnie z tym ogólnobranżowym ruchem, zaktualizowaliśmy również "Learn Git Branching", by używać `main` zamiast `master` w naszych zadaniach.',"Ta zmiana nazwy powinna być już w miarę spójna, ale jeśli zauważysz jakieś błędy, nie krępuj się dodać pull request (lub zgłosić issue na githubie - prawy górny róg)."]}}],ta_IN:[{type:"ModalAlert",options:{markdowns:["## Git Branching கற்க வரவேற்கிறோம்","","கிட் கற்க ஆர்வமா? அப்படியானால் நீங்கள் சரியான இடத்திற்கு வந்துவிட்டீர்கள்! ",'"Learn Git Branching" Git ஐக் கற்றுக்கொள்வதற்கான வரைபடம் மற்றும் செயல்முறை ',"பயிற்சியுடன் கூடிய சிரந்த கருவி; ","உங்களை சோதிக்கும் வகையிலான நிலைகளுடன் மிகுந்த சக்திவாய்ந்த அம்சங்களை ","படிப்படியாகவும், சில சமையம் விளையாட்டாகவும் கற்றுத்தர கூடியது.","","இந்த அறிவிற்ப்புக்கு பிறகு, நாங்கள் வழங்க உள்ள பல்வேறு நிலைகளை நீங்கள் காண்பீர்கள். ","நீங்கள் ஆரம்ம நிலையில் இருந்தால், முதல் கட்டத்தில் இருந்து தொடங்கவும். ","கிட்டின் சில அடிப்படைகளை நீங்கள் ஏற்கனவே அறிந்திருந்தால், மெலும் உள்ள கடினமான கட்டங்களை முயற்ச்சி செய்யுங்கள்.","","தேவையானால் `show commands` ஐ பயன்படுத்தி அனைத்து கட்டளைகளையும் முனையத்தில் பார்க்கலாம்.","","பின்குறிப்பு: அடுத்தமுறை நேராக sandbox செல்ல வேண்டுமா?","அப்படியானால் பின் வரும் இணைப்பை பயன்பாடித்துக ","[this special link](https://pcottle.github.io/learnGitBranching/?locale=ta_IN&NODEMO)","","பின்குறிப்பு: GitHub (பெரிய அளவில் பயன்பாட்டில் உள்ள இணையதலம்) `main` என்ற கிளையை `master`-க்கு பதில் ","முன்னிருப்பு கிளையாக பயன் படுத்த உள்ளது [more details available here](https://github.com/github/renaming). ","இந்த மாற்றத்தை பின்னோக்கி இணக்கமான வழியில் பொருத்துவதற்காக, `main`-ஐ முதன்மையாக கருதி ","இந்த இரண்டு பெயர்களும் ஒன்றுக்கொன்று மாற்றுப்பெயர்களாகக் கருதப்படும். ","இந்த மாற்றத்தை அனைத்து நிலை உள்ளடக்கங்களிலும் புதுப்பிக்க நாங்கள் சிறந்த முயற்சியை ","மேற்கொண்டோம், ஆயினும் ஏதேனும் விடுபட்டி இருந்தால் PR உருவாக்கி உதவுங்கள்.","ஒருபக்கச்சார்பான சொற்களிலிருந்து விலகிச் செல்ல உதவியதற்கு நன்றி."]}}],it_IT:[{type:"ModalAlert",options:{markdowns:["## Benvenuto su Learn Git Branching","","Vorresti imparare Git? Bene, sei nel posto giusto! ",'"Learn Git Branching" è il modo più chiaro e interattivo per imparare Git ',"su internet; sarai messo alla prova tramite livelli stimolanti, con dimostrazioni ","passo a passo sulle sue potenzialità e, perché no, magari ti divertirai lungo questo percorso.","","Dopo questa finestra vedrai una varietà di livelli che abbiamo da offrire. Se sei alle","prime armi procedi e parti dall'inizio. Se hai delle conoscenze base di Git ","prova con gli ultimi livelli più impegnativi.","","Puoi vedere tutti i comandi disponibili digitando `show commands` sul terminale.","","PS: Preferisci andare direttamente al sandbox?","Prova ","[questo link](https://pcottle.github.io/learnGitBranching/?NODEMO?locale=it_IT).","","PPS: GitHub (e il settore in generale) sta modificando il nome del ramo di default in `main` invece che `master` ","(leggi [qui per ulteriori dettagli](https://github.com/github/renaming)). Per adattarci a questo cambiamento ","mantenendo la retrocompatibilità, questi nomi saranno considerati equivalenti. `main` sarà comunque ","il nome predefinito. Ci siamo impegnati per aggiornare tutti i livelli ma ci sarà ","sicuramente qualcosa che potremmo aver dimenticato. Esegui una PR (o segnala un problema) se ne trovi. ","Grazie per l'aiuto!"]}}],tr_TR:[{type:"ModalAlert",options:{markdowns:["## Learn Git Branching'e hoşgeldiniz.","","Git öğrenmeye ilgi duyuyor musunuz? O zaman doğru yerdesiniz!",'"Learn Git Branching," Git\'i öğrenmenin en görsel ve etkileşimli yoludur.',"web üzerinde; sizi heyecan verici seviyelerle zorlayacak, güçlü özelliklerin adım adım gösterimlerini sunacak","ve belki de eğlenceli vakit geçirmenizi sağlayacaktır.","","Bu iletişim kutusunu geçtikten sonra sunduğumuz çeşitli seviyeleri göreceksiniz. Eğer yeni başlayan biriyseniz, ","sadece ilk seviyeye başlayabilirsiniz. Eğer zaten Git temellerini biliyorsanız, ","daha sonraki daha zorlu seviyeleri deneyebilirsiniz.","","Terminalde `show commands` ile mevcut tüm komutları görebilirsiniz.","","Not: Bir sonraki seferde doğrudan bir deneme ortamına gitmek mi istiyorsunuz?","Denemek için bu özel bağlantıyı kullanın: ","[özel bağlantı](https://pcottle.github.io/learnGitBranching/?NODEMO)","","Not: GitHub, önyargılı terimlerden uzaklaşmak için varsayılan Branch ismini `master` yerine `main` ","olarak adlandırmaya başladı [(daha fazla detay için tıklayın)](https://github.com/github/renaming). ",'Biz de sektör genelindeki harekete uygun olarak, "Learn Git Branching" ',"derslerimizde de `master` yerine `main` kullanımını güncelledik. Bu adlandırmanın ","şu anda oldukça tutarlı olması gerekiyor, ancak herhangi bir hata fark ederseniz,","lütfen bir PR (veya issue) göndermekten çekinmeyin."]}}]}},{"../git":63}],59:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("flux").Dispatcher,n=i.PayloadSources,r=new a;r.handleViewAction=function(e){this.dispatch({source:n.VIEW_ACTION,action:e})},r.handleURIAction=function(e){this.dispatch({source:n.URI_ACTION,action:e})},t.exports=r},{"../constants/AppConstants":54,flux:6}],60:[function(e,t,o){var i=e("../util/escapeString"),a=e("../intl"),n=e("../graph"),r=e("../util/errors"),s=(r.CommandProcessError,r.GitError),c=(r.Warning,r.CommandResult),l=function(e){return e.replace(/'/g,"'").replace(///g,"/")};function m(e){return-1!==e.indexOf(":")&&2===e.split(":").length}var u=function(e,t){e.resolveID(t)},d=function(e,t){return e.validateBranchName(t)},h=function(e,t){return e.origin.validateBranchName(t)},p=function(e,t){return e.refs[t]?t:d(e,t)},g=function(e,t){if(e.refs[t]&&e.HEAD.get("target")===e.refs[t])throw new s({msg:a.todo("cannot fetch to "+t+" when checked out on "+t)})},f=function(e,t){u(e,t);var o=e.resolveID(t);if(!o||"branch"!==o.get("type"))throw new s({msg:a.todo(t+" is not a branch")})},b=function(e){if(e.length&&"origin"!==e[0])throw new s({msg:a.todo(e[0]+" is not a remote in your repository! try adding origin to that argument")})},v=function(e,t){if(t=l(t),!e.resolveID(t))throw new s({msg:a.todo(t+" is not a branch!")});var o=e.resolveID(t);if("branch"!==o.get("type"))throw new s({msg:a.todo(t+" is not a branch!")});var i=o.getRemoteTrackingBranchID();if(!i)throw new s({msg:a.todo(t+" is not a remote tracking branch! I don't know where to push")});return i},k={commit:{sc:/^(gc|git ci)($|\s)/,regex:/^git +commit($|\s)/,options:["--amend","-a","--all","-am","-m"],execute:function(e,t){var o=t.getOptionsMap();if(t.acceptNoGeneralArgs(),o["-am"]&&(o["-a"]||o["--all"]||o["-m"]))throw new s({msg:a.str("git-error-options")});var i=null,n=null;(o["-a"]||o["--all"])&&t.addWarning(a.str("git-warning-add")),o["-am"]&&(n=o["-am"],t.validateArgBounds(n,1,1,"-am"),i=n[0]),o["-m"]&&(n=o["-m"],t.validateArgBounds(n,1,1,"-m"),i=n[0]),o["--amend"]&&(n=o["--amend"],t.validateArgBounds(n,0,0,"--amend"));var r=e.commit({isAmend:!!o["--amend"]});i&&(i=i.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),r.set("commitMessage",i));var c=e.animationFactory.playCommitBirthPromiseAnimation(r,e.gitVisuals);e.animationQueue.thenFinish(c)}},cherrypick:{displayName:"cherry-pick",regex:/^git +cherry-pick($|\s)/,execute:function(e,t){t.getOptionsMap();var o=t.getGeneralArgs();t.validateArgBounds(o,1,Number.MAX_VALUE);var i=n.getUpstreamSet(e,"HEAD"),r=o.map((function(t){var o=e.getCommitFromRef(t);if(i[o.get("id")])throw new s({msg:a.str("git-error-already-exists",{commit:o.get("id")})});return o}),this);e.setupCherrypickChain(r)}},gc:{displayName:"gc",regex:/^git +gc($|\s)/,execute:function(e,t){e.pruneTree(!1)}},pull:{regex:/^git +pull($|\s)/,options:["--rebase"],execute:function(e,t){if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});var o,i,n=t.getOptionsMap(),r=t.getGeneralArgs();n["--rebase"]&&(r=n["--rebase"].concat(r)),t.twoArgsForOrigin(r),b(r);var c=r[1];if(c&&m(c)){var u=c.split(":");o=u[0],i=p(e,l(u[1])),g(e,i)}else if(c)o=c,f(e.origin,o),i=e.origin.resolveID(o).getPrefixedID();else{if(e.getDetachedHead())throw new s({msg:a.todo("Git pull can not be executed in detached HEAD mode if no remote branch specified!")});var d=e.getOneBeforeCommit("HEAD"),h=d.get("id");v(e,h),o=(i=d.getRemoteTrackingBranchID()).replace("o/","")}e.pull({source:o,destination:i,isRebase:!!n["--rebase"]})}},fakeTeamwork:{regex:/^git +fakeTeamwork($|\s)/,execute:function(e,t){var o,i,n=t.getGeneralArgs();if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});switch(t.validateArgBounds(n,0,2),n.length){case 0:o="main",i=1;break;case 1:isNaN(parseInt(n[0],10))?(o=h(e,n[0]),i=1):(i=parseInt(n[0],10),o="main");break;case 2:if(o=h(e,n[0]),isNaN(parseInt(n[1],10)))throw new s({msg:"Bad numeric argument: "+n[1]});i=parseInt(n[1],10)}if("branch"!==e.origin.resolveID(o).get("type"))throw new s({msg:a.str("git-error-options")});e.fakeTeamwork(i,o)}},clone:{regex:/^git +clone *?$/,execute:function(e,t){t.acceptNoGeneralArgs(),e.makeOrigin(e.printTree())}},remote:{regex:/^git +remote($|\s)/,options:["-v"],execute:function(e,t){if(t.acceptNoGeneralArgs(),!e.hasOrigin())throw new c({msg:""});e.printRemotes({verbose:!!t.getOptionsMap()["-v"]})}},fetch:{regex:/^git +fetch($|\s)/,execute:function(e,t){if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});var o,i,n=t.getGeneralArgs();t.twoArgsForOrigin(n),b(n);var r=n[1];if(r&&m(r)){var c=r.split(":");o=c[0],i=p(e,l(c[1])),g(e,i)}else r&&(o=r,f(e.origin,o),i=e.origin.resolveID(o).getPrefixedID());o&&u(e.origin,o),e.fetch({source:o,destination:i})}},branch:{sc:/^(gb|git br)($|\s)/,regex:/^git +branch($|\s)/,options:["-d","-D","-f","--force","-a","-r","-u","--contains"],execute:function(e,t){var o,i=t.getOptionsMap(),n=t.getGeneralArgs(),r=null;if(i["-d"]||i["-D"]){var c=i["-d"]||i["-D"];return c=c.concat(n),t.validateArgBounds(c,1,Number.MAX_VALUE,"-d"),void c.forEach((function(t){e.validateAndDeleteBranch(t)}))}if(i["-u"]){r=i["-u"].concat(n),t.validateArgBounds(r,1,2,"-u");var m=l(r[0]),d=r[1]||e.getOneBeforeCommit("HEAD").get("id");return function(e,t){u(e,t);var o=e.resolveID(t);if("branch"!==o.get("type")||!o.getIsRemote())throw new s({msg:a.todo(t+" is not a remote branch")})}(e,m),f(e,d),void e.setLocalToTrackRemote(e.resolveID(d),e.resolveID(m))}return i["--contains"]?(r=i["--contains"],t.validateArgBounds(r,1,1,"--contains"),void e.printBranchesWithout(r[0])):i["-f"]||i["--force"]?(r=(r=i["-f"]||i["--force"]).concat(n),t.twoArgsImpliedHead(r,"-f"),void e.forceBranch(r[0],r[1])):0===n.length?(o=i["-a"]?e.getBranches():i["-r"]?e.getRemoteBranches():e.getLocalBranches(),void e.printBranches(o)):(t.twoArgsImpliedHead(n),void e.branch(n[0],n[1]))}},add:{dontCountForGolf:!0,sc:/^ga($|\s)/,regex:/^git +add($|\s)/,execute:function(){throw new c({msg:a.str("git-error-staging")})}},reset:{regex:/^git +reset($|\s)/,options:["--hard","--soft"],execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs();if(o["--soft"])throw new s({msg:a.str("git-error-staging")});if(o["--hard"]&&(t.addWarning(a.str("git-warning-hard")),i=i.concat(o["--hard"])),t.validateArgBounds(i,1,1),e.getDetachedHead())throw new s({msg:a.str("git-error-reset-detached")});e.reset(i[0])}},revert:{regex:/^git +revert($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.validateArgBounds(o,1,Number.MAX_VALUE),e.revert(o)}},merge:{regex:/^git +merge($|\s)/,options:["--no-ff","--squash"],execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs().concat(o["--no-ff"]||[]).concat(o["--squash"]||[]);t.validateArgBounds(i,1,1);var a=e.merge(i[0],{noFF:!!o["--no-ff"],squash:!!o["--squash"]});void 0!==a?e.animationFactory.genCommitBirthAnimation(e.animationQueue,a,e.gitVisuals):e.animationFactory.refreshTree(e.animationQueue,e.gitVisuals)}},revlist:{dontCountForGolf:!0,displayName:"rev-list",regex:/^git +rev-list($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.validateArgBounds(o,1),e.revlist(o)}},log:{dontCountForGolf:!0,regex:/^git +log($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.impliedHead(o,0),e.log(o)}},show:{dontCountForGolf:!0,regex:/^git +show($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.oneArgImpliedHead(o),e.show(o[0])}},rebase:{sc:/^gr($|\s)/,options:["-i","--solution-ordering","--interactive-test","--aboveAll","-p","--preserve-merges","--onto"],regex:/^git +rebase($|\s)/,execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs();if(o["-i"]){var a=o["-i"].concat(i);return t.twoArgsImpliedHead(a," -i"),void(o["--interactive-test"]?e.rebaseInteractiveTest(a[0],a[1],{interactiveTest:o["--interactive-test"]}):e.rebaseInteractive(a[0],a[1],{aboveAll:!!o["--aboveAll"],initialCommitOrdering:o["--solution-ordering"]}))}if(o["--onto"]){a=o["--onto"].concat(i);return t.threeArgsImpliedHead(a," --onto"),void e.rebaseOnto(a[0],a[1],a[2],{preserveMerges:o["-p"]||o["--preserve-merges"]})}t.twoArgsImpliedHead(i),e.rebase(i[0],i[1],{preserveMerges:o["-p"]||o["--preserve-merges"]})}},status:{dontCountForGolf:!0,sc:/^(gst|gs|git st)($|\s)/,regex:/^git +status($|\s)/,execute:function(e){e.status()}},checkout:{sc:/^(go|git co)($|\s)/,regex:/^git +checkout($|\s)/,options:["-b","-B","-"],execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs(),n=null;if(o["-b"]){n=o["-b"].concat(i),t.twoArgsImpliedHead(n,"-b");var r=e.validateBranchName(n[0]);return e.branch(r,n[1]),void e.checkout(r)}if(o["-"]){var c=e.HEAD.get("lastLastTarget");if(!c)throw new s({msg:a.str("git-result-nothing")});e.HEAD.set("target",c)}else{if(o["-B"])return n=o["-B"].concat(i),t.twoArgsImpliedHead(n,"-B"),e.forceBranch(n[0],n[1]),void e.checkout(n[0]);t.validateArgBounds(i,1,1),e.checkout(e.crappyUnescape(i[0]))}}},push:{regex:/^git +push($|\s)/,options:["--force","--delete","-d"],execute:function(e,t){if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});var o,i,n,r=t.getOptionsMap(),c=r["-d"]||r["--delete"],l=t.getGeneralArgs();if(c){let e=r["-d"]||r["--delete"];l="origin"===e[0]?e.concat(l):l.concat(e)}t.twoArgsForOrigin(l),b(l);var h=l[1];if(c){if(!h)throw new s({msg:a.todo("--delete doesn't make sense without any refs")});if(m(h))throw new s({msg:a.todo("--delete only accepts plain target ref names")});h=":"+h}if(h&&m(h)){var p=h.split(":");if(i=p[0],o=d(e,p[1]),""===i&&!e.origin.resolveID(o))throw new s({msg:a.todo("cannot delete branch "+{}.destination+" which doesn't exist")})}else if(h?(u(e,h),n=e.resolveID(h)):n=e.getOneBeforeCommit("HEAD"),i=n.get("id"),n.getRemoteTrackingBranchID&&n.getRemoteTrackingBranchID()){v(e,i);var g=n.getRemoteTrackingBranchID();o=e.resolveID(g).getBaseID()}else o=d(e,i);i&&u(e,i),e.push({destination:o,source:i,force:!!r["--force"]})}},describe:{regex:/^git +describe($|\s)/,execute:function(e,t){if(0===e.tagCollection.toArray().length)throw new s({msg:a.todo("fatal: No tags found, cannot describe anything.")});var o=t.getGeneralArgs();t.oneArgImpliedHead(o),u(e,o[0]),e.describe(o[0])}},tag:{regex:/^git +tag($|\s)/,options:["-d"],execute:function(e,t){var o=t.getGeneralArgs(),i=t.getOptionsMap();if(i["-d"]){var n,r=i["-d"];if(u(e,r),t.oneArgImpliedHead(r),e.tagCollection.each((function(e){e.get("id")==r&&(n=e)}),!0),null==n)throw new s({msg:a.todo("No tag found, nothing to remove")});return e.tagCollection.remove(n),delete e.refs[r],void e.gitVisuals.refreshTree()}if(0!==o.length)t.twoArgsImpliedHead(o),e.tag(o[0],o[1]);else{var c=e.getTags();e.printTags(c)}}},switch:{sc:/^(gsw|git sw)($|\s)/,regex:/^git +switch($|\s)/,options:["-c","--create","-C","--force-create","-"],execute:function(e,t){var o=t.getGeneralArgs(),i=t.getOptionsMap();let n=i["-c"]?i["-c"]:i["--create"];if(n){let i=n.concat(o);t.twoArgsImpliedHead(i,"-c");let a=e.validateBranchName(i[0]);return e.branch(a,i[1]),void e.checkout(a)}let r="-C",c=i[r]?i[r]:i["--force-create"];if(c){let i=c.concat(o);t.twoArgsImpliedHead(i,r);let a=e.validateBranchName(i[0]);return e.forceBranch(a,i[1]),void e.checkout(a)}if(i["-"]){var l=e.HEAD.get("lastLastTarget");if(!l)throw new s({msg:a.str("git-result-nothing")});e.HEAD.set("target",l)}else t.validateArgBounds(o,1,1),e.checkout(e.crappyUnescape(o[0]))}}},w=[[/^(git help($|\s)|git$)/,function(){var t=[a.str("git-version"),"
",a.str("git-usage"),i(a.str("git-usage-command")),"
",a.str("git-supported-commands"),"
"],o=e("../commands").commands.getOptionMap().git;Object.keys(o).forEach((function(e){var i=o[e];t.push("git "+e),Object.keys(i).forEach((function(e){t.push("\t "+e)}),this)}),this);var n=t.join("\n");throw n=n.replace(/\t/g,"   "),new c({msg:n})}]];o.commandConfig=k,o.instantCommands=w},{"../commands":53,"../graph":64,"../intl":67,"../util/errors":93,"../util/escapeString":94}],61:[function(e,t,o){var i=e("q"),a=e("../app");e("../views/multiView").MultiView;function n(e){e=e||{},this.beforeCB=e.beforeCB||function(){},this.afterCB=e.afterCB||function(){};var t=function(e){e.resolve()};this.beforeDeferHandler=e.beforeDeferHandler||t,this.afterDeferHandler=e.afterDeferHandler||t,this.eventBaton=e.eventBaton||a.getEventBaton()}n.prototype.insertShim=function(){this.eventBaton.stealBaton("processGitCommand",this.processGitCommand,this)},n.prototype.removeShim=function(){this.eventBaton.releaseBaton("processGitCommand",this.processGitCommand,this)},n.prototype.processGitCommand=function(e,t){this.beforeCB(e);var o=i.defer();o.promise.then(function(){this.afterGitCommandProcessed(e,t)}.bind(this)).done();var a=function(){this.eventBaton.passBatonBack("processGitCommand",this.processGitCommand,this,[e,o])}.bind(this),n=i.defer();n.promise.then(a).done(),this.beforeDeferHandler(n,e)},n.prototype.afterGitCommandProcessed=function(e,t){this.afterCB(e);var o=i.defer();o.promise.then((function(){t.resolve()})).done(),this.afterDeferHandler(o,e)},o.GitShim=n},{"../app":52,"../views/multiView":108,q:29}],62:[function(e,t,o){e("backbone");var i=e("q"),a=e("../git").GitEngine,n=e("../visuals/animation/animationFactory").AnimationFactory,r=e("../visuals").GitVisuals,s=(e("../graph/treeCompare"),e("../util/eventBaton").EventBaton),c=e("../models/collections"),l=c.CommitCollection,m=c.BranchCollection,u=c.TagCollection,d=e("../models/commandModel").Command,h=e("../util/mock").mock,p=e("../util");var g=function(){this.init()};g.prototype.init=function(){this.commitCollection=new l,this.branchCollection=new m,this.tagCollection=new u;var e=function(){var e={},t=function(){var e=i.defer();return e.resolve(),e.promise};for(var o in n)e[o]=t;return e.playRefreshAnimationAndFinish=function(e,t){t.finish()},e.refreshTree=function(e,t){e.finish()},e.highlightEachWithPromise=function(e,t,o){return e},e}(),t=h(r),o={makeOrigin:function(e){e.localRepo;var t=e.treeString,o=new g;return o.gitEngine.loadTreeFromString(t),{customEvents:{on:function(e,t,o){t.apply(o,[])}},gitEngine:o.gitEngine}}};t.getVisualization=function(){return o},this.gitEngine=new a({collection:this.commitCollection,branches:this.branchCollection,tags:this.tagCollection,gitVisuals:t,animationFactory:e,eventBaton:new s}),this.gitEngine.init()};g.prototype.sendCommand=function(e,t){var o=i.defer(),a=o.promise,n=((new Date).getTime(),[]);return p.splitTextCommand(e,(function(e){a=a.then(function(){var t=new d({rawStr:e}),o=i.defer();return this.gitEngine.dispatch(t,o),n.push(t),o.promise}.bind(this))}),this),a.then((function(){(new Date).getTime();t&&t.resolve(n)})),a.fail((function(e){console.log("!!!!!!!! error !!!!!!!"),console.log(e),console.log(e.stack),console.log("!!!!!!!!!!!!!!!!!!!!!!")})),o.resolve(),a},o.HeadlessGit=g,o.getTreeQuick=function(e,t){var o=i.defer(),a=new g;a.sendCommand(e,o),o.promise.then((function(){t.resolve(a.gitEngine.exportTree())}))}},{"../git":63,"../graph/treeCompare":65,"../models/collections":75,"../models/commandModel":76,"../util":96,"../util/eventBaton":95,"../util/mock":99,"../visuals":112,"../visuals/animation/animationFactory":110,backbone:1,q:29}],63:[function(e,t,o){var i=e("backbone"),a=e("q"),n=e("../intl"),r=e("../visuals/animation/animationFactory").AnimationFactory,s=e("../visuals/animation").AnimationQueue,c=e("../graph/treeCompare"),l=e("../graph"),m=e("../util/errors"),u=e("../app"),d=e("../commands"),h=m.GitError,p=m.CommandResult,g="o/",f="   ",b="STAPH";function v(e){if(e!==b)throw e}function k(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.origin=null,this.mode="git",this.localRepo=null,this.branchCollection=e.branches,this.tagCollection=e.tags,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory?e.animationFactory:r,this.initUniqueID()}k.prototype.initUniqueID=function(){var e;this.uniqueId=(e=0,function(t){return t?t+e++:e++})},k.prototype.handleModeChange=function(e,t){if(this.mode!==e){u.getEvents().trigger("vcsModeChange",{mode:e});var o=this.setMode(e);this.origin&&this.origin.setMode(e,(function(){})),o?o.then(t):t()}else t()},k.prototype.getIsHg=function(){return"hg"===this.mode},k.prototype.setMode=function(e){var t="git"===this.mode&&"hg"===e;if(this.mode=e,t){var o=a.defer();o.resolve();var i=o.promise;if(this.updateAllBranchesForHg())return i=(i=i.then(function(){return this.animationFactory.playRefreshAnimationSlow(this.gitVisuals)}.bind(this))).then(function(){if(this.pruneTree())return this.animationFactory.playRefreshAnimation(this.gitVisuals)}.bind(this));if(this.pruneTree())return this.animationFactory.playRefreshAnimation(this.gitVisuals)}},k.prototype.assignLocalRepo=function(e){this.localRepo=e},k.prototype.defaultInit=function(){var e=l.getDefaultTree();this.loadTree(e)},k.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("main",this.rootCommit);this.HEAD=new w({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},k.prototype.hasOrigin=function(){return!!this.origin},k.prototype.isOrigin=function(){return!!this.localRepo},k.prototype.exportTreeForBranch=function(e){var t=this.exportTree(),o=l.getUpstreamSet(this,e),i=t.commits;t.commits={},i.forEach((function(e,i){o[i]&&(t.commits[i]=e)}));var a=t.branches;return t.branches={},a.forEach((function(o,i){i===e&&(t.branches[i]=o)})),t.HEAD.target=e,t},k.prototype.exportTree=function(){var e={branches:{},commits:{},tags:{},HEAD:null};this.branchCollection.toJSON().forEach((function(t){t.target=t.target.get("id"),delete t.visBranch,e.branches[t.id]=t})),this.commitCollection.toJSON().forEach((function(t){C.prototype.constants.circularFields.forEach((function(e){delete t[e]})),t.parents=(t.parents||[]).map((function(e){return e.get("id")})),e.commits[t.id]=t}),this),this.tagCollection.toJSON().forEach((function(t){delete t.visTag,t.target=t.target.get("id"),e.tags[t.id]=t}),this);var t=this.HEAD.toJSON();return t.lastTarget=t.lastLastTarget=t.visBranch=t.visTag=void 0,t.target=t.target.get("id"),e.HEAD=t,this.hasOrigin()&&(e.originTree=this.origin.exportTree()),e},k.prototype.printTree=function(e){e=e||this.exportTree(),c.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},k.prototype.printAndCopyTree=function(){window.prompt(n.str("Copy the tree string below"),this.printTree())},k.prototype.loadTree=function(e){e=JSON.parse(JSON.stringify(e)),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},k.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(this.crappyUnescape(e))))},k.prototype.instantiateFromTree=function(e){var t={};Object.values(e.commits).forEach((function(o){var i=this.getOrMakeRecursive(e,t,o.id,this.gitVisuals);this.commitCollection.add(i)}),this),Object.values(e.branches).forEach((function(o){var i=this.getOrMakeRecursive(e,t,o.id,this.gitVisuals);this.branchCollection.add(i,{silent:!0})}),this),Object.values(e.tags||{}).forEach((function(o){var i=this.getOrMakeRecursive(e,t,o.id,this.gitVisuals);this.tagCollection.add(i,{silent:!0})}),this);var o=this.getOrMakeRecursive(e,t,e.HEAD.id,this.gitVisuals);if(this.HEAD=o,this.rootCommit=t.C0,!this.rootCommit)throw new Error("Need root commit of C0 for calculations");if(this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each((function(e){this.gitVisuals.addBranch(e)}),this),this.tagCollection.each((function(e){this.gitVisuals.addTag(e)}),this),e.originTree){var i=JSON.stringify(e.originTree);this.animationQueue=this.animationQueue||new s({callback:function(){}}),this.makeOrigin(i)}},k.prototype.makeOrigin=function(e){if(this.hasOrigin())throw new h({msg:n.str("git-error-origin-exists")});e=e||this.printTree(this.exportTreeForBranch("main"));var t=this.gitVisuals.getVisualization().makeOrigin({localRepo:this,treeString:e});this.animationQueue.set("promiseBased",!0),t.customEvents.on("gitEngineReady",(function(){this.origin=t.gitEngine,t.gitEngine.assignLocalRepo(this),this.syncRemoteBranchFills(),this.origin.externalRefresh(),this.animationFactory.playRefreshAnimationAndFinish(this.gitVisuals,this.animationQueue)}),this);var o=JSON.parse(unescape(e));Object.keys(o.branches).forEach((function(e){var t=o.branches[e];if(!this.refs[g+e]){var i=this.findCommonAncestorWithRemote(t.target),a=this.makeBranch(g+e,this.getCommitFromRef(i));this.setLocalToTrackRemote(this.refs[t.id],a)}}),this)},k.prototype.makeRemoteBranchIfNeeded=function(e){if(!this.doesRefExist(g+e)&&"branch"===this.origin.resolveID(e).get("type"))return this.makeRemoteBranchForRemote(e)},k.prototype.makeBranchIfNeeded=function(e){if(!this.doesRefExist(e)){var t=this.findCommonAncestorForRemote(this.getCommitFromRef("HEAD").get("id"));return this.validateAndMakeBranch(e,this.getCommitFromRef(t))}},k.prototype.makeRemoteBranchForRemote=function(e){var t=this.origin.resolveID(e).get("target"),o=this.findCommonAncestorWithRemote(t.get("id"));return this.makeBranch(g+e,this.getCommitFromRef(o))},k.prototype.findCommonAncestorForRemote=function(e){if(this.origin.refs[e])return e;var t=this.refs[e].get("parents");if(1===t.length)return e=t[0].get("id"),this.findCommonAncestorForRemote(e);var o=this.findCommonAncestorForRemote(t[0].get("id")),i=this.findCommonAncestorForRemote(t[1].get("id"));return this.getCommonAncestor(o,i,!0).get("id")},k.prototype.findCommonAncestorWithRemote=function(e){if(this.refs[e])return e;var t=this.origin.refs[e].get("parents");if(1===t.length)return this.findCommonAncestorWithRemote(t[0].get("id"));var o=this.findCommonAncestorWithRemote(t[0].get("id")),i=this.findCommonAncestorWithRemote(t[1].get("id"));return this.getCommonAncestor(o,i,!0).get("id")},k.prototype.makeBranchOnOriginAndTrack=function(e,t){var o=this.makeBranch(g+e,this.getCommitFromRef(t));this.refs[e]&&this.setLocalToTrackRemote(this.refs[e],o);var i=this.findCommonAncestorForRemote(this.getCommitFromRef(t).get("id"));this.origin.makeBranch(e,this.origin.getCommitFromRef(i))},k.prototype.setLocalToTrackRemote=function(e,t){if(e.setRemoteTrackingBranchID(t.get("id")),this.command){var o='local branch "'+e.get("id")+'" set to track remote branch "'+t.get("id")+'"';this.command.addWarning(n.todo(o))}},k.prototype.getOrMakeRecursive=function(e,t,o,i){if(t[o])return t[o];var a=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if("HEAD"==t)return"HEAD";if(e.tags[t])return"tag";throw new Error("bad type for "+t)}(e,o);if("HEAD"==a){var n=e.HEAD,r=new w(Object.assign(e.HEAD,{target:this.getOrMakeRecursive(e,t,n.target)}));return t[o]=r,r}if("branch"==a){var s=e.branches[o],c=new y(Object.assign(e.branches[o],{target:this.getOrMakeRecursive(e,t,s.target)}));return t[o]=c,c}if("tag"==a){var l=e.tags[o],m=new z(Object.assign(e.tags[o],{target:this.getOrMakeRecursive(e,t,l.target)}));return t[o]=m,m}if("commit"==a){var u=e.commits[o],d=u.parents.map((function(o){return this.getOrMakeRecursive(e,t,o)}),this),h=new C(Object.assign(u,{parents:d,gitVisuals:this.gitVisuals}));return t[o]=h,h}throw new Error("ruh rho!! unsupported type for "+o)},k.prototype.tearDown=function(){this.tornDown||(this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll(),this.tornDown=!0)},k.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},k.prototype.removeAll=function(){this.branchCollection.reset(),this.tagCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.origin&&(this.origin.gitVisuals.getVisualization().tearDown(),delete this.origin,this.gitVisuals.getVisualization().clearOrigin()),this.gitVisuals.resetAll()},k.prototype.getDetachedHead=function(){return"branch"!==this.HEAD.get("target").get("type")},k.prototype.validateBranchName=function(e){if(e=(e=e.replace(///g,"/")).replace(/\s/g,""),!/^(\w+[.\/\-]?)+\w+$/.test(e)||0===e.search("o/"))throw new h({msg:n.str("bad-branch-name",{branch:e})});if(/^[cC]\d+$/.test(e))throw new h({msg:n.str("bad-branch-name",{branch:e})});if(/[hH][eE][aA][dD]/.test(e))throw new h({msg:n.str("bad-branch-name",{branch:e})});return e.length>9&&(e=e.slice(0,9),this.command.addWarning(n.str("branch-name-short",{branch:e}))),e},k.prototype.validateAndMakeBranch=function(e,t){if(e=this.validateBranchName(e),this.doesRefExist(e))throw new h({msg:n.str("bad-branch-name",{branch:e})});return this.makeBranch(e,t)},k.prototype.validateAndMakeTag=function(e,t){if(e=this.validateBranchName(e),this.refs[e])throw new h({msg:n.str("bad-tag-name",{tag:e})});this.makeTag(e,t)},k.prototype.makeBranch=function(e,t){if(this.refs[e]){var o=new Error;throw new Error("woah already have that ref "+e+" "+o.stack)}var i=new y({target:t,id:e});return this.branchCollection.add(i),this.refs[i.get("id")]=i,i},k.prototype.makeTag=function(e,t){if(this.refs[e])throw new Error("woah already have that");var o=new z({target:t,id:e});return this.tagCollection.add(o),this.refs[o.get("id")]=o,o},k.prototype.getHead=function(){return Object.assign({},this.HEAD)},k.prototype.getTags=function(){var e=[];return this.tagCollection.each((function(t){e.push({id:t.get("id"),target:t.get("target"),remote:t.getIsRemote(),obj:t})}),this),e},k.prototype.getBranches=function(){var e=[];return this.branchCollection.each((function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),remote:t.getIsRemote(),obj:t})}),this),e},k.prototype.getRemoteBranches=function(){return this.getBranches().filter((function(e){return!0===e.remote}))},k.prototype.getLocalBranches=function(){return this.getBranches().filter((function(e){return!1===e.remote}))},k.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet()[this.getCommitFromRef(e).get("id")].map((function(e){return e.selected=this.HEAD.get("target").get("id")==e.id,e}),this);this.printBranches(t)},k.prototype.printBranches=function(e){var t="";throw e.forEach((e=>{t+=(e.selected?"* ":"")+this.resolveName(e.id).split('"')[1]+"\n"})),new p({msg:t})},k.prototype.printTags=function(e){var t="";throw e.forEach((function(e){t+=e.id+"\n"})),new p({msg:t})},k.prototype.printRemotes=function(e){var t="";throw e.verbose?(t+="origin (fetch)\n",t+=f+"git@github.com:pcottle/foo.git\n\n",t+="origin (push)\n",t+=f+"git@github.com:pcottle/foo.git"):t+="origin",new p({msg:t})},k.prototype.getUniqueID=function(){for(var e=this.uniqueId("C"),t=function(e){return!!this.refs[e]||!(!this.origin||!this.origin.refs[e])}.bind(this);t(e);)e=this.uniqueId("C");return e},k.prototype.makeCommit=function(e,t,o){t||(t=this.getUniqueID());var i=new C(Object.assign({parents:e,id:t,gitVisuals:this.gitVisuals},o||{}));return this.refs[i.get("id")]=i,this.commitCollection.add(i),i},k.prototype.revert=function(e){var t=e.map((function(e){return this.getCommitFromRef(e)}),this),o=a.defer(),i=o.promise,r=this.resolveID("HEAD");i=this.animationFactory.highlightEachWithPromise(i,t,r);var s=this.getCommitFromRef("HEAD"),c=function(e){var t=this.rebaseAltID(e.get("id")),o=n.str("git-revert-msg",{oldCommit:this.resolveName(e),oldMsg:e.get("commitMessage")}),i=this.makeCommit([s],t,{commitMessage:o});return s=i,this.animationFactory.playCommitBirthPromiseAnimation(i,this.gitVisuals)}.bind(this);t.forEach((function(e){i=i.then((function(){return c(e)}))})),i=i.then(function(){return this.setTargetLocation("HEAD",s),this.animationFactory.playRefreshAnimation(this.gitVisuals)}.bind(this)),this.animationQueue.thenFinish(i,o)},k.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},k.prototype.setupCherrypickChain=function(e){var t=a.defer(),o=t.promise,i=this.resolveID("HEAD");o=this.animationFactory.highlightEachWithPromise(o,e,i);var n=function(e){var t=this.cherrypick(e);return this.animationFactory.playCommitBirthPromiseAnimation(t,this.gitVisuals)}.bind(this);e.forEach((function(e){o=o.then((function(){return n(e)}))}),this),this.animationQueue.thenFinish(o,t)},k.prototype.checkUpstreamOfSource=function(e,t,o,i,a){if(!l.getUpstreamSet(t,i)[e.getCommitFromRef(o).get("id")])throw new h({msg:a||n.str("git-error-origin-fetch-no-ff")})},k.prototype.getTargetGraphDifference=function(e,t,o,i,a){a=a||{},i=t.resolveID(i);var r=l.getUpstreamSet(e,o),s=t.getCommitFromRef(i),c=t.exportTree(),m=c.commits[s.get("id")];if(r[m.id]){if(a.dontThrowOnNoFetch)return[];throw new h({msg:n.str("git-error-origin-fetch-uptodate")})}m.depth=0;for(var u=[],d=[m],p=function(e){if(!r[e]){var t=c.commits[e];t.depth=g.depth+1,d.push(t)}};d.length;){var g=d.pop();u.push(g),g.parents.forEach(p)}for(var f=l.getUniqueObjects(u),b=[],v=function(e){var t=!0;return e.parents.forEach((function(e){t=t&&r[e]})),t};f.length;)for(var k=0;kt[e]=!0));var i=[];if(this.commitCollection.each((function(e){t[e.get("id")]||i.push(e)}),this),i.length)return this.command&&e&&this.command.addWarning(n.str("hg-prune-tree")),i.forEach((function(e){e.removeFromParents(),this.commitCollection.remove(e);var t=e.get("id");this.refs[t]=void 0,delete this.refs[t];var o=e.get("visNode");o&&o.removeAll()}),this),!0},k.prototype.getUpstreamBranchSet=function(){return this.getUpstreamCollectionSet(this.branchCollection)},k.prototype.getUpstreamTagSet=function(){return this.getUpstreamCollectionSet(this.tagCollection)},k.prototype.getUpstreamCollectionSet=function(e){var t={};return e.each((function(e){(function(e){for(var t=[],o=[e];o.length;){var i=o.pop();t.push(i.get("id")),i.get("parents")&&i.get("parents").length&&(o=o.concat(i.get("parents")))}return t})(e.get("target")).forEach((function(o){t[o]=t[o]||[],function(e,t){var o=!1;return e.forEach((function(e){e.id==t&&(o=!0)})),o}(t[o],e.get("id"))||t[o].push({obj:e,id:e.get("id")})}))})),t},k.prototype.getUpstreamHeadSet=function(){var e=l.getUpstreamSet(this,"HEAD");return e[this.getCommitFromRef("HEAD").get("id")]=!0,e},k.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t!==this.HEAD||this.getDetachedHead()||(t=t.get("target")),t},k.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},k.prototype.rebaseAltID=function(e){for(var t=this.getBumpedID(e);this.refs[t];)t=this.getBumpedID(t);return t},k.prototype.getMostRecentBumpedID=function(e){for(var t,o=e;this.refs[o];)t=o,o=this.getBumpedID(o);return t},k.prototype.getBumpedID=function(e){for(var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]],o=0;o0)throw new h({msg:n.todo("Hey those commits don't exist in the set!")})}this.rebaseFinish(i,{},e,t)},k.prototype.rebaseInteractive=function(t,o,i){i=i||{};var r=this.getInteractiveRebaseCommits(t,o);this.animationQueue.set("defer",!0);var s,c=a.defer();if(c.promise.then(function(e){if(!e.length)throw new p({msg:n.str("git-result-nothing")});this.rebaseFinish(e,{},t,o)}.bind(this)).fail(function(e){this.filterError(e),this.command.set("error",e),this.animationQueue.start()}.bind(this)).done(),i.initialCommitOrdering&&i.initialCommitOrdering.length>0){var l={};r.forEach((function(e){l[e.get("id")]=!0})),s=[],i.initialCommitOrdering[0].split(",").forEach((function(e){if(!l[e])throw new h({msg:n.todo("Hey those commits don't exist in the set!")});s.push(e)}))}new(0,e("../views/rebaseView").InteractiveRebaseView)({deferred:c,toRebase:r,initialCommitOrdering:s,aboveAll:i.aboveAll})},k.prototype.filterRebaseCommits=function(e,t,o){var i={};Object.keys(t).forEach((function(e){i[this.scrapeBaseID(e)]=!0}),this);var a={};return e.filter((function(e){if(1!==e.get("parents").length&&!o.preserveMerges)return!1;var t=this.scrapeBaseID(e.get("id"));return!i[t]&&(!a[e.get("id")]&&(a[e.get("id")]=!0,!0))}),this)},k.prototype.getRebasePreserveMergesParents=function(e){return e.get("parents").map((function(e){var t=e.get("id"),o=this.getMostRecentBumpedID(t);return this.refs[o]}),this)},k.prototype.rebaseFinish=function(e,t,o,i,r){r=r||{};var s=this.resolveID(o),c=r.deferred||a.defer(),l=r.chain||c.promise,m=this.filterRebaseCommits(e,t,r);if(!m.length)throw new h({msg:n.str("git-error-rebase-none")});l=this.animationFactory.highlightEachWithPromise(l,m,s);var u=this.getCommitFromRef(o),d=!1,p=function(e){var t,o=this.rebaseAltID(e.get("id"));t=r.preserveMerges&&d&&d?this.getRebasePreserveMergesParents(e):[u];var i=this.makeCommit(t,o);return u=i,d=!0,this.animationFactory.playCommitBirthPromiseAnimation(i,this.gitVisuals)}.bind(this);return m.forEach((function(e){l=l.then((function(){return p(e)}))}),this),l=l.then(function(){return"commit"==this.resolveID(i).get("type")?this.checkout(u):(this.setTargetLocation(i,u),this.checkout(i)),this.animationFactory.playRefreshAnimation(this.gitVisuals)}.bind(this)),r.dontResolvePromise||this.animationQueue.thenFinish(l,c),l},k.prototype.mergeCheck=function(e,t){var o=this.getCommitFromRef(e)===this.getCommitFromRef(t);return this.isUpstreamOf(e,t)||o},k.prototype.merge=function(e,t){t=t||{};var o="HEAD";if(this.mergeCheck(e,o))throw new p({msg:n.str("git-result-uptodate")});if(this.isUpstreamOf(o,e)&&!t.noFF&&!t.squash)return this.setTargetLocation(o,this.getCommitFromRef(e)),void this.command.setResult(n.str("git-result-fastforward"));var i=this.getCommitFromRef(o),a=this.getCommitFromRef(e),r=n.str("git-merge-msg",{target:this.resolveName(e),current:this.resolveName(o)}),s=[i];t.squash||s.push(a);var c=this.makeCommit(s,null,{commitMessage:r});return this.setTargetLocation(o,c),c},k.prototype.checkout=function(e){var t=this.resolveID(e);if("HEAD"!==t.get("id")){var o=t.get("type");if("branch"===o&&t.getIsRemote()&&(t=this.getCommitFromRef(t.get("id"))),"branch"!==o&&"tag"!==o&&"commit"!==o)throw new h({msg:n.str("git-error-options")});"tag"===o&&(t=t.get("target")),this.HEAD.set("target",t)}},k.prototype.forceBranch=function(e,t){e=this.crappyUnescape(e),this.doesRefExist(e)||this.branch(e,t);var o=this.resolveID(e);if("branch"!==o.get("type"))throw new h({msg:n.str("git-error-options")});if(o.getIsRemote())throw new h({msg:n.str("git-error-remote-branch")});var i=this.getCommitFromRef(t);this.setTargetLocation(o,i)},k.prototype.branch=function(e,t){var o=this.getCommitFromRef(t),i=this.validateAndMakeBranch(e,o);t=this.resolveID(t),this.isRemoteBranchRef(t)&&this.setLocalToTrackRemote(i,t)},k.prototype.isRemoteBranchRef=function(e){var t=this.resolveID(e);return"branch"===t.get("type")&&t.getIsRemote()},k.prototype.tag=function(e,t){var o=this.getCommitFromRef(t);this.validateAndMakeTag(e,o)},k.prototype.describe=function(e){var t=this.getCommitFromRef(e),o={};this.tagCollection.toJSON().forEach((function(e){o[e.target.get("id")]=e.id}));for(var i,a=[t],r=[];a.length;){var s=a.pop(),c=s.get("id");if(o[c]){i=o[c];break}r.push(s.get("id"));var l=s.get("parents");l&&l.length&&(a=a.concat(l)).sort(this.dateSortFunc)}if(!i)throw new h({msg:n.todo("Fatal: no tags found upstream")});if(0===r.length)throw new p({msg:i});throw new p({msg:i+"_"+r.length+"_g"+t.get("id")})},k.prototype.validateAndDeleteBranch=function(e){var t=this.resolveID(e);if("branch"!==t.get("type")||"main"==t.get("id")||this.HEAD.get("target")===t)throw new h({msg:n.str("git-error-branch")});var o=t;if(t.getIsRemote())throw new h({msg:n.str("git-error-remote-branch")});this.deleteBranch(o)},k.prototype.deleteBranch=function(e){this.branchCollection.remove(e),this.refs[e.get("id")]=void 0,delete this.refs[e.get("id")],this.HEAD.get("target")===e&&this.HEAD.set("target",this.refs.main),e.get("visBranch")&&e.get("visBranch").remove()},k.prototype.crappyUnescape=function(e){return e.replace(/'/g,"'").replace(///g,"/")},k.prototype.filterError=function(e){if(!(e instanceof h||e instanceof p))throw e},k.prototype.externalRefresh=function(){this.animationQueue=new s({callback:function(){}}),this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals),this.animationQueue.start()},k.prototype.dispatch=function(e,t){this.command=e;var o=e.get("vcs"),i=function(){this.dispatchProcess(e,t)}.bind(this);this.handleModeChange(o,i)},k.prototype.dispatchProcess=function(e,t){var o=function(){e.finishWith(t)}.bind(this);this.animationQueue=new s({callback:o});var i=e.get("vcs"),a=e.get("method").replace(/-/g,"");try{d.commands.execute(i,a,this,this.command)}catch(o){return this.filterError(o),e.set("error",o),void t.resolve()}var n=this.animationQueue.get("defer")||this.animationQueue.get("promiseBased");this.animationQueue.get("animations").length||n||this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals),n||this.animationQueue.start()},k.prototype.show=function(e){var t=this.getCommitFromRef(e);throw new p({msg:t.getShowEntry()})},k.prototype.status=function(){var e=[];if(this.getDetachedHead())e.push(n.str("git-status-detached"));else{var t=this.resolveNameNoPrefix("HEAD");e.push(n.str("git-status-onbranch",{branch:t}))}e.push("Changes to be committed:"),e.push(""),e.push(f+"modified: cal/OskiCostume.stl"),e.push(""),e.push(n.str("git-status-readytocommit"));var o="";throw e.forEach((function(e){o+="# "+e+"\n"})),new p({msg:o})},k.prototype.logWithout=function(e,t){t=t.slice(1),this.log(e,l.getUpstreamSet(this,t))},k.prototype.revlist=function(e){var t=new A(this,e).formatRevisions((function(e){return e.id+"\n"}));throw new p({msg:t})},k.prototype.log=function(e){var t=new A(this,e).formatRevisions((function(e){return e.getLogEntry()}));throw new p({msg:t})},k.prototype.getCommonAncestor=function(e,t,o){if(this.isUpstreamOf(t,e)&&!o)throw new Error("Don't use common ancestor if we are upstream!");for(var i=l.getUpstreamSet(this,e),a=[this.getCommitFromRef(t)];a.length;){var n=a.pop();if(i[n.get("id")])return n;a=a.concat(n.get("parents"))}throw new Error("something has gone very wrong... two nodes aren't connected!")},k.prototype.isUpstreamOf=function(e,t){return e=this.getCommitFromRef(e),void 0!==l.getUpstreamSet(this,t)[e.get("id")]},k.prototype.getDownstreamSet=function(e){var t=this.getCommitFromRef(e),o=t.get("id"),i=[t],a={};a[o]=!0;for(var n=function(e){a[e.get("id")]=!0,i.push(e)};i.length;){i.pop().get("children").forEach(n)}return a};var w=i.Model.extend({initialize:function(){if(!this.get("target"))throw new Error("must be initialized with target");if(!this.get("id"))throw new Error("must be given an id");this.set("type","general ref"),"HEAD"==this.get("id")&&(this.set("lastLastTarget",null),this.set("lastTarget",this.get("target")),this.on("change:target",this.targetChanged,this))},getIsRemote:function(){return!1},getName:function(){return this.get("id")},targetChanged:function(e,t,o){this.set("lastLastTarget",this.get("lastTarget")),this.set("lastTarget",t)},toString:function(){return"a "+this.get("type")+"pointing to "+String(this.get("target"))}}),y=w.extend({defaults:{visBranch:null,remoteTrackingBranchID:null,remote:!1},initialize:function(){w.prototype.initialize.call(this),this.set("type","branch")},setRemoteTrackingBranchID:function(e){this.set("remoteTrackingBranchID",e)},getRemoteTrackingBranchID:function(){return this.get("remoteTrackingBranchID")},getPrefixedID:function(){if(this.getIsRemote())throw new Error("im already remote");return g+this.get("id")},getBaseID:function(){if(!this.getIsRemote())throw new Error("im not remote so can't get base");return this.get("id").replace(g,"")},getIsRemote:function(){return this.get("id"),this.get("id").slice(0,2)===g}}),C=i.Model.extend({defaults:{type:"commit",children:null,parents:null,author:"Peter Cottle",createTime:null,commitMessage:null,visNode:null,gitVisuals:null},constants:{circularFields:["gitVisuals","visNode","children"]},getLogEntry:function(){return["Author: "+this.get("author"),"Date: "+this.get("createTime"),"",this.get("commitMessage"),"","Commit: "+this.get("id")].join("
")+"\n"},getShowEntry:function(){return[this.getLogEntry().replace("\n",""),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("
")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");if(this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage",n.str("git-dummy-msg")),this.set("children",[]),!(this.get("rootCommit")||this.get("parents")&&this.get("parents").length))throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},getParent:function(e){return this&&this.attributes&&this.attributes.parents?this.attributes.parents[e]:null},removeFromParents:function(){this.get("parents").forEach((function(e){e.removeChild(this)}),this)},checkForUpdatedParent:function(e){var t=this.get("parents");if(!(t.length>1)){var o=t[0].get("id"),i=e.getMostRecentBumpedID(o);if(o!==i){var a=e.refs[i];this.removeFromParents(),this.set("parents",[a]),a.get("children").push(this);var n=this.get("visNode");n&&n.removeAllEdges();var r=this.get("gitVisuals");return r&&r.addEdge(this.get("id"),i),!0}}},removeChild:function(e){var t=[];this.get("children").forEach((function(o){o!==e&&t.push(o)})),this.set("children",t)},isMainParent:function(e){return 0===this.get("parents").indexOf(e)},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),(this.get("parents")||[]).forEach((function(e){e.get("children").push(this),this.addEdgeToVisuals(e)}),this)}}),z=w.extend({defaults:{visTag:null},initialize:function(){w.prototype.initialize.call(this),this.set("type","tag")}});function A(e,t){this.engine=e,this.tipsToInclude=[],this.tipsToExclude=[],this.includedRefs={},this.excludedRefs={},this.revisions=[],this.processSpecifiers(t)}var _=/^(.*)\.\.(.*)$/;A.prototype.processAsRange=function(e){var t=e.match(_);return!!t&&(this.tipsToExclude.push(t[1]),this.tipsToInclude.push(t[2]),!0)},A.prototype.processAsExclusion=function(e){return!!e.startsWith("^")&&(this.tipsToExclude.push(e.slice(1)),!0)},A.prototype.processAsInclusion=function(e){return this.tipsToInclude.push(e),!0},A.prototype.processSpecifiers=function(e){var t=this,o=[this.processAsRange,this.processAsExclusion];e.forEach((function(e){o.some((function(o){return o.bind(t)(e)}))||t.processAsInclusion(e)})),this.tipsToExclude.forEach((function(e){t.addExcluded(l.getUpstreamSet(t.engine,e))})),this.tipsToInclude.forEach((function(e){t.addIncluded(l.getUpstreamSet(t.engine,e))}));var i=Array.from(Object.keys(t.includedRefs));t.revisions=i.map((function(e){return t.engine.resolveStringRef(e)})),t.revisions.sort(t.engine.dateSortFunc),t.revisions.reverse()},A.prototype.isExcluded=function(e){return this.excludedRefs.hasOwnProperty(e)},A.prototype.addExcluded=function(e){var t=this;Object.keys(e).forEach((function(e){t.isExcluded(e)||(t.excludedRefs[e]=!0)}))},A.prototype.addIncluded=function(e){var t=this;Object.keys(e).forEach((function(e){t.isExcluded(e)||(t.includedRefs[e]=!0)}))},A.prototype.formatRevisions=function(e){var t="";return this.revisions.forEach((function(o){t+=e(o)})),t},o.GitEngine=k,o.Commit=C,o.Branch=y,o.Tag=z,o.Ref=w},{"../app":52,"../commands":53,"../graph":64,"../graph/treeCompare":65,"../intl":67,"../util/errors":93,"../views/rebaseView":109,"../visuals/animation":111,"../visuals/animation/animationFactory":110,backbone:1,q:29}],64:[function(e,t,o){var i={getOrMakeRecursive:function(t,o,i,a){var n=e("../git"),r=n.Commit,s=n.Ref,c=n.Branch,l=n.Tag;if(o[i])return o[i];var m=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if("HEAD"==t)return"HEAD";if(e.tags[t])return"tag";throw new Error("bad type for "+t)}(t,i);if("HEAD"==m){var u=t.HEAD,d=new s(Object.assign(t.HEAD,{target:this.getOrMakeRecursive(t,o,u.target)}));return o[i]=d,d}if("branch"==m){var h=t.branches[i],p=new c(Object.assign(t.branches[i],{target:this.getOrMakeRecursive(t,o,h.target)}));return o[i]=p,p}if("tag"==m){var g=t.tags[i],f=new l(Object.assign(t.tags[i],{target:this.getOrMakeRecursive(t,o,g.target)}));return o[i]=f,f}if("commit"==m){var b=t.commits[i],v=[];b.parents.forEach((function(e){v.push(this.getOrMakeRecursive(t,o,e))}),this);var k=new r(Object.assign(b,{parents:v,gitVisuals:this.gitVisuals}));return o[i]=k,k}throw new Error("ruh rho!! unsupported type for "+i)},descendSortDepth:function(e){return e.sort((function(e,t){return t.depth-e.depth}))},bfsFromLocationWithSet:function(e,t,o){for(var i=[],a=[e.getCommitFromRef(t)];a.length;){var n=a.pop();o[n.get("id")]||(i.push(n),a=a.concat(n.get("parents")))}return i},getUpstreamSet:function(e,t){var o=e.getCommitFromRef(t),i=o.get("id"),a=[o],n={};n[i]=!0;for(var r=function(e){n[e.get("id")]=!0,a.push(e)};a.length;){(a.pop().get("parents")||[]).forEach(r)}return n},getUniqueObjects:function(e){var t={},o=[];return e.forEach((function(e){t[e.id]||(t[e.id]=!0,o.push(e))})),o},getDefaultTree:function(){return JSON.parse(unescape("%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22main%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22main%22%2C%22type%22%3A%22general%20ref%22%7D%7D"))}};t.exports=i},{"../git":63}],65:[function(e,t,o){var i=e("underscore"),a={dispatchFromLevel:function(e,t){var o=e.goalTreeString;return"string"!=typeof t&&console.warn("NEED to pass in string!! gah"),a.dispatch(e,o,t)},onlyMainCompared:function(e){switch(!0){case!!e.compareOnlyMain:case!!e.compareOnlyMainHashAgnostic:case!!e.compareOnlyMainHashAgnosticWithAsserts:return!0;default:return!1}},dispatch:function(e,t,o){var i=this.convertTreeSafe(t);if(o=this.convertTreeSafe(o),typeof i.originTree!=typeof o.originTree)return!1;var a=this.dispatchShallow(e,i,o);if(!a||!i.originTree)return a;var n=e.originCompare?e.originCompare:e;return a&&this.dispatchShallow(n,i.originTree,o.originTree)},dispatchShallow:function(e,t,o){switch(!0){case!!e.compareOnlyMain:return a.compareBranchWithinTrees(o,t,"main");case!!e.compareAllBranchesAndEnforceBranchCleanup:return a.compareAllBranchesAndEnforceBranchCleanup(o,t);case!!e.compareOnlyBranches:return a.compareAllBranchesWithinTrees(o,t);case!!e.compareAllBranchesHashAgnostic:return a.compareAllBranchesWithinTreesHashAgnostic(o,t);case!!e.compareOnlyMainHashAgnostic:return a.compareBranchesWithinTreesHashAgnostic(o,t,["main"]);case!!e.compareOnlyMainHashAgnosticWithAsserts:return a.compareBranchesWithinTreesHashAgnostic(o,t,["main"])&&a.evalAsserts(o,e.goalAsserts);case!!e.onlyEvaluateAsserts:return a.evalAsserts(o,e.goalAsserts);default:return a.compareAllBranchesWithinTreesAndHEAD(o,t)}},compareAllBranchesWithinTreesAndHEAD:function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target===t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)&&this.compareAllTagsWithinTrees(e,t)},compareAllBranchesAndEnforceBranchCleanup:function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var o=Object.assign({},e.branches,t.branches);return Object.keys(o).every(function(o){return this.compareBranchWithinTrees(e,t,o)}.bind(this))},compareAllBranchesWithinTrees:function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),Object.keys(t.branches).every(function(o){return this.compareBranchWithinTrees(e,t,o)}.bind(this))},compareAllTagsWithinTrees:function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),i.isEqual(e.tags,t.tags)},compareBranchesWithinTrees:function(e,t,o){var i=!0;return o.forEach((function(o){i=i&&this.compareBranchWithinTrees(e,t,o)}),this),i},compareBranchWithinTrees:function(e,t,o){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var a=this.getRecurseCompare(e,t),n=e.branches[o],r=t.branches[o];return i.isEqual(n,r)&&a(e.commits[n.target],t.commits[r.target])},compareAllBranchesWithinTreesHashAgnostic:function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var o=Object.assign({},e.branches,t.branches),i=Object.keys(o||{});return this.compareBranchesWithinTreesHashAgnostic(e,t,i)},compareBranchesWithinTreesHashAgnostic:function(e,t,o){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var a=function(e,t){return!(!e||!t)&&(e=Object.assign({},e),t=Object.assign({},t),e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),i.isEqual(e,t))}.bind(this),n=this.getRecurseCompareHashAgnostic(e,t),r=!0;return o.forEach((function(o){var i=e.branches[o],s=t.branches[o];r=r&&a(i,s)&&n(e.commits[i.target],t.commits[s.target])}),this),r},evalAsserts:function(e,t){var o=!0;return Object.keys(t).forEach((function(i){var a=t[i];o=o&&this.evalAssertsOnBranch(e,i,a)}),this),o},evalAssertsOnBranch:function(e,t,o){if(!(e=this.convertTreeSafe(e)).branches[t])return!1;for(var i=[e.branches[t].target],a={},n=0;i.length;){var r=i.pop();a[this.getBaseRef(r)]=this.getNumHashes(r),i=i.concat(e.commits[r].parents),n++}a.__num_commits_upstream=n;var s=!0;return o.forEach((function(e){try{s=s&&e(a)}catch(e){console.warn("error during assert",e),s=!1}})),s},getNumHashes:function(e){for(var t=[[/^C(\d+)([']{0,3})$/,function(e){return e[2]?e[2].length:0}],[/^C(\d+)['][\^](\d+)$/,function(e){return Number(e[2])}]],o=0;o []",de_DE:"git []",zh_CN:"git <命令> [<参数>]",zh_TW:"git <指令> [<參數>]",es_AR:"git []",es_MX:"git []",es_ES:"git []",pt_BR:"git []",gl:"git []",fr_FR:"git []",ru_RU:"git <команда> [<аргументы>]",uk:"git <команда> [<аргументи>]",ko:"git <명령어> [<인자들>]",vi:"git []",sl_SI:"git []",pl:"git []",it_IT:"git []",ta_IN:"git []"},"git-supported-commands":{__desc__:"In the git help command, the header above the supported commands",en_US:"Supported commands:",de_DE:"Unterstützte Befehle:",zh_CN:"支持的命令有:",zh_TW:"支援的指令有:",es_AR:"Comandos soportados:",es_MX:"Comandos compatibles:",es_ES:"Comandos compatibles:",pt_BR:"Comandos suportados:",gl:"Comandos soportados:",fr_FR:"Commandes supportées",ru_RU:"Поддерживаемые команды",uk:"Допустимі команди",ko:"지원되는 명령어들:",vi:"Các lệnh được hỗ trợ:",sl_SI:"Podprti ukazi:",pl:"Obsługiwane polecenia:",it_IT:"Comandi supportati:",ta_IN:"செயலாக்கம் உள்ள கட்டளைகள்;"},"git-usage":{__desc__:"In the dummy git output, the header before showing all the commands",en_US:"Usage:",de_DE:"Benutzung:",zh_CN:"使用:",zh_TW:"用法:",es_AR:"Uso:",es_MX:"Uso:",es_ES:"Uso:",pt_BR:"Uso:",gl:"Uso:",fr_FR:"Utilisation :",ru_RU:"Использование:",uk:"Використання:",ko:"사용법",vi:"Cách dùng:",sl_SI:"Uporaba:",pl:"Użyj",it_IT:"Utilizzo:",ta_IN:"பயன்பாடு"},"git-version":{__desc__:"The git version dummy output, kind of silly. PCOTTLE is my unix name but feel free to put yours instead",en_US:"Git Version PCOTTLE.1.0",de_DE:"Git Version PCOTTLE.1.0.jbr",zh_CN:"Git 版本 PCOTTLE.1.0",zh_TW:"Git 版本 PCOTTLE.1.0",es_AR:"Git Versión PCOTTLE.1.0",es_MX:"Git Versión PCOTTLE.1.0",es_ES:"Git Versión PCOTTLE.1.0",pt_BR:"Git versão PCOTTLE.1.0",gl:"Git versión PCOTTLE.1.0",fr_FR:"Git version PCOTTLE.1.0",ru_RU:"Версия git PCOTTLE.1.0",uk:"Версія git PCOTTLE.1.0",ko:"Git Version PCOTTLE.1.0",vi:"Phiên bản Git PCOTTLE.1.0",sl_SI:"Git Verzija PCOTTLE.1.0",pl:"Wersja GIT-a OLSZA-YSC-1.0",it_IT:"Git Version SHARDANA_SOFT.1.0.0",ta_IN:"Git Version PCOTTLE.1.0"},"flip-tree-command":{__desc__:"when the tree is being flipped",en_US:"Flipping tree...",de_DE:"Kehre den Baum um...",zh_CN:"翻转树中...",zh_TW:"翻轉樹中...",es_AR:"Invirtiendo el árbol...",es_MX:"Invirtiendo el árbol...",es_ES:"Invirtiendo el árbol...",pt_BR:"Invertendo a árvore...",gl:"Invirtindo a árbore...",fr_FR:"Inversion de l'arbre...",ru_RU:"Переворачиваю дерево...",uk:"Перевертаю дерево...",ko:"트리 뒤집는중...",vi:"Cây lật...",sl_SI:"Obračanje drevesa ...",pl:"Odwracanie drzewa...",it_IT:"Girando l'albero...",ta_IN:"Flipping tree..."},"refresh-tree-command":{__desc__:"when the tree is visually refreshed",en_US:"Refreshing tree...",de_DE:"Aktualisiere Baum ...",zh_CN:"正在刷新树结构...",zh_TW:"正在更新樹狀結構...",es_AR:"Refrezcando el árbol...",es_MX:"Actualizando el árbol...",es_ES:"Actualizando el árbol...",pt_BR:"Atualizando a árvore...",gl:"Actualizando a árbore...",fr_FR:"Actualisation de l'arbre…",ru_RU:"Обновляю дерево...",uk:"Оновлюю дерево...",ko:"트리 다시 불러오는중...",vi:"Đang làm mới cây...",sl_SI:"Osveževanje drevesa ...",pl:"Odświeżanie drzewa...",it_IT:"Aggiornando l'albero...",ta_IN:"Refreshing tree..."},"locale-command":{__desc__:"when the locale is set to something",en_US:"Locale set to {locale}",de_DE:"Locale auf {locale} gesetzt",zh_CN:"语言更改为 {locale}",zh_TW:"語系設為 {locale}",es_AR:"Localización actualizada a {locale}",es_MX:"Idioma actualizado a {locale}",es_ES:"Idioma puesto a {locale}",pt_BR:"Língua trocada para {locale}",gl:"Cambiado o idioma a {locale}",fr_FR:"Langue changée à {locale}",ru_RU:"Локаль теперь равна {locale}",uk:"Локаль тепер дорівнює {locale}",ko:"로케일이 {locale}로 설정되었습니다.",vi:"Ngôn ngữ được thay đổi thành {locale}",sl_SI:"Locale nastavljen na {locale}",pl:"Ustawiono język na {locale}",it_IT:"Locale impostato a {locale}",ta_IN:"பிரதேசம் {locale}ஆக மற்ற பட்டுள்ளது"},"locale-reset-command":{__desc__:"when the locale is reset",en_US:"Locale reset to default, which is {locale}",de_DE:"Locale auf Standard zurückgesetzt, also {locale}",zh_CN:"语言重置为默认的 {locale}",zh_TW:"還原為預設語系 {locale}",es_AR:"Localización vuelta al default, que es {locale}",es_MX:"Idioma reestablecido al default, que es {locale}",es_ES:"Idioma reajustado a su valor por defecto ({locale})",pt_BR:"Língua retornada para a padrão, que é {locale}",gl:"Lingua reaxustada ó seu valor por defecto {locale}",fr_FR:"Langue remise par défaut, qui est {locale}",ru_RU:"Локаль сброшена. Теперь она равна {locale}",uk:"Локаль скинута. Тепер вона дорівнює {locale}",ko:"로케일이 {locale}로 초기화 되었습니다.",vi:"Ngôn ngữ được đổi thành mặc định: {locale}",sl_SI:"Locale ponastavljen na {locale}",pl:"Przywrócono język do wartości domyślnych, czyli {locale}",it_IT:"Locale resettato al valore di default, che è {locale}",ta_IN:"பிரதேசம் இயல்புநிலை {locale}க்கி மீட்டமைக்கப்பட்டுள்ளது"},"show-command":{__desc__:'command output title from "show"',en_US:"Please use one of the following commands for more info:",zh_TW:"請使用下列其中一個指令取得更多資訊:",zh_CN:"请使用以下命令以了解更多:",de_DE:"Bitte benutze einen der folgenden Befehle um mehr Informationen zu bekommen:",es_AR:"Usá alguno de estos comandos para tener más información:",es_MX:"Por favor, utilice alguno de estos comandos para tener más información:",es_ES:"Por favor usa uno de los siguientes comandos para más información:",pt_BR:"Use algum destes comandos para ter mais informações:",gl:"Usa algún destes comandos para ter máis información:",fr_FR:"Merci d'utiliser une des commandes suivantes pour obtenir plus d'informations",ru_RU:"Для получения большей информации используй следующие команды:",uk:"Щоб отримати більше інформації використовуй наступні команди:",ko:"더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.",vi:"Vui lòng dùng một trong các lệnh sau để có thêm thông tin:",sl_SI:"Prosim uporabi enega od naslednjih ukazov",pl:"Aby uzyskać więcej informacji, użyj jednego z następujących poleceń:",it_IT:"Usa uno dei seguenti comandi per maggiori informazioni:",ta_IN:"மேலும் தகவலுக்கு பின்வரும் கட்டளைகளில் ஒன்றைப் பயன்படுத்தவும்:"},"show-all-commands":{__desc__:'command output title from "show commands"',en_US:"Here is a list of all the commmands available:",zh_TW:"這份清單列出所有可用指令:",zh_CN:"该列表列出了所有可用的指令:",de_DE:"Hier ist eine Liste aller verfügbaren Befehle:",es_AR:"Esta es una lista de los comandos disponibles:",es_MX:"Esta es una lista de todos los comandos disponibles:",es_ES:"Esta es una lista de todos los comandos disponibles:",pt_BR:"Esta é uma lista dos comandos disponíveis:",gl:"Esta é unha lista dos comando dispoñibles:",fr_FR:"Ci-dessous est la liste de toutes les commandes disponibles :",ru_RU:"Вот все поддерживаемые команды:",uk:"Ось список всіх можливих команд:",ko:"여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.",vi:"Dưới đây là danh sách tất cả các lệnh có sẵn:",sl_SI:"Tu je seznam vseh možnih ukazov:",pl:"Oto lista wszystkich dostępnych poleceń:",it_IT:"Ecco la lista con tutti i comandi disponibili:",ta_IN:"கிடைக்கக்கூடிய அனைத்து கட்டளைகளின் பட்டியல்:"},"cd-command":{__desc__:"dummy command output for the command in the key",en_US:'Directory changed to "/directories/dont/matter/in/this/demo"',de_DE:'Verzeichnis gewechselt zu "/verzeichnisse/sind/in/dieser/demo/irrelevant"',zh_CN:'目录切换到 "/directories/dont/matter/in/this/demo"',zh_TW:'目錄切換到 "/directories/dont/matter/in/this/demo"',es_AR:'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',es_MX:'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',es_ES:'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',pt_BR:'Diretório mudado para "/diretorios/nao/importam/neste/demo"',gl:'Directorio cambiado a "/os/directorios/non/importan/nesta/demo"',fr_FR:'Répertoire changé à "/directories/dont/matter/in/this/demo" (les répertoires ne servent à rien dans cette démo)',ru_RU:'Директория изменена на "/директории/не/важны/в/этом/демо"',uk:'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"',ko:'디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.',vi:'Thay đổi thư mục thành "/directories/dont/matter/in/this/demo"',sl_SI:'Mapa spremenjena na "/directories/dont/matter/in/this/demo"',pl:'Katalog zmieniony na "/home/users/windows/pl/demo"',it_IT:'Cartella modificata in "/directories/dont/matter/in/this/demo"',ta_IN:'அடைவு "/directories/dont/matter/in/this/demo"க்கு மாற்றப்பட்டது'},"ls-command":{__desc__:"Dummy command output for the command in the key",en_US:"DontWorryAboutFilesInThisDemo.txt",de_DE:"VergissDateienInDieserDemo.txt",zh_CN:"在本程序中无须考虑文件问题.txt",zh_TW:"DontWorryAboutFilesInThisDemo.txt (譯註:在 demo 裡不用擔心檔案)",es_AR:"NoTePreocupesPorLosArchivosEnEstaDemo.txt",es_MX:"NoTePreocupesPorLosArchivosEnEstaDemo.txt",es_ES:"NoTePreocupesPorLosArchivosEnEstaDemo.txt",pt_BR:"NaoSePreocupeComNomesDeArquivoNesteDemo.txt",gl:"NonTePreocupesPolosCambiosNestaDemo.txt",fr_FR:"DontWorryAboutFilesInThisDemo.txt (ne vous préoccupez pas des noms de fichier dans cette démo)",ru_RU:"НеНадоЗаботитьсяОФайлахВЭтомДемо.txt",uk:"ЗабийНаФайлиВЦьомуДемо.txt",ko:"DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)",vi:"DontWorryAboutFilesInThisDemo.txt (ĐừngLoLắngVềTậpTinTrongBảnGiớiThiệuNày.txt)",sl_SI:"DontWorryAboutFilesInThisDemo.txt",pl:"SpokojnieToTylkoPlikDemo.txt",it_IT:"NoNdEvIpReOcCuPaRtIdEiFiLeInQuEsTaDeMo.txt",ta_IN:"DontWorryAboutFilesInThisDemo.txt"},"mobile-alert":{__desc__:"When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them",en_US:"LGB can't receive input on mobile, visit on desktop! it's worth it :D",de_DE:"LGB ist nicht mit mobilen Endgeräten kompatibel, benutz es vom Desktop! Es lohnt sich :D",zh_CN:"无法在移动设备/平板上调出键盘 :( 请试试桌面版 :D",zh_TW:"無法在行動裝置上叫出鍵盤,請改用桌面版!",es_AR:"LGB no puede recibir comandos en dispositivos móviles. Visitanos desde una desktop, ¡lo vale! :D",es_MX:"LGB no puede recibir comandos en dispositivos móviles. Visítanos en una computadora de escritorio u laptop, ¡Vale la pena! :D",es_ES:"LGB no puede recibir comandos en dispositivos móviles. Visítanos en una computadora de escritorio, ¡lo vale! :D",pt_BR:"Provavelmente você não vai conseguir digitar comandos no celular, neste caso tente acessar de um computador",gl:"LGB non pode recibir os comandos nos dispositivos móbiles. Visítanos dende un ordenador de escritorio, ¡paga a pena! :D",fr_FR:"Impossible de faire apparaître le clavier sur mobile / tablette :( Essayez de passer sur un ordinateur de bureau :D",ru_RU:"Мобильные не поддерживаются, зайди с компьютера!",uk:"LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!",ko:"LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D",vi:"Đáng tiếc là ứng dụng không thể nhận thông tin từ điện thoại hay máy tính bảng, hãy sử dụng máy tính cá nhân, đáng để bỏ công mà :D",sl_SI:"LGB ne more sprejeti ukazov na mobilni napravi, obiščite nas na računalinku! Je vredno :D ",pl:"Przepraszamy, ale LearnGitBranching nie obsługuje wpisywania komend z urządzeń mobilnych. Odwiedź LearnGitBranching na komputerze stacjonarnym, warto! :D",it_IT:"LGB non funziona su mobile, vieni a trovarci da pc! Ne vale veramente la pena :D",ta_IN:"LGBஆல் மொபைலில் உள்ளீட்டைப் பெற முடியாது, டெஸ்க்டாப்பில் பார்வையிடவும், அது பயணுள்ளது :D"},"share-tree":{__desc__:"When you export a tree, we want you to share the tree with friends",en_US:'Share this tree with friends! They can load it with "import tree"',de_DE:'Teile diesen git-Baum mit Freunden! Sie können ihn mit "import tree" laden',zh_CN:'与你的好友分享提交树!他们可以用 "import tree" 加载它',zh_TW:'與你的好友分享這棵樹!他們可以用 "import tree" 來載入它',es_AR:'¡Compartí este árbol con amigos! Pueden cargarlo con "import tree"',es_MX:'¡Comparte éste árbol con amigos! Pueden cargarlo con "import tree"',es_ES:'¡Comparte este árbol con amigos! Pueden cargarlo con "import tree"',pt_BR:'Compartilhe esta árvore com seus amigos! Eles podem carregá-la com "import tree"',gl:'¡Comparte esta árbore cos teus amigos! Eles poden cargalo con "import tree"',fr_FR:'Partagez cet arbre avec vos amis ! Ils peuvent le charger avec "import tree"',ru_RU:'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"',uk:'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"',ko:'친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.',vi:'Hãy chia sẻ cây này với bạn của mình! Họ có thể dùng "import tree" để tải',sl_SI:'Deli to drevo s prijatelji! Lahko ga naložijo z "import tree"',pl:'Udostępnij to drzewo znajomym! Mogą je załadować za pomocą "import tree"',it_IT:'Condividi quest\'albero con i tuoi amici! Può essere importato tramite "import tree"',ta_IN:'இந்த `tree`ஐ நண்பர்களுடன் பகிர்ந்து கொள்ளுங்கள்! அவர்கள் அதை "import tree" மூலம் பெறலாம்'},"paste-json":{__desc__:"When you are importing a level or tree",en_US:"Paste a JSON blob below!",de_DE:"Füg einen JSON-Blob unten ein!",zh_CN:"在下边粘贴一个 JSON 串",zh_TW:"在下方貼上一串 JSON",es_AR:"¡Pegá un blob JSON abajo!",es_MX:"¡Pega un blob JSON abajo!",es_ES:"¡Pega un blob JSON abajo!",pt_BR:"Cole o JSON abaixo!",gl:"Pega un JSON abaixo!",fr_FR:"Collez un blob JSON ci-dessous !",ru_RU:"Вставь JSON ниже!",uk:"Встав JSON нижче!",ko:"아래에 JSON blob을 붙여넣으세요.",vi:"Dán một chuỗi JSON xuống bên dưới!",sl_SI:"Prilepi JSON kodo spodaj!",pl:"Wklej poniżej obiekt z kodem JSON!",it_IT:"Incolla un blob JSON qui sotto!",ta_IN:"ஒரு JSON blob-ஐ கீழே ஒட்டவும்"},"solved-map-reset":{__desc__:"When you reset the solved map to clear your solved history, in case someone else wants to use your browser",en_US:"Solved map was reset, you are starting from a clean slate!",de_DE:"Gelöste Karte wurde zurückgesetzt, du fängst mit einem leeren Blatt an!",zh_CN:"解决列表已重置,您现在可以从头开始了",zh_TW:"過關地圖已經重新設置,您現在從零開始了",es_AR:"El mapa resuelto fue eliminado, estás arrancando desde un estado limpio",es_MX:"El mapa resuelto fue eliminado, estás empezando desde un estado limpio",es_ES:"El mapa resuelto fue eliminado, estás empezando de un estado limpio.",pt_BR:"Mapa de resolvidos descartado, você está começando com ficha limpa!",gl:"O mapa resolto foi eliminado, estás arrancando dende un estado limpo.",fr_FR:"La carte des niveaux résolus a été effacée, vous repartez de zéro !",ru_RU:"Всё сброшено! Можно начать с чистого листа!",uk:"Все скинуте! Можна починати з чистого аркушу!",ko:"해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.",vi:"Tất cả đáp án đã được xóa, bạn có thể bắt đầu lại từ đầu!",sl_SI:"Rešena mapa je ponastavljena, začel boš lahko na novo!",pl:"Rozwiązania zostały wyczyszczone, zaczynasz z czystą kartą.",it_IT:"I progresse salvati sono stati resettati, stai iniziando da zero!",ta_IN:"தீர்க்கப்பட்ட கோப்பு மீட்டமைக்கப்பட்டது, நீங்கள் ஆரம்பத்தில் இருந்து தொடங்குகிறீர்கள்!"},"level-cant-exit":{__desc__:"When the user tries to exit a level when they are not in one",en_US:'You are not in a level! You are in a sandbox, start a level with "levels"',de_DE:'Du bist nicht in einem Level! Du bist im Sandkasten-Modus, starte ein Level mit "levels"',zh_CN:'您没在关卡中而是在沙盒中,要开始关卡请输入 "levels"',zh_TW:'您沒在關卡中!您在沙盒中,要開始關卡請輸入 "levels"',es_AR:'¡No estás en un nivel! Estás en el sandbox, comenzá un nivel usando "levels"',es_MX:'¡No estás en un nivel! Estás en el sandbox, comienza un nivel con "levels"',es_ES:'¡No estás en un nivel! Estás en el sandbox, comienza un nivel con "levels"',pt_BR:'Você não está em um nível! Você está no sandbox, comece um nível com "levels"',gl:'¡Non estás en ningún nivel! Estás nunha caixa de arena, comeza un nivel usando "levels"',fr_FR:'Vous n\'êtes pas dans un niveau ! Vous êtes dans le mode bac à sable, commencez un niveau avec "levels"',ru_RU:'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!',uk:'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"',ko:'당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.',vi:'Bạn hiện không ở cấp độ nào cả! Bạn đang ở trong hộp cát (sandbox), hãy bắt đầu một cấp độ với "levels"',sl_SI:'Nisi v stopnji! Si v peskovniku, začni stopnjo z "levels"',pl:'Nie jesteś na poziomie! Jesteś w trybie piaskownicy, zacznij poziom wpisując "levels"',it_IT:'Non ti trovi in un livello! Sei nella sandbox, inizia un livello con "levels"',ta_IN:'ஒரு நிலையில் இல்லாமல், நீங்கள் sandbox-இல் உள்ளீர்கள்! "நிலைகள்" மூலம் ஒரு நிலையைத் தொடங்கவும்'},"level-no-id":{__desc__:"When you say an id but that level doesn't exist",en_US:'A level for that id "{id}" was not found! Opening up a level selection view',de_DE:'Konnte kein Level mit der ID "{id}" finden! Öffne den Level-Auswahldialog',zh_CN:'没找到 id 为 "{id}" 的关卡!打开关卡选择框',zh_TW:'找不到 id 為 "{id}" 的關卡!開啟關卡選擇視窗',es_AR:"No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...",es_MX:"No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...",es_ES:"No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...",pt_BR:'O nível "{id}" não existe! Abrindo uma caixa de seleção de nível',gl:'O nivel "{id}" non existe! Abrindo unha caixa de seleción de nivel',fr_FR:"Le niveau dont l'identifiant est {id} n'a pas été trouvé ! Ouverture de la vue de sélection des niveaux",ru_RU:'Уровень с id "{id}" не найден! Открываю выбор уровней',uk:'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней',ko:'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.',vi:'Không tìm thấy cấp độ cho định danh "{id}"! Mở cửa sổ chọn cấp độ',sl_SI:'Stopnja za ta id "{id}" ni bila najdena! Odpiram pogled za izbiro stopnje',pl:"Nie znaleziono poziomu {id}!. Otwieranie widoku wyboru poziomu...",it_IT:'Non è stato trovato un livello con id "{id}"! Apro la finestra con la selezione dei livelli',ta_IN:'அந்த "{id}"-க்கான நிலை காணப்படவில்லை! நிலை தேர்வு செய்யும் திரை திறக்கிறது'},"undo-stack-empty":{__desc__:"The undo command can only undo back until the last time the level was reset or the beginning of the level",en_US:"The undo stack is empty!",de_DE:"Die Undo-Liste ist leer!",zh_CN:"还没有什么可以撤销",zh_TW:"還沒有什麼可以取消",es_AR:"No hay comandos que deshacer",es_MX:"No hay comandos para deshacer",es_ES:"No hay comandos que deshacer",pt_BR:"Você já desfez tudo!",gl:"Nonn hai comandos que desfacer",fr_FR:"La pile d'annulation est vide !",ru_RU:"Некуда откатывать!",uk:"Нема куди відкочуватись!",ko:"되돌리기 스택이 비었습니다!",vi:"Không có gì để hoàn tác!",sl_SI:"Undo seznam je prazen!",pl:"Nie ma już poleceń do cofnięcia!",it_IT:"Non sono presenti comandi da annullare!",ta_IN:"மீள்பதிவு அடுக்கு காலியாக உள்ளது!"},"already-solved":{__desc__:"When you play in a level that is already solved",en_US:'You have already solved this level, try other levels with "levels" or go back to sandbox with "sandbox"',de_DE:'Du hast dieses Level bereits gelöst, probier ein anderes Level mit "levels" aus oder geh in den Sandkasten-Modus mit "sandbox"',zh_CN:'你已经解决了本关,输入 "levels" 尝试其他关卡,或者输入 "sandbox" 回到沙盒中',zh_TW:'你已經解决了本關,輸入 "levels" 嘗試其他關卡,或者輸入 "sandbox" 回到沙盒中',es_AR:'Ya resolviste este nivel, probá otros usando "levels" o volvé al sandbox usando "sandbox"',es_MX:'Ya resolviste este nivel, prueba otros usando "levels" o vuelve al sandbox usando "sandbox"',es_ES:'Ya resolviste este nivel, prueba otros usando "levels" o vuelve al sandbox usando "sandbox"',pt_BR:'Você já resolveu este nível, tente outros com "levels" ou volte ao sandbox com "sandbox"',gl:'Xa resolviches este nivel, proba outros usando "levels" ou volve á caixa de area con "sandbox"',fr_FR:'Vous avez déjà résolu ce niveau, essayez d\'autres niveaux avec "levels" ou revenez au bac à sable avec "sandbox"',ru_RU:'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"',uk:'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"',ko:'당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.',vi:'Bạn đã vượt qua cấp độ này. Thử cấp độ khác với "levels" hoặc dùng "sandbox" để trở lại hộp cát',sl_SI:'To stopnjo si že rešil, poizkusi druge stopnje z "levels" ali pojdi nazaj v peskovnik s "sandbox"',pl:'Już rozwiązałeś ten poziom, wypróbuj inne, używając "levels" lub wróć do trybu piaskownicy za pomocą polecenia "sandbox"',it_IT:'Hai già risolto questo livello, prova altri livelli con "levels" o torna alla sandbox con "sandbox"',ta_IN:'நீங்கள் ஏற்கனவே இந்த நிலையை தீர்த்துள்ளீர்கள், "நிலைகள்" மூலம் பிற நிலைகளை முயற்சிக்கவும் அல்லது "sandbox" உடன் sandbox-க்குச் செல்லவும்'},"solved-level":{__desc__:"When you solved a level",en_US:"Solved!!!\n:D",es_MX:"¡Resuelto!!!",de_DE:"Gelöst!!!\n:D",zh_CN:"恭喜过关!!!",zh_TW:"恭喜,本關解決了!!!",es_ES:"¡Resuelto!!!\n:D",gl:"¡Resolto!!!",ru_RU:"Решено!!!\n:D",uk:"Вирішено!!!\n:D",ko:"해결 완료!!!\n:D",vi:"ĐÃ XONG!!!\n:D",sl_SI:"Rešeno!!!\n:D",pl:"Rozwiązany!!!\n:D",it_IT:"Risolto!!!\n:D",ta_IN:"தீர்க்கப்பட்டது!!!\n:D",tr_TR:"Tebrikler!!!\n:D"},"command-disabled":{__desc__:"When you try a command that is disabled",en_US:"That git command is disabled for this level!",de_DE:"Dieser git-Befehl ist für dieses Level deaktiviert!",zh_CN:"本关不允许使用该命令!",zh_TW:"本關禁止使用該 git 指令!",es_AR:"¡Ese comando de git está deshabilitado para este nivel!",es_MX:"¡Ese comando de git está deshabilitado para éste nivel!",es_ES:"¡Ese comando de git está deshabilitado para este nivel!",pt_BR:"Achou que seria fácil assim? Desabilitamos esse comando durante este nível, só para dificultar ;-)",gl:"¡Ese comando de git está deshabilitado para este nivel!",fr_FR:"Cette commande git est désactivée pour ce niveau !",ru_RU:"На этом уровне нельзя использовать эту команду!",uk:"На цьому рівні не можна використовувати цю команду!",ko:"그 Git 명령어는 이 레벨에서 사용할 수 없습니다.",vi:"Ở cấp độ này thì lệnh git đó bị vô hiệu hóa!",sl_SI:"Ta git ukaz je onemogočen za to stopnjo!",pl:"To polecenie Gita jest wyłączone na tym poziomie!",it_IT:"Questo comando git è disabilitato per questo livello!",ta_IN:"இந்த நிலையில் அந்த கிட் கட்டளை முடக்கப்பட்டுள்ளது"},"share-json":{__desc__:"when you have made the level, prompt to share this",en_US:"Here is the JSON for this level! Share it with someone or send it to me on GitHub",de_DE:"Hier ist das JSON für dieses Level! Teil es mit jemandem or schick es mir über GitHub",zh_CN:"这是一个关卡定义 JSON !您可以分享它或者发到我的 GitHub 上",zh_TW:"這是本關的 JSON!您可以分享給別人,或是送到 GitHub 上給我",es_AR:"Este es el JSON de este nivel. Compartilo con quien quieras o mandámelo por GitHub",es_MX:"Este es el JSON de éste nivel. Compártelo con quien quieras o mándamelo por GitHub.",es_ES:"Este es el JSON de este nivel. Compártelo con quien quieras o mandámelo por GitHub.",pt_BR:"Aqui está o JSON para este nível! Compartilhe com alguém ou me envie pelo GitHub",gl:"Este é o JSON deste nivel. Comparteo con quen queiras ou mándao por GitHub",fr_FR:"Voici le JSON pour ce niveau ! Partagez-le avec quelqu'un ou envoyez-le moi sur GitHub",ru_RU:"Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub",uk:"Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на GitHub",ko:"이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 GitHub에서 제게 보내보세요.",vi:"Đây là chuỗi JSON cho cấp độ này! Hãy chia sẻ với người khác hoặc với tôi qua GitHub",sl_SI:"Tu je JSON za to stopnjo! Deli ga z nekom ali ga pošlji meni na GitHub",pl:"To jest JSON dla tego poziomu. Udostępnij go, komu chcesz, lub wyślij do mnie na GitHub.",it_IT:"Ecco il JSON per questo livello! Condividilo con qualcuno o inviamelo tramite GitHub",ta_IN:"இதோ இந்த நிலைக்கான JSON, இதை பகிர்ந்து கொள்ளுங்கள் அல்லது GitHub-இல் எனக்கு அனுப்புங்கள்"},"want-start-dialog":{__desc__:"prompt to add a start dialog",en_US:"You have not specified a start dialog, would you like to add one?",de_DE:"Du hast noch keinen Einführungs-Dialog geschrieben, willst du einen hinzufügen?",zh_CN:"您还没有定义一开始的介绍,是否添加一个?",zh_TW:"尚未指定開始對話視窗,是否立即新增?",es_AR:"No especificaste un mensaje de inicio, ¿querés agregar uno?",es_MX:"No especificaste un mensaje de inicio, ¿Quieres agregar uno?",es_ES:"No especificaste un mensaje de inicio, ¿quieres agregar uno?",pt_BR:"Você não especificou uma mensagem de início, quer colocar uma?",gl:"Non especificaches unha mensaxe de incio. ¿queres agregar un?",fr_FR:"Vous n'avez pas spécifié de dialogue de départ, voulez-vous en ajouter un ?",ru_RU:"Не указано стартово сообщение! Точно продолжаем?",uk:"Не вказано стартовий діалог, хочеш додати стартовий діалог?",ko:"당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?",vi:"Không có cửa sổ hộp thoại được chỉ định, thêm một cái chứ?",sl_SI:"Nisi določil začetnega dialoga, bi ga rad dodal?",pl:"Nie określiłeś okna startowego, czy chcesz je dodać?",it_IT:"Non hai specificato una finestra di partenza, ne vuoi aggiungere una?",ta_IN:"தொடக்க உரை எதுவும் நீங்கள் குறிப்பிடவில்லை, ஏதேனும் ஒன்றைச் சேர்க்க விரும்புகிறீர்களா?"},"want-hint":{__desc__:"prompt to add a hint",en_US:"You have not specified a hint, would you like to add one?",de_DE:"Du hast noch keinen Hinweis geschrieben, magst du einen hinzufügen?",zh_CN:"您还没有定义提示,是否添加一个?",zh_TW:"尚未指定提示,是否立即新增?",es_AR:"No especificaste ninguna pista, ¿querés agregar alguna?",es_MX:"No especificaste ninguna pista, ¿Quieres agregar alguna?",es_ES:"No especificaste ninguna pista, ¿quieres agregar alguna?",pt_BR:"Você não especificou uma dica, quer colocar uma?",gl:"Ti non especificaches unha pista, ¿queres agregar algunha?",fr_FR:"Vous n'avez pas spécifié d'indice, voulez-vous en ajouter un ?",ru_RU:"Не указана подсказка для уровня! Пренебречь? Вальсируем?",uk:"Не вказана підказка, хочеш додати підказку?",ko:"당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?",vi:"Bạn chưa chỉ định một gợi ý, thêm một cái chứ?",sl_SI:"Nisi določil namiga, bi ga rad dodal?",pl:"Nie podałeś podpowiedzi, czy chcesz ją dodać?",it_IT:"Non hai specificato un suggerimento, ne vuoi aggiungere uno?",ta_IN:"நீங்கள் குறிப்பெதுவும் தரவில்லை, ஏதேனும் ஒன்றைச் சேர்க்க விரும்புகிறீர்களா?"},"prompt-hint":{__desc__:"prompt for hint",en_US:"Enter the hint for this level, or leave this blank if you do not want to include one",de_DE:"Gib den Hinweis für dieses Level an, oder lass es leer wenn du keinen hinzufügen willst",zh_CN:"请输入关卡提示,如果没有请留空",zh_TW:"請輸入關卡提示,或者故意留空",es_AR:"Ingresá una pista para este nivel, o dejalo en blanco si no querés incluir ninguna",es_MX:"Ingresa una pista para este nivel, o déjalo en blanco si no quieres incluir ninguna.",es_ES:"Ingresa una pista para este nivel, o déjalo en blanco si no quieres incluir ninguna.",pt_BR:"Colocque uma dica para este nível, ou deixe em branco se não quiser incluir",gl:"Ingresa unha pista para este nivel, ou déixao en branco se non a queres incluír.",fr_FR:"Entrez l'indice pour ce niveau, ou laissez-le vide pour ne pas l'inclure",ru_RU:"Введи подсказку для уровня, если хочешь.",uk:"Додай підказку для рівня, якщо хочеш",ko:"이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.",vi:"Thêm một gợi ý cho cấp độ này, hoặc cứ để trống nếu bạn không muốn thêm",sl_SI:"Vnesi namig za to stopnjo ali pusti to prazno, če ga nočeš dodati",pl:"Wpisz wskazówkę dotyczącą tego poziomu lub pozostaw ją pustą, jeśli nie chcesz jej uwzględniać.",it_IT:"Inserisci un suggerimento per questo livello, oppure lascialo vuoto se non ne vuoi aggiungere",ta_IN:"இந்த நிலைக்கான குறிப்பை உள்ளிடவும், குறிப்பு தேவை இல்லை என்றால் இதனை காலியாக விடுவும்"},"prompt-name":{__desc__:"prompt for level name",en_US:"Enter the name for the level",de_DE:"Gib den Namen für dieses Level an",zh_CN:"请输入关卡名称",zh_TW:"請輸入關卡名稱",es_AR:"Ingresá el nombre del nivel",es_MX:"Ingresa el nombre del nivel",es_ES:"Ingresa el nombre del nivel.",pt_BR:"Coloque o nome do nível",gl:"Coloque o nome do nivel",fr_FR:"Entrez le nom pour ce niveau",ru_RU:"Введи название уровня",uk:"Введи назву рівня",ko:"레벨 이름을 입력하세요.",vi:"Nhập tên cho cấp độ này",sl_SI:"Vnesi ime za stopnjo",pl:"Wprowadź nazwę poziomu",it_IT:"Inserisci il nome per questo livello",ta_IN:"நிலைக்கான பெயரை உள்ளிடவும்"},"solution-empty":{__desc__:"If you define a solution without any commands, aka a level that is solved without doing anything",en_US:"Your solution is empty!! Something is amiss",de_DE:"Deine Auflösung ist leer! Hier fehlt etwas",zh_CN:"你的解法是空的!! 可能是程序出错了",zh_TW:"您的解法是空的!這一定是哪裡出錯了",es_AR:"¡Tu solución está vacía! Algo hay que hacer",es_MX:"¡Tu solución está vacía! Algo hay que hacer",es_ES:"¡Tu solución está vacía! Algo hay que hacer.",pt_BR:"Sua solução está vazia! O aprendiz deveria ter que fazer alguma coisa",gl:"¡Su solución está vacía! Algo haberá que facer.",fr_FR:"Votre solution est vide !! Quelque chose ne tourne pas rond",ru_RU:"Решение не указано! Так не годится!",uk:"Розв’язок порожній!! Щось не так",ko:"해답이 비어있습니다. 무언가 잘못되었습니다.",vi:"Đáp án bị bỏ trống!! Có gì thiếu rồi",sl_SI:"Tvoja rešitev je prazna!! Nekaj ni vredu.",pl:"Twoje rozwiązanie jest puste!! Coś musi zostać zrobione.",it_IT:"C'è qualcosa che non va. La soluzione è vuota!! ",ta_IN:"உங்கள் தீர்வு காலியாக உள்ளது!! ஏதோ தவறாக இருக்கிறது"},"define-start-warning":{__desc__:"When you define the start point again, it overwrites the solution and goal so we add a warning",en_US:"Defining start point... solution and goal will be overwritten if they were defined earlier",de_DE:"Lege Startpunkt fest ... Auflösung und Ziel werden überschrieben, falls sie schon festgelegt waren",zh_CN:"定义开始点... 解决方法和目标会被新的替代",zh_TW:"正在定義起始點...先前定義的解法和目標會被覆蓋掉",es_AR:"Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos",es_MX:"Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos",es_ES:"Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos.",pt_BR:"Esbelecendo o ponto de início... a solução e o objetivo serão sobrescritos caso já existirem",gl:"Establecendo o punto de inicio... A solución e o obxectivo serán sobreescritos se xa foron definidos.",fr_FR:"Redéfinition du point de départ… la solution et la cible seront écrasés s'ils ont déjà été définis",ru_RU:"Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее",uk:"Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше",ko:"시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.",vi:"Đang xác định điểm bắt đầu... Các giải pháp và mục tiêu sẽ được thay thế nếu đã được chỉ định từ trước",sl_SI:"Določanje začetne točke ... rešitev in cilj bosta povožena, če sta bila prej že podana",pl:"Ustawianie punktu startowego... Rozwiązanie i cel zostaną nadpisane, jeśli zostały wcześniej zdefiniowane",it_IT:"Definendo punto di partenza... soluzione e obiettivo saranno sovrascritti se erano già stati definiti.",ta_IN:"தொடக்கத்தை வரையறுத்தல்... தீர்வு மற்றும் குறிக்கோள் முன்னரே வரையறுக்கப்பட்டிருந்தால் மேலெழுதப்படும்"},"help-vague-level":{__desc__:"When you are in a level and you say help, its vague and you need to specify",en_US:'You are in a level, so multiple forms of help are available. Please select either "help level" to learn more about this lesson, "help general" for using Learn GitBranching, or "objective" to learn about how to solve the level.',de_DE:'Du befindest dich in einem Level, daher gibt es verschiedene Hilfen. Gib "help level" ein um mehr über dieses Level zu erfahren, "help general" um zu sehen wie Learn Git Branching bedient wird, oder "objective" um das Ziel dieses Levels zu erfahren.',zh_CN:'您正在关卡中,这里有多种形式的帮助,请选择 "help level" (关卡帮助)或 "help general" (一般帮助)',zh_TW:'您正在進行關卡中,這裡有多種不同型式的幫助,請選擇 "help level" 來了解這個關卡,或者是選擇 "help general" 來學習如何使用 Learn GitBranching,或者是選擇 "objective" 來學習如何解決這個關卡',es_AR:'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elegí entre "help level" para aprender algo más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.',es_MX:'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elige entre "help level" para aprender algo más sobre ésta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "bjective" para aprender a resolver este nivel.',es_ES:'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elige "help level" para aprender más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.',pt_BR:'Você está em um nível, então há vários tipos de ajuda. Selecione "help level" para aprender mais sobre esta lição, "help general" para aprender a usar o Learn GitBranching, ou "objective" ver como resolver o nível.',gl:'Estás nun nivel, entón hai varios tipos de axuda. Selecione "help level" para aprender máis sobre esta lección, "gelp general" para aprender a usar o Learn Git Branching, ou "objective" para ver como resolver o nivel.',fr_FR:'Vous êtes dans un niveau, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help level" pour en apprendre plus sur cette leçon, "help general" pour l\'utilisation de Learn GitBranching, ou "objective" pour apprendre comment résoudre le niveau',ru_RU:'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.',uk:'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня',ko:'당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.',vi:'Bạn đang ở trong một cấp độ, nên sẽ có nhiều hỗ trợ. Vui lòng dùng "help level" để biết thêm về bài học này, "help general" để sử dụng HọcNhánhGit, hoặc "objective" để biết cách giải quyết bài tập.',sl_SI:'Si v stopnji, zato so na voljo različne pomoči. Prosim izberi "help level" za več informacij o tej lekciji, "help general" za splošna navodila ali "objective" da izveš kako rešiti to stopnjo',pl:'Jesteś na poziomie, więc istnieje kilka rodzajów pomocy. Wpisz "help level", aby dowiedzieć się więcej o tej lekcji, wpisz "help general", aby uzyskać pomoc dotyczącą korzystania z nauki GitBranching, lub wpisz "objective", aby dowiedzieć się, jak rozwiązać ten poziom.',it_IT:'Sei dentro a un livello, hai a disposizione vari tipi di aiuto. Digita "help level" per saperne di più su questa lezione, "help general" per come usare Learn GitBranching, o "objective" per capire come risolvere il livello.',ta_IN:'நீங்கள் ஒரு நிலையில் உள்ளீர்கள், எனவே பல வகையான உதவி பெற இயலும். இந்த பாடத்தைப் பற்றி மேலும் அறிய "நிலைக்கான உதவி" என்பதைத் தேர்ந்தெடுக்கவும், Learn GitBranching பற்றி மேலும் அறிய "பொது உதவி" பயன்படுத்துக, அல்லது இந்த நிலையை எவ்வாறு தீர்ப்பது என்பது பற்றி அறிய "நோக்கம்" தேர்ந்தெடுக்கவும்.'},"help-vague-builder":{__desc__:"When you are in a level builder, the help command is vague so you need to specify what you mean",en_US:'You are in a level builder, so multiple forms of help are available. Please select either "help general" or "help builder"',de_DE:'Du befindest dich im Level-Editor, daher gibt es verschiedene Hilfen. Gib bitte "help general" oder "help builder" ein',zh_CN:'您正在进行关卡构建中,这里有多种形式的帮助,请选择 "help general" (一般帮助)或 "help builder" (关卡构建帮助)',zh_TW:'您正在進行關卡構建中,這裡有多種不同型式的幫助,請選擇 "help general" (一般幫助)或 "help builder" (製造關卡的幫助)',es_AR:'Estás en el constructor de niveles, por lo que hay varios tipos de ayuda. Elegí entre "help general" para ayuda sobre Learn GitBranching y "help builder" para ayuda sobre el constructor de niveles',es_MX:'Estás en el constructor de niveles, por lo que hay varios tipos de ayuda. Elige "help general" para ayuda sobre Learn GitBranching y "help builder" para ayuda sobre el constructor de niveles',es_ES:'Estás en un constructor de niveles, por lo que hay varios tipos de ayuda. Elige "help general" para ayuda sobre Learn GitBranching o "help builder" para ayuda sobre el constructor de niveles',pt_BR:'Você está no construtor de nívels, então há vários tipos de ajuda. Selecione "help general" ou "help builder"',gl:'Estás no constructor de niveis, polo que hai varios tipos de axuda. Elixe "help general" ou "help builder"',fr_FR:'Vous êtes dans l\'éditeur de niveaux, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help general" soit "help builder"',ru_RU:'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"',uk:'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"',ko:'당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.',vi:'Bạn đang tạo một cấp độ, nên sẽ có nhiều trợ giúp có sẵn. Vui lòng chọn "help general" hoặc "help builder"',sl_SI:'Si v graditelju stopenj, zato so na voljo različne pomoči. Prosim izberi "help general" ali "help builder"',pl:'Znajdujesz się w kreatorze poziomów. Dostępnych jest tu kilka rodzajów pomocy. Wpisz "help general", aby uzyskać pomoc dotyczącą nauki GitBranching-u, lub wpisz "help builder", aby uzyskać pomoc dotyczącą konstruktora poziomów',it_IT:'Sei in un generatore di livelli, hai a disposizione vari tipi di aiuto. Digita "help general" o "help builder"',ta_IN:'நீங்கள் ஒரு நிலை கட்டமைப்பானில் உள்ளீர்கள், எனவே பல வகையான உதவி பெற இயலும். தயவுசெய்து "பொது உதவி" அல்லது "கட்டமைப்பான் உதவி" என்பதைத் தேர்ந்தெடுக்கவும்'},"show-goal-button":{__desc__:"button label to show goal",en_US:"Show Goal",de_DE:"Ziel anzeigen",zh_TW:"顯示目標",zh_CN:"显示目标",fr_FR:"Afficher les cibles",pt_BR:"Mostrar objetivo",gl:"Amosar obxectivo",es_AR:"Mostrar objetivo",es_MX:"Mostrar objetivo",es_ES:"Mostrar objetivo",ja:"ゴールを表示",ru_RU:"Цель уровня",uk:"Ціль рівня",ko:"목표 보기",vi:"Hiển thị mục tiêu",sl_SI:"Prikaži Cilj",pl:"Pokaż cel",it_IT:"Mostra obiettivo",ta_IN:"இலக்கைக் காட்டு"},"hide-goal-button":{__desc__:"button label to hide goal",en_US:"Hide Goal",de_DE:"Ziel verstecken",fr_FR:"Cacher les cibles",zh_TW:"隱藏目標",zh_CN:"隐藏目标",pt_BR:"Ocultar objetivo",gl:"Ocultar obxectivo",es_AR:"Ocultar objetivo",es_MX:"Ocultar objetivo",es_ES:"Ocultar objetivo",ja:"ゴールを隠す",ru_RU:"Спрятать цель",uk:"Сховати ціль",ko:"목표 숨기기",vi:"Ẩn mục tiêu",sl_SI:"Skrij Cilj",pl:"Ukryj cel",it_IT:"Nascondi obiettivo",ta_IN:"இலக்கை மறை"},"objective-button":{__desc__:"button label to show objective",en_US:"Instructions",de_DE:"Ziel",zh_TW:"提示",zh_CN:"提示",es_ES:"Objetivo",es_MX:"Objetivo",gl:"Obxectivo",ru_RU:"Задача",uk:"Задача",ko:"목적",vi:"Chỉ dẫn",sl_SI:"Navodila",pl:"Instrukcje",it_IT:"Istruzioni",ta_IN:"வழிமுறைகள்"},"git-demonstration-title":{__desc__:"title of git demonstration window",en_US:"Git Demonstration",de_DE:"Git Demonstration",zh_TW:"Git示範",zh_CN:"Git示范",es_ES:"Demostración de Git",es_MX:"Demostración de Git",gl:"Demostración de Git",ru_RU:"Git демо",uk:"Git демо",ko:"Git 데모",vi:"Trình diễn Git",sl_SI:"Git Predstavitev",pl:"Demo GIT",it_IT:"Dimostrazione Git",ta_IN:"கிட் செயல் விளக்கம்"},"goal-to-reach":{__desc__:"title of window that shoes the goal tree to reach",en_US:"Goal To Reach",de_DE:"Zu erreichendes Ziel",zh_CN:"目标",zh_TW:"目標",es_AR:"Objetivo a cumplir",es_MX:"Objetivo a cumplir",es_ES:"Objetivo a cumplir",pt_BR:"Objetivo a cumprir",gl:"Obxectivo a cumprir",fr_FR:"Cible à atteindre",ja:"到達目標",ru_RU:"Цель уровня",uk:"Ціль рівня",ko:"목표",vi:"Mục tiêu cần đạt",sl_SI:"Končni Cilj",pl:"Cel do osiągnięcia",it_IT:"Obiettivo da raggiungere",ta_IN:"அடைய வேண்டிய இலக்கு"},"goal-only-main":{__desc__:"the helper message for the window that shows the goal tree when the goal will only be compared using the main branch",en_US:'Note: Only the main branch will be checked in this level. The other branches are simply for reference (shown as dashed labels below). As always, you can hide this dialog with "hide goal"',fr_FR:'Note: Dans ce niveau on ne doit faire de git checkout que sur la branche main. Les autres branches représentées ici (entourées d\'un cadre en tirets) doivent être utilisées uniquement comme références. Comme toujours, vous pouvez cacher cette fenêtre avec "Cacher les objectifs"',de_DE:'Hinweis: In diesem Level wird nur der Branch main geprüft. Die anderen Branches dienen nur als Vergleichsbasis (als gestrichelte Bezeichner dargestellt). Wie immer kannst du diese Meldung mit "hide goal" ausblenden',es_AR:'Nota: Sólo la rama main va a ser chequeada en este nivel. Las otras ramas sólo son para referencia. Como siempre, podés ocultar este mensaje con "hide goal"',es_MX:'Nota: Sólo la rama main va a ser inspeccionada en este nivel. Las otras ramas sólo son para referencia (etiquetados abajo con guión). Como siempre, puedes ocultar éste mensaje con "hide goal"',es_ES:'Nota: Sólo la rama main va a ser inspeccionado en este nivel. Las otras ramas sólo son para referencia (etiquetados abajo con guion). Siempre puedes ocultar este mensaje con "hide goal."',pt_BR:'Nota: Apenas o ramo main será verificado neste nível. Os outros ramos (dentro das caixas clareadas) são somente para referência. Como sempre, você pode ocultar esta janela com "hide goal"',gl:'Nota: Só a rama main será verificada neste nivel. As outras ramas (dentro das caixas clareadas) son soamente de referencia. Coma sempre, podes ocultar está ventá con "hide goal"',zh_CN:'注意:本关卡中,只检查 main 分支,其他分支只是用作 reference 存在(以虚线标签表示)。照常,你可以用 “hide goal” 来隐藏此窗口。',zh_TW:'在這個關卡中,只有 main branch 會被檢查,別的 branch 只是用來做為 reference (下面用虛線符號表示)。一如往常,你可以利用 "hide goal" 來隱藏這個對話視窗',ja:'Note: mainブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます',ru_RU:'Важно: В этом уровне проверяется только ветка main. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"',uk:'Важливо: В цьому рівні буде перевірятися тільки гілка main. Решта гілок тільки для наглядності (показані пунктиром нижче). Як завжди, можна сховати цей діалог за допомогою "hide goal"',ko:'Note: 이 레벨에선 오직 메인 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨길 수 있습니다.',vi:'Chú ý: Ở cấp độ này chỉ nhánh main bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu (có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal"',sl_SI:'Opomba: Samo main branch bo preverjen v tej stopnji. Ostali branchi so zgolj za referenco (prikazani kot črtaste oznake spodaj). Kot ponavadi, lahko skriješ dialog z "hide goal"',pl:' Uwaga: Na tym poziomie będzie sprawdzana tylko poprawność gałęzi main. Pozostałe gałęzie są tylko odniesieniem (pokazane jako przerywane etykiety poniżej). Jak zawsze, możesz ukryć to okno klikając "Ukryj cel".',it_IT:'Nota: In questo livello sarà selezionato solo il ramo main. Gli altri rami ci sono solo come riferimento (mostrati come etichette tratteggiate). Come sempre, puoi nascondere questa finestra con "hide goal"',ta_IN:'குறிப்பு: இந்த மட்டத்தில் பிரதான கிளை மட்டுமே சரிபார்க்கப்படும். மற்ற கிளைகள் வெறுமனே விளக்க குறிப்புக்காக மட்டுமே (கீழே விடுபட்ட மேற்கோள்களாக காட்டப்பட்டுள்ளது). எப்பொழுதும் போல், "இலக்கை மறை" மூலம் இந்த சாளரத்தை மறைக்கலாம்'},"hide-goal":{__desc__:"the helper message for the window that shows the goal tree",en_US:'You can hide this window with "hide goal"',de_DE:'Du kannst diese Meldung mit "hide goal" ausblenden',zh_CN:'你可以通过 "hide goal" 命令关闭这个窗口',zh_TW:'你可以透過 "hide goal" 關閉這個視窗',es_AR:'Podés ocultar esta ventana con "hide goal"',es_MX:'Puedes ocultar esta ventana con "hide goal"',es_ES:'Puedes ocultar esta ventana con "hide goal."',pt_BR:'Você pode ocultar esta janela com "hide goal"',gl:'Podes ocultar esta ventá con "hide goal"',fr_FR:'Vous pouvez masquer cette fenêtre avec "Cacher les cibles"',ja:'このウィンドウは"hide goal"と打つかクリックで閉じれます',ru_RU:'Можно скрыть это окно при помощи "hide goal"',uk:'Можна сховати це вікно за допомогою "hide goal"',ko:'"hide goal"을 사용하여 이 창을 숨길 수 있습니다.',vi:'Bạn có thể ẩn cửa sổ này với "hide goal"',sl_SI:'To okno lahko skriješ z "hide goal"',pl:'Możesz ukryć to okno za pomocą opcji "ukryj cel"',it_IT:'Puoi nascondere questa finestra con "hide goal"',ta_IN:'இந்த சாளரத்தை "இலக்கை மறை" மூலம் மறைக்கலாம்'},"hide-start":{__desc__:"The helper message for the window that shows the start tree for a level",en_US:'You can hide this window with "hide start"',de_DE:'Du kannst diese Meldung mit "hide start" ausblenden',zh_CN:'你可以通过 "hide start" 命令关闭这个窗口',zh_TW:'你可以透過 "hide start" 關閉這個視窗',es_AR:'Podés ocultar esta ventana con "hide start"',es_MX:'Puedes ocultar ésta ventana con "hide start"',es_ES:'Puedes ocultar esta ventana con "hide start."',pt_BR:'Você pode ocultar esta janela com "hide start"',gl:'Podes ocultar esta ventá con "hide start"',fr_FR:'Vous pouvez masquer cette fenêtre avec "hide start"',ja:'このウィンドウは"hide start"かクリックで閉じれます',ru_RU:'Можно скрыть это окно при помощи "hide start"',uk:'Можна сховати це вікно за допомогою "hide start"',ko:'"hide start"를 사용하여 이 창을 숨길 수 있습니다.',vi:'Bạn có thể ẩn cửa sổ này với "hide start"',sl_SI:'To okno lahko skriješ z "hide start"',pl:'Możesz ukryć to okno za pomocą opcji "ukryj start"',it_IT:'Puoi nascondere questa finestra con "hide start"',ta_IN:'இந்த சாளரத்தை "தொடக்கத்தை மறை" மூலம் மறைக்கலாம்'},"level-builder":{__desc__:"The name for the environment where you build levels",en_US:"Level Builder",de_DE:"Level-Editor",zh_CN:"关卡生成器",zh_TW:"關卡產生器",es_AR:"Constructor de niveles",es_MX:"Constructor de niveles",es_ES:"Constructor de niveles",pt_BR:"Construtor de níveis",gl:"Constructor de nivéis",fr_FR:"Éditeur de niveaux",ja:"Levelエディタ",ru_RU:"Редактор уровней",uk:"Редактор рівнів",ko:"레벨 생성기",vi:"Trình tạo cấp độ",sl_SI:"Graditelj Stopenj",pl:"Twórca poziomu",it_IT:"Generatore di livelli",ta_IN:"நிலை கட்டமைப்பான்"},"no-start-dialog":{__desc__:"when the user tries to open a start dialog for a level that does not have one",en_US:"There is no start dialog to show for this level!",de_DE:"Es gibt keinen Einführungs-Dialog für dieses Level!",zh_CN:"这个关卡没有介绍!",zh_TW:"這關沒有介紹!",es_AR:"¡No hay mensaje de inicio para este nivel!",es_MX:"¡No hay mensaje de inicio para este nivel!",es_ES:"¡No hay mensaje de inicio para este nivel!",pt_BR:"Não há mensagem de início para este nível!",gl:"¡Non hai mensaxe de inicio para este nivel!",fr_FR:"Il n'y a aucun dialogue de départ à afficher pour ce niveau !",ja:"このLevelにはスタートダイアログが存在しません",ru_RU:"Нет стартового сообщение для уровня!",uk:"Немає початкового діалогу для цього рівня!",ko:"이 레벨을 위한 시작 대화창이 없습니다.",vi:"Không có hộp thoại giới thiệu cho cấp độ này!",sl_SI:"Ni začetnega dialoga za prikaz te stopnje!",pl:"Dla tego poziomu nie ma okna startowego do wyświetlenia!",it_it:"Non esiste una finestra di partenza per questo livello!",ta_IN:"இந்த நிலை பற்றி விளக்கிகாட்ட தொடக்க உரையாடல் எதுவும் இல்லை"},"no-hint":{__desc__:"when no hint is available for a level",en_US:"Hmm, there doesn't seem to be a hint for this level :-/",de_DE:"Hm, es gibt anscheinend keinen Hinweis für dieses Level :-/",zh_CN:"呃……,这关好像没有提示 :-/",zh_TW:"嗯‧‧‧這關沒有提示 :-/",es_AR:"Mmm... Pareciera no haber pistas para este nivel :-/",es_MX:"Mmm... Parece que no hay pistas para Este nivel. :-/",es_ES:"Mmm... Parece que no hay pistas para este nivel. :-/",pt_BR:"Hmm, não existe nenhuma pista para este nível :-/",gl:"Hmm, non existe ningunha pista para este nivel :-/",fr_FR:"Hum, il ne semble pas y avoir d'indice pour ce niveau :-/",ja:"あらら、このLevelでは、残念ながらヒントが存在しません :-/",ru_RU:"Милый мой, хороший, догадайся сам :-/ Подсказка не создана...",uk:"Хм, схоже для цього рівня немає підказки :-/",ko:"흠, 이 레벨을 위한 힌트가 없어보이는군요.",vi:"Hmmm, có vẻ cấp độ này không có gợi ý rồi :-/",sl_SI:"Hmm, izgleda da ni namiga za to stopnjo :-/",pl:"Hmm, wydaje się, że nie ma podpowiedzi dla tego poziomu :-/",it_IT:"Mmh, sembra non ci sia un suggerimento per questo livello :-/",ta_IN:"ஹ்ம், இந்த நிலைக்கு ஒரு குறிப்பு எதுவும் இருப்பதாகத் தெரியவில்லை :-/"},"error-untranslated-key":{__desc__:"This error happens when we are trying to translate a specific key and the locale version is mission",en_US:"The translation for {key} does not exist yet :( Please hop on github and offer up a translation!",de_DE:"Die Übersetzung für {key} existiert noch nicht :( Falls du eine hast, dann teile sie mir bitte auf GitHub mit!",zh_CN:"还没翻译 {key} :( 请在 GitHub 上贡献您的翻译!",zh_TW:"還沒翻譯 {key} :( 請在 GitHub 上貢獻您的翻譯!",es_AR:"Aún no hay traducción para {key} :( ¡Metete en GitHub y sugerí una! :)",es_MX:"Aún no existe una traducción para {key}. :( ¡Métete en GitHub y sugiere una! :)",es_ES:"Aún no hay traducción para {key}. :( ¡Métete en GitHub y sugiere una! :)",pt_BR:"Não existe tradução para {key} :( Pule no GitHub e sugira uma! :)",gl:"Non existe tradución para {key} :( Axúdanos en GitHub e suxire unha! :)",fr_FR:"La traduction pour {key} n'existe pas encore :( Venez sur GitHub pour en offrir une !",ja:"{key}の翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m",ru_RU:"Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub",uk:"Немає перекладу для {key} :( Будь-ласка, запропонуй переклад на GitHub",ko:"{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!",vi:"Bản dịch cho {key} không có rồi :( Nếu có thể thì hãy lên dự án của chúng tôi ở GitHub để cung cấp bản dịch!",sl_SI:"Prevod za {key} še ne obstaja :( Skoči na github in dodaj prevod!",pl:'Tłumaczenie dla klucza "{key}" jeszcze nie istnieje tłumaczenia :( Zapraszam na GitHub, aby pomóc w tłumaczeniu!',it_IT:"La traduzione per {key} non esiste ancora :( Fai un salto su GitHub e dacci una mano!",ta_IN:"{key}-இன் மொழிபெயர்ப்பு கிடைக்கவில்லை :( github-இன் வழியாக் நீங்களும் மொழி பெயர்க்க உதவலாம்!"},"error-untranslated":{__desc__:"The general error when we encounter a dialog that is not translated",en_US:"This dialog or text is not yet translated in your locale :( Hop on github to aid in translation!",de_DE:"Dieser Dialog oder Text ist noch nicht in deiner Sprache verfügbar. :( Schau auf GitHub vorbei um bei der Übersetzung zu helfen!",zh_CN:"这段对话还没有被翻译成您的语言 :( 欢迎在 GitHub 上贡献您的翻译!",zh_TW:"這段對話尚未翻成您的語言 :( 歡迎到 GitHub 貢獻翻譯!",es_AR:"Este mensaje o texto aún no fue traducido a tu idioma :( ¡Metete en GitHub y ayudanos a traducirlo!",es_MX:"Este mensaje o texto aún no ha sido traducido en tu idioma. :( ¡Métete en GitHub y ayúdanos a traducirlo!",es_ES:"Este mensaje o texto aún no fue traducido a tu idioma. :( ¡Métete en GitHub y ayúdanos a traducirlo!",pt_BR:"Esta mensagem ou texto não foi traduzida para Português :( Ajude-nos a traduzir no GitHub!",gl:"Esta mensaxe ou texto non foi traducida ó teu idioma :( Axúdanos a traducir a web en GitHub, é moi doado!",fr_FR:"Ce message n'a pas encore été traduit dans votre langue :( Venez sur GitHub aider à la traduction !",ja:"このダイアログ、またはテキストの翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m",ru_RU:"Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub",uk:"Для цього повідомлення ще немає перекладу :( Будь-ласка, запропонуй переклад на GitHub",ko:"이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!",vi:"Hộp thoại hoặc văn bản này chưa được dịch ra ngôn ngữ của bạn rồi :( Hãy lên GitHub để cung cấp bản dịch!",sl_SI:"Ta dialog ali tekst še ni preveden za tvoj jezik :( Skoči na github in dodaj prevod!",pl:"Kolejne okno dialogowe lub tekst nie zostało jeszcze przetłumaczone na język polski :( Zapraszam na GitHub, aby pomóc w tłumaczeniu!",it_IT:"Questo messaggio o testo non è ancora stato tradotto nella tua lingua :( Fai un salto su GitHub e dacci una mano!",ta_IN:"இந்த உரையாடல் அல்லது உரை உங்கள் தமிழில் இன்னும் மொழிபெயர்க்கப்படவில்லை :( github-இன் வழியாக் நீங்களும் மொழி பெயர்க்க உதவலாம்!",tr_TR:"Bu ileti veya metin henüz dilimize çevrilmemiş :( Çeviriye yardımcı olmak için GitHub'da bize katılın!"},"cancel-button":{__desc__:"Cancel button label after completing a level",es_AR:"Cancelar",en_US:"Cancel",es_MX:"Cancelar",de_DE:"Abbrechen",zh_TW:"取消",pl:"Powrót",it_IT:"Annulla",ta_IN:"இரத்துசெய்",vi:"Hủy",tr_TR:"İptal"},"confirm-button":{__desc__:"Confirm button label after completing a level",es_AR:"Confirmar",en_US:"Confirm",es_MX:"Confirmar",de_DE:"Bestätigen",zh_TW:"確認",pl:"Dalej",it_IT:"Conferma",ta_IN:"உறுதிப்படுத்தவும்",vi:"Đồng ý",tr_TR:"Tamam"},"level-label":{__desc__:"Label in the top of the left-side menu. Remember to leave some space on the sides",es_AR:"Nivel",en_US:" Level ",es_MX:"Nivel",de_DE:" Level ",zh_TW:"關卡 ",it_IT:" Livello ",pl:" Poziom ",tr_TR:" Seviye "},"command-helper-bar-levels":{__desc__:"Levels command label in the bottom command helper bar.",es_AR:"Niveles",en_US:"Levels",es_MX:"Niveles",de_DE:"Levels",zh_TW:"關卡",it_IT:"Livelli",pl:"Poziomy"},"command-helper-bar-solution":{__desc__:"Solution command label in the bottom command helper bar.",es_AR:"Solución",en_US:"Solution",es_MX:"Solución",de_DE:"Lösung",zh_TW:"解答",it_IT:"Soluzione",pl:"Rozwiązanie"},"command-helper-bar-reset":{__desc__:"Reset command label in the bottom command helper bar.",es_AR:"Reiniciar",en_US:"Reset",es_MX:"Reiniciar",de_DE:"Zurücksetzen",zh_TW:"重新開始",it_IT:"Reset",pl:"Wyczyść"},"command-helper-bar-undo":{__desc__:"Undo command label in the bottom command helper bar.",es_AR:"Deshacer",en_US:"Undo",es_MX:"Deshacer",de_DE:"Rückgängig",zh_TW:"回到上一步",it_IT:"Annulla",pl:"Cofnij"},"command-helper-bar-objective":{__desc__:"Objective command label in the bottom command helper bar.",es_AR:"Objetivo",en_US:"Objective",es_MX:"Objetivo",de_DE:"Zielvorgabe",zh_TW:"目標",it_IT:"Obiettivo",pl:"Cel"},"command-helper-bar-help":{__desc__:"Help command label in the bottom command helper bar.",es_AR:"Ayuda",en_US:"Help",es_MX:"Ayuda",de_DE:"Hilfe",zh_TW:"幫助",it_IT:"Aiuto",pl:"Pomoc"},"error-command-currently-not-supported":{__desc__:"Message that appears in git console when command is not supported in the current environment.",es_AR:"¡El comando es valido, pero no está soportado en este ambiente! intentá ingresar un nivel o un constructor de nivel para usar ese comando",en_US:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command",es_MX:"¡El comando es válido, pero no es suportado en este ambiente! Intenta ingresar un nivel o un constructor de niveles para usar ese comando",de_DE:"Der Befehl ist gültig, aber in der aktuellen Umgebung nicht unterstützt! Rufe ein Level oder den Level-Editor auf, um diesen Befehl zu nutzen",zh_TW:"這項指令輸入正確,然而目前的環境不支援此指令。試著前往關卡或關卡建造器中使用此指令。",it_IT:"Il comando è valido, ma non supportato in questo ambiente! Prova a entrare in un livello o nel generatore di livelli per usare quel comando",pl:"To polecenie jest poprawne, ale nie jest obsługiwane w obecnym środowisku! Spróbuj wybrać poziom lub włączyć konstruktor poziomów, aby użyć tej komendy",vi:"Lệnh đó hợp lệ, nhưng không được hỗ trợ ở môi trường hiện tại! Hãy thử vào một cấp độ hoặc trình tạo cấp độ để sử dụng lệnh",tr_TR:"Bu komut geçerli bir komuttur, fakat bu ortamda desteklenmemektedir, bu komutu kullanmak için bir seviye (level) ya da seviye oluşturucu ekleyin (level builder)."},"interactive-rebase-title":{__desc__:"Title for the popup",es_AR:"Rebase interactivo",en_US:"Interactive Rebase",es_MX:"Rebase interactivo",de_DE:"Interaktives Rebase",zh_TW:"互動式 Rebase",it_IT:"Rebase interattivo",pl:"Interaktywny Rebase",vi:"Rebase tương tác"}}},{}],69:[function(e,t,o){e("backbone");var i=e("q"),a=e("../util"),n=e("../app"),r=e("../intl"),s=e("../util/errors"),c=e("../visuals/visualization").Visualization,l=(e("../level/parseWaterfall").ParseWaterfall,e("../level").Level),m=e("../stores/LocaleStore"),u=e("../stores/LevelStore"),d=(e("../models/commandModel").Command,e("../git/gitShim").GitShim,e("../views/multiView").MultiView,e("../views").CanvasTerminalHolder),h=e("../views").ConfirmCancelTerminal,p=(e("../views").NextLevelConfirm,e("../views/builderViews").MarkdownPresenter),g=e("../views/builderViews").MultiViewBuilder,f=(e("../views/builderViews").MarkdownGrabber,{"define goal":/^define goal$/,"define name":/^define name$/,"help builder":/^help builder$/,"define start":/^define start$/,"edit dialog":/^edit dialog$/,"show start":/^show start$/,"hide start":/^hide start$/,"define hint":/^define hint$/,finish:/^finish$/}),b=a.genParseCommand(f,"processLevelBuilderCommand"),v=l.extend({initialize:function(t){(t=t||{}).level={},this.options=t;var o,i=m.getLocale();t.level.startDialog={},t.level.startDialog[i]={childViews:r.getDialog(e("../dialogs/levelBuilder"))},t.editLevel&&(o=u.getLevel(t.editLevel),t.level=o),v.__super__.initialize.apply(this,[t]),t.editLevel?(this.startDialogObj=o.startDialog[i],this.definedGoal=!0):(this.startDialogObj=void 0,this.definedGoal=!1),delete this.treeCompare,delete this.solved},initName:function(){},initGoalData:function(){this.options.editLevel||(this.level.goalTreeString='{"branches":{"main":{"target":"C1","id":"main"},"makeLevel":{"target":"C2","id":"makeLevel"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"makeLevel","id":"HEAD"}}',this.level.solutionCommand="git checkout -b makeLevel; git commit"),v.__super__.initGoalData.apply(this,arguments)},minimizeGoal:function(e,t){this.doBothVis("hide"),this.goalWindowPos=e,this.goalWindowSize=t,$("#goalPlaceholder").is(":visible")&&($("#goalPlaceholder").hide(),this.mainVis.myResize())},doBothVis:function(e){this.startVis&&this.startVis[e].call(this.startVis),this.goalVis&&this.goalVis[e].call(this.goalVis)},resizeGoal:function(){this.doBothVis("myResize")},initStartVisualization:function(){return this.startCanvasHolder=new d({parent:this,additionalClass:"startTree",text:r.str("hide-start")}),this.startVis=new c({el:this.startCanvasHolder.getCanvasLocation(),containerElement:this.startCanvasHolder.getCanvasLocation(),treeString:this.level.startTree,noKeyboardInput:!0,smallCanvas:!0,noClick:!0}),this.startCanvasHolder},startOffCommand:function(){n.getEventBaton().trigger("commandSubmitted","echo :D")},objectiveDialog:function(e,t){var o=[e,t,void 0===this.startDialogObj?null:{startDialog:{en_US:this.startDialogObj}}];v.__super__.objectiveDialog.apply(this,o)},initParseWaterfall:function(e){v.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",b),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands())},buildLevel:function(e,t){this.exitLevel(),setTimeout((function(){n.getSandbox().buildLevel(e,t)}),1.5*this.getAnimationTime())},getInstantCommands:function(){return[[/^help$|^\?$/,function(){throw new s.CommandResult({msg:r.str("help-vague-builder")})}]]},takeControl:function(){n.getEventBaton().stealBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),v.__super__.takeControl.apply(this)},releaseControl:function(){n.getEventBaton().releaseBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),v.__super__.releaseControl.apply(this)},showGoal:function(){this.hideStart(),v.__super__.showGoal.apply(this,arguments)},showStart:function(e,t){this.hideGoal(),this.showSideVis(e,t,this.startCanvasHolder,this.initStartVisualization)},resetSolution:function(){this.gitCommandsIssued=[],this.level.solutionCommand=void 0},hideStart:function(e,t){this.hideSideVis(e,t,this.startCanvasHolder)},defineStart:function(e,t){this.hideStart(),e.addWarning(r.str("define-start-warning")),this.resetSolution(),this.level.startTree=this.mainVis.gitEngine.printTree(),this.mainVis.resetFromThisTreeNow(this.level.startTree),this.showStart(e,t)},defineGoal:function(e,t){if(this.hideGoal(),!this.gitCommandsIssued.length)return e.set("error",new s.GitError({msg:r.str("solution-empty")})),void t.resolve();this.definedGoal=!0,this.level.solutionCommand=this.gitCommandsIssued.join(";"),this.level.goalTreeString=this.mainVis.gitEngine.printTree(),this.initGoalVisualization(),this.showGoal(e,t)},defineName:function(e,t){this.level.name={en_US:prompt(r.str("prompt-name"))},e&&e.finishWith(t)},defineHint:function(e,t){this.level.hint={en_US:prompt(r.str("prompt-hint"))},e&&e.finishWith(t)},editDialog:function(e,t){var o=i.defer();this.currentBuilder=new g({multiViewJSON:this.startDialogObj,deferred:o}),o.promise.then(function(e){this.startDialogObj=e}.bind(this)).fail((function(){})).done((function(){e?e.finishWith(t):t.resolve()}))},finish:function(e,t){if(!(this.options.editLevel||this.gitCommandsIssued.length&&this.definedGoal))return e.set("error",new s.GitError({msg:r.str("solution-empty")})),void t.resolve();for(;!this.level.name;)this.defineName();var o=i.defer(),a=o.promise;if(void 0===this.level.hint){var n=i.defer();a=a.then((function(){return n.promise})),new h({markdowns:[r.str("want-hint")]}).getPromise().then(this.defineHint.bind(this)).fail(function(){this.level.hint={en_US:""}}.bind(this)).done((function(){n.resolve()}))}if(void 0===this.startDialogObj){var c=i.defer();a=a.then((function(){return c.promise})),new h({markdowns:[r.str("want-start-dialog")]}).getPromise().then(function(){var e=i.defer();return this.editDialog(void 0,e),e.promise}.bind(this)).fail((function(){})).done((function(){c.resolve()}))}a=a.done(function(){new p({fillerText:JSON.stringify(this.getExportObj(),null,2),previewText:r.str("share-json")}),e.finishWith(t)}.bind(this)),o.resolve()},getExportObj:function(){var e=Object.assign({},this.level);return delete e.startDialog,this.startDialogObj&&(e.startDialog={en_US:this.startDialogObj}),e},processLevelBuilderCommand:function(e,t){var o={"define goal":this.defineGoal,"define start":this.defineStart,"show start":this.showStart,"hide start":this.hideStart,finish:this.finish,"define hint":this.defineHint,"define name":this.defineName,"edit dialog":this.editDialog,"help builder":v.__super__.startDialog};if(!o[e.get("method")])throw new Error("woah we don't support that method yet");o[e.get("method")].apply(this,arguments)},afterCommandDefer:function(e,t){e.resolve()},die:function(){this.hideStart(),v.__super__.die.apply(this,arguments),delete this.startVis,delete this.startCanvasHolder}});o.LevelBuilder=v,o.regexMap=f},{"../app":52,"../dialogs/levelBuilder":56,"../git/gitShim":61,"../intl":67,"../level":71,"../level/parseWaterfall":72,"../models/commandModel":76,"../stores/LevelStore":88,"../stores/LocaleStore":89,"../util":96,"../util/errors":93,"../views":106,"../views/builderViews":103,"../views/multiView":108,"../visuals/visualization":119,backbone:1,q:29}],70:[function(e,t,o){var i=e("../intl"),a=e("../commands"),n=e("../util/errors").GitError;function r(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}r.prototype.getInstantCommands=function(){var e=[],t=function(){throw new n({msg:i.str("command-disabled")})};return Object.keys(this.disabledMap).forEach(function(o){o=o.slice("git".length+1);var i=a.commands.getRegexMap().git[o];if(!i)throw new Error("wuttttt this disbaled command"+o+" has no regex matching");e.push([i,t])}.bind(this)),e},o.DisabledMap=r},{"../commands":53,"../intl":67,"../util/errors":93}],71:[function(e,t,o){var i=e("q"),a=e("react"),n=e("react-dom"),r=e("../util"),s=e("../app"),c=e("../intl"),l=e("../log"),m=e("../util/errors"),u=e("../sandbox/").Sandbox,d=e("../actions/GlobalStateActions"),h=e("../stores/GlobalStateStore"),p=e("../actions/LevelActions"),g=e("../stores/LevelStore"),f=e("../visuals/visualization").Visualization,b=e("../level/disabledMap").DisabledMap,v=e("../git/gitShim").GitShim,k=e("../commands"),w=e("../views/multiView").MultiView,y=e("../views").CanvasTerminalHolder,C=e("../views").ConfirmCancelTerminal,z=e("../views").NextLevelConfirm,A=e("../react_views/LevelToolbarView.jsx"),_=e("../graph/treeCompare"),D={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^(show goal|goal|help goal)$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/,objective:/^(objective|assignment)$/},x=r.genParseCommand(D,"processLevelCommand"),M=u.extend({initialize:function(e){(e=e||{}).level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.solved=!1,this.wasResetAfterSolved=!1,this.initGoalData(e),this.initName(e),this.on("minimizeCanvas",this.minimizeGoal),this.on("resizeCanvas",this.resizeGoal),this.isGoalExpanded=!1,M.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred),p.setIsSolvingLevel(!0)},getIsGoalExpanded:function(){return this.isGoalExpanded},handleOpen:function(e){p.setIsSolvingLevel(!0),e=e||i.defer(),h.getShouldDisableLevelInstructions()?setTimeout((function(){e.resolve()}),100):!this.level.startDialog||this.testOption("noIntroDialog")?setTimeout((function(){e.resolve()}),1.2*this.getAnimationTime()):new w(Object.assign({},c.getStartDialog(this.level),{deferred:e}))},objectiveDialog:function(e,t,o){if(!(o=void 0===o?this.level:o)||!o.startDialog)return e.set("error",new m.GitError({msg:c.str("no-start-dialog")})),void t.resolve();var i=$.extend({},c.getStartDialog(o));i.childViews=i.childViews.slice(-1),new w(Object.assign(i,{deferred:t})),t.promise.then((function(){e.set("status","finished")}))},startDialog:function(e,t){if(!this.level.startDialog)return e.set("error",new m.GitError({msg:c.str("no-start-dialog")})),void t.resolve();this.handleOpen(t),t.promise.then((function(){e.set("status","finished")}))},getEnglishName:function(){return this.level.name.en_US},initName:function(){var e=c.getName(this.level);this.levelToolbar=a.createElement(A,{name:e,onGoalClick:this.toggleGoal.bind(this),onObjectiveClick:this.toggleObjective.bind(this),parent:this}),n.render(this.levelToolbar,document.getElementById("levelToolbarMount"))},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){s.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),M.__super__.takeControl.apply(this)},releaseControl:function(){s.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),M.__super__.releaseControl.apply(this)},startOffCommand:function(){var e=this.options.command.get("method");h.getShouldDisableLevelInstructions()?s.getEventBaton().trigger("commandSubmitted","hint; show goal"):this.testOption("noStartCommand")||"importLevelNow"===e||s.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new f({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree})},initGoalVisualization:function(){var e=_.onlyMainCompared(this.level);return this.goalCanvasHolder=new y({text:e?c.str("goal-only-main"):void 0,parent:this}),this.goalVis=new f({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,smallCanvas:!0,isGoalVis:!0,levelBlob:this.level,noClick:!0}),this.goalVis.customEvents.on("drag",function(e,t){Math.abs(t.position.left)<.4*$(window).width()?$("#goalPlaceholder").is(":visible")||($("#goalPlaceholder").show(),this.mainVis.myResize()):$("#goalPlaceholder").is(":visible")&&($("#goalPlaceholder").hide(),this.mainVis.myResize())}.bind(this)),this.goalCanvasHolder},minimizeGoal:function(e,t){this.isGoalExpanded=!1,this.trigger("goalToggled"),this.goalVis.hide(),this.goalWindowPos=e,this.goalWindowSize=t,$("#goalPlaceholder").is(":visible")&&($("#goalPlaceholder").hide(),this.mainVis.myResize())},resizeGoal:function(){this.goalVis&&this.goalVis.myResize()},showSolution:function(t,o){var a=this.level.solutionCommand,n=function(){this.isShowingSolution=!0,this.wasResetAfterSolved=!0,s.getEventBaton().trigger("commandSubmitted",a),l.showLevelSolution(this.getEnglishName())}.bind(this),r=t.get("rawStr");if(this.testOptionOnString(r,"noReset")||(a="reset --forSolution; "+a),this.testOptionOnString(r,"force"))return n(),void t.finishWith(o);if(g.isLevelSolved(this.level.id))n(),t.finishWith(o);else{var m=i.defer(),u=c.getDialog(e("../dialogs/confirmShowSolution"))[0],d=new C({markdowns:u.options.markdowns,deferred:m});m.promise.then(n).fail((function(){t.setResult("")})).done((function(){setTimeout((function(){t.finishWith(o)}),d.getAnimationTime())}))}},toggleObjective:function(){s.getEventBaton().trigger("commandSubmitted","objective")},toggleGoal:function(){this.goalCanvasHolder&&this.goalCanvasHolder.inDom?this.hideGoal():this.showGoal()},showGoal:function(e,t){this.isGoalExpanded=!0,this.trigger("goalToggled"),this.showSideVis(e,t,this.goalCanvasHolder,this.initGoalVisualization),$(this.goalVis.el).offset().left>.5*$(window).width()&&($("#goalPlaceholder").show(),this.mainVis.myResize())},showSideVis:function(e,t,o,i){o&&o.inDom||(o=i.apply(this)),o.restore(this.goalWindowPos,this.goalWindowSize),setTimeout((function(){e&&e.finishWith(t)}),o.getAnimationTime())},hideGoal:function(e,t){this.isGoalExpanded=!1,this.trigger("goalToggled"),this.hideSideVis(e,t,this.goalCanvasHolder)},hideSideVis:function(e,t,o,i){var a=function(){e&&e.finishWith(t)};o&&o.inDom?(o.die(),setTimeout(a,o.getAnimationTime())):a()},initParseWaterfall:function(e){M.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",x),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",new b({disabledMap:e.level.disabledMap}).getInstantCommands())},initGitShim:function(e){this.gitShim=new v({beforeCB:this.beforeCommandCB.bind(this),afterCB:this.afterCommandCB.bind(this),afterDeferHandler:this.afterCommandDefer.bind(this)})},undo:function(){this.gitCommandsIssued.pop(),M.__super__.undo.apply(this,arguments)},beforeCommandCB:function(e){this._treeBeforeCommand=this.mainVis.gitEngine.printTree()},afterCommandCB:function(e){this.doesCommandCountTowardsTotal(e)&&(this.gitCommandsIssued.push(e.get("rawStr")),this.undoStack.push(this._treeBeforeCommand))},doesCommandCountTowardsTotal:function(e){if(e.get("error"))return!1;var t=!1,o=k.commands.getCommandsThatCount();return Object.values(o).forEach((function(o){Object.values(o).forEach((function(o){t=t||o.test(e.get("rawStr"))}))})),t},afterCommandDefer:function(e,t){if(this.solved)return t.addWarning(c.str("already-solved")),void e.resolve();var o=this.mainVis.gitEngine.printTree();_.dispatchFromLevel(this.level,o)?this.levelSolved(e):e.resolve()},getNumSolutionCommands:function(){return this.level.solutionCommand.replace(/^;|;$/g,"").split(";").length},testOption:function(e){return this.options.command&&new RegExp("--"+e).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&new RegExp("--"+t).test(e)},levelSolved:function(e){this.solved=!0,this.isShowingSolution||(p.setLevelSolved(this.level.id),l.levelSolved(this.getEnglishName())),this.hideGoal();var t=g.getNextLevel(this.level.id),o=this.gitCommandsIssued.length,a=this.getNumSolutionCommands(),n=this.testOption("noFinishDialog")||this.wasResetAfterSolved,r=this.wasResetAfterSolved;r||d.levelSolved();var c=1;switch(h.getNumLevelsSolved()){case 2:c=1.5;break;case 3:c=1.8;break;case 4:c=2.1;break;case 5:c=2.4}h.getNumLevelsSolved()>5&&(c=2.5);var m=null;if(r){var u=i.defer();u.resolve(),m=u.promise,s.getEventBaton().trigger("commandSubmitted","echo \"level solved! type in 'levels' to access the next level\"")}else d.changeIsAnimating(!0),m=this.mainVis.gitVisuals.finishAnimation(c),this.mainVis.originVis&&(m=m.then(this.mainVis.originVis.gitVisuals.finishAnimation(c)));n||(m=m.then((function(){return new z({nextLevel:t,numCommands:o,best:a}).getPromise()}))),m.then((function(){!n&&t&&(l.choseNextLevel(t.id),s.getEventBaton().trigger("commandSubmitted","level "+t.id))})).fail((function(){})).done((function(){d.changeIsAnimating(!1),e.resolve()}))},die:function(){n.unmountComponentAtNode(document.getElementById("levelToolbarMount")),this.hideGoal(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder,p.setIsSolvingLevel(!1)},getInstantCommands:function(){var e=function(){var e=c.getHint(this.level);return e&&e.length?e:c.str("no-hint")}.bind(this);return[[/^help$|^\?$/,function(){throw new m.CommandResult({msg:c.str("help-vague-level")})}],[/^hint$/,function(){throw new m.CommandResult({msg:e()})}]]},reset:function(e,t){this.gitCommandsIssued=[];var o=e?e.get("rawStr"):"";this.testOptionOnString(o,"forSolution")||(this.isShowingSolution=!1),this.solved&&(this.wasResetAfterSolved=!0),this.solved=!1,M.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout((function(){s.getSandbox().buildLevel(e,t)}),1.5*this.getAnimationTime())},importLevel:function(e,t){this.exitLevel(),setTimeout((function(){s.getSandbox().importLevel(e,t)}),1.5*this.getAnimationTime())},startLevel:function(e,t){this.exitLevel(),setTimeout((function(){s.getSandbox().startLevel(e,t)}),1.5*this.getAnimationTime())},exitLevel:function(e,t){this.die(),e&&t&&(setTimeout((function(){e.finishWith(t)}),this.getAnimationTime()),s.getEventBaton().trigger("levelExited"))},processLevelCommand:function(e,t){var o={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog,objective:this.objectiveDialog}[e.get("method")];if(!o)throw new Error("woah we don't support that method yet",o);o.apply(this,[e,t])}});o.Level=M,o.regexMap=D},{"../actions/GlobalStateActions":49,"../actions/LevelActions":50,"../app":52,"../commands":53,"../dialogs/confirmShowSolution":55,"../git/gitShim":61,"../graph/treeCompare":65,"../intl":67,"../level/disabledMap":70,"../log":73,"../react_views/LevelToolbarView.jsx":82,"../sandbox/":85,"../stores/GlobalStateStore":87,"../stores/LevelStore":88,"../util":96,"../util/errors":93,"../views":106,"../views/multiView":108,"../visuals/visualization":119,q:29,react:39,"react-dom":33}],72:[function(e,t,o){var i=e("../git/commands"),a=e("../commands"),n=e("../sandbox/commands"),r=function(e){e=e||{},this.options=e,this.shortcutWaterfall=e.shortcutWaterfall||[a.commands.getShortcutMap()],this.instantWaterfall=e.instantWaterfall||[i.instantCommands,n.instantCommands]};r.prototype.initParseWaterfall=function(){e("../util").isBrowser()?this.parseWaterfall=this.options.parseWaterfall||[a.parse,n.parse,n.getOptimisticLevelParse(),n.getOptimisticLevelBuilderParse()]:this.parseWaterfall=[a.parse]},r.prototype.clone=function(){return new r({shortcutWaterfall:this.shortcutWaterfall.slice(),instantWaterfall:this.instantWaterfall.slice(),parseWaterfall:this.parseWaterfall.slice()})},r.prototype.getWaterfallMap=function(){return this.parseWaterfall||this.initParseWaterfall(),{shortcutWaterfall:this.shortcutWaterfall,instantWaterfall:this.instantWaterfall,parseWaterfall:this.parseWaterfall}},r.prototype.addFirst=function(e,t){if(!e||!t)throw new Error("need to know which!!!");this.getWaterfallMap()[e].unshift(t)},r.prototype.addLast=function(e,t){this.getWaterfallMap()[e].push(t)},r.prototype.expandAllShortcuts=function(e){return this.shortcutWaterfall.forEach((function(t){e=this.expandShortcut(e,t)}),this),e},r.prototype.expandShortcut=function(e,t){return Object.keys(t).forEach((function(o){var i=t[o];Object.keys(i).forEach((function(t){var a=i[t].exec(e);a&&(e=o+" "+t+" "+e.slice(a[0].length))}))})),e},r.prototype.processAllInstants=function(e){this.instantWaterfall.forEach((function(t){this.processInstant(e,t)}),this)},r.prototype.processInstant=function(e,t){t.forEach((function(t){var o=t[0].exec(e);o&&t[1](o)}))},r.prototype.parseAll=function(e){this.parseWaterfall||this.initParseWaterfall();var t=!1;return this.parseWaterfall.forEach((function(o){var i=o(e);i&&(t=i)}),this),t},o.ParseWaterfall=r},{"../commands":53,"../git/commands":60,"../sandbox/commands":84,"../util":96}],73:[function(e,t,o){var i=function(e,t,o){window._gaq=window._gaq||[],window._gaq.push(["_trackEvent",e,t,o])};o.viewInteracted=function(e){i("views","interacted",e)},o.showLevelSolution=function(e){i("levels","showedLevelSolution",e)},o.choseNextLevel=function(e){i("levels","nextLevelChosen",e)},o.levelSelected=function(e){i("levels","levelSelected",e)},o.levelSolved=function(e){i("levels","levelSolved",e)},o.commandEntered=function(e){i("commands","commandEntered",e)}},{}],74:[function(e,t,o){var i=e("../intl"),a=(e("../git/commands"),e("../util/errors")),n=(a.CommandProcessError,a.GitError),r=(a.Warning,a.CommandResult,{commit:{regex:/^hg +(commit|ci)($|\s)/,options:["--amend","-A","-m"],delegate:function(e,t){return t.getOptionsMap()["-A"]&&t.addWarning(i.str("hg-a-option")),{vcs:"git",name:"commit"}}},status:{regex:/^hg +(status|st) *$/,dontCountForGolf:!0,execute:function(e,t){throw new n({msg:i.str("hg-error-no-status")})}},export:{regex:/^hg +export($|\s)/,dontCountForGolf:!0,delegate:function(e,t){return t.mapDotToHead(),{vcs:"git",name:"show"}}},graft:{regex:/^hg +graft($|\s)/,options:["-r"],delegate:function(e,t){return t.acceptNoGeneralArgs(),t.prependOptionR(),{vcs:"git",name:"cherrypick"}}},log:{regex:/^hg +log($|\s)/,options:["-f"],dontCountForGolf:!0,delegate:function(e,t){var o=t.getOptionsMap();if(t.acceptNoGeneralArgs(),!o["-f"])throw new n({msg:i.str("hg-error-log-no-follow")});return t.mapDotToHead(),{vcs:"git",name:"log"}}},bookmark:{regex:/^hg (bookmarks|bookmark|book)($|\s)/,options:["-r","-f","-d"],delegate:function(e,t){var o,a,r=t.getOptionsMap(),s=t.getGeneralArgs(),c={vcs:"git"};if(r["-m"]&&r["-d"])throw new n({msg:i.todo("-m and -d are incompatible")});if(r["-d"]&&r["-r"])throw new n({msg:i.todo("-r is incompatible with -d")});if(r["-m"]&&r["-r"])throw new n({msg:i.todo("-r is incompatible with -m")});return s.length+(r["-r"]?r["-r"].length:0)+(r["-d"]?r["-d"].length:0)===0?(c.name="branch",c):(r["-d"]?(r["-D"]=r["-d"],delete r["-d"],c.name="branch"):r["-r"]?(o=(s=t.getGeneralArgs())[0],a=r["-r"][0],c.name="branch",t.setGeneralArgs([o,a])):s.length>0?(t.setOptionsMap({"-b":[s[0]]}),c.name="checkout",t.setGeneralArgs([])):c.name="branch",c)}},rebase:{regex:/^hg +rebase($|\s+)/,options:["-d","-s","-b"],execute:function(e,t){var o=function(){throw new n({msg:i.str("git-error-options")})},a=t.getOptionsMap();if(a["-d"]&&a["-s"]||!a["-d"]&&a["-s"],a["-b"]||(a["-b"]=["."]),t.setOptionsMap(a),t.mapDotToHead(),(a=t.getOptionsMap())["-d"]){var r=a["-d"][0]||o(),s=a["-b"][0];e.hgRebase(r,s)}else o()}},update:{regex:/^hg +(update|up)($|\s+)/,options:["-r"],delegate:function(e,t){return t.appendOptionR(),{vcs:"git",name:"checkout"}}},backout:{regex:/^hg +backout($|\s+)/,options:["-r"],delegate:function(e,t){return t.prependOptionR(),{vcs:"git",name:"revert"}}},histedit:{regex:/^hg +histedit($|\s+)/,delegate:function(e,t){var o=t.getGeneralArgs();return t.validateArgBounds(o,1,1),t.setOptionsMap({"-i":o}),t.setGeneralArgs([]),{vcs:"git",name:"rebase"}}},pull:{regex:/^hg +pull($|\s+)/,delegate:function(e,t){return{vcs:"git",name:"pull"}}},summary:{regex:/^hg +(summary|sum) *$/,delegate:function(e,t){return{vcs:"git",name:"branch"}}}});o.commandConfig=r},{"../git/commands":60,"../intl":67,"../util/errors":93}],75:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../git").Commit,r=e("../git").Branch,s=e("../git").Tag,c=e("../models/commandModel").Command,l=e("../util/constants").TIME,m=e("../intl"),u=a.Collection.extend({model:n}),d=a.Collection.extend({model:c}),h=a.Collection.extend({model:r}),p=a.Collection.extend({model:s}),g=a.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){this.timeout||this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(function(){this.sipFromBuffer()}.bind(this),l.betweenCommandsDelay)},popAndProcess:function(){for(var e=this.buffer.shift(0);e.get("error")&&this.buffer.length;)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var o=i.defer();o.promise.then(function(){this.setTimeout()}.bind(this));var a=t.get("eventName");if(!a)throw new Error("I need an event to trigger when this guy is parsed and ready");var n=e("../app");if(!n.getEventBaton().getNumListeners(a)){var r=e("../util/errors");return t.set("error",new r.GitError({msg:m.str("error-command-currently-not-supported")})),void o.resolve()}n.getEventBaton().trigger(a,t,o)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){this.buffer.length?this.popAndProcess():this.clear()}});o.CommitCollection=u,o.CommandCollection=d,o.BranchCollection=h,o.TagCollection=p,o.CommandBuffer=g},{"../app":52,"../git":63,"../intl":67,"../models/commandModel":76,"../util/constants":90,"../util/errors":93,backbone:1,q:29}],76:[function(e,t,o){var i=e("backbone"),a=e("../util/errors"),n=e("../level/parseWaterfall").ParseWaterfall,r=e("../stores/LevelStore"),s=e("../intl"),c=a.CommandProcessError,l=a.GitError,m=a.Warning,u=a.CommandResult,d=i.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new n,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},replaceDotWithHead:function(e){return e.replace(/\./g,"HEAD")},appendOptionR:function(){var e=this.getOptionsMap()["-r"]||[];this.setGeneralArgs(this.getGeneralArgs().concat(e))},prependOptionR:function(){var e=this.getOptionsMap()["-r"]||[];this.setGeneralArgs(e.concat(this.getGeneralArgs()))},mapDotToHead:function(){var e=this.getGeneralArgs(),t=this.getOptionsMap();e=e.map((function(e){return this.replaceDotWithHead(e)}),this);var o={};Object.keys(t).forEach((function(e){var i=t[e];o[e]=Object.values(i).map((function(e){return this.replaceDotWithHead(e)}),this)}),this),this.setGeneralArgs(e),this.setOptionsMap(o)},deleteOptions:function(e){var t=this.getOptionsMap();e.forEach((function(e){delete t[e]}),this),this.setOptionsMap(t)},getGeneralArgs:function(){return this.get("generalArgs")},setGeneralArgs:function(e){this.set("generalArgs",e)},setOptionsMap:function(e){this.set("supportedMap",e)},getOptionsMap:function(){return this.get("supportedMap")},acceptNoGeneralArgs:function(){if(this.getGeneralArgs().length)throw new l({msg:s.str("git-error-no-general-args")})},argImpliedHead:function(e,t,o,i){this.validateArgBounds(e,t,o,i),this.impliedHead(e,t)},oneArgImpliedHead:function(e,t){this.argImpliedHead(e,0,1,t)},twoArgsImpliedHead:function(e,t){this.argImpliedHead(e,1,2,t)},threeArgsImpliedHead:function(e,t){this.argImpliedHead(e,2,3,t)},oneArgImpliedOrigin:function(e){this.validateArgBounds(e,0,1),e.length||e.unshift("origin")},twoArgsForOrigin:function(e){this.validateArgBounds(e,0,2)},impliedHead:function(e,t){e.length==t&&e.push("HEAD")},validateArgBounds:function(e,t,o,i){var a=void 0===i?"git "+this.get("method"):this.get("method")+" "+i+" ";if(a="with "+a,e.lengtho)throw new l({msg:s.str("git-error-args-many",{upper:String(o),what:a})})},validateAtInit:function(){if(null===this.get("rawStr"))throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){return a.filterError(e),void this.set("error",e)}this.parseAll()||this.set("error",new c({msg:s.str("git-error-command-not-supported",{command:this.get("rawStr")})}))},errorChanged:function(){var e=this.get("error");e&&(e instanceof c||e instanceof l?this.set("status","error"):e instanceof u?this.set("status","finished"):e instanceof m&&this.set("status","warning"),this.formatError())},formatError:function(){this.set("result",this.get("error").getMsg())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new u({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr");const t=r.getAliasMap();for(var o=0;othis.clearOldCommands()),this)}componentWillUnmount(){for(var e=0;et.clientHeight||window.innerHeight","show commands","show solution","show goal"];throw new d({msg:t.join("\n")})}],[/^alias (\w+)="(.+)"$/,function(e){const t=e[1],o=e[2];throw l.addToAliasMap(t,o),new d({msg:'Set alias "'+t+'" to "'+o+'"'})}],[/^unalias (\w+)$/,function(e){const t=e[1];throw l.removeFromAliasMap(t),new d({msg:'Removed alias "'+t+'"'})}],[/^locale (\w+)$/,function(e){throw c.changeLocale(e[1]),new d({msg:a.str("locale-command",{locale:e[1]})})}],[/^flip$/,function(){throw u.changeFlipTreeY(!m.getFlipTreeY()),e("../app").getEvents().trigger("refreshTree"),new d({msg:a.str("flip-tree-command")})}],[/^disableLevelInstructions$/,function(){throw u.disableLevelInstructions(),new d({msg:a.todo("Level instructions disabled")})}],[/^refresh$/,function(){throw e("../app").getEvents().trigger("refreshTree"),new d({msg:a.str("refresh-tree-command")})}],[/^rollup (\d+)$/,function(t){throw e("../app").getEvents().trigger("rollupCommands",t[1]),new d({msg:"Commands combined!"})}],[/^echo "(.*?)"$|^echo (.*?)$/,function(e){var t=e[1]||e[2];throw new d({msg:t})}],[/^show +commands$/,function(e){var t=g(),o=n.commands.getOptionMap(),i={};Object.keys(o).forEach((function(e){var t=o[e];Object.keys(t).forEach((function(o){var a=t[o];a&&(i[e+" "+o]=Object.keys(a).filter((e=>e.length>1)))}))}));var r=[a.str("show-all-commands"),"
"];throw Object.keys(t).forEach((function(e){r.push(e),i[e]&&i[e].forEach((e=>r.push("    "+e)))})),new d({msg:r.join("\n")})}]],p={"reset solved":/^reset solved($|\s)/,help:/^help( +general)?$|^\?$/,reset:/^reset( +--forSolution)?$/,delay:/^delay (\d+)$/,clear:/^clear($|\s)/,"exit level":/^exit level($|\s)/,sandbox:/^sandbox($|\s)/,level:/^level\s?([a-zA-Z0-9]*)/,levels:/^levels($|\s)/,mobileAlert:/^mobile alert($|\s)/,"build level":/^build +level\s?([a-zA-Z0-9]*)$/,"export tree":/^export +tree$/,importTreeNow:/^importTreeNow($|\s)/,importLevelNow:/^importLevelNow($|\s)/,"import tree":/^import +tree$/,"import level":/^import +level$/,undo:/^undo($|\s)/,"share permalink":/^share( +permalink)?$/},g=function(){var t=Object.assign({},e("../level").regexMap,p),o=n.commands.getRegexMap();return Object.keys(o).forEach((function(e){var i=o[e];Object.keys(i).forEach((function(o){var a=i[o];t[e+" "+o]=a}))})),["mobileAlert"].forEach((function(e){delete t[e]})),t};o.getAllCommands=g,o.instantCommands=h,o.parse=i.genParseCommand(p,"processSandboxCommand"),o.getOptimisticLevelParse=function(){return i.genParseCommand(e("../level").regexMap,"processLevelCommand")},o.getOptimisticLevelBuilderParse=function(){return i.genParseCommand(e("../level/builder").regexMap,"processLevelBuilderCommand")}},{"../actions/GlobalStateActions":49,"../actions/LocaleActions":51,"../app":52,"../commands":53,"../intl":67,"../level":71,"../level/builder":69,"../stores/GlobalStateStore":87,"../stores/LevelStore":88,"../stores/LocaleStore":89,"../util":96,"../util/constants":90,"../util/errors":93}],85:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../util"),r=e("../intl"),s=e("../app"),c=e("../util/errors"),l=e("../visuals/visualization").Visualization,m=e("../level/parseWaterfall").ParseWaterfall,u=(e("../level/disabledMap").DisabledMap,e("../models/commandModel").Command),d=e("../git/gitShim").GitShim,h=e("../actions/LevelActions"),p=e("../stores/LevelStore"),g=e("../views"),f=(g.ModalTerminal,g.ModalAlert,e("../views/builderViews")),b=e("../views/multiView").MultiView,v=a.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),this.initUndoStack(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new l({el:e.el||this.getDefaultVisEl()})},initUndoStack:function(e){this.undoStack=[]},initCommandCollection:function(e){this.commandCollection=s.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new m},initGitShim:function(e){this.gitShim=new d({beforeCB:this.beforeCommandCB.bind(this),afterCB:this.afterCommandCB.bind(this)})},takeControl:function(){s.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),s.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),s.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){s.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),s.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),s.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",(function(){this.gitShim.insertShim()}),this)},beforeCommandCB:function(e){this._treeBeforeCommand=this.mainVis.gitEngine.printTree()},afterCommandCB:function(e){this.pushUndo()},pushUndo:function(){this.mainVis.gitEngine.printTree()!==this._treeBeforeCommand&&this.undoStack.push(this._treeBeforeCommand)},undo:function(e,t){var o=this.undoStack.pop();if(!o)return e.set("error",new c.GitError({msg:r.str("undo-stack-empty")})),void t.resolve();this.mainVis.reset(o),setTimeout((function(){e.finishWith(t)}),this.mainVis.getAnimationTime())},commandSubmitted:function(e){s.getEvents().trigger("commandSubmittedPassive",e),n.splitTextCommand(e,(function(e){this.commandCollection.add(new u({rawStr:e,parseWaterfall:this.parseWaterfall}))}),this)},startLevel:function(t,o){var a=(t.get("regexResults")||[])[1]||"",n=p.getLevel(a);if(!n)return t.addWarning(r.str("level-no-id",{id:a})),s.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),void o.resolve();this.hide(),this.clear();var c=i.defer(),l=e("../level").Level;this.currentLevel=new l({level:n,deferred:c,command:t}),c.promise.then((function(){t.finishWith(o)}))},buildLevel:function(t,o){this.hide(),this.clear();var a=i.defer(),n=e("../level/builder").LevelBuilder,r=(t.get("regexResults")||[])[1]||!1;this.levelBuilder=new n({deferred:a,editLevel:r}),a.promise.then((function(){t.finishWith(o)}))},exitLevel:function(e,t){e.addWarning(r.str("level-cant-exit")),e.set("status","error"),t.resolve()},showLevels:function(e,t){var o=i.defer();s.getLevelDropdown().show(o,e),o.promise.done((function(){e.finishWith(t)}))},sharePermalink:function(e,t){var o=JSON.stringify(this.mainVis.gitEngine.exportTree()),i="https://learngitbranching.js.org/?NODEMO&command=importTreeNow%20"+escape(o);e.setResult(r.todo("Here is a link to the current state of the tree: ")+"\n"+i),e.finishWith(t)},resetSolved:function(e,t){if("reset solved --confirm"!==e.get("regexResults").input)return e.set("error",new c.GitError({msg:"Reset solved will mark each level as not yet solved; because this is a destructive command, please pass in --confirm to execute"})),void e.finishWith(t);h.resetLevelsSolved(),e.addWarning(r.str("solved-map-reset")),e.finishWith(t)},processSandboxCommand:function(e,t){var o={"reset solved":this.resetSolved,undo:this.undo,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,importTreeNow:this.importTreeNow,"import level":this.importLevel,importLevelNow:this.importLevelNow,"share permalink":this.sharePermalink}[e.get("method")];if(!o)throw new Error("no method for that wut");o.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importLevelNow:function(t,o){var a=t.get("regexResults")||[];if(a.length<2)return t.set("error",new c.GitError({msg:r.str("git-error-options")})),void t.finishWith(o);var n=a.input.replace(/importLevelNow\s+/g,""),s=e("../level").Level;try{var l=JSON.parse(unescape(n)),m=i.defer();this.currentLevel=new s({level:l,deferred:m,command:t}),this.hide(),m.promise.then((function(){t.finishWith(o)}))}catch(e){throw t.set("error",new c.GitError({msg:"Something went wrong "+String(e)})),e}t.finishWith(o)},importTreeNow:function(e,t){var o=e.get("regexResults")||[];o.length<2&&(e.set("error",new c.GitError({msg:r.str("git-error-options")})),e.finishWith(t));var i=o.input.replace(/importTreeNow\s+/g,"");try{this.mainVis.gitEngine.loadTreeFromString(i)}catch(t){e.set("error",new c.GitError({msg:String(t)}))}e.finishWith(t)},importTree:function(e,t){new f.MarkdownPresenter({previewText:r.str("paste-json"),fillerText:" "}).deferred.promise.then(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(e){this.mainVis.reset(),new b({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(e)]}}]})}}.bind(this)).fail((function(){})).done((function(){e.finishWith(t)}))},importLevel:function(t,o){new f.MarkdownPresenter({previewText:r.str("paste-json"),fillerText:" "}).deferred.promise.then(function(a){var n=e("../level").Level;try{var r=JSON.parse(a),s=i.defer();this.currentLevel=new n({level:r,deferred:s,command:t}),this.hide(),s.promise.then((function(){t.finishWith(o)}))}catch(e){new b({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(e)]}}]}),t.finishWith(o)}}.bind(this)).fail((function(){t.finishWith(o)})).done()},exportTree:function(e,t){var o=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2);new b({childViews:[{type:"MarkdownPresenter",options:{previewText:r.str("share-tree"),fillerText:o,noConfirmCancel:!0}}]}).getPromise().then((function(){e.finishWith(t)})).done()},clear:function(e,t){s.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert(r.str("mobile-alert")),e.finishWith(t)},delay:function(e,t){var o=parseInt(e.get("regexResults")[1],10);setTimeout((function(){e.finishWith(t)}),o)},reset:function(e,t){this.mainVis.reset(),this.initUndoStack(),setTimeout((function(){e.finishWith(t)}),this.mainVis.getAnimationTime())},helpDialog:function(t,o){new b({childViews:r.getDialog(e("../dialogs/sandbox"))}).getPromise().then(function(){t.finishWith(o)}.bind(this)).done()}});o.Sandbox=v},{"../actions/LevelActions":50,"../app":52,"../dialogs/sandbox":58,"../git/gitShim":61,"../intl":67,"../level":71,"../level/builder":69,"../level/disabledMap":70,"../level/parseWaterfall":72,"../models/commandModel":76,"../stores/LevelStore":88,"../util":96,"../util/errors":93,"../views":106,"../views/builderViews":103,"../views/multiView":108,"../visuals/visualization":119,backbone:1,q:29}],86:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("../dispatcher/AppDispatcher"),n=e("events").EventEmitter,r=i.ActionTypes,s="lgb_CommandHistory",c=[];try{c=JSON.parse(localStorage.getItem(s)||"[]")||[]}catch(e){}var l=Object.assign({},n.prototype,i.StoreSubscribePrototype,{getMaxHistoryLength:function(){return 100},getCommandHistoryLength:function(){return c.length},getCommandHistory:function(){return c.slice(0)},dispatchToken:a.register((function(e){var t=e.action,o=!1;switch(t.type){case r.SUBMIT_COMMAND:c.unshift(String(t.text)),c.length>100&&(c=c.slice(0,10)),function(){try{localStorage.setItem(s,JSON.stringify(c))}catch(e){}}(),o=!0;case r.CHANGE_FLIP_TREE_Y:}o&&l.emit(i.CHANGE_EVENT)}))});t.exports=l},{"../constants/AppConstants":54,"../dispatcher/AppDispatcher":59,events:4}],87:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("../dispatcher/AppDispatcher"),n=e("events").EventEmitter,r=i.ActionTypes,s=!1,c=!1,l=0,m=!1,u=!1,d=Object.assign({},n.prototype,i.StoreSubscribePrototype,{getIsAnimating:function(){return s},getIsSolvingLevel:function(){return u},getFlipTreeY:function(){return c},getNumLevelsSolved:function(){return l},getShouldDisableLevelInstructions:function(){return m},dispatchToken:a.register((function(e){var t=e.action,o=!1;switch(t.type){case r.SET_IS_SOLVING_LEVEL:u=t.isSolvingLevel,o=!0;break;case r.CHANGE_IS_ANIMATING:s=t.isAnimating,o=!0;break;case r.CHANGE_FLIP_TREE_Y:c=t.flipTreeY,o=!0;break;case r.LEVEL_SOLVED:l++,o=!0;break;case r.DISABLE_LEVEL_INSTRUCTIONS:m=!0,o=!0}o&&d.emit(i.CHANGE_EVENT)}))});t.exports=d},{"../constants/AppConstants":54,"../dispatcher/AppDispatcher":59,events:4}],88:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("../dispatcher/AppDispatcher"),n=e("events").EventEmitter,r=e("../../levels").levelSequences,s=e("../../levels").sequenceInfo,c=e("../util"),l=i.ActionTypes,m="solvedMap",u="aliasMap",d={},h={},p=[];if(c.isBrowser())f=window.localStorage;else var g={},f={setItem:function(e,t){g[e]=t||""},getItem:function(e){return e in g?g[e]:null},removeItem:function(e){delete g[e]},get length(){return Object.keys(g).length},key:function(e){return Object.keys(g)[e]||null}};try{h=JSON.parse(f.getItem(m)||"{}")||{}}catch(e){console.warn("local storage failed",e)}function b(){try{f.setItem(m,JSON.stringify(h))}catch(e){console.warn("local storage failed on set",e)}}function v(){try{return JSON.parse(f.getItem(u)||"{}")||{}}catch(e){return{}}}Object.keys(r).forEach((function(e){var t=r[e];if(p.push(e),!t||!t.length)throw new Error("no empty sequences allowed");t.forEach((function(t,o){!function(e){e=e||{},["name","goalTreeString","solutionCommand"].forEach((function(t){if(void 0===e[t])throw console.log(e),new Error("I need this field for a level: "+t)}))}(t);var i=e+String(o+1),a=Object.assign({},t,{index:o,id:i,sequenceName:e});d[i]=a,r[e][o]=a}))}));var k=Object.assign({},n.prototype,i.StoreSubscribePrototype,{getAliasMap:v,addToAliasMap:function(e,t){const o=v();o[e]=t,f.setItem(u,JSON.stringify(o))},removeFromAliasMap:function(e){const t=v();delete t[e],f.setItem(u,JSON.stringify(t))},getSequenceToLevels:function(){return r},getSequences:function(){return Object.keys(r)},getLevelsInSequence:function(e){if(!r[e])throw new Error("that sequence name "+e+" does not exist");return r[e]},getSequenceInfo:function(e){return s[e]},getLevel:function(e){return d[e]},getNextLevel:function(e){if(!d[e])return console.warn("that level doesn't exist!!!"),null;var t=d[e],o=t.sequenceName,i=r[o],a=t.index+1;if(a":">",'"':""","'":"'","/":"/"};t.exports=function(e){return(""+e).replace(/[&<>"'\/]/g,(function(e){return i[e]}))}},{}],95:[function(e,t,o){function i(e){this.eventMap={},this.options=e||{}}i.prototype.stealBaton=function(e,t,o){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var i=this.eventMap[e]||[];i.push({func:t,context:o}),this.eventMap[e]=i},i.prototype.sliceOffArgs=function(e,t){for(var o=[],i=e;i0&&!e.length||t(e)}))},o.genParseCommand=function(e,t){return function(o){var i,a;return Object.keys(e).forEach((function(t){var n=e[t].exec(o);n&&(i=t,a=n)})),!!i&&{toSet:{eventName:t,method:i,regexResults:a}}}},o.readDirDeep=function(e){var t=[];return i(e).forEach((function(i){var r=n(e,i);a(r).isDirectory()?t.push(...o.readDirDeep(r)):t.push(r)})),t}},{"../util/constants":90,"../util/escapeString":94,fs:3,path:21}],97:[function(e,t,o){"use strict";t.exports=function(e){var t={};for(var o in e)e.hasOwnProperty(o)&&(t[o]=o);return t}},{}],98:[function(e,t,o){e("backbone");var i=e("../app"),a=function(e){return{37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"}[e]};function n(e){this.events=e.events,this.aliasMap=e.aliasMap||{},e.wait||this.listen()}n.prototype.listen=function(){this.listening||(this.listening=!0,i.getEventBaton().stealBaton("docKeydown",this.keydown,this))},n.prototype.mute=function(){this.listening=!1,i.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},n.prototype.keydown=function(e){var t=e.which||e.keyCode,o=a(t);void 0!==o&&this.fireEvent(o,e)},n.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},n.prototype.passEventBack=function(e){i.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},o.KeyboardListener=n,o.mapKeycodeToKey=a},{"../app":52,backbone:1}],99:[function(e,t,o){o.mock=function(e){var t={},o=function(){};for(var i in e.prototype)t[i]=o;return t}},{}],100:[function(e,t,o){o.joinClasses=function(e){return e.join(" ")}},{}],101:[function(e,t,o){t.exports=function(e,t){var o=!1;return function(){o||(e.apply(this,arguments),o=!0,setTimeout((function(){o=!1}),t))}}},{}],102:[function(e,t,o){var i=!0;o.detectZoom=function(){return window.outerWidth&&window.innerWidth?window.outerWidth/window.innerWidth:(i&&(console.warn("Can't detect zoom level correctly :-/"),i=!1),1)}},{}],103:[function(e,t,o){var i=e("underscore"),a=e("q"),{marked:n}=e("marked"),r=e("../views"),s=e("../util/throttle"),c=r.ModalTerminal,l=r.ContainedBase,m=l.extend({tagName:"div",className:"textGrabber box vertical",template:i.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new c({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),u=l.extend({tagName:"div",className:"markdownGrabber box horizontal",template:i.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){if(e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new c({title:e.title||"Enter some markdown"}),this.render(),!e.withoutButton){var t=a.defer();t.promise.then(this.confirmed.bind(this)).fail(this.cancelled.bind(this)).done();new r.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=s(this.updatePreview.bind(this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var e=this.getRawText(),t=n(e);this.$("div.insidePreview").html(t)}}),d=l.extend({tagName:"div",className:"markdownPresenter box vertical",template:i.template($("#markdown-presenter").html()),initialize:function(e){(e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new c({title:"Check this out..."}),this.render(),e.noConfirmCancel)||new r.ConfirmCancelView({destination:this.getDestination()}).deferred.promise.then(function(){this.deferred.resolve(this.grabText())}.bind(this)).fail(function(){this.deferred.reject()}.bind(this)).done(this.die.bind(this));this.show()},grabText:function(){return this.$("textarea").val()}}),h=l.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:i.template($("#demonstration-builder").html()),events:{"click .testButton":"testView"},initialize:function(e){if(e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj){var t=e.fromObj.options;e=Object.assign({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new c({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new u({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new m({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new m({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new u({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var o=a.defer();new r.ConfirmCancelView({deferred:o,destination:this.getDestination()});o.promise.then(this.confirmed.bind(this)).fail(this.cancelled.bind(this)).done()},testView:function(){new(0,e("../views/multiView").MultiView)({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),p=l.extend({tagName:"div",className:"multiViewBuilder box vertical",template:i.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:u,GitDemonstrationView:h},events:{"click .deleteButton":"deleteOneView","click .testButton":"testOneView","click .editButton":"editOneView","click .testEntireView":"testEntireView","click .addView":"addView","click .saveView":"saveView","click .cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:Object.keys(this.typeToConstructor)},this.container=new c({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.target,o=$(t).attr("data-type"),i=a.defer(),n=new(0,this.typeToConstructor[o])({deferred:i});i.promise.then(function(){var e={type:o,options:n.getExportObj()};this.addChildViewObj(e)}.bind(this)).fail((function(){})).done()},testOneView:function(t){var o=t.target,i=$(o).attr("data-index"),a=this.getChildViews()[i];new(0,e("../views/multiView").MultiView)({childViews:[a]})},testEntireView:function(){new(0,e("../views/multiView").MultiView)({childViews:this.getChildViews()})},editOneView:function(e){var t=e.target,o=$(t).attr("data-index"),i=$(t).attr("data-type"),n=a.defer(),r=new this.typeToConstructor[i]({deferred:n,fromObj:this.getChildViews()[o]});n.promise.then(function(){var e={type:i,options:r.getExportObj()},t=this.getChildViews();t[o]=e,this.setChildViews(t)}.bind(this)).fail((function(){})).done()},deleteOneView:function(e){var t=e.target,o=$(t).attr("data-index"),i=this.getChildViews(),a=i.slice(0,o).concat(i.slice(o+1));this.setChildViews(a),this.update()},addChildViewObj:function(e,t){var o=this.getChildViews();o.push(e),this.setChildViews(o),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});o.MarkdownGrabber=u,o.DemonstrationBuilder=h,o.TextGrabber=m,o.MultiViewBuilder=p,o.MarkdownPresenter=d},{"../util/throttle":101,"../views":106,"../views/multiView":108,marked:19,q:29,underscore:47}],104:[function(e,t,o){var i=e("backbone");const{getAllCommands:a}=e("../sandbox/commands");var n=e("../app"),r=e("../stores/CommandLineStore"),s=e("../actions/CommandLineActions"),c=e("../log"),l=e("../util/keyboard");const m=Object.keys(a()),u=["levels","help","show solution","reset","import level"],d=u.concat(m.map((e=>u.indexOf(e)>0?null:e)).filter((e=>!!e)));var h=i.View.extend({initialize:function(){n.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.focus(),n.getEvents().on("rollupCommands",this.rollupCommands,this),n.getEventBaton().stealBaton("keydown",this.onKeyDown,this),n.getEventBaton().stealBaton("keyup",this.onKeyUp,this),this.updatePrompt(" ")},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandParagraph).toggleClass("showCursor",e)},onKeyDown:function(e){var t=e.target;const o=document.querySelector("#shadow"),i=t.value,a=i.split(";"),n=a[a.length-1].replace(/\s\s+/g," ").replace(/^\s/,"");if(o.innerHTML="",n.length)for(const e of d)if(e.startsWith(n)){o.innerHTML=(i+e.replace(n,"")).replace(/ /g," ");break}9===e.keyCode&&(e.preventDefault(),o.innerHTML&&(t.value=o.innerHTML.replace(/ /g," "))),this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:function(){this.submit()}.bind(this),up:function(){this.commandSelectChange(1)}.bind(this),down:function(){this.commandSelectChange(-1)}.bind(this)},o=l.mapKeycodeToKey(e.which||e.keyCode);void 0!==t[o]&&(e.preventDefault(),t[o](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/"+this.badHtmlEncode(a)+''+this.badHtmlEncode(r)+""+this.badHtmlEncode(s)+"";this.commandParagraph.innerHTML=c,n.getEvents().trigger("commandScrollDown")},commandSelectChange:function(e){if(this.index+=e,this.index>=r.getCommandHistoryLength()||this.index<0)return this.clear(),void(this.index=-1);var t=r.getCommandHistory()[this.index];this.setTextField(t)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=r.getCommandHistory().slice(1,Number(e)+1);t.reverse();var o="";t.forEach((function(e){o+=e+";"}),this),s.submitCommand(o)},addToCommandHistory:function(e){(e.length&&-1===this.index||e.length&&-1!==this.index&&r.getCommandHistory()[this.index]!==e)&&(s.submitCommand(e),c.commandEntered(e))},submitCommand:function(e){n.getEventBaton().trigger("commandSubmitted",e)}});o.CommandPromptView=h},{"../actions/CommandLineActions":48,"../app":52,"../log":73,"../sandbox/commands":84,"../stores/CommandLineStore":86,"../util/keyboard":98,backbone:1}],105:[function(e,t,o){var i=e("underscore"),a=e("q"),n=e("backbone"),{marked:r}=e("marked"),s=e("../util"),c=e("../intl"),l=e("../util/keyboard").KeyboardListener,m=e("../models/commandModel").Command,u=e("../views").ModalTerminal,d=e("../views").ContainedBase,h=e("../visuals/visualization").Visualization,p=e("../git/headless"),g=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:i.template($("#git-demonstration-view").html()),events:{'click div.command > p.uiButton:not([target="reset"])':"positive",'click div.command > p.uiButton[target="reset"]':"onResetButtonClick"},initialize:function(e){e=e||{},this.options=e,this.JSON=Object.assign({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},e);var t=function(e){return r(e.join("\n"))};this.JSON.beforeHTML=t(this.JSON.beforeMarkdowns),this.JSON.afterHTML=t(this.JSON.afterMarkdowns),this.container=new u({title:e.title||c.str("git-demonstration-title")}),this.render(),this.checkScroll(),this.navEvents=Object.assign({},n.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.navEvents.on("onResetButtonClick",this.onResetButtonClick,this),this.keyboardListener=new l({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),e.wait||this.show()},receiveMetaNav:function(e,t){e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){this.$("div.demonstrationText").children().toArray().map((function(e){return e.clientHeight})).reduce((function(e,t){return e+t}))'+c.str("finish-dialog-finished")+" (ノ^_^)ノ (ノ^_^)ノ (ノ^_^)ノ

",t=Object.assign({},t,{markdown:a,_dangerouslyInsertHTML:o}),A.__super__.initialize.apply(this,[t])}}),_=n.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new C({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){s.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){s.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),D=_.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],D.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>l.VIEWPORT.minWidth&&e.h>l.VIEWPORT.minHeight&&this.finish()}}),x=_.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],x.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=l.VIEWPORT.maxZoom&&e>=l.VIEWPORT.minZoom&&this.finish()}}),M=h.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:i.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.parent=e.parent,this.minHeight=e.minHeight||200,this.destination=$("body"),this.JSON={title:e.title||c.str("goal-to-reach"),text:e.text||c.str("hide-goal")},this.render(),this.inDom=!0,this.$terminal=this.$el.find(".terminal-window-holder").first(),this.$terminal.height(.8*$(window).height()),this.$terminal.draggable({cursor:"move",handle:".toolbar",containment:"#interfaceWrapper",scroll:!1}),$(window).on("resize",u(this.recalcLayout.bind(this),300)),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.die()},die:function(){this.minimize(),this.inDom=!1,setTimeout(function(){this.tearDown()}.bind(this),this.getAnimationTime())},minimize:function(){this.parent.trigger("minimizeCanvas",{left:this.$terminal.css("left"),top:this.$terminal.css("top")},{width:this.$terminal.css("width"),height:this.$terminal.css("height")}),this.$terminal.animate({height:"0px",opacity:0},this.getAnimationTime())},restore:function(e,t){var o=this;e=e||{top:this.$terminal.css("top"),left:this.$terminal.css("left")},t=t||{width:this.$terminal.css("width"),height:this.$terminal.css("height")},this.$terminal.css({top:e.top,left:e.left,width:t.width,height:"0px",opacity:"0"}),this.$terminal.animate({height:t.height,opacity:1},this.getAnimationTime(),(function(){o.recalcLayout()}))},recalcLayout:function(){var e=this.parent,t=0,o=0,i=0,a=this.$terminal.outerWidth(),n=this.$terminal.outerHeight(),r=this.$terminal.offset().left,s=this.$terminal.offset().top,c=$(window).width()-(r+a),l=$(window).height()-(s+n),m=.75*$(window).height(),u=.95*$(window).height();s<0&&(o=-s),r<0&&(t=-r),c<0&&(t=c),l<0&&(o=l),nu&&(i=u-n),r=Math.max(r+t,0),s=Math.max(s+o,0),n=Math.max(n+i,m),this.$terminal.animate({right:c+"px",top:s+"px",height:n+"px"},this.getAnimationTime(),(function(){e.trigger("resizeCanvas")}))},getCanvasLocation:function(){return this.$("div.inside")[0]}});o.BaseView=h,o.GeneralButton=b,o.ModalView=w,o.ModalTerminal=y,o.ModalAlert=C,o.ContainedBase=f,o.ConfirmCancelView=v,o.LeftRightView=k,o.ZoomAlertWindow=x,o.ConfirmCancelTerminal=z,o.WindowSizeAlertWindow=D,o.CanvasTerminalHolder=M,o.NextLevelConfirm=A}).call(this)}).call(this,e("_process"))},{"../app":52,"../dialogs/nextLevel":57,"../intl":67,"../log":73,"../util/constants":90,"../util/debounce":91,"../util/keyboard":98,"../util/throttle":101,_process:22,backbone:1,marked:19,q:29,underscore:47}],107:[function(e,t,o){var i=e("underscore"),a=(e("q"),e("backbone")),n=e("../stores/LocaleStore"),r=e("../util"),s=e("../util/debounce"),c=e("../intl"),l=e("../log"),m=e("../util/keyboard").KeyboardListener,u=e("../app"),d=e("../stores/LevelStore"),h=e("../views").ModalTerminal,p=e("../views").ContainedBase,g=e("../views").BaseView,f=e("../../levels"),b=p.extend({tagName:"div",className:"levelDropdownView box vertical",template:i.template($("#level-dropdown-view").html()),events:{"click div.levelDropdownTab":"onTabClick"},initialize:function(e){e=e||{};var t=r.parseQueryString(window.location.href);this.JSON={selectedTab:t.defaultTab||"main",tabs:[{id:"main",name:c.str("main-levels-tab")},{id:"remote",name:c.str("remote-levels-tab")}]},this.navEvents=Object.assign({},a.Events),this.navEvents.on("clickedID",s(this.loadLevelID.bind(this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new m({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=d.getSequences(),this.sequenceToLevels=d.getSequenceToLevels(),this.container=new h({title:c.str("select-a-level")});var o=this;n.subscribe((function(){o.render.apply(o)})),d.subscribe((function(){o.render()})),this.render(),e.wait||this.show()},render:function(){this.container.updateTitle(c.str("select-a-level")),this.updateTabNames([c.str("main-levels-tab"),c.str("remote-levels-tab")]),b.__super__.render.apply(this,arguments),this.buildSequences()},onTabClick:function(e){var t=e.target||e.srcElement,o=$(t).attr("data-id");o!==this.JSON.selectedTab&&(this.selectedTab=o,this.updateTabTo(o))},updateTabTo:function(e){this.JSON.selectedTab=e,this.render(),this.selectedID&&(this.selectedSequence=this.getSequencesOnTab()[0],this.selectedIndex=0,this.updateSelectedIcon())},updateTabNames:function(e){for(var t=0;t=o.length&&this.getTabIndex()+1=0?(this.switchToTabIndex(this.getTabIndex()-1),this.selectedIndex=0):this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.updateSelectedIcon()},right:function(){this.turnOnKeyboardSelection()||this.leftOrRight(1)},up:function(){this.turnOnKeyboardSelection()||(this.selectedSequence=this.getPreviousSequence(),this.downOrUp())},down:function(){this.turnOnKeyboardSelection()||(this.selectedSequence=this.getNextSequence(),this.downOrUp())},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.updateSelectedIcon()},turnOnKeyboardSelection:function(){return!this.selectedID&&(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){this.selectedID&&(this.deselectIconByID(this.selectedID),this.selectedID=void 0,this.selectedIndex=void 0,this.selectedSequence=void 0)},getTabIndex:function(){return this.JSON.tabs.map((function(e){return e.id})).indexOf(this.JSON.selectedTab)},switchToTabIndex:function(e){var t=this.JSON.tabs[e].id;this.updateTabTo(t)},wrapIndex:function(e,t){return e=(e=e>=t.length?0:e)<0?t.length-1:e},boundIndex:function(e,t){return e=(e=e>=t.length?t.length-1:e)<0?0:e},getSequencesOnTab:function(){return this.sequences.filter((function(e){return f.getTabForSequence(e)===this.JSON.selectedTab}),this)},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.getSequencesOnTab());return this.getSequencesOnTab()[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.getSequencesOnTab());return this.getSequencesOnTab()[t]},getSequenceIndex:function(e){var t=this.getSequencesOnTab().indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return d.getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.getSequencesOnTab()[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.getSequencesOnTab()[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e,$("#levelIcon-"+e).toggleClass("selected",t),this.seriesViews.forEach((function(t){-1!==t.levelIDs.indexOf(e)&&t.updateAboutForLevelID(e)}),this)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&new RegExp("--"+e).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),b.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=void 0,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),b.__super__.hide.apply(this)},loadLevelID:function(e){if(!this.testOption("noOutput")){u.getEventBaton().trigger("commandSubmitted","level "+e);var t=d.getLevel(e).name.en_US;l.levelSelected(t)}this.hide()},updateSolvedStatus:function(){this.seriesViews.forEach((function(e){e.updateSolvedStatus()}),this)},buildSequences:function(){this.seriesViews=[],this.getSequencesOnTab().forEach((function(e){this.seriesViews.push(new v({destination:this.$el,name:e,navEvents:this.navEvents}))}),this)}}),v=g.extend({tagName:"div",className:"seriesView box flex1 vertical",template:i.template($("#series-view").html()),events:{"click a.levelIcon":"click","mouseenter a.levelIcon":"enterIcon"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=d.getSequenceInfo(this.name),this.levels=d.getLevelsInSequence(this.name),this.levelIDs=[];var t=null;this.levels.forEach((function(e){null===t&&(t=this.formatLevelAbout(e.id)),this.levelIDs.push(e.id)}),this),this.destination=e.destination,this.JSON={displayName:c.getIntlKey(this.info,"displayName"),about:c.getIntlKey(this.info,"about")||" ",levelInfo:t,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){this.$("a.levelIcon").each((function(e,t){var o=$(t).attr("data-id");$(t).toggleClass("solved",d.isLevelSolved(o))}))},getEventID:function(e){var t=e.target;return $(t).attr("data-id")},setAbout:function(e){this.$("p.levelInfo").text(e)},enterIcon:function(e){var t=this.getEventID(e);this.updateAboutForLevelID(t)},updateAboutForLevelID:function(e){this.setAbout(this.formatLevelAbout(e))},formatLevelAbout:function(e){var t=d.getLevel(e);return this.getLevelNumberFromID(e)+": "+c.getName(t)},getLevelNumberFromID:function(e){return e.replace(/[^0-9]/g,"")},click:function(e){var t=this.getEventID(e);this.navEvents.trigger("clickedID",t)}});o.LevelDropdownView=b},{"../../levels":121,"../app":52,"../intl":67,"../log":73,"../stores/LevelStore":88,"../stores/LocaleStore":89,"../util":96,"../util/debounce":91,"../util/keyboard":98,"../views":106,backbone:1,q:29,underscore:47}],108:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../views").LeftRightView,r=e("../views").ModalAlert,s=e("../views/gitDemonstrationView").GitDemonstrationView,c=e("../views/builderViews").MarkdownPresenter,l=e("../util/keyboard").KeyboardListener,m=e("../util/debounce"),u=a.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:r,GitDemonstrationView:s,MarkdownPresenter:c},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||i.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=Object.assign({},a.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.navEvents.on("exit",this.finish,this),this.keyboardListener=new l({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return m(function(){this.navForward()}.bind(this),this.navEventDebounce,!0)},getNegFunc:function(){return m(function(){this.navBackward()}.bind(this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(!this.locked)return this.currentIndex===this.childViews.length-1?(this.hideViewIndex(this.currentIndex),void this.finish()):void this.navIndexChange(1)},navBackward:function(){0!==this.currentIndex&&this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),this.childViews.forEach((function(e){e.die()})),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');return new this.typeToConstructor[t](Object.assign({},e.options,{wait:!0}))},addNavToView:function(e,t){var o=new n({events:this.navEvents,destination:e.getDestination(),showLeft:0!==t,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(o,this)},render:function(){this.childViewJSONs.forEach((function(e,t){var o=this.createChildView(e);this.childViews.push(o),this.addNavToView(o,t)}),this)}});o.MultiView=u},{"../util/debounce":91,"../util/keyboard":98,"../views":106,"../views/builderViews":103,"../views/gitDemonstrationView":105,backbone:1,q:29}],109:[function(e,t,o){e("../util/errors").GitError;var i=e("underscore"),a=e("q"),n=e("backbone"),r=e("../views").ModalTerminal,s=e("../views").ContainedBase,c=e("../views").ConfirmCancelView,l=e("../intl");e("jquery-ui/ui/widget"),e("jquery-ui/ui/scroll-parent"),e("jquery-ui/ui/data"),e("jquery-ui/ui/widgets/mouse"),e("jquery-ui/ui/ie"),e("jquery-ui/ui/widgets/sortable"),e("jquery-ui/ui/plugin"),e("jquery-ui/ui/safe-active-element"),e("jquery-ui/ui/safe-blur"),e("jquery-ui/ui/widgets/draggable");var m=s.extend({tagName:"div",template:i.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.options=e,this.rebaseEntries=new d,e.toRebase.reverse(),e.toRebase.forEach((function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new u({id:t}),this.rebaseEntries.add(this.entryObjMap[t])}),this),this.container=new r({title:l.str("interactive-rebase-title")}),this.render(),this.show(),e.aboveAll&&$("#canvasHolder").css("display","none")},restoreVis:function(){$("#canvasHolder").css("display","inherit")},confirm:function(){this.die(),this.options.aboveAll&&this.restoreVis();var e=[];this.$("ul.rebaseEntries li").each((function(t,o){e.push(o.id)}));var t=[];e.forEach((function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])}),this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:Object.keys(this.rebaseMap).length,solutionOrder:this.options.initialCommitOrdering},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var o=this.$("ul.rebaseEntries");this.rebaseEntries.each((function(e){new h({el:o,model:e})}),this),o.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},cancel:function(){this.hide(),this.options.aboveAll&&this.restoreVis(),this.deferred.resolve([])},makeButtons:function(){var e=a.defer();e.promise.then(function(){this.confirm()}.bind(this)).fail(function(){this.cancel()}.bind(this)).done(),new c({destination:this.$(".confirmCancel"),deferred:e,disableCancelButton:!!this.options.aboveAll})}}),u=n.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),d=n.Collection.extend({model:u}),h=n.View.extend({tagName:"li",template:i.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",function(){this.toggle()}.bind(this))}});o.InteractiveRebaseView=m},{"../intl":67,"../util/errors":93,"../views":106,backbone:1,"jquery-ui/ui/data":8,"jquery-ui/ui/ie":9,"jquery-ui/ui/plugin":10,"jquery-ui/ui/safe-active-element":11,"jquery-ui/ui/safe-blur":12,"jquery-ui/ui/scroll-parent":13,"jquery-ui/ui/widget":14,"jquery-ui/ui/widgets/draggable":15,"jquery-ui/ui/widgets/mouse":16,"jquery-ui/ui/widgets/sortable":17,q:29,underscore:47}],110:[function(e,t,o){e("backbone");var i=e("q"),a=e("./index").Animation,n=e("./index").PromiseAnimation,r=e("../../util/constants").GRAPHICS,s={},c=function(e,t){var o=1*r.defaultAnimationTime,i=2*o;return{animation:function(){e.refreshTree(o),t.setBirth(),t.parentInFront(),e.visBranchesFront(),t.animateUpdatedPosition(i,"bounce"),t.animateOutgoingEdges(o)},duration:Math.max(o,i)}};s.genCommitBirthAnimation=function(e,t,o){if(!e)throw new Error("Need animation queue to add closure to!");var i=t.get("visNode"),n=c(o,i);e.add(new a({closure:n.animation,duration:n.duration}))},s.genCommitBirthPromiseAnimation=function(e,t){var o=e.get("visNode");return new n(c(t,o))},s.highlightEachWithPromise=function(e,t,o){return t.forEach(function(t){e=e.then(function(){return this.playHighlightPromiseAnimation(t,o)}.bind(this))}.bind(this)),e},s.playCommitBirthPromiseAnimation=function(e,t){var o=this.genCommitBirthPromiseAnimation(e,t);return o.play(),o.getPromise()},s.playRefreshAnimationAndFinish=function(e,t){var o=new n({closure:function(){e.refreshTree()}});o.play(),t.thenFinish(o.getPromise())},s.genRefreshPromiseAnimation=function(e){return new n({closure:function(){e.refreshTree()}})},s.playRefreshAnimationSlow=function(e){var t=r.defaultAnimationTime;return this.playRefreshAnimation(e,2*t)},s.playRefreshAnimation=function(e,t){var o=new n({duration:t,closure:function(){e.refreshTree(t)}});return o.play(),o.getPromise()},s.refreshTree=function(e,t){e.add(new a({closure:function(){t.refreshTree()}}))},s.genHighlightPromiseAnimation=function(e,t){var o=t.get("visBranch")||t.get("visNode")||t.get("visTag");if(!o)throw console.log(t),new Error("could not find vis object for dest obj");var i=e.get("visNode");return new n(function(e,t){var o=.66*r.defaultAnimationTime*2;return{animation:function(){e.highlightTo(t,o,"easeInOut")},duration:1.5*o}}(i,o))},s.playHighlightPromiseAnimation=function(e,t){var o=this.genHighlightPromiseAnimation(e,t);return o.play(),o.getPromise()},s.getDelayedPromise=function(e){var t=i.defer();return setTimeout(t.resolve,e||1e3),t.promise},s.delay=function(e,t){t=t||r.defaultAnimationTime,e.add(new a({closure:function(){},duration:t}))},o.AnimationFactory=s},{"../../util/constants":90,"./index":111,backbone:1,q:29}],111:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../../actions/GlobalStateActions"),r=e("../../util/constants").GRAPHICS,s=a.Model.extend({defaults:{duration:r.defaultAnimationTime,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1,promiseBased:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},thenFinish:function(e,t){e.then(function(){this.finish()}.bind(this)),e.fail((function(e){throw console.log("uncaught error",e),e})),this.set("promiseBased",!0),t&&t.resolve()},add:function(e){if(!(e instanceof s))throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),n.changeIsAnimating(!0),this.next()},finish:function(){n.changeIsAnimating(!1),this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length)this.finish();else{var o=e[t],i=o.get("duration");o.run(),this.set("index",t+1),setTimeout(function(){this.next()}.bind(this),i)}}}),l=a.Model.extend({defaults:{deferred:null,closure:null,duration:r.defaultAnimationTime},initialize:function(e){if(!e.closure&&!e.animation)throw new Error("need closure or animation");this.set("closure",e.closure||e.animation),this.set("duration",e.duration||this.get("duration")),this.set("deferred",e.deferred||i.defer())},getPromise:function(){return this.get("deferred").promise},play:function(){this.get("closure")(),setTimeout(function(){this.get("deferred").resolve()}.bind(this),this.get("duration"))},then:function(e){return this.get("deferred").promise.then(e)}});l.fromAnimation=function(e){return new l({closure:e.get("closure"),duration:e.get("duration")})},o.Animation=s,o.PromiseAnimation=l,o.AnimationQueue=c},{"../../actions/GlobalStateActions":49,"../../util/constants":90,backbone:1,q:29}],112:[function(e,t,o){var i=e("q"),a=e("../intl"),n=e("../util/constants").GRAPHICS,r=e("../util/debounce"),s=e("../stores/GlobalStateStore"),c=e("../visuals/visNode").VisNode,l=e("../visuals/visBranch").VisBranch,m=e("../visuals/visBranch").VisBranchCollection,u=e("../visuals/visTag").VisTag,d=e("../visuals/visTag").VisTagCollection,h=e("../visuals/visEdge").VisEdge,p=e("../visuals/visEdge").VisEdgeCollection;function g(t){t=t||{},this.options=t,this.visualization=t.visualization,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.tagCollection=t.tagCollection,this.visNodeMap={},this.visEdgeCollection=new p,this.visBranchCollection=new m,this.visTagCollection=new d,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.tagStackMap=null,this.upstreamBranchSet=null,this.upstreamTagSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.tagCollection.on("add",this.addTagFromEvent,this),this.tagCollection.on("remove",this.removeTag,this),this.deferred=[],this.flipFraction=.65;var o=e("../app"),i=this;this._onRefreshTree=function(){i.refreshTree()},o.getEvents().on("refreshTree",this._onRefreshTree,this)}g.prototype.defer=function(e){this.deferred.push(e)},g.prototype.deferFlush=function(){this.deferred.forEach((function(e){e()}),this),this.deferred=[]},g.prototype.resetAll=function(){this.visEdgeCollection.toArray().forEach((function(e){e.remove()}),this),this.visBranchCollection.toArray().forEach((function(e){e.remove()}),this),this.visTagCollection.toArray().forEach((function(e){e.remove()}),this),Object.values(this.visNodeMap).forEach((function(e){e.remove()}),this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visTagCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},g.prototype.tearDown=function(){this.resetAll(),this.paper.remove(),e("../app").getEvents().removeListener("refreshTree",this._onRefreshTree)},g.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},g.prototype.getVisualization=function(){return this.visualization},g.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},g.prototype.getScreenPadding=function(){var e=s.getFlipTreeY()?3:1.5;return{widthPadding:1.5*n.nodeRadius,topHeightPadding:n.nodeRadius*e,bottomHeightPadding:5*n.nodeRadius}},g.prototype.getPosBoundaries=function(){return this.gitEngine.hasOrigin()?{min:0,max:.5}:this.gitEngine.isOrigin()?{min:.5,max:1}:{min:0,max:1}},g.prototype.getFlipPos=function(){var e=this.getPosBoundaries(),t=e.min,o=e.max;return this.flipFraction*(o-t)+t},g.prototype.getIsGoalVis=function(){return!!this.options.isGoalVis},g.prototype.getLevelBlob=function(){return this.visualization.options.levelBlob||{}},g.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t,o,i,a,n=this.getScreenPadding(),r=function(e,t,o){return o+e*(t-2*o)}(e.x,this.paper.width,n.widthPadding),c=(t=e.y,o=this.paper.height,i=n.topHeightPadding,a=n.bottomHeightPadding,i+t*(o-a-i));return s.getFlipTreeY()&&(c=this.paper.height-c),{x:r,y:c}},g.prototype.animateAllAttrKeys=function(e,t,o,a){var r=i.defer(),s=function(i){i.animateAttrKeys(e,t,o,a)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),this.visTagCollection.each(s),Object.values(this.visNodeMap).forEach(s);var c=void 0!==o?o:n.defaultAnimationTime;return setTimeout((function(){r.resolve()}),c),r.promise},g.prototype.finishAnimation=function(e){if(!(e=e||1))throw new Error("need speed by time i finish animation "+e);var t=i.defer(),o=i.defer(),r=n.defaultAnimationTime,s=n.nodeRadius,c=a.str("solved-level"),l=null,m=function(){(l=this.paper.text(this.paper.width/2,this.paper.height/2,c)).attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",stroke:"#000","stroke-width":2,fill:"#000"}),l.animate({opacity:1},r)}.bind(this);return t.promise.then(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},1.1*r/e)}.bind(this)).then(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:2*s},1.5*r/e)}.bind(this)).then(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:.75*s},.5*r/e)}.bind(this)).then(function(){return m(),this.explodeNodes(e)}.bind(this)).then(function(){return this.explodeNodes(e)}.bind(this)).then(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},1.25*r)}.bind(this)).then(function(){return l.animate({opacity:0},r,void 0,void 0,(function(){l.remove()})),this.animateAllAttrKeys({},{})}.bind(this)).then((function(){o.resolve()})).fail((function(e){console.warn("animation error "+e)})).done(),t.resolve(),o.promise},g.prototype.explodeNodes=function(e){var t=i.defer(),o=[];Object.values(this.visNodeMap).forEach((function(t){o.push(t.getExplodeStepFunc(e))}));var a=setInterval((function(){var e=[];if(o.forEach((function(t){t()&&e.push(t)})),!e.length)return clearInterval(a),void t.resolve();o=e}),1/40);return t.promise},g.prototype.animateAllFromAttrToAttr=function(e,t,o){var i=function(i){var a=i.getID();o.includes(a)||e[a]&&t[a]&&i.animateFromAttrToAttr(e[a],t[a])};this.visBranchCollection.each(i),this.visEdgeCollection.each(i),this.visTagCollection.each(i),Object.values(this.visNodeMap).forEach(i)},g.prototype.genSnapshot=function(){this.fullCalc();var e={};return Object.values(this.visNodeMap).forEach((function(t){e[t.get("id")]=t.getAttributes()}),this),this.visBranchCollection.each((function(t){e[t.getID()]=t.getAttributes()}),this),this.visEdgeCollection.each((function(t){e[t.getID()]=t.getAttributes()}),this),this.visTagCollection.each((function(t){e[t.getID()]=t.getAttributes()}),this),e},g.prototype.refreshTree=function(e){this.gitReady&&this.gitEngine.rootCommit&&(this.fullCalc(),this.animateAll(e))},g.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},g.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},g.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},g.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcTagStacks(),this.calcDepth(),this.calcWidth()},g.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each((function(e){e.updateName()})),this.visTagCollection.each((function(e){e.updateName()}))},g.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet(),this.upstreamTagSet=this.gitEngine.getUpstreamTagSet()},g.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},g.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesn't have upstream branches!");return this.blendHuesFromBranchStack(t)},g.prototype.blendHuesFromBranchStack=function(e){var t=[];return e.forEach((function(e){var o=e.obj.get("visBranch").get("fill");if("hsb"!==o.slice(0,3)){var i=Raphael.color(o);o=(o="hsb("+String(i.h)+","+String(i.l))+","+String(i.s)+")"}t.push(o)})),function(e){var t=0,o=0,i=0,a=0,n=e.length;e.forEach((function(e){var n=e.split("(")[1];n=(n=n.split(")")[0]).split(","),i+=parseFloat(n[1]),a+=parseFloat(n[2]);var r=parseFloat(n[0])*Math.PI*2;t+=Math.cos(r),o+=Math.sin(r)})),t/=n,o/=n,i/=n,a/=n;var r=Math.atan2(o,t)/(2*Math.PI);r<0&&(r+=1);return"hsb("+String(r)+","+String(i)+","+String(a)+")"}(t)},g.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),o=this.upstreamBranchSet,i=this.upstreamHeadSet,a=this.upstreamTagSet;return o[t]?"branch":a[t]?"tag":i[t]?"head":"none"},g.prototype.calcTagStacks=function(){var e=this.gitEngine.getTags(),t={};e.forEach((function(e){var o=e.target.get("id");t[o]=t[o]||[],t[o].push(e),t[o].sort((function(e,t){var o=e.obj.get("id"),i=t.obj.get("id");return o.localeCompare(i)}))})),this.tagStackMap=t},g.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};e.forEach((function(e){var o=e.target.get("id");t[o]=t[o]||[],t[o].push(e),t[o].sort((function(e,t){var o=e.obj.get("id"),i=t.obj.get("id");return"main"==o||"main"==i?"main"==o?-1:1:o.localeCompare(i)}))})),this.branchStackMap=t},g.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit);var e=this.getPosBoundaries();this.assignBoundsRecursive(this.rootCommit,e.min,e.max)},g.prototype.maxWidthRecursive=function(e){var t=0;e.get("children").forEach((function(o){if(o.isMainParent(e)){var i=this.maxWidthRecursive(o);t+=i}}),this);var o=Math.max(1,t);return e.get("visNode").set("maxWidth",o),o},g.prototype.assignBoundsRecursive=function(e,t,o){var i=(o+t)/2;if(e.get("visNode").get("pos").x=i,0!==e.get("children").length){var a=o-t,n=0,r=e.get("children");r.forEach((function(t){t.isMainParent(e)&&(n+=t.get("visNode").getMaxWidthScaled())}),this);var s=t;r.forEach((function(t,o){if(t.isMainParent(e)){var i=t.get("visNode").getMaxWidthScaled()/n*a,r=s,c=r+i;this.assignBoundsRecursive(t,r,c),s=r+i}}),this)}},g.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);Object.values(this.visNodeMap).forEach((function(e){e.setDepthBasedOn(t,this.getHeaderOffset())}),this)},g.prototype.animateNodePositions=function(e){Object.values(this.visNodeMap).forEach((function(t){t.animateUpdatedPosition(e)}),this)},g.prototype.addBranchFromEvent=function(e,t,o){var i=function(){this.addBranch(e)}.bind(this);this.gitEngine&&this.gitReady?i():this.defer(i)},g.prototype.addBranch=function(e){var t=new l({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(function(){t.genGraphics(this.paper)}.bind(this))},g.prototype.addTagFromEvent=function(e,t,o){var i=function(){this.addTag(e)}.bind(this);this.gitEngine&&this.gitReady?i():this.defer(i)},g.prototype.removeTag=function(e,t,o){var i=function(){var t;this.visTagCollection.each((function(o){o.get("tag")==e&&(t=o)}),!0),t.remove(),this.removeVisTag(t)}.bind(this);this.gitEngine&&this.gitReady?i():this.defer(i)},g.prototype.addTag=function(e){var t=new u({tag:e,gitVisuals:this,gitEngine:this.gitEngine});this.visTagCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(function(){t.genGraphics(this.paper)}.bind(this))},g.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},g.prototype.removeVisTag=function(e){this.visTagCollection.remove(e)},g.prototype.removeVisNode=function(e){delete this.visNodeMap[e.getID()]},g.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},g.prototype.animateRefs=function(e){this.visBranchCollection.each((function(t){t.animateUpdatedPos(e)}),this),this.visTagCollection.each((function(t){t.animateUpdatedPos(e)}),this)},g.prototype.animateEdges=function(e){this.visEdgeCollection.each((function(t){t.animateUpdatedPath(e)}),this)},g.prototype.getMinLayers=function(){return this.options.smallCanvas?2:7},g.prototype.getDepthIncrement=function(e){return e=Math.max(e,this.getMinLayers()),(1-this.getHeaderOffset())/e},g.prototype.shouldHaveHeader=function(){return this.gitEngine.isOrigin()||this.gitEngine.hasOrigin()},g.prototype.getHeaderOffset=function(){return this.shouldHaveHeader()?.05:0},g.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var o=e.get("children"),i=t;return o.forEach((function(e){var o=this.calcDepthRecursive(e,t+1);i=Math.max(o,i)}),this),i},g.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},g.prototype.genResizeFunc=function(){this.resizeFunc=r(function(e,t){this.refreshTree()}.bind(this),200,!0)},g.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var o=new c({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=o,this.gitReady&&o.genGraphics(this.paper),o},g.prototype.addEdge=function(e,t){var o=this.visNodeMap[e],i=this.visNodeMap[t];if(!o||!i)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var a=new h({tail:o,head:i,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(a),this.gitReady&&a.genGraphics(this.paper)},g.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront(),this.visTagsFront()},g.prototype.visNodesFront=function(){Object.values(this.visNodeMap).forEach((function(e){e.toFront()}))},g.prototype.visBranchesFront=function(){this.visBranchCollection.each((function(e){e.nonTextToFront(),e.textToFront()})),this.visBranchCollection.each((function(e){e.textToFrontIfInStack()}))},g.prototype.visTagsFront=function(){this.visTagCollection.each((function(e){e.nonTextToFront(),e.textToFront()})),this.visTagCollection.each((function(e){e.textToFrontIfInStack()}))},g.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},g.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),Object.values(this.visNodeMap).forEach((function(e){e.genGraphics(this.paper)}),this),this.visEdgeCollection.each((function(e){e.genGraphics(this.paper)}),this),this.visBranchCollection.each((function(e){e.genGraphics(this.paper)}),this),this.visTagCollection.each((function(e){e.genGraphics(this.paper)}),this),this.zIndexReflow()},o.GitVisuals=g},{"../app":52,"../intl":67,"../stores/GlobalStateStore":87,"../util/constants":90,"../util/debounce":91,"../visuals/visBranch":115,"../visuals/visEdge":116,"../visuals/visNode":117,"../visuals/visTag":118,q:29}],113:[function(e,t,o){var i=e("backbone").Model.extend({removeKeys:function(e){e.forEach((function(e){this.get(e)&&this.get(e).remove()}),this)},animateAttrKeys:function(e,t,o,i){e=Object.assign({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var a=this.getAttributes();e.include.forEach((function(e){a[e]=Object.assign({},a[e],t)})),e.exclude.forEach((function(e){delete a[e]})),this.animateToAttr(a,o,i)}});o.VisBase=i},{backbone:1}],114:[function(e,t,o){var i=e("backbone").Model.extend({removeKeys:function(e){e.forEach((function(e){this.get(e)&&this.get(e).remove()}),this)},getNonAnimateKeys:function(){return["stroke-dasharray"]},getIsInOrigin:function(){return!!this.get("gitEngine")&&this.get("gitEngine").isOrigin()},animateToAttr:function(e,t,o){if(0!==t){var i=void 0!==t?t:this.get("animationSpeed"),a=o||this.get("animationEasing");this.setAttr(e,!1,i,a)}else this.setAttr(e,!0)},setAttrBase:function(e,t,o,i,a){e.forEach((function(e){o?this.get(e).attr(t[e]):(this.get(e).stop(),this.get(e).animate(t[e],i,a),this.getNonAnimateKeys().forEach((function(o){t[e]&&void 0!==t[e][o]&&this.get(e).attr(o,t[e][o])}),this)),t.css&&$(this.get(e).node).css(t.css)}),this)},animateAttrKeys:function(e,t,o,i){e=Object.assign({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var a=this.getAttributes();e.include.forEach((function(e){a[e]=Object.assign({},a[e],t)})),e.exclude.forEach((function(e){delete a[e]})),this.animateToAttr(a,o,i)}});o.VisBase=i},{backbone:1}],115:[function(e,t,o){var i=e("backbone"),a=e("../util/constants").GRAPHICS,n=e("../visuals/visBase").VisBase,r=e("../graph/treeCompare"),s=function(){var e=Math.random();return"hsb("+String(e)+",0.6,1)"},c=n.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:a.rectFill,stroke:a.rectStroke,"stroke-width":a.rectStrokeWidth,offsetX:4.75*a.nodeRadius,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:a.defaultAnimationTime,animationEasing:a.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){if(this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");"HEAD"==e?(this.set("isHead",!0),this.set("flip",-1),this.refreshOffset(),this.set("fill",a.headRectFill)):"main"!==e&&this.set("fill",s())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode");return this.set("flip",this.getFlipValue(e,t)),this.refreshOffset(),t.getScreenCoords()},getDashArray:function(){return this.get("gitVisuals").getIsGoalVis()?this.getIsLevelBranchCompared()?"":"--":""},getIsGoalAndNotCompared:function(){return!!this.get("gitVisuals").getIsGoalVis()&&!this.getIsLevelBranchCompared()},getIsLevelBranchCompared:function(){if(this.getIsMain())return!0;var e=this.get("gitVisuals").getLevelBlob();return!r.onlyMainCompared(e)},getIsMain:function(){return"main"==this.get("branch").get("id")},getFlipValue:function(e,t){var o=this.get("gitVisuals").getFlipPos(),i=t.get("pos").x>o;return"C0"===e.get("id")?-1:this.get("isHead")?i?this.isBranchStackEmpty()?-1:1:this.isBranchStackEmpty()?1:-1:i?-1:1},refreshOffset:function(){var e=4.75*a.nodeRadius;1===this.get("flip")?(this.set("offsetY",-33),this.set("offsetX",e-10)):(this.set("offsetY",33),this.set("offsetX",e-10))},getArrowTransform:function(){return 1===this.get("flip")?"t-2,-20R-35":"t2,20R-35"},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return e.forEach((function(e,o){e.obj==this.get("branch")&&(t=o)}),this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},isBranchStackEmpty:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return!e||0===e.length},getCommitID:function(){var e=this.get("branch").get("target");return"branch"===e.get("type")&&(e=e.get("target")),e.get("id")},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return void 0===e?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*a.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=(this.get("flip"),this.getTextSize());return{x:e.x-.5*t.w-this.get("hPad"),y:e.y-.5*t.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,o){return{x:e.x+t,y:e.y+o}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},o=this.get("flip"),i=e(this.getCommitPosition(),o*this.get("arrowOffsetFromCircleX"),0),a=e(i,o*this.get("arrowLength"),-this.get("arrowHeight")),n=e(i,o*this.get("arrowLength"),this.get("arrowHeight")),r=e(a,o*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),s=e(n,o*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),c=e(r,49*o,0),l=e(s,49*o,0),m="";return m+="M"+t(c)+" ",[r,a,i,n,s,l].forEach((function(e){m+="L"+t(e)+" "}),this),m+="z"},getTextSize:function(){var e=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},t=this.get("text").node;if(this.get("isHead")){var o=t.getBoundingClientRect();return e({w:o.width,h:o.height})}var i=0;return this.getBranchStackArray().forEach((function(e){i=Math.max(i,function(e){var t=e.get("text")?e.get("text").node:null;return null===t?0:t.getBoundingClientRect().width}(e.obj.get("visBranch")))})),e({w:i,h:t.getBoundingClientRect().height})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad");return{w:e.w+2*t,h:e.h+2*o}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad"),i=this.getBranchStackLength();return{w:e.w+2*t,h:e.h*i*1.1+2*o}},getIsRemote:function(){return this.get("branch").getIsRemote()},getName:function(){var e=this.get("branch").getName(),t=this.get("branch")===this.gitEngine.HEAD.get("target"),o=this.getIsRemote(),i=this.gitEngine.getIsHg();return"HEAD"===e&&i&&(e="."),e+(!t||this.getIsInOrigin()||o?"":"*")},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){0!==this.getBranchStackIndex()&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||1==this.getBranchStackLength()||0!==this.getBranchStackIndex()?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},handleModeChange:function(){},genGraphics:function(e){var t=this.getTextPosition(),o=this.getName(),i=e.text(t.x,t.y,String(o));i.attr({"font-size":14,"font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",opacity:this.getTextOpacity()}),this.set("text",i);var a=this.getAttributes(),n=this.getRectPosition(),r=this.getRectSize(),s=e.rect(n.x,n.y,r.w,r.h,8).attr(a.rect);this.set("rect",s);var c=this.getArrowPath(),l=e.path(c).attr(a.arrow);this.set("arrow",l);["text","rect","arrow"].forEach((function(e){$(this.get(e).node).css(a.css)}),this),this.attachClickHandlers(),s.toFront(),i.toFront()},attachClickHandlers:function(){this.get("gitVisuals").options.noClick||[this.get("rect"),this.get("text"),this.get("arrow")].forEach((function(e){e.click(this.onClick.bind(this))}),this)},shouldDisableClick:function(){return this.get("isHead")&&!this.gitEngine.getDetachedHead()},onClick:function(){if(!this.shouldDisableClick()){var t="git checkout "+this.gitEngine.resolveNameNoPrefix(this.get("branch"));e("../app").getEventBaton().trigger("commandSubmitted",t)}},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:0!==this.getBranchStackIndex()?0:1},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getIsGoalAndNotCompared()?0===this.getBranchStackIndex()?.7:.3:1},getStrokeWidth:function(){return this.getIsGoalAndNotCompared()?this.get("stroke-width")/5:this.get("stroke-width")},getAttributes:function(){var e=this.getTextOpacity();this.updateName();var t=this.getTextPosition(),o=this.getRectPosition(),i=this.getRectSize(),a=this.getArrowPath(),n=this.getDashArray();return{css:{cursor:this.shouldDisableClick()?"auto":"pointer"},text:{x:t.x,y:t.y,opacity:e},rect:{x:o.x,y:o.y,width:i.w,height:i.h,opacity:this.getNonTextOpacity(),fill:this.getFill(),stroke:this.get("stroke"),"stroke-dasharray":n,"stroke-width":this.getStrokeWidth()},arrow:{path:a,opacity:this.getNonTextOpacity(),fill:this.getFill(),stroke:this.get("stroke"),transform:this.getArrowTransform(),"stroke-dasharray":n,"stroke-width":this.getStrokeWidth()}}},animateUpdatedPos:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},setAttr:function(e,t,o,i){this.setAttrBase(["text","rect","arrow"],e,t,o,i)}}),l=i.Collection.extend({model:c});o.VisBranchCollection=l,o.VisBranch=c,o.randomHueString=s},{"../app":52,"../graph/treeCompare":65,"../util/constants":90,"../visuals/visBase":114,backbone:1}],116:[function(e,t,o){var i=e("backbone"),a=e("../util/constants").GRAPHICS,n=e("../visuals/visBase").VisBase,r=e("../stores/GlobalStateStore"),s=n.extend({defaults:{tail:null,head:null,animationSpeed:a.defaultAnimationTime,animationEasing:a.defaultEasing},validateAtInit:function(){["tail","head"].forEach((function(e){if(!this.get(e))throw new Error(e+" is required!")}),this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var o=e.getScreenCoords(),i=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(o,i)},genSmoothBezierPathStringFromCoords:function(e,t){var o=r.getFlipTreeY()?-1:1,i=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=function(e,t,i){return i=i||a.curveControlPointOffset,{x:e.x,y:e.y+o*i*t}},s=function(e,t,i){return{x:e.x+t,y:e.y+o*i}};e=n(e,-1,this.get("tail").getRadius()),t=n(t,1,1.15*this.get("head").getRadius());var c="";c+="M"+i(e)+" ",c+="C",c+=i(n(e,-1))+" ",c+=i(n(t,1))+" ",c+=i(t);var l=a.arrowHeadSize||10;return c+=" L"+i(s(t,-l,l)),c+=" L"+i(s(t,l,l)),c+=" L"+i(t),c+="C",c+=i(n(t,1))+" ",c+=i(n(e,-1))+" ",c+=i(e)},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return a.visBranchStrokeColorNone},setOpacity:function(e){e=void 0===e?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),o=e.path(t).attr({"stroke-width":a.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});o.toBack(),this.set("path",o)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,tag:1,head:a.edgeUpstreamHeadOpacity,none:a.edgeUpstreamNoneOpacity};if(void 0===t[e])throw new Error("bad stat");return t[e]},getAttributes:function(){return{path:{path:this.getBezierCurve(),opacity:this.getOpacity()}}},animateUpdatedPath:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},animateToAttr:function(e,t,o){0!==t?(this.get("path").toBack(),this.get("path").stop(),this.get("path").animate(e.path,void 0!==t?t:this.get("animationSpeed"),o||this.get("animationEasing"))):this.get("path").attr(e.path)}}),c=i.Collection.extend({model:s});o.VisEdgeCollection=c,o.VisEdge=s},{"../stores/GlobalStateStore":87,"../util/constants":90,"../visuals/visBase":114,backbone:1}],117:[function(e,t,o){e("backbone");var i=e("../util/constants").GRAPHICS,a=e("../visuals/visBase").VisBase,n=a.extend({defaults:{depth:void 0,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:i.defaultAnimationTime,animationEasing:i.defaultEasing,fill:i.defaultNodeFill,"stroke-width":i.defaultNodeStrokeWidth,stroke:i.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e,t){if(void 0===this.get("depth"))throw new Error("no depth yet!");this.get("pos").y=this.get("depth")*e+t},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,tag:1,head:.3,none:.1};if(void 0===t[e])throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,tag:1,head:i.upstreamHeadOpacity,none:i.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(void 0===e[t])throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),o=this.getOpacity(),a=this.getIsInOrigin()?i.originDash:"";return{circle:{cx:e.x,cy:e.y,opacity:o,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),"stroke-dasharray":a,stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:o}}},animatePositionTo:function(e,t,o){var i=this.getAttributes(),a=e.getAttributes();i.circle=a.circle,i.text=a.text,this.animateToAttr(i,t,o)},highlightTo:function(e,t,o){var i=e.get("fill"),a={circle:{fill:i,stroke:i,"stroke-dasharray":"","stroke-width":5*this.get("stroke-width")},text:{}};this.animateToAttr(a,t,o)},animateUpdatedPosition:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},animateToSnapshot:function(e,t,o){e[this.getID()]&&this.animateToAttr(e[this.getID()],t,o)},setAttr:function(e,t,o,i){this.setAttrBase(["text","circle"],e,t,o,i)},animateToAttr:function(e,t,o){a.prototype.animateToAttr.apply(this,arguments);var i=void 0!==t?t:this.get("animationSpeed");o||this.get("animationEasing");"bounce"==o&&e.circle&&void 0!==e.circle.cx&&e.text&&void 0!==e.text.x&&(this.get("circle").animate(e.circle.cx,i,"easeInOut"),this.get("text").animate(e.text.x,i,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||i.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=e[this.get("commit").get("parents")[0].get("visNode").getID()];this.get("circle").attr({opacity:0,r:0,cx:t.circle.cx,cy:t.circle.cy}),this.get("text").attr({opacity:0,x:t.text.x,y:t.text.y});var o={x:t.circle.cx,y:t.circle.cy};this.setOutgoingEdgesBirthPosition(o)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){this.get("outgoingEdges").forEach((function(t){t.setOpacity(e)}))},animateOutgoingEdgesToAttr:function(e,t,o){this.get("outgoingEdges").forEach((function(t){var o=e[t.getID()];t.animateToAttr(o)}),this)},animateOutgoingEdges:function(e,t){this.get("outgoingEdges").forEach((function(o){o.animateUpdatedPath(e,t)}),this)},animateOutgoingEdgesFromSnapshot:function(e,t,o){this.get("outgoingEdges").forEach((function(i){var a=e[i.getID()];i.animateToAttr(a,t,o)}),this)},setOutgoingEdgesBirthPosition:function(e){this.get("outgoingEdges").forEach((function(t){var o=t.get("head").getScreenCoords(),i=t.genSmoothBezierPathStringFromCoords(e,o);t.get("path").stop(),t.get("path").attr({path:i,opacity:0})}),this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return"head"==e?i.headRectFill:"tag"==e||"none"==e?i.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(!this.get("gitVisuals").options.noClick){var t="git checkout "+this.get("commit").get("id"),o=e("../app");[this.get("circle"),this.get("text")].forEach((function(e){e.click((function(){o.getEventBaton().trigger("commandSubmitted",t)})),$(e.node).css("cursor","pointer")}))}},setOpacity:function(e){e=void 0===e?1:e;["circle","text"].forEach((function(t){this.get(t).attr({opacity:e})}),this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),this.removeAllEdges()},removeAllEdges:function(){this.get("outgoingEdges").forEach((function(e){e.remove()}),this)},getExplodeStepFunc:function(e){if(!e)throw new Error("need speed by now");var t=this.get("circle"),o=20/e,i=Math.PI+1*Math.random()*Math.PI,a=.2*e,n=.01*e,r=o*Math.cos(i),s=o*Math.sin(i),c=t.attr("cx"),l=t.attr("cy"),m=this.gitVisuals.paper.width,u=this.gitVisuals.paper.height-t.attrs.r,d=.8/e;return function(){return((c+=1*(r-=n*r))<0||c>m)&&(r=d*-r,c=c<0?0:m),((l+=1*(s+=1*a-n*s))<0||l>u)&&(s=d*-s,l=l<0?0:u),t.attr({cx:c,cy:l}),!(r*r+s*s<.1&&Math.abs(l-u)<=.1)}},makeCircle:function(e){var t=this.getScreenCoords();return e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle)},makeText:function(e){var t=this.getTextScreenCoords();return e.text(t.x,t.y,String(this.get("id")))},genGraphics:function(){var e=this.gitVisuals.paper,t=this.makeCircle(e),o=this.makeText(e);o.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",opacity:this.getOpacity()}),this.set("circle",t),this.set("text",o),this.attachClickHandlers()}});o.VisNode=n},{"../app":52,"../util/constants":90,"../visuals/visBase":114,backbone:1}],118:[function(e,t,o){var i=e("backbone"),a=e("../util/constants").GRAPHICS,n=e("../visuals/visBase").VisBase,r=e("../graph/treeCompare"),s=n.extend({defaults:{pos:null,text:null,rect:null,isHead:!1,fill:a.tagFill,stroke:a.tagStroke,"stroke-width":a.tagStrokeWidth,offsetX:a.nodeRadius,offsetY:a.nodeRadius,vPad:4,hPad:4,animationSpeed:a.defaultAnimationTime,animationEasing:a.defaultEasing},validateAtInit:function(){if(!this.get("tag"))throw new Error("need a Tag!")},getID:function(){return this.get("tag").get("id")},initialize:function(){if(this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),!this.gitEngine)throw new Error("asd wtf");this.get("tag").set("visTag",this)},getCommitPosition:function(){return this.gitEngine.getCommitFromRef(this.get("tag")).get("visNode").getScreenCoords()},getDashArray:function(){return this.get("gitVisuals").getIsGoalVis()?this.getIsLevelTagCompared()?"":"--":""},getIsGoalAndNotCompared:function(){return!!this.get("gitVisuals").getIsGoalVis()&&!this.getIsLevelTagCompared()},getIsLevelTagCompared:function(){var e=this.get("gitVisuals").getLevelBlob();return!r.onlyMainCompared(e)},getTagStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getTagStackArray(),t=-1;return e.forEach((function(e,o){e.obj==this.get("tag")&&(t=o)}),this),t},getTagStackLength:function(){return this.get("isHead")?1:this.getTagStackArray().length},isTagStackEmpty:function(){var e=this.gitVisuals.tagStackMap[this.getCommitID()];return!e||0===e.length},getCommitID:function(){return this.get("tag").get("target").get("id")},getTagStackArray:function(){var e=this.gitVisuals.tagStackMap[this.getCommitID()];return void 0===e?(this.gitVisuals.calcTagStacks(),this.getTagStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getTagStackIndex();return{x:e.x+this.get("offsetX"),y:e.y+t*a.multiTagY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.getTextSize();return{x:e.x-this.get("hPad"),y:e.y-.5*t.h-this.get("vPad")}},getTextSize:function(){var e,t=this.get("text").node,o=0;return this.getTagStackArray().forEach((function(e){o=Math.max(o,function(e){var t=e.get("text")?e.get("text").node:null;return null===t?0:t.getBoundingClientRect().width}(e.obj.get("visTag")))})),(e={w:o,h:t.getBoundingClientRect().height}).w||(e.w=75),e.h||(e.h=20),e},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad");return{w:e.w+2*t,h:e.h+2*o}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad"),i=this.getTagStackLength();return{w:e.w+2*t,h:e.h*i+2*o}},getIsRemote:function(){return this.get("tag").getIsRemote()},getName:function(){var e=this.get("tag").getName();this.getIsRemote(),this.gitEngine.getIsHg();return e},nonTextToFront:function(){this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){0!==this.getTagStackIndex()&&this.get("text").toFront()},remove:function(){this.removeKeys(["text","rect"]),this.gitVisuals.removeVisTag(this)},handleModeChange:function(){},genGraphics:function(e){var t=this.getTextPosition(),o=this.getName(),i=e.text(t.x,t.y,String(o));i.attr({"font-size":14,"font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",opacity:this.getTextOpacity(),"text-anchor":"start"}),this.set("text",i);var a=this.getAttributes(),n=this.getRectPosition(),r=this.getRectSize(),s=e.rect(n.x,n.y,r.w,r.h,8).attr(a.rect);this.set("rect",s);["text","rect"].forEach((function(e){$(this.get(e).node).css(a.css)}),this),this.attachClickHandlers(),s.toFront(),i.toFront()},attachClickHandlers:function(){this.get("gitVisuals").options.noClick||[this.get("rect"),this.get("text")].forEach((function(e){e.click(this.onClick.bind(this))}),this)},shouldDisableClick:function(){return this.get("isHead")&&!this.gitEngine.getDetachedHead()},onClick:function(){if(!this.shouldDisableClick()){var t="git checkout "+this.get("tag").get("id");e("../app").getEventBaton().trigger("commandSubmitted",t)}},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:0!==this.getTagStackIndex()?0:1},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getIsGoalAndNotCompared()?0===this.getTagStackIndex()?.7:.3:1},getStrokeWidth:function(){return this.getIsGoalAndNotCompared()?this.get("stroke-width")/5:this.get("stroke-width")},getAttributes:function(){var e=this.getTextOpacity();this.updateName();var t=this.getTextPosition(),o=this.getRectPosition(),i=this.getRectSize(),a=this.getDashArray();return{css:{cursor:this.shouldDisableClick()?"auto":"pointer"},text:{x:t.x,y:t.y,opacity:e},rect:{x:o.x,y:o.y,width:i.w,height:i.h,opacity:this.getNonTextOpacity(),fill:this.get("fill"),stroke:this.get("stroke"),"stroke-dasharray":a,"stroke-width":this.getStrokeWidth()}}},animateUpdatedPos:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},setAttr:function(e,t,o,i){this.setAttrBase(["text","rect"],e,t,o,i)}}),c=i.Collection.extend({model:s});o.VisTagCollection=c,o.VisTag=s,o.randomHueString=function(){var e=Math.random();return"hsb("+String(e)+",0.7,1)"}},{"../app":52,"../graph/treeCompare":65,"../util/constants":90,"../visuals/visBase":114,backbone:1}],119:[function(e,t,o){(function(t){(function(){var i=e("backbone"),a=e("../models/collections"),n=a.CommitCollection,r=a.BranchCollection,s=a.TagCollection,c=e("../util/eventBaton").EventBaton,l=e("../visuals").GitVisuals,m=i.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=Object.assign({},i.Events),this.containerElement=e.containerElement;var o=this,a=e.containerElement||$("#canvasHolder")[0];new Raphael(a,200,200,(function(){var i=this;t.nextTick((function(){o.paperInitialize(i,e)}))}))},paperInitialize:function(o,i){this.treeString=i.treeString,this.paper=o;var a=e("../app");this.eventBaton=i.noKeyboardInput?new c({noInput:!0}):a.getEventBaton(),this.commitCollection=new n,this.branchCollection=new r,this.tagCollection=new s,this.gitVisuals=new l({commitCollection:this.commitCollection,branchCollection:this.branchCollection,tagCollection:this.tagCollection,paper:this.paper,noClick:this.options.noClick,isGoalVis:this.options.isGoalVis,smallCanvas:this.options.smallCanvas,visualization:this});var m=e("../git").GitEngine;this.gitEngine=new m({collection:this.commitCollection,branches:this.branchCollection,tags:this.tagCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",(()=>this.myResize())),this.$el.parents(".ui-draggable").on("drag",function(e,t){this.customEvents.trigger("drag",e,t),this.myResize()}.bind(this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),t.nextTick(this.fadeTreeIn.bind(this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},clearOrigin:function(){delete this.originVis},makeOrigin:function(e){return this.originVis=new m(Object.assign({},this.options,{noKeyboardInput:!0,noClick:!0,treeString:e.treeString})),this.originVis.customEvents.on("paperReady",function(){var e=$(this.paper.canvas).css("z-index");this.originVis.setTreeIndex(e)}.bind(this)),this.originVis},originToo:function(e,t){if(this.originVis){var o=function(){this.originVis[e].apply(this.originVis,t)}.bind(this);this.originVis.paper?o():this.originVis.customEvents.on("paperReady",o)}},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e),this.originToo("setTreeIndex",arguments)},setTreeOpacity:function(e){0===e&&(this.shown=!1),$(this.paper.canvas).css("opacity",e),this.originToo("setTreeOpacity",arguments)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,this.paper&&($(this.paper.canvas).animate({opacity:1},this.getAnimationTime()),this.originToo("fadeTreeIn",arguments))},fadeTreeOut:function(){this.shown=!1,this.paper&&this.paper.canvas&&$(this.paper.canvas).animate({opacity:0},this.getAnimationTime()),this.originToo("fadeTreeOut",arguments)},hide:function(){this.fadeTreeOut(),setTimeout(function(){$(this.paper.canvas).css("visibility","hidden")}.bind(this),this.getAnimationTime()),this.originToo("hide",arguments)},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(this.fadeTreeIn.bind(this),10),this.originToo("show",arguments),this.myResize()},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1),this.originToo("showHarsh",arguments),this.myResize()},resetFromThisTreeNow:function(e){this.treeString=e;var t=this.getOriginInTreeString(e);if(t){var o=this.gitEngine.printTree(t);this.originToo("resetFromThisTreeNow",[o])}},getOriginInTreeString:function(e){return JSON.parse(unescape(e)).originTree},reset:function(e){var t=e||this.treeString;if(this.setTreeOpacity(0),t?this.gitEngine.loadTreeFromString(t):this.gitEngine.defaultInit(),this.fadeTreeIn(),this.originVis)if(t){var o=this.getOriginInTreeString(t);this.originToo("reset",[JSON.stringify(o)])}else this.originToo("reset",arguments)},tearDown:function(e){e=e||{},this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper,this.originToo("tearDown",arguments)},die:function(){this.fadeTreeOut(),setTimeout(function(){this.shown||this.tearDown({fromDie:!0})}.bind(this),this.getAnimationTime()),this.originToo("die",arguments)},myResize:function(){if(this.paper){var e=this.el,t=e.getBoundingClientRect(),o=t.width,i=t.height;if(this.containerElement)$(this.paper.canvas).css({position:"absolute"});else{var a=this.$el.offset().left,n=this.$el.offset().top;$(this.paper.canvas).css({position:"absolute",left:a+"px",top:n+"px"})}this.paper.setSize(o,i),this.gitVisuals.canvasResize(o,i),this.originToo("myResize",arguments)}}});o.Visualization=m}).call(this)}).call(this,e("_process"))},{"../app":52,"../git":63,"../models/collections":75,"../util/eventBaton":95,"../visuals":112,_process:22,backbone:1}],120:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C7","id":"main"},"bugWork":{"target":"C2","id":"bugWork"}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',solutionCommand:"git branch bugWork main^^2^",startTree:'{"branches":{"main":{"target":"C7","id":"main"}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Multiple parents",zh_CN:"两个 parent 节点",fr_FR:"Parents multiples",de_DE:"Mehrere Vorgänger",ja:"複数の親",es_AR:"Múltiples padres",es_MX:"Múltiples padres",es_ES:"Múltiples padres",pt_BR:"Múltiplos pais",gl:"Múltiples pais",zh_TW:"多個 parent commit",ru_RU:"Здоровая семья, или несколько родителей",ko:"다수의 부모",uk:"Декілька батьків",vi:"Nhiều cha lắm mẹ",sl_SI:"Več Staršev",ta_IN:"ஒன்றுக்கு மேற்ப்பட்ட துவக்க கிலைகள்",it_IT:"Genitori multipli",pl:"Wielu rodziców"},hint:{en_US:"Use `git branch bugWork` with a target commit to create the missing reference.",de_DE:"Nutze `git branch bugWork` mit einem Ziel-Commit um die fehlende Referenz zu erstellen.",ja:"`git branch bugWork`を対象のコミットと組み合わせて使い、欠如しているリファレンスを作成しましょう",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_MX:"Use `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`。",ru_RU:"`git branch bugWork` на нужном коммите поможет создать нужную ссылку.",ko:"`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요",uk:'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання',vi:"Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định",sl_SI:"Uporabi `git branch bugWork` s ciljnim commitom za ustvarjanje manjkajoče reference.",ta_IN:"`git branch bugWork` பயன்படுத்தி தேவைப்படும் கமிட்டுடன் இழந்த இணைப்பை உருவாக்குக.",it_IT:"Scrivi `git branch bugWork` con un commit per creare il riferimento mancante.",pl:"Użyj `git branch bugWork` na docelowym commicie, aby utworzyć brakującą referencję."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Specifying Parents","","Like the `~` modifier, the `^` modifier also accepts an optional number after it.","","Rather than specifying the number of generations to go back (what `~` takes), the modifier on `^` specifies which parent reference to follow from a merge commit. Remember that merge commits have multiple parents, so the path to choose is ambiguous.","",'Git will normally follow the "first" parent upwards from a merge commit, but specifying a number with `^` changes this default behavior.',"","Enough talking, let's see it in action.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have a merge commit. If we checkout `main^` without the modifier, we will follow the first parent after the merge commit. ","","(*In our visuals, the first parent is positioned directly above the merge commit.*)"],afterMarkdowns:["Easy -- this is what we are all used to."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now let's try specifying the second parent instead..."],afterMarkdowns:["See? We followed the other parent upwards."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["The `^` and `~` modifiers can make moving around a commit tree very powerful:"],afterMarkdowns:["Lightning fast!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Even crazier, these modifiers can be chained together! Check this out:"],afterMarkdowns:["The same movement as before, but all in one command."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Put it to practice","","To complete this level, create a new branch at the specified destination.","","Obviously it would be easy to specify the commit directly (with something like `C6`), but I challenge you to use the modifiers we talked about instead!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Vorgänger ansteuern","","Wie der Operator `~` akzeptiert auch der Operator `^` eine optionale Anzahl.","","Anstatt der Anzahl von Schritten, die zurückgegangen werden soll (das ist das, was man bei `~` angibt), bezeichnet die Anzahl nach `^` welchem Vorgänger bei einem Merge-Commit gefolgt werden soll. Du erinnerst dich, dass ein Merge-Commit mehrere Vorgänger hat; es gilt also aus diesen auszuwählen.","",'Normalerweise folgt Git dem "ersten" Vorgänger des Merge-Commit, aber durch Angabe einer Zahl nach dem `^` lässt sich dieses Verhalten ändern.',"","Aber genug gequatscht, schauen wir es uns in Aktion an.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier sehen wir einen Merge-Commit. Wenn wir einen Checkout von `main^` ohne Zahl machen, wird Git auf den ersten Vorgänger des Commits zurückgehen. ","","*(In unserer Darstellung befindet sich der erste Vorgänger direkt über dem Merge-Commit.)*"],afterMarkdowns:["Simpel -- so kennen wir das."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jetzt versuchen wir mal stattdessen den zweiten Vorgänger anzugeben ..."],afterMarkdowns:["Gesehen? Wir gehen zu dem anderen Vorgänger zurück."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Die Operatoren `^` und `~` geben uns eine Menge Möglichkeiten für das Navigieren durch den Commit-Baum:"],afterMarkdowns:["Bämm!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Noch abgefahrener: Die beiden Operatoren können verkettet werden. Aufgepasst:"],afterMarkdowns:["Gleicher Ablauf wie zuvor, nur alles in einem Befehl."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Setzen wir's um","","Erstelle einen neuen Branch an dem angegebenen Ziel, um diesen Level abzuschließen.","","Es ist natürlich möglich den Commit einfach direkt anzugeben (also mit sowas wie `C6`), aber ich fordere dich heraus stattdessen die relativen Operatoren zu benutzen!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Détermine les parents","","Comme le symbole `~`, le symbole `^` accepte un numéro après lui.","","Au lieu d'entrer le nombre de générations à remonter (ce que `~` fait), le symbole `^` détermine quel parent est à remonter. Attention, un merge commit a deux parents ce qui peut porter à confusion.","",'Normalement Git suit le "premier" parent pour un commit/merge, mais avec un numéro après `^` le comportement par défaut est modifié.',"","Assez de bla bla, passons à l'action",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous avons un commit/merge. Si nous faisons checkout `main^` sans le symbole, on obtient le premier parent suivant ce commit. ","","(*Dans notre vue, le premier parent se situe juste au dessus du merge.*)"],afterMarkdowns:["Facile -- c'est ce que nous faisons tout le temps."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous allons spécifier le deuxième parent à la place."],afterMarkdowns:["Vous voyez ? Nous suivons le second parent."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Les symboles `^` et `~` permettent de se déplacer de façon très efficace :"],afterMarkdowns:["Boum, vitesse du tonnerre !"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Encore plus fou, ces symboles peuvent être enchainés ! Regardez cela :"],afterMarkdowns:["Le même résultat, mais en une seule commande."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Un peu de pratique","","Pour réussir le niveau, créez une nouvelle branche à la destination indiquée.","","Évidement ce serait plus rapide de spécifier le commit (C6 par exemple), mais faites-le plutôt avec les symboles de déplacement dont nous venons de parler !"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 选择 parent 提交记录","","操作符 `^` 与 `~` 符一样,后面也可以跟一个数字。","","但是该操作符后面的数字与 `~` 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个 parent 提交。还记得前面提到过的一个合并提交有两个 parent 提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。","","Git 默认选择合并提交的“第一个” parent 提交,在操作符 `^` 后跟一个数字可以改变这一默认行为。","","废话不多说,举个例子。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这里有一个合并提交记录。如果不加数字修改符直接切换到 `main^`,会回到第一个 parent 提交记录。","","(*在我们的图示中,第一个 parent 提交记录是指合并提交记录正上方的那个提交记录。*)"],afterMarkdowns:["这正是我们都已经习惯的方法。"],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在来试试选择另一个 parent 提交……"],afterMarkdowns:["看见了吧?我们回到了另外一个 parent 提交上。"],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用 `^` 和 `~` 可以自由地在提交树中移动,非常给力:"],afterMarkdowns:["快若闪电!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["更厉害的是,这些操作符还支持链式操作!试一下这个:"],afterMarkdowns:["和前面的结果一样,但只用了一条命令。"],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 课后小练习","","要完成此关,在指定的目标位置创建一个新的分支。","","很明显可以简单地直接使用提交记录的哈希值(比如 `C6`),但我要求你使用刚刚讲到的相对引用修饰符!"]}}]},es_AR:{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. Recordá 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:["Acá tenemos un commit de merge. Si hacemos checkout de `main^`, 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 algo habitual."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Más loco aún, ¡estos modificadores pueden encadenarse entre sí! Mirá 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 main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Ponelo en práctica","","Para completar este nivel, creá 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."]}}]},es_MX:{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:["Acá tenemos un commit de merge. Si hacemos checkout de `main^`, 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 main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Más loco aún, ¡Éstos 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 main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Pongámoslo 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."]}}]},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 `main^`, 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 main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main; 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 main; 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:[{type:"ModalAlert",options:{markdowns:["### Especificando pais","","Assim como o modificador `~`, o modificador `^` também aceita um número opcional depois dele.","","Em vez de especificar o número de gerações a voltar (que é o que o `~` faz), o modificador no `^` especifica qual referência de pai a ser seguida a partir de um commit de merge. Lembre-se que commits de merge possuem múltiplos pais, então o caminho a seguir é ambíguo.","",'O Git normalmente subirá o "primeiro" pai de um commit de merge, mas especificar um número após o `^` muda esse comportamento padrão.',"","Basta de conversa, vejamos o operador em ação.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui temos um commit de merge. Se fizermos checkout em `main^` sem especificar um número, vamos seguir o primeiro pai acima do commit de merge. ","","(*Em nossa visualização, o primeiro pai é aquele diretamente acima do commit de merge.*)"],afterMarkdowns:["Fácil -- isso é aquilo com o que já estamos acostumados."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora vamos, em vez disso, especificar o segundo pai..."],afterMarkdowns:["Viu? Subimos para o outro pai."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Os modificadores `^` e `~` podem tornar a movimentação ao redor da árvore de commits muito poderosa:"],afterMarkdowns:["Rápido como a luz!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ainda mais louco, esses modificadores podem ser encadeados em conjunto! Veja só:"],afterMarkdowns:["O mesmo movimento que o anterior, mas tudo em um único comando."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Coloque em prática","","Para completar este nível, crie um novo ramo no destino especificado.","","Obviamente seria mais fácil especificar o commit diretamente (com algo como `C6`), mas em vez disso eu desafio você a usar os modificadores sobre os quais falamos!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Especificando pais","","Tanto o modificador `~`, como o modificador `^` aceptan un número opcional despois del.","","Mellor que especificar o número de commits que percorrer cara atrás (que é o que o `~` fai), o modificador sobre `^` especifica qué referencia do pai vai ser seguida dende o commit con merge. Lembra qué os commits do merge teñen varios pais, entón o camiño a seguir é ambiguo.","",'Git normalmente seguirá ó "primeiro" pai de un commit de merge, pero especificando un número co `^` muda o comportamento do pai.',"","Xa chega de faladoiros, vexamos o comando en acción.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí temos un commit do merge. Se fixéramos checkout en `main^` sen especificar un número, imos seguir ó primeiro pai enriba do commit do merge. ","","(*Na nosa vista, o primeiro pai é aquel directamente enriba do commit do merge.*)"],afterMarkdowns:["Sinxelo, eso é aquelo co que xa estamos acostumados."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora imos, en vez de iso, especificar o segundo pai..."],afterMarkdowns:["¿Viches? Subimos para o outro pai."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Os modificadores `^` e `~` pódense mover ao redor da árbore de commits con moito poder:"],afterMarkdowns:["Rápido coma a luz!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aínda máis tolo, eses modificadores poden ser encadeados en conxunto! Olla ahí:"],afterMarkdowns:["O mesmo movemento feito antes, pero feito nun só comando."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Pono na práctica","","Para completar este nível, crea unha nova rama no destino especificado.","","Obviamente sería máis sinxelo especificar o commit diretamente (algo como `C6`), pero en vez de facer eso, ¡podes usar os modificadores dos que falamos!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["### 選擇 parent commit","","和 `~` 符號一樣,`^` 符號的後面也可以接一個(可選的)數字。","","這不是用來指定往上回去幾代(`~` 的作用),`^` 後面所跟的數字表示我要選擇哪一個 parent commit。還記得一個 merge commit 可以有多個 parent commit 吧,所以當我們要選擇走到哪一個 parent commit 的時候就會比較麻煩了。","",'git 預設會選擇 merge commit 的"第一個" parent commit,使用 `^` 後面接一個數字可以改變這個預設的行為。',"","廢話不多說,舉一個例子。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡有一個 merge commit。如果後面不加數字的話會直接切換到`main^`,也就是說會回到第一個 parent commit。","","(*在我們的圖示中,第一個 parent commit 是指 merge commit 正上方的那一個 parent commit。*)"],afterMarkdowns:["簡單吧!這就是預設的情況。"],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在來試試選擇第二個 parent commit..."],afterMarkdowns:["看到了嗎?我們回到了第二個 parent commit。"],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用`^`和`~`可以自由在 commit tree 中移動:"],afterMarkdowns:["簡直就像是電光石火!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["再瘋狂點,這些符號可以被連在一起!試一下這個:"],afterMarkdowns:["和前面的結果一樣,但只用了一條指令。"],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 練習一下","","要完成這一關,在指定的目標位置上面建立一個新的 branch。","","很明顯可以直接使用 commit 的 hash 值(比如 `C6`),但我要求你使用剛剛講到的相對引用的符號!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Определение родителей","","Так же как тильда (~), каретка (^) принимает номер после себя.","","Но в отличие от количества коммитов, на которые нужно откатиться назад (как делает `~`), номер после `^` определяет, на какого из родителей мерджа надо перейти. Учитывая, что мерджевый коммит имеет двух родителей, просто указать ^ нельзя.","",'Git по умолчанию перейдёт на "первого" родителя коммита, но указание номера после `^` изменяет это поведение.',"","Посмотрим, как это работает.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вот мерджевый коммит. Если мы перейдём на `main^` без номера, то попадём на первого родителя.","","(*На нашей визуализации первый родитель находится прямо над коммитом*)"],afterMarkdowns:["Просто - прямо как мы любим."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Теперь попробуем перейти на второго родителя."],afterMarkdowns:["Вот. Мы на втором родительском коммите."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Модификаторы `^` и `~` сильно помогают перемещаться по дереву коммитов:"],afterMarkdowns:["Быстро как Флэш!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Более того, эти модификаторы можно применять вместе. Например, так:"],afterMarkdowns:["Сделаем то же самое, что перед этим, только в одну команду."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### На практике","","Чтобы пройти этот уровень, создай ветку в указанном месте.","","Очевидно, что (в данном случае) будет проще указать коммит напрямую, но для того, чтобы закрепить пройденное, используй модификаторы, о которых мы говорили выше."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### 親の指定","","`~`修飾子と同じように、`^`修飾子も後に任意の番号を置くことができます。","","指定した数だけ遡る(これは`~`の場合の機能)のではなく、`^`はマージコミットからどの親を選択するかを指定できます。マージコミットは複数の親で構成されるので、選択する経路が曖昧であることを覚えておいてください。","","Gitは通常、マージコミットから「一つ目」の親、マージされた側のブランチの親を選びます。しかし、`^`で数を指定することでこのデフォルトの動作を変えることができます。","","では、実際の動作を見ていきましょう。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["ここに、マージコミットがあります。もし、指定無しに`main^`でチェックアウトした場合、私たちは一番目の親に移動することになります。","","(*私たちのツリーでは、一番目の親はマージコミットのちょうど上に位置しています。*)"],afterMarkdowns:["簡単ですね -- これがデフォルトの動作になります。"],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["それでは代わりに二つ目の親を指定してみます"],afterMarkdowns:["見ましたか?私たちは他の親に移ることができました。"],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`^`修飾子と`~`修飾子は、コミット履歴を辿るのを強力に補助してくれます:"],afterMarkdowns:["超高速ですね!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["より素晴らしいことに、これらの修飾子は連鎖させることができます!これを見てください:"],afterMarkdowns:["前と同じ移動ですが、なんと一つのコマンドでできています。"],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 練習課題","","このレベルをクリアするためには、まず新しいブランチを指定したように作成します。","","明らかに直接コミットを指定した方が(`C6`というように)簡単ですが、私は今まで述べたような修飾子を使う方法で挑戦してもらいたいと思います。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### 부모를 선택하기","","`~` 수식처럼 `^` 수식 또한 뒤에 숫자를 추가 할 수 있습니다.","","몇개의 세대를 돌아갈지 정하는 것 대신(`~`의 기능) `^`수식은 병합이된 커밋에서 어떤 부모를 참조할지 선택할 수 있습니다. 병합된 커밋들은 다수의 부모를 가지고 있다는것을 기억하시나요? 어떤 부모를 선택할지 예측할 수가 없습니다.","",'Git은 보통 병합된 커밋에서 "첫" 부모를 따라갑니다. 하지만 `^`수식을 숫자와 함께 사용하면 앞의 디폴트 동작대로가 아닌 다른 결과가 나타납니다.',"","이만 줄이고, 직접 확인해봅시다.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 병합된 커밋이 있습니다. 우리가 `main`를 수식없이 체크아웃한다면 병합된 커밋의 첫 부모를 따라 올라갈 것입니다. ","","(*화면에서는 첫 부모는 병합된 커밋 바로 위에 위치해 있습니다.*)"],afterMarkdowns:["간단하죠 -- 우리한테 익숙한 모습입니다."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["자 이제 두번째 부모를 선택해봅시다..."],afterMarkdowns:["보이나요? 다른 부모를 선택해 올라갔습니다."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`^`수식과 `~`수식을 이용해 커밋트리에서 효과적으로 움직일 수 있습니다.:"],afterMarkdowns:["빛처럼 빠르게 말이죠!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["더 대단한것은 이 수식들은 같이 사용할 수 있다는 겁니다! 확인해봅시다:"],afterMarkdowns:["앞과 같은 움직임이지만 하나의 명령으로 표현되었습니다."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 직접 확인해봅시다","","이 레벨을 완료하기 위해서 정해진 목적지에 새 브랜치를 생성하세요.","","물론 커밋을 직접 특정지어주면 아주 쉽겠지만(`C6`과 같이), 수식을 익혀볼겸 배운것을 사용해 도전해 봅시다!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Вибираємо Попередників","","Так само як і модифікатор `~`, модифікатор `^` також приймає необов’язкове число після нього.","","Замість того, щоб вказувати кількість генерацій щоб переміститись назад (те що робить `~`), число після `^` вказує на яке батьківське посилання мерджу потрібно перейти. Зауважте що так як мерджевий коміт має декілька батьків, використання '^' без числа є неоднозначним.","",'Git зазвичай перейде на "першого" з батьків вверх з мерджевого коміту, але вказання числа після `^` змінює цю поведінку. ',"","Годі ляси точити, перевірмо як це працює в дії.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ось ми маємо мерджевий коміт. Якщо зробимо checkout `main^` без числа, ми потрапимо на першого з предків ","","(*В нашій візуалізації перший предок знаходиться прямо над мерджевим комітом*)"],afterMarkdowns:["Легко -- те до чого ми всі звикли."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер спробуймо натомість вказати другого батька..."],afterMarkdowns:["Бачиш? Ми перейшли до другого батька вверх."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Модифікатори `^` та `~` дозволяють легко пересуватися деревом комітів:"],afterMarkdowns:["Супер швидко!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Більше того, ці модифікатори можна використовувати разом! Заціни:"],afterMarkdowns:["Те саме, що й перед цим, але однією командою."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Практика","","Щоб завершити цей рівень, створи нову гілку на вказаному місці.","","Очевидно, що в данному випадку досить легко вказати коміт напряму (щось на зразок checkout `C6`), але для закріплення матеріалу використай модифікатори, про які ми щойно говорили!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Tìm về cội nguồn","","Cũng giống ký hiệu `~`, ta cũng có thể thêm số theo sau ký hiệu `^`.","","Nhưng mà không giống như (`~`) con số theo sau là số lượng thế hệ commit, con số theo sau `^` chỉ định commit cha từ commit merge. Hãy nhớ rằng commit merge có nhiều cha, cho nên chọn cha nào cũng khá là mơ hồ.","",'Thông thường thì sẽ chọn cha "đầu tiên" từ commit merge, nhưng nếu sau dấu `^` có một con số thì cách hành xử sẽ khác đi.',"","Không nói dông dài nữa, làm thử một ví dụ nào.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ở đây ta có 1 commit merge. Nếu ta dùng lệnh `main^` mà không bổ nghĩa cho nó, ta sẽ đi ngược lên commit cha đầu tiên của merge commit. ","","(*Trong hình minh họa bên trái thì commit cha đầu tiên được xếp thẳng hàng ngay phía trên của commit merge.*)"],afterMarkdowns:["Dễ dàng -- đó là cách mà ta thường làm."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào bây giờ hãy chỉ định commit cha thứ hai thử..."],afterMarkdowns:["Thấy chứ? Ta đã leo lên commit cha khác lúc trước."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dùng bổ ngữ `^` và `~` cho ta khả năng di chuyển trên cây lịch sử:"],afterMarkdowns:["Nhanh như chớp!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Thâm chí còn ghê gớm hơn khi ta kết hợp chúng với nhau! Hãy xem thử:"],afterMarkdowns:["Cùng con đường như lúc trước, nhưng chỉ cần 1 dòng lệnh."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Áp dụng thực hành nào","","Để hoàn thành cấp độ này, hãy tạo ra một nhánh mới ở vị trí chỉ định.","","Dùng cách chỉ định trực tiếp commit (như là dùng `C6` chẳng hạn) thì dễ quá, nhưng thử thách ở đây là dùng các bổ ngữ đã học ở trên!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Določanje Staršev","","Tako kot `~` modifikator, tudi `^` modifikator sprejme opcijsko število na koncu.","","Raje kot podajanje števila generacij, za katere se hočemo premakniti nazaj (kot pri `~`), modifikator `^` pove kateremu staršu oz. njegovi referenci naj sledi iz merge commita. Zapomni si, da imajo merge commiti več staršev, zato je pot nejasna.","",'Git bo ponavadi sledil "prvemu" staršu navzgor po merge commitu, ampak določitev števila s `^` spremeni privzeto obnašanje.',"","Dovolj govorjenja, poglejmo stvar v akciji.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tukaj imamo merge commit. Če checkoutamo `main^` brez modifikatorjev, bomo sledili prvem staršu po merge commitu. ","","(* V naši vizualizaciji, je postavljen prvi starš direktno nad merge commitom.)"],afterMarkdowns:["Enostavno -- tega smo vsi navajeni."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sedaj pa poizkusimo določiti raje drugega starša ..."],afterMarkdowns:["Vidiš? Sledili smo drugemu staršu navzgor."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Modifikatorja `^` in `~` naredita sprehajanje po drevesu zelo učinkovito:"],afterMarkdowns:["Bliskovito!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Še bolj noro, te modifikatorji so lahko povezani skupaj! Poglej to:"],afterMarkdowns:["Isto gibanje kot prej, ampak vse z enim ukazom."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Preizkusi v praksi","","Za dokončanje te stopnje, ustvari nov brench na določeni destinaciji.","","Seveda bi bilo lažje izbrati commit direktno (npr. s `C6`), ampak te izzivam, da namesto tega poizkusiš z modifikatorji o katerih smo govorili!"]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["### துவக்க கிலையை குறிக்க","","`~` மாற்றியை போல, `^` மாற்றியும் தேவைப்படின் உள்ளீடாக ஒரு எண்யை ஏற்றுக்கொள்ளும், ஆனால் அது கட்டாயம் அல்ல.","","அந்த எண் (`~` போல்) முந்தய கிளை இணைப்புகளுக்கு பின்னோக்கி செல்வதை குறிக்காமல், தற்ப்போதிய கமிட் எந்த கிளை துவக்கத்துடன் இணைக்க வேண்டுமோ அதனை `^`-இன் உள்ளீடு குறிக்கிரது. தொகுப்பு கமிட்கள் ஒன்றுக்கும் மேற்ப்பட்ட மூல கிளைகளை கொண்டு இருக்கும் எனவே இது குழப்பமானதாக இருக்கும்.","",'கிட் பொதுவாக தொகுப்பு கமிட்டில் இருந்து மேல் நோக்கி உள்ள "முதல்" கிளைக்கு பின் இணைப்பை உருவாக்கும், ஆனால் `^`-இற்க்கு கொடுக்கப்படு் உள்ளீட்டு எண் வேரு கிளை முனைப்புகளுடன் இணைக்கி உதவும்.',"","விவரங்கள் போதும், அதை செயலில் பார்ப்போம்.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இங்கே நாம்மிடன் ஒரு தொகுப்பு கமிட் உள்ளது. இப்போது நாம் checkout `main^` மட்டும் எந்த ஒரு எண்னும் குறிப்பிடாமல் கட்டலையிட்டால் அது கமிட்டின் நேரடி மூல கிளையுடன் இணைப்பை உருவாக்கும். ","","(*இங்குள்ள வரைபடத்தில், நேரடி மூழம் தொகுப்பு கமிட்டின் நேர் எதிர் திசையில் மேலக காட்ட பட்டுள்ளது.*)"],afterMarkdowns:["அது பரவாயில்லை -- இது நாம் அனைவரும் பழக்கமாகிவிட்டது."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது நாம் மாற்றாக இரண்டாவது துவக்க கிளையை குறிக்க செய்வோம்..."],afterMarkdowns:["கவனத்தீர்களா? நாம் அடுத்த கிளை மூழப்புள்ளியின் கீழ் இணைப்பை உருவாக்கி உள்ளொம்."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`^` மற்றும் `~` மாற்றிகள் கமிட் மர அமைப்பை சுலபமாக சுற்றி வர உதவுகின்றன:"],afterMarkdowns:["மின்னல் வேகம்!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["மேலும் ஒரு எளிய வழி, இந்த மாற்றிகளை நாம் இணைத்தும் பயன் படுத்தலாம்! இதைப்பாருங்க்:"],afterMarkdowns:["மேல் கண்ட அதே வழி மாற்றம்தான் ஆனால் அனைத்தும் ஒரே கட்டளையில்."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### இப்போது நீங்கள் பயிற்சி செய்யுங்கள்","","இந்த படி நிலையை நிரைவு செய்ய, குறிப்பிட்டபட்டுள்ள பிரிவில் ஒரு கிளையை உருவாக்குங்கள்.","","வெளிப்படையாக சொல்லப்போனால் (`C6` போன்று) நேரடியாக கிளையை குறிப்பிடமுடியுன், இருப்பினும் இந்த சவால் மேல் குறிப்பிட்ட மாற்றிகளை பயன் படுத்தும் வகையில் அமைக்க பட்டுள்ளது!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Określanie rodziców","","Podobnie jak modyfikator `~`, modyfikator `^` również przyjmuje po sobie opcjonalną liczbę.","","Zamiast określać liczbę pokoleń do cofnięcia się (co robi `~`), modyfikator `^` określa, do którego rodzica należy się odwołać po wykonaniu merge commita. Pamiętaj, że scalanie ma wielu rodziców, więc wybór ścieżki nie jest jednoznaczny.","",'Git zazwyczaj podąża za "pierwszym" rodzicem w górę od commitu scalającego, ale określenie liczby za pomocą `^` zmienia to domyślne zachowanie.',"","Dość gadania - zobaczmy, jak to działa.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutaj mamy merge commit. Jeśli checkoutujemy `main^` bez liczby na końcu, przejdziemy do pierwszego rodzica po merge commicie. ","","(*Na naszych wizualizacjach pierwszy rodzic jest umieszczony bezpośrednio nad commitem scalającym.*)"],afterMarkdowns:["Spokojnie - do tego wszyscy jesteśmy przyzwyczajeni."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A teraz spróbujmy określić drugiego rodzica..."],afterMarkdowns:["Spójrz. Przenieślismy się do drugiego rodzica."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Modyfikatory `^` i `~` mogą dodać supermoce do poruszania się po drzewie commitów:"],afterMarkdowns:["Co za prędkość!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jeszcze bardziej szalone jest to, że modyfikatory mogą być ze sobą łączone! Zobacz:"],afterMarkdowns:["Ten sam ruch co poprzednio, ale wszystko w jednym poleceniu."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Zastosuj to w praktyce","","Aby ukończyć ten poziom, utwórz nową gałąź w określonym miejscu docelowym.","","Oczywiście łatwo byłoby określić commit bezpośrednio (coś jak `C6`), ale spróbuj użyć modyfikatorów, o których mówiliśmy przed chwilą!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Speficicare i genitori","","Come il modificatore `~` , anche il modificatore `^` accetta un numero (opzionale) dopo di esso.","","Invece che specificare il numero di generazioni di cui tornare indietro (come accade con `~`), il modificatore `^` specifica quale genitore seguire partendo da un merge commit (di fusione). Ricorda che i merge commit hanno genitori multipli, quindi il percorso da seguire può essere ambiguo.","","Git normalmente segue il primo genitore partendo da un merge commit, ma specificando un numero con `^` cambia questo comportamento predefinito.","","Basta parlare, vediamolo in azione.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Qui abbiamo un merge commit. Se facciamo checkout `main^` senza modificatore, seguiremo il primo genitore dopo il merge commit. ","","(*Nell'immagine, il primo genitore è situato direttamente al di sopra al merge commit.*)"],afterMarkdowns:["Facile -- questo è quello a cui siamo abituati."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora invece proviamo a specificare il secondo genitore..."],afterMarkdowns:["Vedi? Abbiamo seguito il secondo genitore verso l'alto."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["I modificatori `^` e `~` riescono a farci muovere lungo l'albero dei commit in modo agevole:"],afterMarkdowns:["Super veloce!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ancora più sorprendente, questi modificatori possono essere concatenati tra loro! Dai un occhiata:"],afterMarkdowns:["Stessi passaggi di prima, ma tutto con un comando."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Mettilo in pratica","","Per completare questo livello, crea un nuovo ramo alla destinazione specificata.","","Sarebbe facile specificare il commit direttamente (con qualcosa del tipo `C6`), ovvio, ma ti sfido invece a utilizare i modificatori di cui abbiamo parlato!"]}}]}}}},{}],121:[function(e,t,o){o.levelSequences={intro:[e("./intro/commits").level,e("./intro/branching").level,e("./intro/merging").level,e("./intro/rebasing").level],rampup:[e("./rampup/detachedHead").level,e("./rampup/relativeRefs").level,e("./rampup/relativeRefs2").level,e("./rampup/reversingChanges").level],move:[e("./rampup/cherryPick").level,e("./rampup/interactiveRebase").level],mixed:[e("./mixed/grabbingOneCommit").level,e("./mixed/jugglingCommits").level,e("./mixed/jugglingCommits2").level,e("./mixed/tags").level,e("./mixed/describe").level],advanced:[e("./rebase/manyRebases").level,e("./advanced/multipleParents").level,e("./rebase/selectiveRebase").level],remote:[e("./remote/clone").level,e("./remote/remoteBranches").level,e("./remote/fetch").level,e("./remote/pull").level,e("./remote/fakeTeamwork").level,e("./remote/push").level,e("./remote/fetchRebase").level,e("./remote/lockedMain").level],remoteAdvanced:[e("./remote/pushManyFeatures").level,e("./remote/mergeManyFeatures").level,e("./remote/tracking").level,e("./remote/pushArgs").level,e("./remote/pushArgs2").level,e("./remote/fetchArgs").level,e("./remote/sourceNothing").level,e("./remote/pullArgs").level]};var i=o.sequenceInfo={intro:{displayName:{en_US:"Introduction Sequence",de_DE:"Einführung",ja:"まずはここから",fr_FR:"Séquence d'introduction",es_AR:"Secuencia introductoria",es_MX:"Secuencia introductoria",es_ES:"Secuencia introductoria",pt_BR:"Sequência introdutória",gl:"Secuencia introductoria",zh_CN:"基础篇",zh_TW:"基礎篇",ko:"git 기본",ru_RU:"Введение",uk:"Вступ",vi:"Giới Thiệu Chuỗi Luyện Tập",sl_SI:"Uvodno Zaporedje",pl:"Wprowadzenie",it_IT:"Sequenza introduttiva",ta_IN:"அறிமுக தொடர் வரிசை"},about:{en_US:"A nicely paced introduction to the majority of git commands",de_DE:"Eine gut abgestimmte Einführung in die wichtigsten Git-Befehle",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_MX:"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 主要命令",zh_TW:"循序漸進地介紹 git 主要命令",ko:"git의 주요 명령어를 깔끔하게 알려드립니다",ru_RU:"Хорошо подобранное введение в основные команды git",uk:"Гарно підібране введення в основні команди git",vi:"Từng bước làm quen với phần lớn lệnh điều khiển Git",sl_SI:"Prijeten uvod v git ukaze",pl:"Krótkie wprowadzenie do większości poleceń Gita",it_IT:"Un'introduzione graduale ai principali comandi Git",ta_IN:"பெரும்பாலான கிட் கட்டளைகளுக்கு ஒரு நல்ல அறிமுகம்"}},rampup:{displayName:{en_US:"Ramping Up",de_DE:"Aufstieg",ja:"次のレベルに進もう",fr_FR:"Montée en puissance",es_AR:"Acelerando",es_MX:"Acelerando",es_ES:"Acelerando",pt_BR:"Acelerando",gl:"Alixeirando",zh_CN:"高级篇",zh_TW:"進階篇",ru_RU:"Едем дальше",uk:"Їдемо далі",ko:"다음 단계로",vi:"Tăng Tốc",sl_SI:"Prva Stopnička",pl:"Rozkręcenie",it_IT:"Diamoci dentro",ta_IN:"சற்று அதிகப்படுத்த"},about:{en_US:"The next serving of 100% git awesomes-ness. Hope you're hungry",de_DE:"Eine Portion Git-Wahnsinn zum Thema Navigation",ja:"更にgitの素晴らしさを堪能しよう",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_MX:"La próxima ración de 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 的超棒特性了,快来吧!",zh_TW:"接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!",ru_RU:"Следующая порция абсолютной git-крутотенюшки. Проголодались?",uk:"Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли",ko:"git은 아주 멋져요. 왜 멋진지 알려드립니다",vi:"Tận hưởng khẩu phần tuyệt hảo của Git. Hi vọng bạn còn đói",sl_SI:"Naslednja porcija git izjemnosti. Upam, da si lačen",pl:"Następna porcja gita jest niesamowita. Mam nadzieję, że jesteś głodny",it_IT:"Porzione con il 100% di grandiosità Git, spero tu sia affamato",ta_IN:"அடித்தது கிட்டின் 100% அற்புதங்கள். நீங்கள் ஆர்வமாக உள்ளீர்கள் என்று நம்புகிறேன்"}},remote:{tab:"remote",displayName:{en_US:"Push & Pull -- Git Remotes!",de_DE:"Push & Pull -- entfernte Repositorys",ja:"Push及びPullコマンド -- Gitリモート",fr_FR:"Push & Pull -- Dépôts Git distants !",es_AR:"Push & Pull -- Git Remotes!",es_MX:"Push & Pull -- Repositorios remotos en Git (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 远程仓库!",zh_TW:"Push & Pull -- Git Remotes!",ru_RU:"Push & Pull - удалённые репозитории в Git!",uk:"Push & Pull -- віддалені репозиторії в Git!",ko:"Push & Pull -- Git 원격 저장소!",vi:"Push & Pull -- Git Remotes!",sl_SI:"Push & Pull -- Oddaljeni Git",pl:"Push & Pull -- Zdalne repozytoria",it_IT:"Push & Pull -- Git Remoto!",ta_IN:"Push & Pull -- கிட் Remotes!"},about:{en_US:"Time to share your 1's and 0's kids; coding just got social",fr_FR:"Il est le temps de partager vos 1 et vos 0 les enfants, le code vient de devenir social.",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; programar se volvió social!",es_MX:"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:"是时候分享你的代码了,让编码变得社交化吧",zh_TW:"是時候分享你的程式碼了",ru_RU:"Настало время поделиться своими единичками и нулями. Время коллективного программирования",uk:"Настав час поділитися своїми нулями та одиничками; соціальне програмування",ko:"내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!",vi:"Chia sẻ đứa con tinh thần '0' và '1' của bạn; mã đã đến với cộng đồng",sl_SI:"Čas za deljenje tvojih 1 in 0; kodiranje je pravkar postalo socialno",pl:"Czas podzielić się swoimi dziećmi 1 i 0; kodowanie właśnie stało się społeczne",it_IT:"Ragazzi è arrivato il momento di condividere i vostri 0 e 1; programmare diventa social",ta_IN:"உங்களின் 1'கள் மற்றும் 0'களை பகிர்வதற்கான நேரம் குழந்தைகளே; குறியிடுதல் (coding) பொது உடமை ஆக்க பட்டுள்ளது"}},remoteAdvanced:{tab:"remote",displayName:{en_US:"To Origin And Beyond -- Advanced Git Remotes!",de_DE:"Bis zum origin und noch weiter",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_MX:"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 远程仓库高级操作",zh_TW:"關於 origin 和其它 repo,git remote 的進階指令",ru_RU:"Через origin – к звёздам. Продвинутое использование Git Remotes",uk:"Через origin – до зірок. Прогресивне використання Git Remotes",ko:'"origin"그 너머로 -- 고급 Git 원격 저장소',vi:"Về Với Cội Nguồn Và Vươn Xa Hơn -- Git Remote Nâng Cao",sl_SI:"Do Origina In Naprej -- Napredni Oddaljeni Git",pl:"Do źródła i dalej -- zaawansowane zdalne repozytoria",it_IT:"Verso Origin e oltre -- Git Remoto Avanzato!",ta_IN:"ஆரம்பம் மற்றும் அதர்க்கு மேல் -- மேம்பட்ட கிட் ரிமோட்டுகள்!"},about:{en_US:"And you thought being a benevolent dictator would be fun...",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_MX:"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:"做一名仁慈的独裁者一定会很有趣……",zh_TW:"而且你會覺得做一個仁慈的獨裁者會很有趣...",de_DE:"Git Remotes für Fortgeschrittene",ru_RU:"Весело было быть всесильным мудрым правителем...",uk:"А ти думав, що бути всесильним диктатором весело...",ko:"자비로운 독재자가 되는게 재밌을 줄 알았겠지만...",vi:"Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui...",sl_SI:"In ti si mislil, da je biti dobronamerni diktator zabavno ...",pl:"A myślałeś, że bycie życzliwym dyktatorem byłoby fajne...",it_IT:"E tu credevi che essere un dittatore benevolo fosse divertente...",ta_IN:"நீங்கள் ஒரு அக்கரை உள்ள சர்வாதிகாரியாக இருப்பது வேடிக்கையாக இருக்கும் என்று நினைத்தீர்களா..."}},move:{displayName:{en_US:"Moving Work Around",de_DE:"Code umherschieben",fr_FR:"Déplacer le travail",es_AR:"Moviendo el trabajo por ahí",es_MX:"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:"コードの移動",ko:"코드 이리저리 옮기기",zh_CN:"移动提交记录",zh_TW:"調整提交順序",ru_RU:"Перемещаем труды туда-сюда",uk:"Переміщуємо роботу туди-сюди",vi:"Di Chuyển Commit",sl_SI:"Premikanje Dela Naokrog",pl:"Przenoszenie pracy",it_IT:"Spostare il lavoro in giro",ta_IN:"வேலைகளை பகிர்ந்து கொள்வது"},about:{en_US:'"Git" comfortable with modifying the source tree :P',de_DE:"Gewöhn dich daran, den Git-Baum zu verändern",fr_FR:"Soyez à l'aise pour modifier l'arbre Git",es_AR:"Preparate para modificar el directorio fuente :P",es_MX:"Ponte cómodo al modificar el directorio fuente :P",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:"작업 트리를 수정하는건 식은죽 먹기지요 이제",ja:"話題のrebaseってどんなものだろう?って人にオススメ",zh_CN:"自由修改提交树",zh_TW:"自由修改提交樹",ru_RU:"Не стесняйтесь менять историю",uk:"Не соромимось змінювати історію",vi:'Dễ dàng chỉnh sửa cây lịch sử với "Git" :P',sl_SI:'Spretno "Git" premikanje po drevesu :P',pl:"Git dobrze radzi sobie z modyfikacją drzewa źródłowego :P",it_IT:'Modificare l\'albero con facilità. "GIT" ready :P',ta_IN:'"கிட்" மூல மரத்தை மாற்றுவதில் சிரந்தது :P'}},mixed:{displayName:{en_US:"A Mixed Bag",de_DE:"Ein Kessel Buntes",ja:"様々なtips",fr_FR:"Un assortiment",es_AR:"Bolsa de gatos",es_MX:"De todo un poco",es_ES:"Un poco de todo",pt_BR:"Sortidos",gl:"Todo mesturado",ko:"종합선물세트",zh_CN:"杂项",zh_TW:"活用 git 的指令",ru_RU:"Сборная солянка",uk:"Всяке",vi:"Vài Mẹo Linh Tinh",sl_SI:"Mešana Vreča",pl:"Po trochu wszystkiego",it_IT:"Un po' di tutto",ta_IN:"ஒரு கலப்பு பை"},about:{en_US:"A mixed bag of Git techniques, tricks, and tips",de_DE:"Eine bunte Mischung von Techniken, Tipps und Tricks",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_MX:"Un recopilatorio 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을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다",zh_CN:"Git 技术、技巧与贴士大集合",zh_TW:"git 的技術,招數與技巧",ru_RU:"Ассорти из приёмов работы с Git, хитростей и советов",uk:"Різні прийоми роботи з Git, хитрощі та поради",vi:"Các kỹ thuật, bí quyết, và mẹo vặt hữu ích",sl_SI:"Mešana vreča Git tehnik, trikov in nasvetov",pl:"Po trochu wszystkiego. Wskazówki i triki",it_IT:"Comandi Git assortiti, trucchi e consigli",ta_IN:"கிட் நுட்பங்கள், தந்திரங்கள் மற்றும் உதவிக்குறிப்புகளின் கலவையான பை"}},advanced:{displayName:{en_US:"Advanced Topics",de_DE:"Themen für Fortgeschrittene",ja:"上級トピック",fr_FR:"Sujets avancés",es_AR:"Temas avanzados",es_MX:"Temas avanzados",es_ES:"Temas avanzados",pt_BR:"Temas avançados",gl:"Temas avanzados",zh_CN:"高级话题",zh_TW:"進階主題",ru_RU:"Продвинутый уровень",uk:"Досвідчений рівень",ko:"고급 문제",vi:"Các Chủ Đề Nâng Cao",sl_SI:"Napredne Teme",pl:"Tematy zaawansowane",it_IT:"Argomenti avanzati",ta_IN:"மேம்பட்ட தலைப்புகள்"},about:{en_US:"For the truly brave!",de_DE:"... die nie ein Mensch zuvor gesehen hat.",ja:"勇気ある人のみ!",fr_FR:"Pour les plus courageux !",es_AR:"¡Para personas realmente valientes!",es_MX:"¡Para los verdaderos valientes!",es_ES:"¡Para los verdaderos valientes!",pt_BR:"Para os verdadeiros valentes!",gl:"¡Para os verdadeiros valerosos!",zh_CN:"只为真正的勇士!",zh_TW:"來成為真正的強者吧!",ru_RU:"Если ты смелый, ловкий, умелый – потренируйся тут",uk:"Для хоробрих",ko:"용기있는 도전자를 위해 준비한 문제입니다",vi:"Mạnh mẽ lên!",sl_SI:"Za resnično pogumne!",pl:"Dla naprawdę odważnych!",it_IT:"Per i più temerari!",ta_IN:"உண்மையிலேயே தைரியமானவர்களுக்கு!"}}};o.getTabForSequence=function(e){var t=i[e];return t.tab?t.tab:"main"}},{"./advanced/multipleParents":120,"./intro/branching":122,"./intro/commits":123,"./intro/merging":124,"./intro/rebasing":125,"./mixed/describe":126,"./mixed/grabbingOneCommit":127,"./mixed/jugglingCommits":128,"./mixed/jugglingCommits2":129,"./mixed/tags":130,"./rampup/cherryPick":131,"./rampup/detachedHead":132,"./rampup/interactiveRebase":133,"./rampup/relativeRefs":134,"./rampup/relativeRefs2":135,"./rampup/reversingChanges":136,"./rebase/manyRebases":137,"./rebase/selectiveRebase":138,"./remote/clone":139,"./remote/fakeTeamwork":140,"./remote/fetch":141,"./remote/fetchArgs":142,"./remote/fetchRebase":143,"./remote/lockedMain":144,"./remote/mergeManyFeatures":145,"./remote/pull":146,"./remote/pullArgs":147,"./remote/push":148,"./remote/pushArgs":149,"./remote/pushArgs2":150,"./remote/pushManyFeatures":151,"./remote/remoteBranches":152,"./remote/sourceNothing":153,"./remote/tracking":154}],122:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C1","id":"main"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",name:{en_US:"Branching in Git",de_DE:"Branches in Git",ja:"Gitのブランチ",ko:"Git에서 브랜치 쓰기",es_AR:"Brancheando en Git",es_MX:"Creando ramas 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",zh_CN:"Git Branch",zh_TW:"建立 git branch",ru_RU:"Ветвление в Git",uk:"Розгалуження в Git",vi:"Rẽ nhánh với Git",sl_SI:"Branchanje v Gitu",pl:"Rozgałęzienia w Gicie",it_IT:"Creare rami in Git",ta_IN:"கிட் கிளை நிருவாகம்",tr_TR:"Git'te Branch işlemleri"},hint:{en_US:'Make a new branch with "git branch " and check it out with "git checkout "',de_DE:'Lege mit "git branch [Branch-Name]" einen neuen Branch an und checke ihn mit "git checkout [Branch-Name]" 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_MX:'Crea una nueva rama con "git branch [nombre]" y sitúate en 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]"',zh_CN:"用 'git branch <分支名>' 来创建分支,用 'git checkout <分支名>' 来切换到分支",zh_TW:"用 'git branch [ branch 名稱]' 來建立 branch,用 'git checkout [ branch 名稱]' 切換到該 branch",ko:'"git branch [브랜치명]"으로 새 브랜치를 만들고, "git checkout [브랜치명]"로 그 브랜치로 이동하세요',ru_RU:'Создай новую ветку при помощи "git branch [name]" и перейди на неё при помощи "git checkout [name]"',uk:'Створи нову гілку за допомогою "git branch [ім’я]" й перейди на неї за допомогою "git checkout [ім’я]"',vi:'Tạo một nhánh mới với lệnh "git branch [ten-nhanh]" và chuyển sang đó với lệnh "git checkout [ten-nhanh]"',sl_SI:'Naredi nov branch z "git branch [ime-brancha]" in ga checkoutaj z "git checkout [ime-brancha]"',pl:'Utwórz nową gałąź za pomocą "git branch " i przełącz się na nią za pomocą "git checkout "',it_IT:'Crea un nuovo ramo con "git branch " e selezionalo con "git checkout "',ta_IN:'இப்போது "git branch " கட்டளையை கொண்டு புதிய கிளை ஒன்றை உருவாக்குக பின் "git checkout " கொண்டு அந்த கிளைக்கு தாவுக',tr_TR:'Yeni bir branch oluşturmak için "git branch " komutunu kullanın ve "git checkout " komutu ile bu branch\'e geçin.'},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply pointers to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will create a new branch named `newImage`."],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below."],afterMarkdowns:["Oh no! The `main` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `main`."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout ","```","","This will put us on the new branch before committing our changes."],afterMarkdowns:["There we go! Our changes were recorded on the new branch."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Note: In Git version 2.23, a new command called `git switch` was introduced to eventually replace `git checkout`, ","which is somewhat overloaded (it does a bunch of different things depending on the arguments). The lessons here will still use ","`checkout` instead of `switch` because the `switch` command is still considered experimental and the syntax may change in the future. ","However you can still try out the new `switch` command in this application, and also ",'learn more here.* ']}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch.","","By the way, here's a shortcut: if you want to create a new ","branch AND check it out at the same time, you can simply ","type `git checkout -b [yourbranchname]`."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches in Git","","Branches sind in Git extrem schlank. Sie sind einfach Verweise auf einen bestimmten Commit -- das ist alles. Es ist unter Git-Enthusiasten deshalb gängige Praxis, früh und oft Branches anzulegen.","","Da das Anlegen von Branches keinen Plattenplatz und Speicher verbraucht, liegt es nahe die Arbeit in kleine logische Häppchen aufzuteilen, anstatt mit wenigen großen, monolithischen Branches zu hantieren.","",'Wir werden sehen wie Commits und Branches zusammengehören, sobald wir anfangen mit beiden zu arbeiten. Bis hierhin merk dir einfach, dass ein Branch im Prinzip bedeutet "ich möchte die Arbeit, die in diesem Commit und seinen Vorgängern steckt, sichern".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir mal, wie Branches in der Praxis aussehen.","","Wir legen einen neuen Branch an und nennen ihn `issue`:"],afterMarkdowns:["Und das war's auch schon, mehr ist es nicht. Der Branch `issue` zeigt nun auf den Commit `C1`."],command:"git branch issue",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lass uns mal ein wenig auf dem neuen Branch arbeiten. Machen wir einen Commit:"],afterMarkdowns:['Oi! Der Branch `main` hat sich verändert, aber der Branch `issue` nicht. Das liegt daran, dass wir nicht "auf" dem neuen Branch waren, weshalb das Sternchen `*` auch hinter `main` steht.'],command:"git commit",beforeCommand:"git branch issue"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sagen wir Git also erst mal auf welchem Branch wir arbeiten wollen, und zwar mit","","```","git checkout ","```","","Das wird uns auf den neuen Branch bringen bevor wir unsere Änderungen committen."],afterMarkdowns:["Und fertig! Unsere Änderungen wurden im neuen Branch gespeichert."],command:"git checkout issue; git commit",beforeCommand:"git branch issue"}},{type:"ModalAlert",options:{markdowns:["Cool! Jetzt bist du soweit, selbst Branches anzulegen. Wenn dieses Fenster geschlossen wurde, leg einen neuen Branch namens `bugFix` an und schalte auf diesen um."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitのブランチ","","Gitではコミットだけでなく、ブランチもまた信じられないほど軽量です。ブランチとは単に特定のコミットを指示したポインタにしか過ぎません。Gitの達人が決まってこう言うのは、そのためです:","","```","早めに、かつ頻繁にブランチを切りなさい","```","","どれほど多くのブランチを作ってもストレージやメモリを全然使わないので、ブランチを肥大化させるよりも論理的に分割していく方が簡単なのです。","","ブランチとコミットをあわせて使い始めると、これら2つの機能がどのように連動して機能するかがわかるでしょう。ここではとりあえず、ブランチは基本的には「あるコミットとその親のコミットたちを含めた全てのコミット」のことを呼ぶと覚えておいてください。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["では実際にブランチがどのようなものかを見ていきましょう。","","`newImage`という名前の新しいブランチを切ってみることにします。"],afterMarkdowns:["以上。必要な手順はこれだけです。いま作成された`newImage`ブランチは`C1`コミットを指しています。"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["この新しいブランチに何か変更を加えてみましょう。次のボタンを押してください。"],afterMarkdowns:["あらら、`newImage`ではなくて`main`ブランチが移動してしまいました。これは、私たちが`newImage`のブランチ上で作業していなかったためです。どのブランチで作業しているかは、アスタリスク(*)がついてるかどうかで分かります。"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["今度は作業したいブランチ名をgitに伝えてみましょう。","","```","git checkout [ブランチ名]","```","","このようにして、コミットする前に新しいブランチへと作業ブランチを移動することができます。"],afterMarkdowns:["できましたね。今度は新しいブランチに対して変更を記録することができました。"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["はい、これでもうどんなブランチでも切れますね。このウィンドウを閉じて、","`bugFix`という名前のブランチを作成し、そのブランチをチェックアウトしてみましょう。"]}}]},es_AR:{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:","","```","brancheá temprano, y brancheá seguido","```","","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 esencialmente dice "Quiero incluir el trabajo de este commit y todos su ancestros".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos cómo se ven las ramas en práctica.","","Acá vamos a crear una rama nueva llamada `newImage`."],afterMarkdowns:["Ahí está, ¡eso es todo lo que hay que hacer para branchear! 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. Apretá el botón de acá abajo."],afterMarkdowns:['¡Uh, no! ¡La rama `main` avanzó, pero `newImage` no! Eso es porque no estábamos "en" la rama nueva, y por eso el asterisco (*) estaba en `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Digámosle a git que queremos checkoutear esa rama con","","```","git checkout [name]","```","","Esto va a situarnos en esa rama antes de commitear 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:["¡Ok! Ya podés manejar ramas. Cuando se cierre esta ventana,","creá una nueva rama llamada `bugFix` y cambiate a ella."]}}]},es_MX:{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:","","```","ramifica temprano, y ramifica seguido","```","","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 recuerda que una rama esencialmente dice "Quiero incluir el trabajo de este commit y todos su ancestros".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos cómo se ven las ramas en práctica.","","Acá vamos a crear una rama nueva llamada `newImage`."],afterMarkdowns:["Ahí está, ¡eso es todo lo que hay que hacer para ramificar! La rama `newImage` ahora hace 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 que se encuentra debajo."],afterMarkdowns:['¡Uh, no! ¡La rama `main` avanzó, pero `newImage` no! Eso es porque no estábamos "en" la rama nueva, y por eso el asterisco (*) estaba en `main`.'],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 nos situará en esa rama antes de hacer commit a 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:["¡Ok! Ya estás listo para manejar ramas. Cuando se cierre esta ventana,","crea una nueva rama llamada `bugFix` y cámbiate a ella."]}}]},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 `main` avanzó, pero `newImage` no! Eso es porque no estábamos "en" la rama nueva, y por eso el asterisco (*) estaba en `main`.'],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:[{type:"ModalAlert",options:{markdowns:["## Ramos no Git","","Ramos no Git também são incrivelmente leves. Eles são simplesmente referências a um commit específico -- e nada mais. É por isso que muitos entusiastas do Git entoam o mantra:","","```","ramifique cedo, ramifique sempre","```","","Devido a não existir sobrecarga de armazenamento / memória associada à criação de ramos, é mais fácil dividir logicamente o seu trabalho do que ter ramos grandes e gordos.","",'Quando começarmos a misturar ramos e commits, vamos ver como esses dois recursos combinam bem. Por enquanto, só lembre que um ramo diz essencialmente "Quero incluir o trabalho deste commit e de todos os seus ancestrais".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos como os ramos funcionam na prática.","","Aqui vamos criar um novo ramo chamado `newImage`."],afterMarkdowns:["Veja, é só isso que você tem que fazer para ramificar! O ramo `newImage` agora se refere ao commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos tentar colocar algum trabalho neste novo ramo. Clique no botão abaixo."],afterMarkdowns:['Ah não! O ramo `main` se moveu mas o `newImage` não! Isso é porque o novo ramo não era o "ativo", e é por isso que o asterisco (*) estava no `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos contar ao git que queremos fazer checkout no ramo com:","","```","git checkout [nome]","```","","Isso vai nos situar no ramo antes de commitarmos nossas mudanças."],afterMarkdowns:["Aqui vamos nós! Nossas mudanças foram gravadas no novo ramo."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Vocês estão todos prontos para ramificar. Assim que esta janela fechar,","crie um novo ramo chamado `bugFix` e mude para esse ramo."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas en Git","","As Ramas en Git son tamén increiblemente liviás. Elas sinxelamente son referencias a un mesmo commit específico, e nada máis. É por iso que moitos entusiastas do Git entonan o mantra:","","```","ramifica cedo, ramifica sempre","```","","Debido a non existir sobrecarga de memoria facendo moitas ramas, é máis sinxelo dividir a lóxica do teu traballo en ramas que ter unha enorme.","",'Cando comezamos a mesturar ramas e commits imos ver como eses dous recursos combínanse ben. Por agora lembra que unha rama esencialmente di "Quero incluír o traballo deste commit e de todos os seus ancestros".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos cómo as ramas funcionan na práctica.","","Aquí imos crear unha nova rama chamada `newImage`."],afterMarkdowns:["Mira, solo tes que poñer eso para crear unha rama! A rama `newImage` agora apunta ó commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos intentar colocar algún traballo nesta nova rama. Pincha no botón de abaixo."],afterMarkdowns:['¡Bueno home! A rama `main` moveuse pero a rama `newImage` non! Eso é porque a nova rama non era a "actual", e é por iso que o asterisco (*) ficaba na rama `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ímoslle decir a Git que nos queremos mover á rama con:","","```","git checkout [nome]","```","","Esto vainos levar á rama que tiñamos antes de facer os nosos cambios."],afterMarkdowns:["¡Imos alá! Os nosos cambios foron grabados na nova rama."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["¡Ok! Estas preparado para facer ramas. Así que podes pechar a ventá,","crear unha rama chamada `bugFix` e moverte para esa rama.","","Inda así, hai un atallo: se ti quixeras crear unha nova ","rama e moverte a ela ó mesmo tempo, ti podes escribir simplemente ","`git checkout -b [a-tua- rama]`."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches Git","","Les branches sous Git sont incroyablement légères. Elles sont simplement des références sur un commit spécifique -- rien de plus. C'est pourquoi beaucoup d'enthousiastes répètent en cœur :","","```","des branches le plus tôt possible, et des branches souvent","```","","Parce qu'il n'y a pas de surcoût (stockage/mémoire) associé aux branches, il est facile de diviser son travail en de nombreuses branches plutôt que d'avoir quelques grosses branches.","","Nous verrons comment les branches et les commits interagissent quand nous les utiliserons ensemble. Pour l'instant, souvenez-vous qu'une branche est un moyen d'exprimer \"Je veux inclure le contenu de ce commit et de tous les commits parents.\""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Regardons à quoi ressemblent les branches en pratique.","","Nous allons nous positionner (checkout) dans une nouvelle branche appellée `newImage`."],afterMarkdowns:["Et voilà, c'est tout ! La branche `newImage` se réfère désormais au commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Travaillons maintenant dans cette branche. Appuyez sur le bouton ci-dessous."],afterMarkdowns:["Oh non! La branche `main` a bougé mais pas la branche `newImage` ! C'est parce que nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'astérisque (*) sur `main`."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Indiquons à Git que nous voulons nous positionner sur la branche avec ","","```","git checkout [nom]","```","","Cela nous positionne sur la nouvelle branche avant de faire un commit avec nos modifications."],afterMarkdowns:["C'est parti ! Nos modifications ont été enregistrées sur la nouvelle branche."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Vous êtes fin prêt pour faire des branches. Après la fermeture de cette fenêtre,","faites une nouvelle branche nommée `bugFix` et positionnez-vous sur cette branche."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branch",""," Git 的分支也非常轻量。它们只是简单地指向某个提交纪录 —— 仅此而已。所以许多 Git 爱好者传颂:","","```","早建分支!多用分支!","```","","这是因为即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。","","在将分支和提交记录结合起来后,我们会看到两者如何协作。现在只要记住使用分支其实就相当于在说:“我想基于这个提交以及它所有的 parent 提交进行新的工作。”"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们通过实际操作来看看分支是什么样子的。","","接下来,我们将要创建一个到名为 `newImage` 的分支。"],command:"git branch newImage",afterMarkdowns:["看到了吗,创建分支就是这么容易!新创建的分支 `newImage` 指向的是提交记录 `C1`。"],beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在咱们试着往新分支里提交一些东西。点击下面的按钮"],command:"git commit",afterMarkdowns:["哎呀!为什么 `main` 分支前进了,但 `newImage` 分支还待在原地呢?!这是因为我们没有“在”这个新分支上,看到 `main` 分支上的那个星号(*)了吗?这表示当前所在的分支是 `main`。"],beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在咱们告诉 Git 我们想要切换到新的分支上","","```","git checkout ","```","","下面的命令会让我们在提交修改之前先切换到新的分支上"],command:"git checkout newImage; git commit",afterMarkdowns:["这就对了!我们的修改已经保存到新的分支里了。"],beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*注意:在 Git 2.23 版本中,引入了一个名为 `git switch` 的新命令,最终会取代 `git checkout`,因为 `checkout` 作为单个命令有点超载(它承载了很多独立的功能)。","由于现在很多人还无法使用 `switch`,本次课程仍然使用 `checkout` 而不是 `switch`,",'但是如果你想尝试一下新命令,我们的应用也是支持的!并且你可以从这里学到更多关于新命令的内容。*']}},{type:"ModalAlert",options:{markdowns:["OK,你们都已经准备好使用分支了。当前窗口关闭后,","创建一个名为 `bugFix` 的新分支,然后切换过去。","","对了,有个更简洁的方式:如果你想创建一个新的分支同时切换到新创建的分支的话,可以通过 `git checkout -b ` 来实现。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git 的 branch",""," git 的 branch 非常不佔空間。它們只是一個指向某個 commit 的 reference,就這麼簡單。所以許多 git 的愛好者會建議:","","```","早點建立 branch!經常建立 branch!","```","","因為建立 branch 不怎麼會佔用到硬碟空間或者是記憶體,所以你可以把你目前的工作分成好幾個 branch,這比只用一個 branch 要來的好。","","同時使用 branch 和 commit 時,我們待會可以看到兩者如何配合。現在,只要記住使用 branch 其實就是在說:「我想要包含這一次的 commit 以及它的所有 parent 的 commit。」"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["舉一個例子來看看 branch 到底是什麼。","","這裡,我們建立一個名稱為 `newImage` 的新的 branch。"],command:"git branch newImage",afterMarkdowns:["看吧!這就是建立 branch 所需的操作啦! `newImage` branch 現在指向 commit `C1`。"],beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在讓我們這個新的 branch 做一些操作。點擊下面的按鈕。"],command:"git commit",afterMarkdowns:["太奇怪了啦! `main` branch 前進了,但 `newImage` branch 沒有前進!這是因為我們沒有「在」這個新的 branch 上,這也是為什麼星號(*)會在 `main` 上。"],beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用如下指令告訴 git 我們想要切換到新的 branch","","```","git checkout [name]","```","","這可以讓我們在 commit 之前切換到新的 branch。"],command:"git checkout newImage; git commit",afterMarkdowns:["太好了!新的 branch 已經記錄了我們的修改。"],beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["好啦,你已經準備好使用 branch 了。當目前的視窗關閉後,","建立一個叫 `bugFix` 的新的 branch,然後切換過去。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 브랜치","","깃의 브랜치도 놀랍도록 가볍습니다. 브랜치는 특정 커밋에 대한 참조(reference)에 지나지 않습니다. 이런 사실 때문에 수많은 Git 애찬론자들이 자주 이렇게 말하곤 합니다:","","```","브랜치를 서둘러서, 그리고 자주 만드세요","```","","브랜치를 많이 만들어도 메모리나 디스크 공간에 부담이 되지 않기 때문에, 여러분의 작업을 커다른 브랜치로 만들기 보다, 작은 단위로 잘게 나누는 것이 좋습니다.","",'브랜치와 커밋을 같이 쓸 때, 어떻게 두 기능이 조화를 이루는지 알아보겠습니다. 하지만 우선은, 단순히 브랜치를 "하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역"이라고 기억하시면 됩니다.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["브랜치가 어떤 것인지 연습해보죠.","","`newImage`라는 브랜치를 살펴보겠습니다."],afterMarkdowns:["저 그림에 브랜치의 모든 것이 담겨있습니다! 브랜치 `newImage`가 커밋 `C1`를 가리킵니다"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["이 새로운 브랜치에 약간의 작업을 더해봅시다. 아래 버튼을 눌러주세요"],afterMarkdowns:["앗! `main` 브랜치가 움직이고, `newImage` 브랜치는 이동하지 않았네요! 그건 우리가 새 브랜치 위에 있지 않았었기 때문입니다. 별표(*)가 `main`에 있었던 것이죠."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["아래의 명령으로 새 브랜치로 이동해 봅시다.","","```","git checkout [브랜치명]","```","","이렇게 하면 변경분을 커밋하기 전에 새 브랜치로 이동하게 됩니다."],afterMarkdowns:["이거죠! 이제 우리의 변경이 새 브랜치에 기록되었습니다!"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["좋아요! 이제 직접 브랜치 작업을 연습해봅시다. 이 창을 닫고,","`bugFix`라는 새 브랜치를 만드시고, 그 브랜치로 이동해보세요"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ветвление в Git","","Ветки в Git, как и коммиты, невероятно легковесны. Это просто ссылки на определённый коммит — ничего более. Вот почему многие фанаты Git повторяют мантру","","```","делай ветки сразу, делай ветки часто","```","","Так как создание множества веток никак не отражается на памяти или жестком диске, удобнее и проще разбивать свою работу на много маленьких веток, чем хранить все изменения в одной огромной ветке.","","Чуть позже мы попробуем использовать ветки и коммиты, и вы увидите, как две эти возможности сочетаются. Можно сказать, что созданная ветка хранит изменения текущего коммита и всех его родителей."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, что такое ветки на практике","","Создадим здесь новую ветку с именем newImage."],afterMarkdowns:["Вот и всё, ребята! Ветка newImage теперь указывает на коммит C1."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Теперь попробуем сделать некоторые изменения в этой ветке. Для этого нажми кнопку ниже."],afterMarkdowns:["О-оу! Ветка main сдвинулась, тогда как ветка newImage - нет! Всё из-за того, что мы не переключились на новую ветку, а остались в старой, о чём говорит звёздочка около ветки main."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Сообщим Git, что хотим выбрать ветку","","```","git checkout [name]","```","","Эта команда перенесёт нас на новую ветку в момент, когда мы ещё не коммитили изменения"],afterMarkdowns:["Вот так! Наши изменения записаны уже в новую ветку"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ну что ж, теперь ты готов к работе с ветками. Как только это окно закроется,","создай ветку с именем bugFix и переключись на неё.","","Кстати вот тебе совет, ты можешь создать новую ветку и переключиться на неё","с помощью одной команды: ```git checkout -b [yourbranchname]```."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Гілки в Git","","Гілки в Git також є дивовижно легкими. Вони є просто посиланнями на конкретний коміт, нічого більше. Через це багато Git-ентузіастів повторюють мантру:","","```","роби гілки завчасно, роби гілки часто","```","","Через те, що сворення нових гілок ніяк не впливає на використання пам’яті чи дискового простору, набагато простіше розділити свою роботу на кілька логічно зв’язаних по функціоналу гілок, ніж працювати з величезними гілками.","","Коли ми почнемо використовувати гілки та коміти, ми побачимо, як вони поєднуються між собою. Але зараз просто запам’ятай, що гілка просто зберігає роботу теперішнього коміту і всіх його попередників."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте на практиці подивимось, як виглядають гілки в Git.","","Зараз ми створимо нову гілку `newImage`."],afterMarkdowns:["Ось і все, що треба знати про гілки. Гілка `newImage` тепер посилається на коміт `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте спробуємо додати якусь інформацію до цієї нової гілки. Натисни кнопку внизу."],afterMarkdowns:['От халепа! Гілка `main` просунулася вперед, але гілка `newImage` — ні! Це тому, що ми були не "на новій гілці". Через це зірочка (*) була поруч з `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте вкажемо Git, що ми хочемо перейти на нову гілку за допомогою","","```","git checkout [ім’я]","```","","Ця команда перекине нас на нову гілку до того, як ми закомітимо наші зміни."],afterMarkdowns:["Ось і все! Наші зміни були записані в нову гілку."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Тепер ти готовий до створення гілок. Як тільки це вікно пропаде, ","зроби нову гілку з назвою `bugFix` та перейди на неї."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh Git","","Nhánh trong Git cũng nhẹ đến không ngờ. Chúng chỉ đơn giản là các con trỏ đến commit -- không hơn. Đó là lý do các con chiên Git hay niệm chú:","","```","rẽ nhánh sớm, rẽ nhánh thường xuyên","```","","Bởi vì chẳng tốn bao nhiêu bộ nhớ cho việc rẽ nhánh cả và nó dễ dàng phân chia công việc hơn là có một cái nhánh to tổ chảng.","",'Khi bạn trộn lẫn commit và nhánh, bạn sẽ thấy chúng kết hợp với nhau thế nào. Hãy nhớ về cơ bản nhánh muốn nói "Tôi muốn thành quả trong commit này và tất cả cha ông của nó"']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào hãy xem nhánh trong Git hoạt động thế nào.","","Giờ chúng ta tạo một nhánh mới tên là `newImage`."],afterMarkdowns:["Đó, rẽ nhánh là thế đó! Nhánh `newImage` giờ đã tham chiếu đến commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào cùng thử thêm nội dung vào nhánh mới này nào. Hãy bấm nút bên dưới."],afterMarkdowns:['Ồ không! Nhánh `main` đã di chuyển nhưng nhánh `newImage` thì không! Đó là do ta không "nằm trên" nhánh mới, đó là tại sao dấu hoa thị (*) nằm trên nhánh `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào cùng bảo Git chuyển ta sang nhánh khác với lệnh","","```","git checkout ","```","","Lệnh này sẽ chuyển ta sang nhánh mới trước khi commit."],afterMarkdowns:["Đó! Thay đổi của ta đã được lưu sang nhánh mới."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Note: Ở phiên bản Git 2.23, một câu lệnh mới được giới thiệu mang tên `git switch`, mục đích là để thay thế cho lệnh `git checkout`, ","vì lệnh cũ có quá nhiều tham số, mỗi tham số truyền vào sẽ thực hiện nhiều thứ khác nhau. Bài học này vẫn sẽ sử dụng ","`checkout` thay vì `switch`, vì lệnh `switch` hiện vẫn đang trong giai đoạn thử nghiệm và cú pháp có thể thay đổi trong tương lai. ","Mặc dù vậy, bạn vẫn có thể thử dùng câu lệnh `switch` ở ứng dụng này, và ",'tìm hiểu thêm tại đây.* ']}},{type:"ModalAlert",options:{markdowns:["Được rồi! Bạn đã sẵn sàng để tập rẽ nhánh rồi. Khi cửa sổ này đóng lại,","tạo một nhánh mới tên là `bugFix` và chuyển sang nhánh đó.","","Tiện thể, có đường tắt đấy: nếu bạn muốn tạo nhánh mới ","VÀ đồng thời chuyển sang luôn, bạn chỉ cần ","gõ `git checkout -b [yourbranchname]`."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Tudi branchi v Gitu so izredno majhni. To so preprosto kazalci na določen commit -- nič več. Zato veliko Git navdušencev ponavlja:","","```","branchaj zgodaj in branchaj pogosto","```","","Ker ustvarjanje večih branchev ne porablja dodatnega spomina ali prostora, je lažje logično razdeliti svoje delo kot imeti velike branche.","",'Ko začnemo mešati branche in commite, bomo videli kako se te dve funkcionalnosti dopolnjujeta. Za zdaj si zapomni samo to, da branch ubistvu pomeni "Hočem vključiti delo tega commita in commite vseh njegovih staršev."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo kako branchi izgledajo v praksi.","","Tu bomo ustvarili nov branch imenovan `newImage`."],afterMarkdowns:["Tako, to je vsa umetnost branchanja! Branch poimenovan `newImage` se sedaj nanaša na commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poizkusimo dodati nekaj dela na ta nov branch. Pristisni gumb spodaj."],afterMarkdowns:['O ne! `main` branch se je premaknil ampak `newImage` branch se pa ni! To je zato, ker nismo bili "na" novem branchu, kot smo lahko videli z označeno zvezdico (*) na `main` branchu.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Povejmo gitu, da želimo checkoutat branch z","","```","git checkout ","```","","To nas bo postavilo na nov branch pred commitanjem sprememb."],afterMarkdowns:["Tako je! Naše sprememebe so zabeležene na novem branchu."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Pripravljen si, da začneš branchat. Ko se to okno zapre, ","ustvari nov branch z imenom `bugFix` in preklopi na ta branch.","","Mimogrede, tu je bližnjica: če hočeš narediti nov ","branch IN ga hkrati checkoutati, lahko enostavno ","natipkaš `git checkout -b [imeTvojegaBrancha]`."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branch","","Gałęzie w Gicie zajmują niezwykle mało zasobów. Są po prostu wskaźnikami do konkretnego commita. Dlatego, wielu entuzjastów Gita przestrzega mantry:","","```","twórz gałęzie wcześnie i często","```","","W polskim nazewnictwie stosuje się wymiennie nazwę branch oraz gałąź. Natomiast commit (zatwierdzenie) stosuje się tylko w różnych odmienionych formach, np. commita, commitów itp.","","Tworzenie wielu gałęzi nie wiąże się z żadnymi dodatkowymi kosztami, więc warto dzielić swoją pracę na pojedyńcze funkcjonalności i bug-fixy.","",'Kiedy zaczniemy mieszać gałęzie i commity, zobaczymy, jak łączą się te dwie funkcje. Na razie jednak pamiętaj, że branch zasadniczo mówi: "Chcę uwzględnić pracę tego commita oraz wszystkie poprzednie commity".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak wyglądają gałęzie w praktyce.","","Tutaj utworzymy nową gałąź o nazwie `myBranch`."],afterMarkdowns:["To wszystko o rozgałęzianiu! Gałąź `myBranch` odnosi się teraz do commita `C1`."],command:"git branch myBranch",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spróbujmy trochę popracować nad tą nową gałęzią.\nKliknij przycisk poniżej."],afterMarkdowns:['O nie! Gałąź `main` uległa zmianie, a gałąź `myBranch` nie! To dlatego, że nie byliśmy "w" nowej gałęzi, co podpowiada gwiazdka (*) przy `main`'],command:"git commit",beforeCommand:"git branch myBranch"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Powiedzmy gitowi, z którą gałęzią chcemy pracować","","```","git checkout ","```","","Spowoduje to przeniesienie nas do nowej gałęzi przed wprowadzeniem zmian."],afterMarkdowns:["Gotowe! Nasze zmiany zostały zarejestrowane w nowej gałęzi."],command:"git checkout myBranch; git commit",beforeCommand:"git branch myBranch"}},{type:"ModalAlert",options:{markdowns:["*Uwaga: w wersji 2.23 Gita zostało wprowadzono nowe polecenie o nazwie \n`git switch`, które zastępuje polecenie `git checkout`, ","które jest nieco przeciążone (robi wiele oddzielnych rzeczy zależnie od argumentów). Tutaj będziemy omawiać tylko","`git checkout`, ponieważ wciąż jest to najczęściej stosowane polecenie.",'Mimo to, możesz wypróbować funkcjonalność `switch` sam. Aplikacja jest na to gotowa! Dowiedz się wiecej.* ']}},{type:"ModalAlert",options:{markdowns:["Okej, teraz możesz samodzielnie zacząć tworzyć gałęzie.","Po zamknięciu tego okna stwórz nową gałąź o nazwie `bugFix` i przełącz się na nią.","","Przy okazji, oto skrót: jeśli chcesz stworzyć","nową gałąź ORAZ się na nią przełączyć,","użyj `git checkout -b `."]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["## கிட் கிளைகள்","","கிட் கிளைகள் மிகவும் இலகுவானவை. அவை ஒரு குரிப்பிட்ட கமிட்டினை சுட்டி காட்டும் ஒரு இணைப்பு குறியீடு மட்டும்தான். இதனால்தான் பல கிட் ஆர்வலர்கள் உச்சரிக்கும் மந்திரம்:","","```","மாற்றம் செய்யும் முன்பே கிளையை உருவாக்குங்ள், அடிக்கடி தேவை என்றால் மேலும் கிளைகளை உருவாக்குங்கள்.","```","","ஏன் என்றால் புதிய கிளைகளை உருவாகுவது சேமிப்புபலுவோ / நினைவக மேலான்மை பலுவோ முற்றிலும் இல்லை, பெரிய பல்வேரு மற்றங்களை கொண்ட பலுமிக்க கிளைகளைக் காட்டிலும் உங்கள் வேலையை தர்க்கமாக சிரு சிரு கிளைகளக பிரிப்பது எளிது.","",'கிளைகள் மற்றும் கமிட்டுகளை கொண்ட கலவை உருவாக்கும் போது இவை இரண்டின் இனக்கத்தினை விவாதிப்போம். தற்ப்போது, கிளை உருவாக்குதல் என்பதை "இந்த கமிட்டுடன் இதர்க்கு முன் இருந்த அனைத்து கமிட்டுகளையும் தொகுக்க விரும்புகிறேன்." என்பதாக கருதலாம்.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது நாம் ஒரு கிளை எப்படி இருக்கும் என்பதை பயிற்ச்சி செய்து பார்க்கலாம்.","","இங்கு `newImage` என்ற பதிய கிளை ஒன்றை உருவாக்குவோம்."],afterMarkdowns:["அவ்வலவு தான், `newImage` என்ற புதிய கிளை தயாராகி விட்டது மேலும் அது `C1` என்ற கிட்டை மூலமாக குறிக்கும்படி உள்ளது."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது அதில் சில மாற்றங்களை இணைப்போம். கீலே உள்ள பித்தேனை அமுக்கவும்."],afterMarkdowns:['அடடா! `newImage`க்கு மாறாக `main` கிளை முன்னேறி உள்ளது! ஏன் என்றால் நாம் "அந்த" புதிய கிளையில் இல்ல, அதனால்தான் நட்சத்திரக் குறி (*) `main` மேலுள்ளது.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது நாம் கிட்டை கிளை தாவ சொல்லுவோம்.","","```","git checkout ","```","","புதிய மாற்றங்களை கமிட் செய்யும் முன்பு இது நம்மை புதிய கிளைக்கு மாற்றும்."],afterMarkdowns:["அவ்வலவுதான்! நமது மாற்றங்கள் புதிய கிளையின் பதிவு செய்ய பட்டுள்ளது."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*குறிப்பு: கிட் 2.23 முதல், `git switch` என்ற புதிய கட்டளை `git checkout`க்கு மாற்றாக அறிமுகம் செய்ய பட்டுள்ளது, ","ஏன் என்றால் அது ஒரே கட்டளையில் அதிகப்படியான வேளைகளை செய்கிறது (சொல்லப்போனால் அது கொத்தாக பல தனிப்பட்ட செயல்களை செய்கின்றது). ","இன்னு பலர் `switch` பயன்படுத்த வழி இல்லாததால் இங்குள்ள பாடங்கள் இன்னும் `switch`க்கு பதில் `checkout` பயன்படுத்து கின்றது. ",'இருப்பினும் இந்த செயலியில் நீங்கள் `switch`ஐ முயற்சிக்க விரும்பினால் செய்யலாம்! மேலும் விவரங்களுக்கு.* ']}},{type:"ModalAlert",options:{markdowns:["சரி! நீங்கள் இப்போது கிட் கிளை உருவாக்க தயார். இந்த திரை மூடப்பட்டவுடன்,","`bugFix` எனும் கிளை உருவாக்கி அந்த கிளைக்கு மாறவும்.","","சொல்லபோனால், இதற்க்கு ஒரு குறுக்குவழி உள்ளது: ஒரு புதிய கிளையை உருவாக்கி ","உடனெ அதற்க்கு மாற, நீங்கள்","`git checkout -b [yourbranchname]` என கட்டளையிட்டால் போதும்."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami Git","","Anche i rami in Git sono incredibilmente leggeri. Sono semplicemente puntatori a uno specifico commit -- nulla di più. Questo è il motivo per cui gli appassionati di Git predicano:","","```","ramifica presto, e ramifica spesso","```","","Poiché non c'è un sovraccarico della memoria nel fare molti rami, è più semplice suddividere il lavoro piuttosto che avere rami enormi.","",'Quando inizieremo a mischiare rami e commit, vedremo come queste caratteristiche si combinano. Per ora, però, ricorda che un ramo essenzialmente dice "Voglio includere il lavoro di questo commit e tutti i commit del genitore".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo nella pratica cosa sono i rami.","","Qui creeremo un nuovo ramo di nome `newImage`."],afterMarkdowns:["Ecco, questa è la divisione in rami! Il ramo `newImage` ora punta al commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Proviamo ad aggiungere un po' di lavoro su questo nuovo ramo. Premi il pulsante qua sotto."],afterMarkdowns:["Oh no! Il ramo `main` si è spostato ma il ramo `newImage` no! Questo perché non eravamo sul nuovo ramo, infatti l'asterisco (*) era su `main`."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diciamo a Git che vogliamo selezionare il ramo con","","```","git checkout ","```","","Questo ci metterà sul nuovo ramo prima di fare un nuovo commit."],afterMarkdowns:["Ecco qua! I cambiamenti sono stati memorizzati sul nuovo ramo."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Nota: In Git versione 2.23, è stato introdotto un nuovo comando, `git switch`, per sostituire `git checkout`, ","che è sovraccaricato di funzionalità (fa un sacco di cose diverse). Queste lezioni usano comunque ","`checkout` invece che `switch` perché molti non hanno ancora accesso a `switch`, ma quest'app supporta comunque il comando ",'se sei curioso di provarlo! Potete scoprire di piu qui.* ']}},{type:"ModalAlert",options:{markdowns:["Ok! Ora sei pronto a lavorare con i rami. Dopo che questa finestra si chiude,","crea un nuovo ramo `bugFix` e passa su quel ramo.","","Comunque, c'è una scorciatoia: se vuoi creare un nuovo ","ramo E selezionarlo in un solo passaggio, puoi semplicemente ","digitare `git checkout -b [yourbranchname]`."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branch'leri","","Git'teki branch'ler (dallar), son derece hafif ve sadece belirli bir commit'e işaret eden işaretçilerdir - fazlası değil. -- İşte bu nedenle birçok Git tutkunu şunu söyler:","","```","erken branch'le, sık sık branchle","```","","Git'te birçok branch oluşturmanın depolama/bellek açısından herhangi bir fazlalığı yoktur, bu nedenle işinizi mantıklı bir şekilde bölmek daha kolay ve akıllıca olacaktır.","","Branch'leri ve commit'leri birleştirmeye başladığımızda, bu iki özelliğin nasıl bir araya geldiğini göreceğiz. Şimdilik sadece unutmayın ki bir branch, temelde \"Bu commit'te yaptığım çalımanının ve diğer tüm üst düzey commit'leri dahil etmek istiyorum.\" der."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pratikte branch'ler nasıl işliyor görelim.","","Burada `newImage` adında bir branch oluşturuyoruz."],afterMarkdowns:["İşte bu kadar şimdi `newImage` branch'i `C1` commit'ine işaret ediyor."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Şimdi bu branch'te biraz çalışma yapalım, aşağıdaki düğmeye tıklayın."],afterMarkdowns:["Oh hayır! `main` branch'i hareket etti ama `newImage` branch'i etmedi! Bu, yeni branch \"üzerinde\" olmadığımız için meydana geldi, ki (*) işaretinin `main` üzerinde olması da bunu göstermektedir."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Git'e aşağıdaki komut ile başka bir branch'e geçmek istediğimizi söyleyelim","","```","git checkout ","```","","Bu değişikliklerimizi commit'lemeden önce bizi yeni branch'e yönlendirecek."],afterMarkdowns:["İşte bu! Değişikliklerimiz yeni branch'te kaydedildi."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Not: Git'in 2.23 sürümünde, `git checkout`'un yerine geçmek üzere `git switch` adında yeni bir komut tanıtıldı, ","Bu komut, bazı argümanlara bağlı olarak bir dizi farklı işlem yapabilmektedir. ","Buradaki dersler hala `switch` yerine `checkout` kullanılarak anlatılacaktır, çünkü switch komutu hala deneysel kabul ediliyor ve sözdizisi ","gelecekte değişebilir. Bununla birlikte, bu uygulamada yeni `switch` komutunu deneyebilir ve ayrıca daha fazla bilgi için buraya bakabilirsiniz. ",'git switch.* ']}},{type:"ModalAlert",options:{markdowns:["Hazırsınız! Şimdi branch oluşturmaya başlayabilirsiniz. Bu pencere kapanır kapanmaz,","`bugFix` adında yeni bir branch oluşturun ve bu branch'e geçin.","","Bu arada, size bir kısayol: Eğer yeni bir branch oluşturmak ve ","aynı anda bu branch'e geçmek isterseniz, sadece ","`git checkout -b [yourbranchname]` komutunu kullanabilirsiniz."]}}]}}}},{}],123:[function(e,t,o){o.level={name:{en_US:"Introduction to Git Commits",de_DE:"Einführung in Git Commits",es_AR:"Introducción a los commits de Git",es_MX:"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",ja:"Gitのコミット",ko:"Git 커밋 소개",zh_CN:"Git Commit",zh_TW:"介紹 git commit ",ru_RU:"Знакомство с Git Commit ",uk:"Знайомство з комітами в Git",vi:"Giới thiệu về Git Commit",sl_SI:"Uvod v Git Commit",pl:"Wprowadzenie do commitów Gita",it_IT:"Introduzione ai commit in Git",ta_IN:"கிட் கமிட்கள் ஒரு அறிமுகம்",tr_TR:"Git Commit'e Giriş"},goalTreeString:'{"branches":{"main":{"target":"C3","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"main":{"target":"C1","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}',hint:{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_MX:"¡Simplemente escribe '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 !",zh_CN:"执行两次 'git commit' 就可以过关了!",zh_TW:"輸入兩次 'git commit' 就可以完成!",ja:"'git commit'コマンドを2回打てば完成!",ko:"'git commit'이라고 두 번 치세요!",ru_RU:"Попробуй дважды выполнить команду 'git commit' ;)",uk:"Спробуй двічі виконати команду 'git commit' ;)",vi:"Đơn giản là cứ gõ 'git commit' 2 lần",sl_SI:"Preprosto dvakrat vpiši 'git commit' in zaključi!",pl:"Aby zakończyć, wystarczy dwukrotnie wpisać 'git commit'!",it_IT:"Digita 'git commit' due volte per finire!",ta_IN:"இந்த நிலையை நிரைவு செய்ய 'git commit' என்று இரண்டு முறை தட்டச்சு செய்க!",tr_TR:"Bölümü bitirmek için sadece iki kere 'git commit' yazmanız yeterlidir."},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the (tracked) files in your directory. It's like a giant copy and paste, but even better!","",'Git wants to keep commits as lightweight as possible though, so it doesn\'t just blindly copy the entire directory every time you commit. It can (when possible) compress a commit as a set of changes, or a "delta", from one version of the repository to the next.',"","Git also maintains a history of which commits were made when. That's why most commits have ancestor commits above them -- we designate this with arrows in our visualization. Maintaining history is great for everyone working on the project!","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very lightweight and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit."],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Ein Commit in einem Git-Repository speichert eine Abbildung aller Dateien in deinem Projektverzeichnis. Es ist wie ein riesiges Kopieren und Einfügen, nur besser.","","Allerdings will Git die Commits so schlank wie möglich halten, also kopiert es nicht einfach stur das ganze Verzeichnis jedes Mal wenn du committest. Es kann (wenn möglich) Commits als Menge von Änderungen zusammenpacken, von einer Version des Repositorys zur nächsten.","","Außerdem führt Git ein Protokoll darüber, welche Commits wann gemacht wurden, und welcher auf welchen folgt. Deshalb werden die Commits hier mit ihrem Vorgänger über sich gezeigt -- wir verwenden Pfeile zur Darstellung der Beziehung. Dieses Protokoll zu haben ist eine tolle Sache für jeden, der an einem Projekt arbeitet.","","Das war jetzt eine Menge Neues, aber vorerst kannst du dir Commits einfach als Abbildungen des Projekts vorstellen. Commits sind sehr ressourcenschonend, und zwischen ihnen wechseln geht superschnell!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Mal sehen wie das in der Praxis ist. Rechts sehen wir ein (kleines) Git-Repository. Es gibt aktuell zwei Commits -- den initialen, `C0`, und den danach, `C1`, der irgendwelche Änderungen enthält.","","Klick die Schaltfläche unten um einen neuen Commit zu erzeugen:"],afterMarkdowns:["Fertig. Klasse! Wir haben gerade Änderungen gemacht und als Commit im Repository gespeichert. Der Commit, den wir gerade gemacht haben, hat den Vorgänger `C1`; der verweist wiederum auf den Commit, auf dem er basiert: `C0`."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Probier das Committen gleich mal aus! Mach zwei Commits um den Level abzuschließen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitのコミット","コミットによって、ディレクトリ中の全てのファイルのスナップショットを記録します。巨大なコピー&ペーストのようなものですが、実際にはそれよりずっと良いものです。","","Gitではコミットを可能な限り軽量に保つために、コミット毎にフォルダ全体をコピーしません。実際にはGitは、コミットを直前のバージョンから一つ先のバージョンへの「変更の固まり」あるいは「差分」として記録します。後で出てきますが、ほとんどのコミットが親を持っているのはそういう理由からです。","","リポジトリをcloneする時には、内部動作としてはコミットの差分をたどって全ての変更を取得しています。cloneした時に以下のような表示が出るのは:","","`resolving deltas`(訳:差分を解決中)","","このためです。","","もっと説明したいところですが、しばらくはコミットをスナップショットのようなものだと考えてください。コミットは非常に軽量であり、コミット間の移動も非常に高速です。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["これがどういうことか、動きを見ていきましょう。図には(小さな)gitリポジトリが描かれています。コミットが2つあります -- `C0`という名前の初回のコミットがあり、`C1`という名前の次のコミットが続きます。これは何か意味のある変更かもしれません。","","下のボタンを押下して新しいコミットを作ってみましょう。"],afterMarkdowns:["できました! 良いですね。いまリポジトリに新しい変更が加えられ、1つのコミットとして保存されました。作成したコミットには親がいて、このコミットの出発点となった`C1`を指しています。"],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["実際に手を動かしてみましょう。このウィンドウを閉じたら、試しに2回コミットをしてみましょう。"]}}]},es_AR:{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 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!","","Hay un montón en lo que ahondar, pero por ahora podés 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 ahora: 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 hacer un nuevo commit."],afterMarkdowns:["¡Ahí 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 que se basó este."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["¡Dale, intentalo vos ahora! Cuando se cierre esta ventana, hacé dos commits para completar el nivel."]}}]},es_MX:{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 commit. 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!","","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 ahora: 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 hacer un nuevo commit."],afterMarkdowns:["¡Ahí 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 que se basó este."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["¡Vamos, inténtalo ahora! Cuando se cierre esta ventana, haz dos commits para completar el nivel."]}}]},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:[{type:"ModalAlert",options:{markdowns:["## Commits no Git","Um commit em um repositório git registra uma fotografia (snapshot) de todos os arquivos no seu diretório. É como um _grande_ copy&paste, mas ainda melhor!","",'O Git tem por objetivo manter os commits tão leves quanto possível, de forma que ele não copia cegamente o diretório completo toda vez que você commita. Ele pode (quando possível) comprimir um commit como um conjunto de mudanças (ou um _"delta"_) entre uma versão do seu repositório e a seguinte.',"","O Git também mantém um histórico de quando ocorreu cada commit. É por isso que a maioria dos commits tem ancestrais acima de si -- que indicamos usando setas na nossa visualização. Manter a história é ótimo para todos que trabalham no projeto!","","Há muito para aprender, mas por enquanto pense nos commits como snapshots do seu projeto. Os commits são muito leves, e mudar de um para outro é extremamente rápido!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos o que isso significa na prática. À direita, temos uma visualização de um (pequeno) repositório git. Há dois commits no momento: o commit inicial, `C0`, e um commit que se segue, `C1`, que poderia conter algumas mudanças interessantes.","","Clique no botão abaixo para fazer um novo commit."],afterMarkdowns:["Aí vamos nós! Incrível. Acabamos de fazer mudanças no repositório e as guardamos como um commit. O commit que acabamos de criar tem um pai, `C1`, que referencia em qual commit ele se baseou."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Vamos lá, tente você agora! Quando esta janela se fechar, faça dois commits para completar o nível."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits en Git","Un commit nun repositorio de git rexistra unha fotografía (snapshot) de tódolos arquivos no seu directorio. É coma un copy&paste xigante, ¡pero todavía mellor!","",'Git quere gardar os commits o máis pequenos posíbel, por iso non copia directamente o directorio completo sempre que fas un commit. El pode (cando é posíbel) comprimir nun commit un conxunto de cambios (ou un _"delta"_) entre unha versión do teu respositorio e o seguinte.',"","Git tamén garda un histórico de cando se fixo cada cambio. Por iso a maioría dos commits teñen ancestros enriba deles, e nos indicámolos con frechas na nosa visualización. ¡Manter a historia é óptimo para tódolos que traballan no proxecto!","","Hai moito que aprender, pero por agora podes pensar que os commits son fotos do teu proxecto. Os commits son liviáns, e cambiar dun para o outro é extremadamente rápido!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos o que iso significa na práctica. Á dereita, temos unha visualización dun (pequeno) repositorio de git. Hai dous commits por agora: o commit inicial, `C0`, e un commit que lle segue, `C1`, que podería ter algúns cambios interesantes.","","Pincha no botón de abaixo para facer un novo commit."],afterMarkdowns:["¡Alá imos! Mi ma!. Fixemos cambios no repositorio e gardámolos nun commit. O commit que creaches ten un pai, `C1`, que é unha referencia do commit no que se basea."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Alá imos. ¡Inténtao ti agora! Cando se peche a ventá, fai dous commits para completar o nivel."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits Git","Un commit dans un dépôt Git (repository) enregistre une image (snapshot) de tous les fichiers du répertoire. Comme un Copier-Coller géant, mais en bien mieux !","","Git fait en sorte que les commits soient aussi légers que possible donc il ne recopie pas tout le répertoire à chaque commit. En fait, Git n'enregistre que l'ensemble des changements (\"delta\") depuis la version précédente du dépôt. C'est pour cette raison que la plupart des commits ont un commit parent -- ainsi que nous le verrons plus tard.","",'Pour cloner un dépôt, il faut décompresser ("résoudre") tous ces deltas. C\'est la raison pour laquelle la commande écrit :',"","`resolving deltas`","","lorsque l'on clone un dépôt.","","C'est beaucoup à absorber, mais pour l'instant vous pouvez considérer les commits comme des snapshots du projet. Les commits sont très légers et passer de l'un à l'autre est très rapide !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons à quoi cela ressemble en pratique. Sur la droite, on peut visualiser un (petit) dépôt Git. Il y a pour l'instant deux commits -- le premier commit initial, `C0`, et un commit suivant `C1` qui aurait des changements significatifs.","","Appuyez sur le bouton ci-dessous pour faire un nouveau commit."],afterMarkdowns:["C'est parti ! Super. Nous venons de faire des modifications sur le dépôt et de sauvegarder celles-ci dans un commit. Ce commit que nous venons de faire a un parent, `C1`, qui référence le commit sur lequel il est basé."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Allez-y et essayez par vous-même ! Après la fermeture de cette fenêtre, faites deux commits pour terminer ce niveau."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 커밋","커밋은 Git 저장소에 여러분의 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것입니다. 디렉토리 전체를 복사하여 붙여넣는것과 유사하지만, 훨씬 유용한 방법입니다!","",'Git은 가능한 한 커밋을 가볍게 유지하고자 하기때문에, 커밋할 때마다 디렉토리 전체를 복사하진 않습니다. 각 커밋은 저장소의 이전 버전과 다음 버전의 변경내역("delta"라고도 함)을 저장합니다. 그래서 대부분의 커밋이 그 커밋 위의 부모 커밋을 가리킵니다. -- 다음 화면에서 곧 살펴보게 될 것입니다.',"","저장소를 복제(clone)하려면 모든 변경분(delta)를 풀어내야 하는데, 이 때문에 명령행 결과로 아래 문구를 볼 수 있습니다.","","`resolving deltas`","","알아야 할 것이 꽤 많습니다만, 일단은 커밋을 프로젝트의 스냅샷들로 생각하면 충분합니다. 커밋은 매우 가볍고 커밋 사이의 전환도 매우 빠르다는 것을 기억해주세요!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["연습할 때 어떻게 보이는지 확인해봅시다. 오른쪽 화면에 git 저장소를 그림으로 표현해 놓았습니다. 현재 두번 커밋한 상태입니다 -- 첫번째 커밋으로 `C0`, 그 다음으로 `C1`이라는 어떤 의미있는 변화가 있는 커밋이 있습니다.","","아래 버튼을 눌러 새로운 커밋을 만들어보세요."],afterMarkdowns:["이렇게 보입니다! 멋지죠. 우리는 방금 저장소 내용을 변경해서 하나의 커밋으로 저장했습니다. 방금 만든 커밋은 부모는 `C1`이고, 어떤 커밋을 기반으로 변경된 것인지를 가리킵니다."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["계속해서 직접 한번 해보세요! 이 창을 닫고, 커밋을 두 번 하면 다음 레벨로 넘어갑니다."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commit","Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!","","Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。","","Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有 parent 节点的原因 —— 我们会在图示中用箭头来表示这种关系。对于项目组的成员来说,维护提交历史对大家都有好处。","","关于提交记录太深入的东西咱们就不再继续探讨了,现在你可以把提交记录看作是项目的快照。提交记录非常轻量,可以快速地在这些提交记录之间切换!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们来实际操作一下,看看提交记录是怎样的。右边展示了一个(小型)Git 代码库。当前有两个提交记录 —— 初始提交 `C0` 和其后可能包含某些有用修改的提交 `C1`。","","点击下面的按钮创建一个新的提交记录。"],afterMarkdowns:["好了!非常棒!我们刚才修改了代码库,并把这些修改保存成了一个提交记录 `C2`。`C2` 的 parent 节点是 `C1`, parent 节点是当前提交中变更的基础。"],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["接下来自己试一试吧。当前窗口关闭后,完成两次提交就可以过关!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git commit","一個 commit 在 git repo 中會記錄目錄下所有文件的快照。感覺像是大量的複製和貼上,但 git 的速度更快!","",'git 希望 commit 儘可能地不占空間,所以每次進行 commit 的時候,它不會單純地複製整個目錄。實際上它把每次 commit 視為從目前的版本到下一個版本的變化量,或者說一個 "(delta)"。',"","git 會保存 commit 的歷史紀錄,所以,絕大部分的 commit 的上面都會有 parent commit,在我們的圖形表示中,箭頭方向表示從 parent commit 到所對應的 child commit,保存這樣子的一個歷史紀錄是非常有用的。","","要學的東西有很多,但現在你可以把 commit 當作是當下的 project 的快照。commit 不佔空間且可以快速切換!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在實例中學習 commit。右邊是一個(小)git repository。當前有兩個 commit,一開始的 commit `C0` 以及 `C1` 這一個 commit 來表示之後可能的一些修改。","","點擊下面的按鈕生成新的 commit。"],command:"git commit",afterMarkdowns:["看吧!很厲害!我們對於文件做了一些修改,並且把這些修改表示成一個 commit。剛剛做的 commit `C2` 有一個 parent commit `C1`,代表此次修改是從那裡過來的。"],beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["接下來你可以隨便測試。當目前的視窗關閉之後,輸入兩次 commit 就可以過關!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Коммиты в GIT","Коммит в git репозитории хранит снимок всех файлов в директории. Почти как огромная копия, только лучше","","Git пытается быть лёгким и быстрым насколько это только возможно, так что он не просто слепо копирует всю директорию каждый раз, а ужимает (когда это возможно) коммит в набор изменений или «дельту» между текущей версией и предыдущей.","","Также Git хранит всю историю о том, когда какой коммит был сделан. Вот почему большинство коммитов имеют предков - мы указываем на предков стрелками при визуализации. Поддержка истории коммитов более чем важна для всех, кто работает над проектом!","","Можно ещё долго рассказывать о коммитах, но для простоты будем считать их полными снимками проекта. Коммиты очень легки, так что переключение между ними происходит предельно быстро!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, как это выглядит на практике. Справа расположена визуализация небольшого git репозитория. Сейчас в нём два коммита: первый, исходный коммит С0 и один коммит С1 после него, содержащий изменения.","","Нажми на кнопку, чтобы совершить коммит"],afterMarkdowns:["Отлично. Мы только что внесли изменения в репозиторий и сохранили их как коммит. У коммита, который мы только что сделали, есть родитель, С1, который указывает на предыдущий коммит."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Пора попробовать! После того, как это окно закроется, сделай два коммита, чтобы пройти этот уровень."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Коміти в Git","Коміт в Git репозиторії зберігає моментальну копію всіх файлів в поточній директорії. Це як гігантська копіпаста, тільки краще.","",'Git намагається зберігати коміти якнайпростіше й ефективніше, тому він не просто копіює всю директорію при кожному коміті. Він може стиснути коміт в набір правок чи "дельту" між двома версіями репозиторію.',"","Git також зберігає історію коли і ким був створений той чи інший коміт. Тому більшість комітів мають комітів-предків, що знаходяться вище в ієрархії — ми це зображуємо стрілочками в нашій візуалізації. Історія — це необхідна річ для кожного, хто працює з конкретним проектом.","","Тут є багато над чим подумати, але наразі ти можеш уявляти коміти як моментальні знімки проекту. Коміти майже невагомі й перемикання між ними дуже швидке."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давай подивимось, як це виглядає на практиці. Справа зображена візуалізація маленького Git-репозиторію. Наразі ми бачимо два коміти: початковий коміт `C0`, та наступний коміт `C1`, який містить якісь змістовні зміни.","","Натисни кнопку нижче, щоб створити новий коміт."],afterMarkdowns:["Чудово. Ми щойно зробили деякі зміни з репозиторієм і зберегли їх як новий коміт. Цей коміт має предка `C1`, який вказує на коміт, з якого він був створений."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Спробуй сам. Після того як це вікно закриється, зроби два коміти, щоб пройти цей рівень."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Một commit trong một Git repository (kho chứa) lưu trữ một ảnh chụp của tất cả các file trong thư mục của bạn. Như kiểu copy và paste cỡ bự, thậm chí còn tốt hơn thế!","",'Thế nhưng Git muốn giữ cho các commit nhẹ hết mức có thể, cho nên Git không copy tất cả thư mục một cách mù quáng mỗi khi bạn commit. Nó có thể (khi khả dĩ) nén commit như một tập hợp các thay đổi, hay là một "bản so sánh", giữa một phiên bản kho chứa Git với phiên bản tiếp theo.',"","Đồng thời Git cũng lưu trữ lịch sử commit nào được tạo ra lúc nào. Đó là tại sao hầu hết các commit có commit tổ tiên phía trên nó -- chúng tôi đã hình tượng hóa mối quan hệ này bằng các mũi tên. Trong cộng tác nhóm thì việc gìn giữ lịch sử là rất có ích!","","Có vẻ là hơi nhiều lý thuyết rồi, bây giờ bạn chỉ cần hiểu các commit là các lát cắt của dự án. Các commit rất nhẹ nên việc chuyển qua lại giữa chúng thì nhanh vô cùng!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Thử thực hành chút nào. Ở bên phải chúng ta có mô tả một kho Git (nhỏ). Hiện tại đang có 2 commit, một là commit khởi nguyên `C0`, và một commit sau đó `C1` có thể đã có một vài thay đổi.","","Bấm nút bên dưới để tạo một commit mới."],afterMarkdowns:["Đúng rồi! Tuyệt vời. Bạn vừa tạo thay đổi cho kho chứa và lưu vào commit. Cái commit bạn vừa tạo nó có cha, là `C1` đấy, có thể hiểu commit vừa được tạo dựa trên commit cũ hơn là C1."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Nào bây giờ thì thử tự làm bài tập nào! Sau khi đóng cửa sổ này, tạo ra 2 commit để hoàn thành cấp độ."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Commit v git repozitoriju zabeleži stanje vseh datotek v tvoji mapi. Deluje kot tak velik 'Izreži in Prilepi', vendar še bolje!","",'Git hoče commite ohraniti majhne kot se le da, tako da ne skopira vsakič kar vseh datotek ob commitu. Lahko (kadar je možno) stisne commit le kot množico sprememb oziroma kot "delto" sprememb med eno in drugo različico v repozitoriju.',"","Git vodi tudi zgodovino o tem, kdaj je bil kateri commit narejen. Zato ima večina commitov nad seboj svoje prednike -- to je v vizualizaciji predstavljeno s puščicami. Vzdrževanje zgodovine je uporabno za vse, ki delajo na projektu!","","Veliko je za dojeti na začetku, ampak za zdaj si lahko predstavljaš commite kot posnetek projekta v določenem času. Commiti so zelo majhni in prehajanje med njimi je noro hitro!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo kako to izgleda v praksi. Na desni imamo vizualizacijo (majhnega) git repozitorija. Trenutno imamo dva commita -- prvi začetni commit, `C0`, in še en commit za tem, `C1`, ki ima lahko pomembne spremembe.","","Pritisni gumb spodaj, da narediš nov commit."],afterMarkdowns:["Tako ja! Super. Pravkar smo naredili spremembe v repozitoriju in jih shranili kot commit. Commit, ki smo ga naredili ima starša, `C1`, ki nam pove iz katerega commita smo izhajali."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Čas je, da poizkusiš sam! Ko se to okno zapre, naredi dva commita, da dokončaš to stopnjo."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commity Gita","`commit` w repozytorium Gita rejestruje migawkę wszystkich (śledzonych) plików w twoim katalogu. To jak gigantyczne kopiowanie i wklejanie, ale jeszcze lepsze!","",'Git stara się, aby commity były tak lekkie, jak to tylko możliwe, więc nie kopiuje na ślepo całego katalogu za każdym razem, gdy zatwierdzasz zmiany. Możesz (jeśli to możliwe) skompresować commita jako zestaw zmian (lub _"delta"_) między jedną wersją w repozytorium a następną.',"","Git przechowuje również całą historię, kiedy dokonano każdego zatwierdzenia. Dlatego większość commitów ma na sobie zmiany przodków -- oznaczamy to strzałkami w naszej wizualizacji. Zachowanie historii to świetna funkcja dla wszystkich, którzy pracują nad projektem!","",'To sporo do zapamiętania, ale na razie możesz myśleć o commitach jako "rewizjach" albo migawkach projektu. Są bardzo lekkie, a przełączanie się między nimi jest niesamowicie szybkie!']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak to wygląda w praktyce. Po prawej stronie mamy wizualizację (małego) repozytorium Gita. Istnieją dwa zatwierdzenia:\n początkowy commit `C0`, a następnie po nim commit `C1`, który może mieć kilka interesujących zmian.","","Kliknij przycisk poniżej, aby dodać nowego commita."],afterMarkdowns:["Gotowe! Niesamowite. Właśnie wprowadziliśmy zmiany w repozytorium i zapisaliśmy je jako commita. Commit, który właśnie wykonaliśmy, ma rodzica `C1`, który odnosi się do commitu, na którym się opierał."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Śmiało, wypróbuj to! Po zamknięciu tego okna wykonaj dwa commity, aby ukończyć poziom."]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["## கிட் கமிட்கள்","கிட் கமிட் உங்கள் கோப்பகத்தில் உள்ள கண்காணிக்கப்பட்ட (tracked) கோப்புகளை கிட் களஞ்சியத்தில் ஒரு நகலாக பதிவு செய்கின்றது. ஆனால் இது முழு நகல் எடுத்து ஒட்டுவதை விட சிறந்தது!","",'கிட் கமிட்களை முடிந்தவரை இலகுவாக இருக்கும்படி செய்கின்றது, எனவே நீங்கள் ஒவ்வொரு முறை கமிட் செய்யும் போதும் கிட் கோப்பகங்களை கண்மூடித்தனமாக நகலெடுக்காது. அது (முடிந்தால்) கமிட்களை சுருக்கப்பட்ட மாற்றங்களின் தொகுப்பாகவோ, அல்லது களஞ்சியத்தில் ஏற்க்கனவே உள்ள பதிப்பின் "வேறுபாட்டை" மட்டும் கண்க்கிட்டோ சேமிக்க செயிகிறது.',"","மேலும் கிட் கமிட்கள் எப்போது செய்யப்படுகிறது என்பதன் வரலாற்றையும் பராமரிக்கிறது. அதனால் தான் பெரும்பான்மையான கமிட்கள் முன்பு பதிவிட்ட கமிட்களை பின் தொடருகின்றன -- நமது வரைபடங்கள் அதனை அம்பு குறியீடுகளாக காட்டு கின்றன. வரலாற்றைப் பராமரிப்பது கணினிதிட்டத்தில் பணிபுரியும் அனைவருக்கும் உதவியாக இருக்கும்!","","புரிந்து கொள்ள நிறைய இருக்கிறது, ஆனால் இப்போதைக்கு நீங்கள் கமிட்களை திட்டத்தின் பிரதியாக நினைக்கலாம். கமிட்டுகள் மிகவும் இலகுவானவை மேலும் அவற்றுக்கிடையே மாறுவது மிகவும் எளிமையானது!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இது நடைமுறையில் எப்படி இருக்கும் என்று பார்ப்போம். இங்கு வலதுபுறத்தில் ஒரு (சிறிய) கிட் களஞ்சியத்தின் காட்சிப்படுத்தல் உள்ளது. இப்போது அதில் இரண்டு கமிட்கள் உள்ளன -- முதல் கமிட், `C0`, மற்றும் மேலும் இரண்டாவதாக `C1` அதில் சில பயண்னுள்ள மாற்றங்கள் இருக்கலாம்.","","புதிய கமிட் செய்ய கீழே உள்ள பொத்தானை அழுத்தவும்."],afterMarkdowns:["அவ்வலவுதான்! அருமை. நாம் களஞ்சியத்தில் மாற்றங்களைச் செய்து கமிட்டாக சேமித்துள்ளோம். இப்போது செய்த கமிட்டிர்க்கு `C1` மூலமாக உள்ளது, அது அதனுடைய மூலத்தை தொடர்ந்து உள்ளது."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["இப்போது இந்த திரை மூடிய பிறகு நீங்கள் முயற்சி செய்யுங்கள்!, இந்த நிலையை நிரைவு செய்ய இரண்டு கமிட்டுகள் செய்யுங்கள்."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Un commit in git memorizza un'instantanea di tutti i file (tracciati) della cartella di lavoro. È come un enorme copia-incolla, ma migliore!","",'Git conserva i commit nel modo più leggero possibile, perciò non copia ciecamente l\'intera cartella per ogni commit. Può (ove possibile) comprimere un commit come un insieme di cambiamenti, o "delta", da una versione alla successiva del repository.',"","Git memorizza anche la storia di tutti i commit effettuati. Questo è il motivo per cui molti commit hanno genitori sopra di essi -- questo viene rappresentato con delle frecce nelle nostre spiegazioni. Conoscere la storia è utilissimo per tutti quelli che collaborano ad un progetto!","","C'è tanto da sapere, ma per ora pensa ai commit come a delle instantanee del progetto. I commit sono leggerissimi e si può passare da uno all'altro in un battibaleno!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamolo in pratica. Sulla destra abbiamo l'immagine di un (piccolo) repository git. Ci sono due commit -- il primo commit, `C0`, e un altro dopo, `C1`, che potrebbe avere modifiche importanti.","","Premi il pulsante qua sotto per eseguire un nuovo commit."],afterMarkdowns:["Ecco qua! Fantastico. Abbiamo modificato il repository e salvato con un commit. Il commit che abbiamo creato ha un genitore, `C1`, che ci indica su chi è basato il nostro commit."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Vai avanti e prova da solo! Dopo che questa finestra si chiude, crea due commit per completare il livello."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commit'leri","Git commit'leri, projenizin tüm (izlenen) dosyalarının anlık bir fotoğrafını çeker. Düşünün ki bu, büyük bir kopyala-yapıştır işlemi gibi, ama işte burada daha eğlenceli bir olay var!","","Git, commit'leri hafif tutmak ister, bu yüzden her seferinde sırf her şeyi körü körüne kopyalamaz. Mümkün olduğunda, bir commit'i değişikliklerin seti olarak sıkıştırabilir veya bir sürümün bir sonraki sürüme olan farkını, yani bir \"delta\"yı yakalayabilir.","","Git aynı zamanda hangi commit'lerin ne zaman yapıldığını da kayıt altında tutar. İşte bu yüzden çoğu commit, üstünde atası olan başka commit'lerle gelir - bu görselde oklarla belirtilir. Tarih tutmak, projede çalışan herkes için harika bir şeydir!","","İlk bakışta karmaşık gelebilir, ama şimdilik commit'leri projenizin anlık fotoğrafları gibi düşünün. Commit'ler hafiftir ve aralarında çok hızlı geçiş yapılabilir!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bakalım bu pratikte nasıl görünüyor. Sağ tarafta, (küçük) bir git deposunun görselleştirmesini görüyorsunuz. Şu anda iki commit var - ilk başlangıç commit'i, `C0`, ve ondan sonra gelen anlamlı değişiklikler içerebilecek bir commit olan `C1`.","","Yeni bir commit için aşağıdaki düğmeye tıklayın."],afterMarkdowns:["İşte bu! Harika. Depoya değişiklikler yaptık ve onları bir commit olarak kaydettik. Yeni yaptığımız commit'in bir atası var, `C1`, bu da commit'imizin ne üzerine inşa edildiğini gösteren bir referans içerir."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Şimdi sıra sende! Bu pencere kapanır kapanmaz, seviyeyi tamamlamak için iki commit yap."]}}]}}}},{}],124:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C4","id":"main"},"bugFix":{"target":"C2","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","C2"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout main;git commit;git merge bugFix",name:{en_US:"Merging in Git",de_DE:"Mergen in Git",es_AR:"Mergeando en Git",es_MX:"Haciendo merge 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",ko:"Git에서 브랜치 합치기(Merge)",ja:"ブランチとマージ",zh_CN:"Git Merge",zh_TW:"git 中的 merge",ru_RU:"Слияния веток в Git",uk:"Злиття гілок в Git",vi:"Gộp nhánh trong Git",sl_SI:"Merganje v Gitu",pl:"Merge w Gicie",it_IT:"Fusione in Git",ta_IN:"கிட்டில் இணைத்தல்",tr_TR:"Git'te Merge işlemleri"},hint:{en_US:"Remember to commit in the order specified (bugFix before main)",de_DE:"Denk dran in der angegebenen Reihenfolge zu committen (erst bugFix, dann main)",ja:"指示された順番でコミットすること(mainの前にbugFixで)",es_AR:"Acordate de commitear en el orden especificado (bugFix antes de main)",es_MX:"Acuérdate de hacer commit en el orden especificado (bugFix antes de main)",es_ES:"Acuérdate de hacer commit en el orden especificado (bugFix antes de main)",pt_BR:"Lembre-se de commitar na ordem especificada (bugFix antes de main)",gl:"Lembrate de facer commit na orde específica (bugFix antes de main)",fr_FR:"Pensez à faire des commits dans l'ordre indiqué (bugFix avant main)",zh_CN:"要按目标窗口中指定的顺序进行提交(bugFix 先于 main)",zh_TW:"記住按指定的順序 commit(bugFix 比 main 優先)",ko:"말씀드린 순서대로 커밋해주세요 (bugFix에 먼저 커밋하고 main에 커밋)",ru_RU:"Не забудь делать коммиты в правильном порядке (сначала bugFix, потом main)",uk:"Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім main)",vi:"Nhớ là commit theo đúng thứ tự (bugFix trước main)",sl_SI:"Zapomni si, da je potrebno commitati v pravilnem vrstnem redu (bugfix pred main)",pl:"Pamiętaj, aby commitować w określonej kolejności (bugFix przed main)",it_IT:"Ricorda di effettuare i commit nell'ordine specificato (bugFix prima di main)",ta_IN:"bugFix முன் main என்ற கொடுக்கப்பட்ட வரிசையில் கட்டலை இடுவதை கருத்தில் கொள்க",tr_TR:"Belirlenen sırada commit etmeyi unutmayın (main'den önce bugFix)"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `main`."],afterMarkdowns:["Woah! See that? First of all, `main` now points to a commit that has two parents. If you follow the arrows up the commit tree from `main`, you will hit every commit along the way to the root. This means that `main` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `main` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `main` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was an ancestor of `main`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `main` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `main` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `main` with `git merge`","",'*Remember, you can always re-display this dialog with "objective"!*']}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches und Mergen","","Super! Wir wissen jetzt, wie man committet und einen Branch anlegt. Jetzt müssen wir nur noch rauskriegen, wie man die Arbeit, die in verschiedenen Branches steckt, zusammenführen kann. Dann können wir einen neuen Branch erstellen, darin ein neues Feature entwickeln, und das dann in den ursprünglichen Branch integrieren.","",'Die einfachste Methode, mit der man Branches zusammenführen kann, ist `git merge`. Das Mergen erzeugt in git einen speziellen Commit, der zwei Vorgänger hat. Ein solcher Commit bedeutet im Prinzip "ich möchte alle Arbeit von dem Vorgänger hier und dem dort *und* allen ihren jeweiligen Vorgängern miteinander kombinieren".',"","Grafisch dargestellt ist es einfacher zu verstehen, lass es uns mal ansehen."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir zwei Branches; jeder besteht jeweils aus einem eigenen Commit. Das bedeutet, dass keiner der beiden Branches alle Inhalte des gesamten Repositorys kennt. Das werden wir mit einem Merge ändern.","","Wir werden den Branch `bugFix` in `main` integrieren."],afterMarkdowns:["Wow! Hast du das gesehen? Zunächst mal zeigt `main` jetzt auf einen Commit mit zwei Vorgängern. Wenn du den beiden Pfeilen immer weiter folgst, kommst du an jedem Commit im Repository vorbei. Das heißt `main` enthält jetzt alles, was es im Repository gibt.","","Siehst du außerdem wie sich die Farben der Commits verändert haben? Um die Vorgänge zu verdeutlichen hab ich etwas Farbe ins Spiel gebracht. Jeder Branch hat seine eindeutige Farbe. Jeder Merge Commit bekommt als Farbe eine Mischung aus den Farben seiner Vorgänger.","","Wir sehen also, dass die Farbe des Branch `main` in alle Commits gemischt wurde, die von `bugFix` aber nicht. Ändern wir das ..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Mergen wir `main` in `bugFix`:"],afterMarkdowns:["Da `bugFix` ein Vorgänger von `main` war, musste git hier kaum etwas tun; es verschiebt `bugFix` einfach auf den Commit, auf den auch `main` zeigt.","","Jetzt haben alle Commits dieselbe Farbe, das heißt jeder Branch enthält die Informationen des gesamten Repositorys! Juhu!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Führe folgendes aus, um diesen Level zu schaffen:","","* Lege einen neuen Branch `bugFix` an","* Checke `bugFix` aus mittels `git checkout bugFix`","* Mach einen Commit","* Geh mit `git checkout` zum `main` zurück","* Mach noch einen Commit","* Merge den Branch `bugFix` in `main` mit `git merge`","","*Denk dran, du kannst diese Meldung mit dem Befehl `objective` so oft anzeigen, wie du willst!*"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## ブランチとマージ","","いい調子ですね。これまでにコミットとブランチについて学びました。そろそろ2つのブランチを1つにまとめるやり方について見ていきましょう。これができれば新しい機能の開発のために新しいブランチを切って、開発が終わったら変更を元のブランチへ統合することができるようになります。","","はじめに紹介するのは、`git merge`を使ったマージのやり方です。mergeコマンドによって、2つの独立した親を持つ特別なコミットを作ることができます。2つの親を持つコミットが持つ意味とは、「全く別々の場所にいる2つの親(*かつ*、それらの親の祖先全て)が持つ全ての変更を含んでいますよ」ということです。","","見てみた方が早いので、次の画面で確認してみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["それぞれ別のコミットを指している2つのブランチがあります。変更が別々のブランチに分散していて統合されていないケースです。これをマージで1つにまとめてみましょう。","","`bugFix`ブランチを`main`ブランチにマージしてみます。"],afterMarkdowns:["わあ、見ましたか?まず初めに、`main`ブランチが2つのコミットを親に持つ新しいコミットを指してますね。`main`から親をたどっていくと、最も古いコミットにたどり着くまでに全てのコミットを含んでいる様が確認できます。これで、全ての変更を含む`main`が完成しました。","","色がどう変わったかにも注目して下さい。学習を助けるために、ブランチ毎に色をつけています。それぞれのブランチは自分の色を持っていて、どのブランチから派生して出てくるか次第でコミットごとの色が決まります。","","今回のコミットには`main`ブランチの色が使われました。しかし`bugFix`ブランチの色がまだ変わってないようなので、これを変えてみましょう。"],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`main`ブランチを`bugFix`ブランチにマージしてみます。"],afterMarkdowns:["`bugFix`ブランチは`main`ブランチの派生元だったので、gitは実際大したことはしていません。`bugFix`ブランチを指していたポインタを`main`が指していたコミットへと移動させただけです。","","これで全てのコミットが同じ色になりました。つまり、リポジトリの中の全ての変更をそれぞれのブランチが持ったことになります。やったね!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["以下の作業で理解度の確認をしてみましょう:","","* `bugFix`という名前で新しいブランチを切る","* `git checkout bugFix`コマンドで`bugFix`ブランチに切り替える","* 一回だけコミット","* `git checkout`で`main`へ戻る","* もう1回コミットする","* `git merge`コマンドを使って、`bugFix`ブランチを`main`ブランチへとマージする","",'*注:"objective"コマンドでこのヘルプにいつでも戻ってこれます*']}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mergeando ramas","","¡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 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"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Acá 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 `main`."],afterMarkdowns:["¡Wooow! ¿Viste eso? Primero que nada, `main` ahora apunta a un commit que tiene dos padres. Si seguís las flechas por el árbol de commits empezando desde `main` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `main` 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, incluí 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 acá vemos que el color de la rama `main` 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 main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Mergeemos `main` a `bugFix`:"],afterMarkdowns:["Como `bugFix` era un ancestro de `main`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `main`.","","Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Wiii!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, seguí estos pasos:","","* Creá una nueva rama, llamada `bugFix`","* Checkouteá la rama `bugFix` usando `git checkout bugFix`","* Hacé un commit","* Volvé a `main` con `git checkout`","* Hacé otro commit","* Mergeá la rama `bugFix` a `main` usando `git merge`","",'*Acordate: siempre podés volver a ver este mensaje tipeando "objective"!*']}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mezclando ramas","","¡Genial! Ya sabemos cómo hacer 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`. Mezclar 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"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Acá tenemos dos ramas y cada una tiene un commit único. Esto significa que ninguna de las ramas incluye "todo el trabajo" que hay en nuestro repositorio. Hagamos una mezcla para solucionar eso.',"","Vamos a `merge`(mezclar) la rama `bugFix` a `main`."],afterMarkdowns:["¡Wooow! ¿Viste eso? Primero que nada, `main` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `main` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `main` 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, incluí 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 acá vemos que el color de la rama `main` 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 main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Merge (mezclemos) `main` a `bugFix`:"],afterMarkdowns:["Como `bugFix` era un ancestro de `main`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `main`.","","Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Súper!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, sigue estos pasos:","","* Crea una nueva rama, llamada `bugFix`","* Cambia a la rama `bugFix` usando `git checkout bugFix`","* Haz un commit","* Vuelve a `main` con `git checkout`","* Haz otro commit","* Haz un merge de la rama `bugFix` a `main` usando `git merge`","",'*Recuerda: siempre puedes volver a ver este mensaje usando el comando "objective"!*']}}]},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 `main`."],afterMarkdowns:["¡Caramba! ¿Viste eso? Antes de nada, `main` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `main` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `main` 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 `main` 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 main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hagamos merge de `main` a `bugFix`:"],afterMarkdowns:["Como `bugFix` era un ancestro de `main`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `main`.","","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 main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; 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 `main` con `git checkout`","* Crea otro commit","* Haz merge de la rama `bugFix` a `main` usando `git merge`","",'*Recuerda: siempre puedes volver a ver este mensaje escribiendo "objective"!*']}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches e Merge","","Ótimo! Agora sabemos como commitar e criar ramos. Agora precisamos aprender uma forma de combinar o trabalho de dois ramos diferentes. Isso nos permitirá ramificar, desenvolver um novo recurso, e então combiná-lo de volta.","",'O primeiro método para combinar trabalho que vamos examinar é o `git merge`. O merge do Git cria um commit especial que possui dois pais únicos. Um commit com dois pais essencialmente significa "Quero incluir todo o trabalho deste pai aqui com o daquele outro pai ali, *e* com o do conjunto de todos os seus ancestrais."',"","É mais fácil com uma visualização, vamos ver logo a seguir."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Aqui nós temos dois ramos; cada um tem um commit que é único. Isso significa que nenhum ramo inclui o conjunto do "trabalho" que foi realizado no repositório. Vamos consertar isso com um merge.',"","Vamos juntar o ramo `bugFix` no `main`."],afterMarkdowns:["Uau! Viu isso? Antes de tudo, o `main` agora aponta para um commit que possui dois pais. Se você seguir as setas subindo a árvore de commits a partir do `main`, você será capaz de encontrar, ao longo do caminho até a raiz, qualquer um dos commits. Isso significa que o `main` contém todo o trabalho realizado no repositório até o momento.","","Além disso, viu como as cores dos commits mudaram? Para ajudá-lo a aprender, eu incluí uma legenda. Cada ramo tem uma cor única. Cada commit tem a cor resultante da mistura das cores de todos os ramos que o contém.","","Aqui vemos que a cor do ramo `main` está misturada em todos os commits, mas a cor do `bugFix` não está. Vamos corrigir isso..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos juntar o `main` no `bugFix`:"],afterMarkdowns:["Como o `bugFix` é um ancestral do `main`, o git não teve trabalho nenhum; ele só precisou mover o `bugFix` para o mesmo commit do `main`.","","Agora todos os commits possuem a mesma cor, o que significa que ambos os ramos contém todo o trabalho realizado no repositório! Eba!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, faça o seguinte:","","* Crie um novo ramo chamado `bugFix`","* Faça checkout no ramo `bugFix` com `git checkout bugFix`","* Faça um commit","* Volte ao `main` com `git checkout`","* Faça um novo commit","* Junte o ramo `bugFix` no `main` com `git merge`","",'*Lembre-se, você pode sempre mostrar esta mensagem novamente com o comando "objective"!*']}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas e merges","","¡Xenial! Agora sabemos como facer commits e crear ramas. Agora precisamos aprender unha forma de combinar o traballo de dúas ramas diferentes. Iso permitiríanos ramificar, facer un novo cambio, e entón mesturalo de volta.","",'O primeiro comando para mesturar o traballo que imos ver é `git merge`. O merge de Git crea un commit especial que ten dous pais únicos. Un commit con dous pais significa "Quero incluír todo o traballo deste pai cos cambios do outro pai, *e* o conxunto de tódolos ancestros."',"","É máis doado con unha visualización, ímolo ver na seguinte vista."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Aquí nos temos dúas ramas; cada unha ten un commit que é único. Isto significa que ningunha rama inclúe o conxunto de "traballo" feito no noso repositorio. Imos arranxar esto cun merge.',"","Imos xuntar a rama `bugFix` na `main`."],afterMarkdowns:["¡Uah! ¿Viches? Antes de todo, `main` agora apunta a un commit que ten dous pais. Se ti sigues as frechas subindo a árbore de commits a partir de `main`, serás capaz de ver tódolos commits ata a raíz, calquera de eles. Isto significa que a rama `main` contén todo o traballo realizado no repositorio ata ese momento.","","Ademáis, ¿viches como cambiaron as cores dos commits? Para axudarte a aprender, hai unha lenda. Cada rama ten unha única cor. Cada commit ten a cor resultante de mesturar as cores de tódalas ramas que contén.","","Aquí vemos que a rama `main` está mesturada en todos os commits, pero a cor da rama `bugFix` non o está. Imos arranxar eso..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos mesturar a rama `main` en `bugFix`:"],afterMarkdowns:["Como o `bugFix` é un ancestro de `main`, o git non ten traballo que facer; el só ten que mover o punteiro de `bugFix` para o mesmo commit que `main`.","","Agora tódolos commits teñen a mesma cor, o que significa que ambas ramas teñen o mesmo traballo no repositorios! Iepa!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, fai o seguinte:","","* Crea unha nova ramara chamada `bugFix`","* Fai checkout da rama `bugFix` con `git checkout bugFix`","* Fai un commit","* Volve á rama `main` con `git checkout`","* Fai un novo commit","* Xunta a rama `bugFix` en `main` con `git merge`","",'¡Recorda, podes amosar esta mensaxe novamente co comando "objective"!']}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches et Merges","","Super ! Nous savons désormais comment faire des commits et des branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine (main par exemple).","","La première méthode que nous allons voir pour combiner le contenu de deux branches est `git merge`. Faire un 'merge' avec Git crée un commit spécial qui a deux parents. Un commit avec deux parents indique en susbtance \"Je veux inclure le contenu de ce parent et le contenu de cet autre parent, *et* l'ensemble de leurs parents.\"","","C'est plus facile en visualisant, regardons dans la vue suivante."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici nous avons deux branches ; chacune a un commit qui lui est propre. Cela signifie qu'aucune des deux branches n'inclut la totalité du \"travail\" qui a été fait dans le dépôt. Arrangeons-cela avec merge.","","Nous allons `merge` («fusionner») la branche `bugFix` dans `main`."],afterMarkdowns:["Youhou ! Vous avez vu ça ? Pour commencer, `main` pointe maintenant sur un commit qui a deux parents. Si vous remontez l'enchaînement des flèches depuis `main`, vous allez passez par tous les commits jusqu'à la racine. Cela signifie que `main` contient maintenant tout le travail du dépôt.","","Par ailleurs, avez-vous remarqué les nouvelles couleurs des commits ? Pour faciliter l'apprentissage, j'ai inclus une certaine logique dans la coloration. Chaque branche a une unique couleur. Chaque commit est de la couleur de toutes les branches qui le contiennent.","","Ici nous voyons que la couleur de `main` est intégrée à tous les commits, sauf ceux de `bugFix`. Réparons cela..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Faisons un merge de `main` dans `bugFix` :"],afterMarkdowns:["Puisque `bugFix` était un ancêtre de `main`, Git n'avait aucun travail à effectuer; il a simplement déplacé `bugFix` au même commit auquel `main` est attaché.","","Maintenant tous les commits sont de la même couleur, ce qui indique que chaque branche contient tout le contenu du dépôt ! Woohoo !"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, effectuez les opérations suivantes :","","* Faites une nouvelle branche appelée `bugFix`","* Positionnez-vous sur la branche `bugFix` avec `git checkout bugFix`","* Faites un commit","* Retournez sur la branche `main` (commande `git checkout`)","* Faites un nouveau commit","* Fusionnez la branche `bugFix` dans `main` avec `git merge`","",'*Rappelez-vous que vous pouvez à tout moment réafficher ces indications avec "objective" !*']}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 分支与合并","","太好了! 我们已经知道如何提交以及如何使用分支了。接下来咱们看看如何将两个分支合并到一起。就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。","","咱们先来看一下第一种方法 —— `git merge`。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个 parent 节点。翻译成自然语言相当于:“我要把这两个 parent 节点本身及它们所有的祖先都包含进来。”","","通过图示更容易理解一些,咱们到下一页看一下。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我们准备了两个分支,每个分支上各有一个独有的提交。这意味着没有一个分支包含了我们修改的所有内容。咱们通过合并这两个分支来解决这个问题。","","我们要把 `bugFix` 合并到 `main` 里"],command:"git merge bugFix",afterMarkdowns:["哇哦!看见了吗?首先,`main` 现在指向了一个拥有两个 parent 节点的提交记录。假如从 `main` 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 `main` 包含了对代码库的所有修改。↓↓↓","","还有,看见各个提交记录的颜色变化了吗?为了帮助学习理解,我引入了颜色搭配。每个分支都有不同的颜色,而每个提交记录的颜色是所有包含该提交记录的分支的颜色混合之后的颜色。","","所以,`main` 分支的颜色被混入到所有的提交记录,但 `bugFix` 没有。下面咱们让它也改变一下颜色。"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们再把 `main` 分支合并到 `bugFix`:"],command:"git checkout bugFix; git merge main",afterMarkdowns:["因为 `main` 继承自 `bugFix`,Git 什么都不用做,只是简单地把 `bugFix` 移动到 `main` 所指向的那个提交记录。","","现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!大功告成!"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["要想通过这一关,需要以下几步:","","* 创建新分支 `bugFix`","* 用 `git checkout bugFix` 命令切换到该分支","* 提交一次","* 用 `git checkout main` 切换回 `main`","* 再提交一次","* 用 `git merge` 把 `bugFix` 合并到 `main`","","* 你随时都可以用“objective”命令来打开这个对话框!*"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## branch 以及 merge","","太好了! 我們已經知道怎麼使用 commit 和 branch 了。接下來要學的一招是如何合併(merge)兩個不同 branch 的工作。這讓我們可以建立一個新的 branch ,並且在上面開發新功能,然後合併回 main branch。","","`git merge` 是我們要學習 merge 的第一個方法。該 merge 會產生一個特殊的 commit,它包含兩個唯一 parent commit。一個 commit 如果有兩個 parent commit 的話,那就表示:「我想把這兩個 parent commit 本身及它們的 所有的 parent commit 都包含進來。」","","有圖有真相,看看下面的圖就明白了。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在這裡,我們有兩個 branch:各自都有一個唯一的 commit。這意味著沒有一個 branch 包含我們對文件的所有修改。讓我們 merge 這兩個 branch 來解決這個問題。","","我們要 merge `bugFix` 到 `main` "],command:"git merge bugFix",afterMarkdowns:["哇!看見了沒有?首先,`main` 現在指向一個 commit,這個 commit 有兩個 parent commit。假如從 `main` 開始沿著箭頭向上走,在到達起點的路上會經過所有的 commit。這說明了現在 `main` 紀錄了對文件的所有修改。","","還有,看見各個 commit 的顏色變化了嗎?為了幫助學習,我混合了顏色。每個 branch 都有特定的顏色。每個 commit 的顏色都變成了含有此 commit 的所有 branch 的混合色。","","所以,`main` branch 的顏色被混入到所有的 commit,但 `bugFix` 沒有。接下來就改一下這裡吧。"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們 merge `main` branch 到 `bugFix` 吧。"],command:"git checkout bugFix; git merge main",afterMarkdowns:["因為 `bugFix` branch只是 `main` branch 的 parent,git 什麼都不用做,只是簡單地把 `bugfix` branch 移動到 `main` 指向的 commit。","","現在所有的 commit 的顏色都是一樣的啦,這表示每一個 branch 都包含了所有文件的修改!太厲害了啦!"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["想完成這一關,執行以下的操作:","","* 建立新的 branch,叫做 `bugFix` ","* 用 `git checkout bugFix` 切換到 `bugFix` branch","* commit 一次","* 用 `git checkout` 切換回 `main` branch","* 再 commit 一次","* 用 `git merge` 將 `bugFix` merge 到 `main`","",'*記住,你可以用 "objective" 指令來重新顯示這個對話框!*']}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 브랜치와 합치기(Merge)","","좋습니다! 지금까지 커밋하고 브랜치를 만드는 방법을 알아봤습니다. 이제 두 별도의 브랜치를 합치는 몇가지 방법을 알아볼 차례입니다. 이제부터 배우는 방법으로 브랜치를 따고, 새 기능을 개발 한 다음 합칠 수 있게 될 것입니다.","",'처음으로 살펴볼 방법은 `git merge`입니다. Git의 합치기(merge)는 두 개의 부모(parent)를 가리키는 특별한 커밋을 만들어 냅니다. 두개의 부모가 있는 커밋이라는 것은 "한 부모의 모든 작업내역과 나머지 부모의 모든 작업, *그리고* 그 두 부모의 모든 부모들의 작업내역을 포함한다"라는 의미가 있습니다. ',"","그림으로 보는게 이해하기 쉬워요. 다음 화면을 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기에 브랜치가 두 개 있습니다. 각 브랜치에 독립된 커밋이 하나씩 있구요. 그 말은 이 저장소에 지금까지 작업한 내역이 나뉘어 담겨 있다는 얘기입니다. 두 브랜치를 합쳐서(merge) 이 문제를 해결해 볼까요?","","`bugFix` 브랜치를 `main` 브랜치에 합쳐(merge) 보겠습니다."],afterMarkdowns:["보셨어요? 우선, `main`가 두 부모가 있는 커밋을 가리키고 있습니다. ","","또, 커밋들의 색이 바뀐 것을 눈치 채셨나요? 이해를 돕기위해 색상으로 구분해 표현했습니다. 각 브랜치는 그 브랜치만의 색상으로 그렸습니다. 브랜치가 합쳐지는 커밋의 경우에는, 그 브랜치들의 색을 조합한 색상으로 표시 했습니다.","","그런식으로 여기에 `bugFix`브랜치 쪽을 제외한 나머지 커밋만 `main` 브랜치의 색으로 칠해져 있습니다. 이걸 고쳐보죠..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["이제 `main` 브랜치에 `bugFix`를 합쳐(merge) 봅시다:"],afterMarkdowns:["`bugFix`가 `main`의 부모쪽에 있었기 때문에, git이 별다른 일을 할 필요가 없었습니다; 간단히 `bugFix`를 `main`가 붙어 있는 커밋으로 이동시켰을 뿐입니다.","","짜잔! 이제 모든 커밋의 색이 같아졌고, 이는 두 브랜치가 모두 저장소의 모든 작업 내역을 포함하고 있다는 뜻입니다."],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["아래 작업을 해서 이 레벨을 통과하세요:","","* `bugFix`라는 새 브랜치를 만듭니다","* `git checkout bugFix`를 입력해 `bugFix` 브랜치로 이동(checkout)합니다.","* 커밋 한 번 하세요","* `git checkout` 명령어를 이용해 `main`브랜치로 돌아갑니다","* 커밋 또 하세요","* `git merge` 명령어로 `bugFix`브랜치를 `main`에 합쳐 넣습니다.","",'*아 그리고, "objective" 명령어로 이 안내창을 다시 볼 수 있다는 것을 기억해 두세요!*']}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ветки и слияния","","Ок! Мы уже знаем, как создавать ветки и коммитить наши изменения. Теперь надо понять, как объединять изменения из двух разных веток. Очень удобно создать ветку, сделать свою часть работы в ней и потом объединить изменения из своей ветки с общими.","","Первый способ объединения изменений, который мы рассмотрим - это `git merge` - слияние или просто мердж. Слияния в Git создают особый вид коммита, который имеет сразу двух родителей. Коммит с двумя родителями обычно означает, что мы хотим объединить изменения из одного коммита с другим коммитом и всеми их родительскими коммитами.","","Слишком запутанно =) На схеме всё проще и понятнее."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Вот у нас две ветки, каждая содержит по одному уникальному коммиту. Это означает, что ни одна из веток не содержит полный набор "работ", выполненных в этом репозитории. Можно исправить эту ситуацию, выполнив слияние.',"","Мы сделаем `merge` ветки `bugFix` в ветку `main`."],afterMarkdowns:["Что мы видим? Во-первых, ветка `main` теперь указывает на коммит, у которого два родителя. Если проследовать по стрелкам от этого коммита, вы пройдёте через каждый коммит в дереве прямиком к началу. Это означает, что теперь в ветке `main` содержатся все изменения репозитория.","","Во-вторых, обрати внимание, как изменились цвета коммитов. Мы ввели цветовую дифференциацию, чтобы помочь пониманию. У каждой ветки — свой цвет. Каждый коммит становится того цвета, какого его ветка. Если в нём изменения сразу двух веток - он становится цветом, смешанным из цветов родительских веток.","","И вот мы видим, что цвет ветки `main` подмешан к каждому коммиту, а ветки `bugFix` - нет. Это можно поправить."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Смерджим ветку `main` в ветку `bugFix`."],afterMarkdowns:["Так как ветка `bugFix` была предшественницей `main`, Git не делал ничего, только сдвинул `bugFix` на тот же коммит, где находится `main`","","Теперь все коммиты одного цвета, что означает, что каждая ветка содержит все изменения репозитория! Поздравляем!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, сделай следующее:","","* Создай новую ветку под названием `bugFix`","* Переключись на новую ветку `bugFix` командой `git checkout bugFix`","* Сделай один коммит","* Вернись на ветку `main` при помощи `git checkout`","* Сделай ещё один коммит","* Слей ветку `bugFix` с веткой `main` при помощи `git merge`","",'* Если что-то пошло не так - можешь подглядеть в эту шпаргалку командой "objective"!*']}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Гілки та їх Злиття","","Чудово! Ми знаємо як комітити та створювати гілки. Тепер потрібно навчитися в якийсь спосіб поєднувати інфу з двох чи більше гілок. Це дозволить нам відгілкуватись, зробити нову фічу, й потім інтегрувати її назад.","","Перший спосіб об’єднувати робочу інфу з яким ми розберемось це `git merge`. Команда merge (злити) в Git створює спеціальний коміт який має двох унікальних батьків. Коміт з двома батьками в приниципі просто значить що в нього включена інфа з обох батьків і всіх їх попередників.","","Це простіше сприймається візуально, тому розберемо це в наступному слайді"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Тут ми маємо дві гілки; кожна з них містить унікальний коміт. Це означає що жодна з них не містить повного набору "робочої інфи" в цьому репозиторії. Давайте зіллємо всю інфу докупи за допомогою merge.',"","Ми `змержимо` гілку `bugFix` в `main`."],afterMarkdowns:["Нічого собі! Ви це бачили? По-перше, `main` тепер вказує на коміт з двома батьками. Якщо ти піднімешся вверх з цього коміту по дереву, починаючи з `main`, на шляху ти зустрінеш кожен коміт аж до кореневого. Це означає що гілка `main` тепер містить всю інфу в цьому репозиторії.","","А ти помітив як змінилися кольори комітів? Для кращого розуміння процесу я додав певну кольорову диференціацію. Кожен бранч виділено окремим кольором. Колір кожного коміту це суміш кольорів всіх гілок що місять цей коміт.","","Тож ми бачимо що колір гілки `main` містять всі коміти, але не колір `bugFix`. Давайте виправимо це..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давай змержимо `main` в `bugFix`:"],afterMarkdowns:["Так як `bugFix` є нащадком `main`, git'у не потрібно нічого робити; він просто пересунув `bugFix` на тей самий коміт, на якому знаходиться `main`.","","Тепер всі коміти одного кольору, що означає що кожен бранч включає в собі всю корисну інфу яка є в цьому репозиторії! Ура!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень виконай наступні кроки:","","* Зроби нову гілку (branch) з назвою `bugFix`","* Перейди на гілку `bugFix` за допомогою `git checkout bugFix`","* Зроби один коміт","* Повернись до `main` за допомогою `git checkout`","* Зроби ще один коміт","* Змерджи (злий) гілку `bugFix` в `main` за допомогою `git merge`","",'*Не забувай, ти можеш завжди повернутися до цього діалогу за допомогою "objective"!*']}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh và gộp nhánh","","Tuyệt! Ta đã biết làm sao để commit và tạo nhánh. Giờ ta cần học cách để tập hợp thành quả của 2 nhánh khác biệt lại với nhau. Đây sẽ là cách để ta phân tách để phát triển chức năng, rồi sau đó hợp nhất nó trở lại.","",'Cách đầu tiên để hợp nhất thành quả cần xem xét đến là lệnh `git merge`. Merge trong Git là tạo ra một commit đặc biệt mà có 2 người cha độc nhất. Một commit mà có 2 cha căn bản nghĩa là "Tôi muốn có thành quả của ông này và ông kia nữa, *và* tất cả ông cha của họ."',"","Trực quan thì dễ hiểu hơn, sang trang tiếp theo nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Ở đây ta có 2 nhánh; mỗi nhánh có 1 commit độc nhất. Có nghĩa là chẳng nhánh nào có đủ "thành quả" trong kho chứa của ta cả. Sửa nó bằng merge nào.',"","Ta sẽ `merge` nhánh `bugFix` vào `main`."],afterMarkdowns:["Wao! Thấy chứ? Trước tiên, `main` giờ đã trỏ đến commit có 2 cha. Nếu bạn lần theo mũi tên lên trên từ `main`, bạn sẽ gặp tất cả các commit lên đến commit gốc. Có nghĩa là `main` giờ đã chứa tất cả thành quả trong kho.","","Đồng thời, bạn thấy màu commit thay đổi chứ? Để bạn dễ học hơn, tôi đã phối hợp một số bảng màu. Mỗi nhánh có một màu duy nhất. Mỗi commit mang màu pha trộn của tất cả nhánh chứa nó.","","Vì vậy, ở đây chúng ta thấy rằng màu nhánh `main` được pha trộn vào tất cả các commit, nhưng màu `bugFix` thì không. Hãy sửa nó nào..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy gộp nhánh `main` vào `bugFix` nào:"],afterMarkdowns:["Vì `bugFix` là bậc cha ông của `main`, Git chẳng phải làm gì cả; nó đơn giản chỉ chuyển `bugFix` vào commit mà `main` đang trỏ tới.","","Giờ thì tất cả commit đã có cùng màu, nghĩa là mỗi nhánh đã chứa tất cả thành quả trong kho! Ồ hố!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, hãy làm theo các bước bên dưới:","","* Tạo một nhánh mới tên là `bugFix`","* Chuyển sang nhánh `bugFix` với `git checkout bugFix`","* Commit một lần","* Trở về `main` với `git checkout`","* Commit một lần nữa","* Gộp nhánh `bugFix` vào `main` với `git merge`","",'*Nhớ rằng, bạn luôn luôn có thể bật lại hộp thoại này với lệnh "objective"!*']}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branchi in Merganje","","Odlično! Sedaj znamo commitati in branchati. Naslednja stvar je, da se naučimo združiti delo iz dveh različnih branchev. To nam bo omogočilo, da naredimo branch, razvijemo novo funkcionalnost in jo združimo nazaj.","",'Prva metoda za združevanje dela, ki jo bomo preučili je `git merge`. Merganje v Gitu naredi poseben commit, ki ima dva edinstvena starša. Commit z dvema staršema v bistvu pomeni "Hočem vključiti vso delo iz tega starša tukaj in iz tega tu *ter* vse delo iz njunih staršev".',"","Vizualizacija je enostavnejša, poglejmo v naslednjem oknu."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Tu imamo dva brancha; vsak ima en commit, ki je unikaten. To pomeni, da noben branch v repozitorju nima vsega "dela". Pa popravimo to z mergeom.',"","Sedaj bomo `mergeali` branch `bugFix` v `main`."],afterMarkdowns:["Woah! Si videl to? `main` sedaj kaže na commit, ki ima dva starša. Če slediš puščicam po drevesu commitov iz `main`, boš našel vsak commit po poti do roota. To pomeni, da `main` sedaj vsebuje vso delo iz repozitorija.","","Opaziš tudi, kako so se barve commitov spremenile? V pomoč pri učenju, sem vključil še nekaj barvne pomoči. Vsak branch ima svojo barvo. Vsak commit spremeni barvo v kombinirano barvo vseh branchev, ki imajo ta commit.","","Torej tukaj vidimo, da je `main` branch barva zmešana v vseh commitih, `bugFix` barva pa ne. Popravimo to ..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zmergajmo sedaj `main` v `bugFix`:"],afterMarkdowns:["Ker je `bugFix` bil prednik `main`, git ni rabil storiti ničesar; preprosto je premaknil `bugFix` v isti commit, kamer kaže `main`.","","Sedaj so vsi commiti iste barve, kar pomeni, da vsak branch vsebuje vse delo v repozitoriju!! Woohoo!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Da zaključiš to stopnjo, naredi naslednje korake:","","* Naredi novi branch `bugFix`","* Checkoutaj `bugFix` branch z `git checkout bugFix`","* Enkrat commitaj","* Pojdi nazaj na `main` z `git checkout`","* Še enkrat commitaj","* Mergeaj branch `bugFix` v `main` z `git merge`","",'*Pomni, vedno lahko spet pogledaš ta dialog z "objective"!*']}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Łączenie gałęzi","","Świetnie! Już wiemy, jak dodawać commity oraz jak tworzyć gałęzie (czyli branche). Teraz musimy się nauczyć, jak połączyć pracę dwóch różnych gałęzi. Stwórzmy nową gałąź, wprowadźmy nową funkcjonalność, a następnie połączmy gałęzie.","",'Pierwszą metodą scalania (łączenia) gałęzi, której zamierzamy użyć, jest `git merge` (w Polsce możesz spotkać się z takimi określeniami jak merge\'owanie albo usłyszeć o merdżowaniu). Połączenie to tworzy w Git specjalny commit, który ma dwoje różnych rodziców. Commit z dwojgiem rodziców zasadniczo oznacza: "Chcę uwzględnić całą pracę tych rodziców *oraz* wszystkich ich przodków".',"","Zaraz zobaczysz, jak to wygląda i łatwiej będzie ci wszystko zrozumieć."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Mamy tutaj dwie gałęzie. Każda z nich ma po jednym unikalnym commicie. Oznacza to, że żadna z nich nie zawiera "całej pracy", którą wykonaliśmy w naszym repozytorium. Naprawmy to!.',"","Użyjmy `git merge`, aby połączyć branche `bugFix` oraz `main`."],afterMarkdowns:['Łał! Widzisz to? Teraz "main" wskazuje na commit, który ma dwoje rodziców. Jeśli podążasz za strzałkami w górę drzewa źródłowego od `main`, trafisz na każdy commit po drodze do korzenia. Oznacza to, że `main` zawiera teraz całą pracę w repozytorium.',"","Zobacz też, jak zmieniły się kolory commitów. Aby pomóc Ci w nauce, dołączyłem kilka konwencji kolorów. Każdy branch ma swój własny kolor. Kolor każdego commita to mieszanka kolorów wszystkich gałęzi, które commitujesz","","Tutaj widzimy, że kolor gałęzi `main` jest składową kolorów wszystkich commitów, ale kolor gałęzi `bugFix` już nie. Naprawmy to..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Połączmy gałąź `main` z gałęzią `bugFix`:"],afterMarkdowns:["Ponieważ `bugFix` był przodkiem gałęzi `main`, git nie musiał wykonywać żadnej pracy. Po prostu przeniósł branch `bugFix` do tego samego commita, do którego dołączony był `main`.","","Teraz wszystkie commity mają ten sam kolor, co oznacza, że każda gałąź zawiera całą pracę znajdującą się w repozytorium! Super!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, wykonaj następujące czynności:","","* Stwórz nową gałąź o nazwie `bugFix`","* Przełącz się na gałąź `bugFix`, używając polecenia `git checkout bugFix`","* Zrób jeden commit","* Wróć do gałęzi `main` za pomocą polecenia `git checkout`","* Zrób kolejny commit","* Połącz gałąź `bugFix` z gałęzią `main`, używając polecenia `git merge`","",'*Pamiętaj: zawsze możesz zobaczyć tę wiadomość ponownie, wpisując "objective"!*']}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["## கிளைகள் மற்றும் ஒருங்கினைத்தல் இணைத்தல்","","நன்று! நமக்கு இப்போது கமிட் மற்றும் கிளை பிறித்தில் பற்றி தெரியும். இப்போது நாம் இரண்டு வெவ்வேறு கிளைகளிலிருந்து மாற்றங்களை ஒன்றிணைக்கும் வழியை கற்றுக்கொள்ள வேண்டும். இது நம்மை கிளை பிரிக்கவும், அதில் புதிய அம்சத்தை உருவாக்கி, பின்னர் அதை மீண்டும் இணைக்கவும் உதவும்.","",'நாம் முதலில் `git merge` எப்படி இணைப்பதற்கான வேலையை செய்கிறது என்பதை காண்போம். Gitஇல் ஒருங்கினைக்க இரண்டு கிளைகளின் மாற்றங்களை இணைத்து ஒரு சிற்ப்பு கமிட் உருவாக்க படும். அது "நான் மாற்றத்தினை முதல் கிளேயில் இருந்தும் மற்ற சில மாற்றங்களை அடுத்த கிளையில் இருந்தும் *மேலும்* அவற்றின் மூலங்களையும் இணைத்து ஒரே தொகுப்பாக உருவாக்க விரும்புகிறைன்." என சொல்வதை போன்றதுபோன்றது',"","காட்சிகள் மூலம் இதை எளிதாக புறிந்து கொள்ள முடியும், அடுத்த பகுதியில் அதைப் பார்ப்போம்."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['இங்கே இரண்டு கிளைகள் உள்ளன; ஒவ்வொன்றும் தனித்துவமான ஒரு மாற்றத்துடன் கமிட் கொண்டுள்ளன. இதன் பொருள் என்னவென்றால், நாம் செய்த "மாற்றங்களின்" முழு தொகுப்பும் களஞ்சியத்தின் இரு கிளைகளிலும் இல்லை. அதை ஒன்றிணைப்பதன் மூலம் சரிசெய்வோம்.',"","`bugFix` கிளையை `main` உடன் இணைப்போம்(`merge`)."],afterMarkdowns:["ஓ! அதை பார்தீர்களா? முதலில், `main` இரண்டு பெற்றோர்களைக் கொண்ட ஒரு கமிட்டை சுட்டிக்காட்டுகிறது. `main` கமிட் மரத்திலிருந்து நீங்கள் அம்புகளைப் பின்தொடர்ந்தால், அனைத்து வழியாகவும் வேருக்கு செல்லும் வழியில் இணைவீர்கள். இதன் பொருள் என்னவென்றால், `main` இப்போது களஞ்சியத்தில் உள்ள அனைத்து மாற்றங்களையும் கொண்டுள்ளது.","","மேலும், கமிட்டுகளின் நிறங்கள் எவ்வாறு மாற்றப்பட்டன என்பதைப் பாருங்கள்? கற்றலுக்கு உதவ, நான் சில வண்ண ஒருங்கிணைப்பைச் சேர்த்துள்ளேன். ஒவ்வொரு கிளைக்கும் ஒரு தனித்துவமான நிறம் உள்ளது. ஒவ்வொரு கமிட்டும் அது உள்ள அனைத்து கிளைகளின் கலவையால் ஆன நிறமாக மாறும்.","","ஆகவே, `main` கிளையின் வண்ணம் அனைத்து கமிட்டுகளிலும் கலந்திருப்பதை இங்கே காண்கிறோம், ஆனால் `bugFix` நிறம் மட்டும் இல்லை. அதை சரிசெய்வோம்..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`main`-ஐ `bugFix` உடன் இணைப்போம்:"],afterMarkdowns:["`bugFix` என்பது `main`-இன் மூலக்கிளை என்பதால், கிட் எந்த வேலையும் செய்ய வேண்டியதில்லை; அது `main` இணைந்துள்ள அதே கமிட்டுடன் `bugFix`-ஐ சேர்த்துவிடுகின்றது.","","இப்போது அனைத்து கமிட்களும் ஒரே நிரத்தில் உள்ளது, அதாவது அனைத்து கிளைகளிலும் களஞ்சியத்தில் உள்ள அனைத்து மாற்றங்களும் உள்ளன! வூஹூ!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["இந்த நிலையை முடிக்க, பின்வரும் படிகளைச் செய்யுங்கள்:","","* `bugFix` என்ற புதிய கிளையை உருவாக்குங்கள்","* `git checkout bugFix` கொண்டு `bugFix` கிளைக்கு மாற்றி கொல்லுங்கள்","* ஒரு கமிட் செய்யுங்கள்","* மீண்டும் `main`-க்கு `git checkout` கட்டளைமூலம் மாறுங்கள்","* மீண்டும் ஒரு கமிட் செய்யுங்கள்","* இப்போது `bugFix`-ஐ `main` உடன் `git merge` இணைக்கலாம்","",'*நினைவில் கொள்ளுங்கள், இந்த உரையாடலை "குறிக்கோள்" கொண்டு நீங்கள் மீண்டும் காணலாம்!*']}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami e fusione","","Ottimo! Ora sappiamo come funzionano i commit e i rami. Adesso dobbiamo trovare il modo per unire il lavoro di due rami diversi. Questo ci permetterà di creare un nuovo ramo, aggiungere una nuova funzionalità, e poi riunire il tutto.","",'Il primo metodo che vediamo per unire il lavoro è `git merge` (fusione). La fusione in Git crea un commit speciale che possiede due genitori distinti. Un commit con due genitori significa "Voglio unire tutto il lavoro da questo e da quest\' altro genitore, *e anche* di tutti i loro genitori."',"","È più semplice con le immagini, vediamolo nella prossima schermata."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Qui abbiamo due rami; ognuno di essi ha un commit univoco. Ciò significa che nessuno dei rami contiene per intero il "lavoro" del repository. Sistemiamo le cose con una fusione.',"","Ora facciamo `merge` del ramo `bugFix` nel `main`."],afterMarkdowns:["WOW! Visto? Prima di tutto, `main` ora punta a un commit con due genitori. Se ripercorri l'albero dei commit dal `main`, potrai attraversare tutti i commit fino alla radice (root). Questo significa che `main` ora contiene tutto il lavoro del repository.","","Hai visto come è cambiato il colore del commit? Per imparare più facilmente, ho aggiunto i colori. Ogni ramo ha un colore univoco. Ogni (merge) commit ha un colore che è la combinazione dei colori dei rami che lo compongono.","","Qui vediamo che il colore del ramo `main` è la combinazione di tutti i commit , ma il colore di `bugFix` è diverso. Sistemiamolo..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Fondiamo `main` in `bugFix`:"],afterMarkdowns:["Visto che `bugFix` era un antenato di `main`, git non ha dovuto fare nulla di che; ha semplicemente spostato `bugFix` sullo stesso commit in cui era collegato `main`.","","Ora tutti i commit hanno lo stesso colore, il che significa che ogni ramo contiene tutto il lavoro del repository! WoWoWoW!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, esegui i seguenti passaggi:","","* Crea un nuovo ramo di nome `bugFix`","* Seleziona il ramo `bugFix` con il comando `git checkout bugFix`","* Esegui un commit","* Ritorna al ramo `main` con `git checkout`","* Esegui un nuovo commit","* Fondi il ramo `bugFix` nel `main` con `git merge`","",'*Ricorda, puoi sempre rivedere questa schermata digitando "objective"!*']}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch'ler ve Merge İşlemleri","","Harika! Nasıl commit yapılacağını ve branch oluşturulacağını öğrendik. Şimdi iki farklı branch'in çalışmasını birleştirmenin (merge) bir yolunu öğrenmemiz gerekiyor. Bu, yeni bir özellik geliştirmek için bir branch'i alacak ve sonra onu geri birleştirebilmemizi sağlayacak.","","Birleştirme işlemini inceleyeceğimiz ilk yöntem `git merge`'dir. Git'te birleştirme işlemi, iki benzersiz üst öğesi olan özel bir commit oluşturur. İki ata'sı olan bir commit, temelde \"Bu kaynak kodun bu noktadaki tüm çalışmasını ve diğer noktadaki kaynak kodun tüm çalışmasını *ve* tüm bu kaynak kodlarının üstündeki kaynak kodlarını dahil etmek istiyorum.\" anlamına gelir.","","Bu işlem görsellerle daha kolay anlaşılır, bir sonraki görünümde görelim."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["İşte iki branch'imiz var; her birinin benzersiz bir commit'i var. Bu, her iki branch'in de repo'da yaptığımız \"çalışmanın\" tamamını içermediği anlamına gelir. Birleştirme (merge) ile bunu düzeltebiliriz.","","`bugFix` branch'ini `main` ile `merge` edeceğiz."],afterMarkdowns:["Vay canına! Görüyor musunuz? İlk olarak, `main` artık iki ata'sı (Parent) olan bir commit'e işaret ediyor. `main` üzerinden commit ağacındaki okları takip ederseniz, köke giden yol boyunca her commit'e ulaşırsınız. Bu, `main`'in artık repo'nun tamamındaki tüm çalışmayı içerdiği anlamına gelir.","","Ayrıca, commit'lerim renklerinin nasıl değiştiğini gördünüz mü? Öğrenmenize yardımcı olmak için bazı renk koordinasyonları ekledik. Her branch'in kendine özgü bir rengi vardır. Her commit, kendisini içeren tüm branch'lerin karışık bir kombinasyonu olan bir renge dönüşür.","","Yani burada `main` branch'inin renginin tüm commit'lere karıştığını, ancak `bugFix` renginin karışmadığını görüyoruz. Şimdi bunu düzeltelim..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hadi`main`'i `bugFix`'e merge'leyelim:"],afterMarkdowns:["`bugFix`, `main`'in atası olduğu için, git'in ekstra hiçbir iş yapmasına gerek kalmadı; sadece`bugFix`'i `main`'in bağlı olduğu aynı commit'e taşıdı.","","Artık tüm commit'ler aynı renk oldu, bu da her branch'in repo'daki tüm çalışmaları içerdiği anlamına geliyor! Yaşasın!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Bu level'i tamamlamak için aşağıdaki adımları yapmanız gerekiyor:","","* `bugFix` adında yeni bir branch oluşturun","* `git checkout bugFix` komutu ile `bugFix` branch'ine geçin ","* bir commit atın","* `git checkout` komutu ile `main` branch'ine geri dönün ","* başka bir commit atın","* Ardından `git merge` komutu ile `bugFix`'i `main`'e merge edin","",'*Unutmayın, "objective" komutunu kullanılarak bu iletişim penceresini her zaman yeniden görüntüleyebilirsiniz!*']}}]}}}},{}],125:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22main%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout main;git commit;git checkout bugFix;git rebase main",name:{en_US:"Rebase Introduction",de_DE:"Einführung in Rebase",ja:"Rebaseの解説",es_AR:"Introducción a rebase",es_MX:"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",ko:"리베이스(rebase)의 기본",zh_CN:"Git Rebase",zh_TW:"介紹 rebase",ru_RU:"Введение в rebase",uk:"Знайомство з rebase",vi:"Giới thiệu về rebase",sl_SI:"Uvod v Rebase",it_IT:"Introduzione al rebase (ribasare)",pl:"Wprowadzenie do Rebase",tr_TR:"Rebase İşlemine Giriş"},hint:{en_US:"Make sure you commit from bugFix first",de_DE:"Geh vor dem committen sicher, dass du auf bugFix arbeitest",ja:"初めにbugFixを指した状態でコミットする",fr_FR:"Assurez-vous de bien faire votre commit sur bugFix en premier",es_AR:"Asegurate de commitear desde bugFix primero",es_MX:"Asegúrate de hacer commit 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 브랜치에서 먼저 커밋하세요",zh_CN:"先在 bugFix 分支上进行提交",zh_TW:"你要先在 bugFix branch 進行 commit",ru_RU:"Убедись, что сделал коммит в ветке bugFix",uk:"Впевнись, що зробив коміт в гілці bugFix",vi:"Hãy chắc chắn rằng bạn commit từ bugFix trước",sl_SI:"Prepričaj se, da si najprej commital bugFix.",it_IT:"Assicurati di fare prima il commit da bugFix",pl:"Upewnij się, że masz już commit z bugFix",tr_TR:"Önce bugFix'tencommit attığınıza emin olun"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from main. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command."],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of main and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto main.',"","The only problem is that main hasn't been updated either, let's do that now..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `main` branch. Let's go ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `main` was an ancestor of `bugFix`, git simply moved the `main` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to main and commit again","* Check out bugFix again and rebase onto main","","Good luck!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Der zweite Weg um Inhalte aus verschiedenen Branches zu kombinieren ist `git rebase`. Rebasen nimmt im Prinzip eine Menge von Commits, "kopiert" sie und packt sie auf etwas anderes drauf.',"","Auch wenn das erst mal komisch klingt, liegt der Vorteil von Rebase darin, dass man es benutzen kann um hübsch lineare Abfolgen von Commits zu erhalten. Das Commit-Protokoll des Repositorys wird durch Rebase eine ganze Ecke einfacher aussehen, weil Merge Commits vermieden werden.","","Schauen wir's uns mal in Aktion an ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir wieder zwei Branches; wie du siehst ist `bugFix` aktuell ausgewählt (sieht man am `*`).","","Wir würden jetzt gerne unsere Arbeit aus `bugFix` direkt auf den `main` packen. Das Ergebnis wäre, dass alle aktuellen Änderungen in `main` auch im Branch `bugFix` sind.","","Das machen wir mit dem Befehl `git rebase`:"],afterMarkdowns:["Hammer! Was wir in `bugFix` gemacht haben ist jetzt oben auf `main` draufgepackt und wir haben eine schön lineare Abfolge von Commits bekommen.","",'Commit `C3` existiert immer noch irgendwo (deswegen ist er blass dargestellt) und `C3\'` ist die "Kopie" die wir auf den `main` gepackt haben.',"","Aber `main` ist jetzt nicht aktualisiert worden, lass uns das gerade noch nachholen ..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jetzt sind wir im `main`. Lass uns den mal auf `bugFix` rebasen ..."],afterMarkdowns:["So! Da `main` ein Vorgänger von `bugFix` war konnte Git hier einfach den Bezeichner `main` auf denselben Commit schieben, auf den auch `bugFix` zeigt."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level abzuschließen musst du folgendes tun:","","* Einen neuen Branch namens `bugFix` auschecken","* Einen Commit machen","* Zurück zum `main` wechseln und noch einmal committen","* `bugFix` auschecken und auf den `main` rebasen","","Viel Erfolg!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","ブランチを一つにまとめる方法として前回はマージを紹介しましたが、今回紹介するリベースを使うこともできます。リベースの動作は、マージするコミットのコピーをとって、どこかにストンと落とすというイメージです。","","ピンと来ないかもしれませんが、リベースのメリットは一本の連続したコミットに整形できることです。リベースだけ使っていると、コミットのログや履歴が非常にクリーンな状態に保たれます。","","早速実際にどう動くのかを見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["前回と同様の2つのブランチを考えます。仮にいまbugFixブランチをチェックアウトしているとします。(アスタリスクつきのもの)","","bugFixに入ってる作業内容をそのまま直接mainブランチ上の内容に移動したいとします。こうすることで、実際には並行して開発された2つの別々のブランチ上の機能のソースを、あたかも1本のブランチ上で連続して開発されていたかのように見せることができます。","","`git rebase`コマンドでそれをやってみましょう。"],afterMarkdowns:["できました!これでbugFixブランチの作業内容はmainブランチのすぐ先に移動したので、見た目が一本になってスッキリしました。","","気を付けてほしいのは、C3コミットはどこかに残ってるということ(ツリーの中で半透明にしてあります)、そしてC3'は(C1との接続が切れているC3の)コピーがmainブランチ上に作られているということです。","","一つ問題が残ってて、mainブランチがまだ最新化されていませんね。ちょっと直してみましょう。。"],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["mainブランチにチェックアウトしてあります。この状態からmainブランチを`bugFix`へとリベースしてみましょう。"],afterMarkdowns:["できた!`main`は`bugFix`の直前のコミットだったので、gitは単純に`main`ブランチのポインタを前に進めただけでした。"],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["以下の作業で理解度の確認をしてみましょう。","","* `bugFix`という名前の新しいブランチをチェックアウトする","* 一回だけコミット","* mainブランチに戻ってもう1回コミット","* bugFixをもう1回チェックアウトして、main上にリベース","","幸運を祈る!"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'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.","","Veámoslo en acción..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Acá tenemos dos ramas otra vez. Notar que la rama bugFix está actualmente seleccionada (tiene un asterisco)","","Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de main. 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 main, y tenemos una secuencia lineal de commits.","",'Notá que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3\' es la "copia" que rebaseamos sobre main.',"","El único problema es que main todavía no se actualizó, resolvámoslo ahora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ahora nos encontramos sobre la rama `main`. Avancemos y rebaseémosla sobre `bugFix`..."],afterMarkdowns:["¡Ahí está! Como `main` era un ancestro de `bugFix`, git simplemente movió la referencia de `main` hacia adelante en la historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, hacé lo siguiente:","","* Checkouteá una nueva rama llamada `bugFix`","* Commiteá una vez","* Volvé a main y commiteå de nuevo","* Checkoutá bugFix otra vez y rebaseala sobre main","","¡Éxitos!"]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'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 usas rebase.","","Veámoslo en acción..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Acá tenemos dos ramas otra vez. Nota que la rama bugFix está actualmente seleccionada (tiene un asterisco)","","Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de main. 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 main, y tenemos una secuencia lineal de commits.","",'Notá que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3\' es la "copia" que rebaseamos sobre main.',"","El único problema es que main todavía no se actualizó, resolvámoslo ahora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ahora estamos parados sobre la rama `main`. Avancemos y rebaseémosla sobre `bugFix`..."],afterMarkdowns:["¡Ahí está! Como `main` era un ancestro de `bugFix`, git simplemente movió la referencia de `main` hacia adelante en la historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, haz lo siguiente:","","* Cámbiate a una nueva rama llamada `bugFix`","* Haz un commit de una vez","* Vuelve a main y haz commit de nuevo","* Cámbiate a la rama bugFix otra vez y rebaséala sobre main","","¡Éxitos!"]}}]},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 main. 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 main, 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 main.',"","El único problema es que main todavía no se actualizó, resolvámoslo ahora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ahora estamos parados sobre la rama `main`. Avancemos y hagamos rebase sobre `bugFix`..."],afterMarkdowns:["¡Ahí está! Como `main` era un ancestro de `bugFix`, git simplemente movió la referencia de `main` hacia adelante en la historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{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 main y crea otro commit","* Haz checkout en bugFix otra vez y haz rebase sobre main","","¡Misión cumplida!"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rebase no Git","",'A segunda forma de combinar trabalho entre ramos é o *rebase*. O rebase essencialmente pega um conjunto de commits, "copia" os mesmos, e os despeja em outro lugar.',"","Isso pode parecer confuso, mas a vantagem do rebase é que ele pode ser usado para construir uma sequência mais bonita e linear de commits. O registro de commits (história do repositório) ficará muito mais limpa se for utilizado apenas rebase em vez de merge.","","Vejamo-lo em ação..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui temos dois ramos novamente; note que o ramo bugFix está atualmente ativo (veja o asterisco)","","Queremos mover nosso trabalho do bugFix diretamente dentro do main. Desta forma, vai parecer que esses dois recursos foram desenvolvidos sequencialmente, quando na realidade foram feitos em paralelo.","","Vamos fazê-lo com o comando `git rebase`."],afterMarkdowns:["Incrível! Agora o trabalho do nosso ramo bugFix está logo após o do main, e temos uma linda sequência linear de commits.","",'Perceba que o commit C3 ainda existe em algum lugar (ele está clareado na árvore), e que o C3\' é a "cópia" que rebaseamos no main.',"","O único problema é que o main não foi atualizado também, vamos fazê-lo agora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora o ramo `main` está ativo. Vamos em frente, fazer rebase no `bugFix`..."],afterMarkdowns:["Aí está! Como o `main` era um ancestral do `bugFix`, o git simplesmente moveu a referência do ramo `main` para frente na história."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, faça o seguinte","","* Faça checkout de um novo branch chamado `bugFix`","* Faça um commit","* Volte ao main e faça um novo commit","* Faça checkout do bugFix novamente e faça rebase no main","","Boa sorte!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rebase en Git","",'A segunda forma de mesturar traballo entre ramas é o *rebase*. O rebase esencialmente pega un conxunto de commits, "copia" os commits, e os sitúa en outro lugar.',"","Esto pode paracer confuso, pero a vantaxe do rebase é que se pode usar para construír unha secuencia máis bonita e linial de commits. O rexisto de commits do repositorio estará máis limpo se só se permite facer rebases.","","Ímolo ver en acción..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí temos dúas ramas novamente; decátate de que a rama `bugFix` está seleccionada (olla ó asterisco)","","Queremos mover o noso traballo do `bugFix` directamente dentro da rama `main`. Desta forma, vai parecer que eses dous recursos foron editados secuencialmente, cando a realidade é que se fixeron en paralelo.","","Imos lanzar o comando `git rebase`."],afterMarkdowns:["¡Buah chorvo! Agora o traballo da nosa rama `bugFix` está seguida de main, e temos unha fermosa línea de commits.","",'Percibe que o commit `C3` aínda existe nalgún lugar (el está borrado na árbore), e que `C3\'` é a "copia" que rebasamos en main.',"","O único problema é que a rama main non foi actualizada tamén, ímolo facer agora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora a rama `main` está ativa. Continuamos facendo o rebase na `bugFix`..."],afterMarkdowns:["¡Xa está! Como `main` era um ancestro de `bugFix`, git simplemente moveu a referencia da rama `main` máis adiante na historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, fai o seguinte","","* Fai checkout de un novo branch chamado `bugFix`","* Fai un commit","* Regresa a main e fai un commit novamente","* Móvete á rama bugFix outra vez e fai rebase sobre main","","Boa sorte!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'La seconde façon de combiner les contenus de deux branches est *rebase*. Rebase prend un ensemble de commits, les "recopie", et les ajoute en bout de chaîne à un autre endroit.',"","Bien que cela puisse sembler compliqué, l'avantage de rebase est de permettre d'obtenir une simple séquence linéaire de commits. Les logs/l'historique du dépôt seront bien plus propres si seul rebase est autorisé (plutôt que merge).","","Voyons rebase en action…"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici nous avons encore une fois deux branches ; notez que nous sommes sur la branche bugFix (cf. l'astérisque)","","Nous voudrions transférer notre travail de la branche 'bugFix' directement sur le travail existant dans 'main'. Ainsi on aurait l'impression que ces deux travaux ont été développés séquentiellement alors qu'en réalité ils ont été réalisés en parallèle.","","Faisons cela avec la commande `git rebase`."],afterMarkdowns:["Super ! Désormais, le travail de la branche 'bugFix' est juste en haut de la branche 'main' et nous avons une belle séquence linéaire de commits.","","Notez que le commit C3 existe toujours quelque part (il est en grisé sur l'arbre), et C3' est la \"copie\" que nous avons créée sur main avec rebase.","","Le seul problème est que main n'a pas été mis à jour, faisons cela maintenant…"],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous sommes désormais positionnés sur la branche `main`. Continuons en faisant le rebase sur `bugFix`…","Et voilà ! Puisque `main` était un ascendant de `bugFix`, Git a simplement déplacé la référence de la branche `main` en avant dans le temps."],afterMarkdowns:["Voilà vous avez vu comment cela fonctionne","","Continuons et essayons ce niveau !"],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, faites les opérations suivantes","","* Positionnez-vous (checkout) sur une nouvelle branche nommée `bugFix`","* Faites un commit","* Retournez sur main et faites un nouveau commit","* Positionnez-vous à nouveau sur bugFix et faites un rebase sur main","","Bonne chance !"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","第二种合并分支的方法是 `git rebase`。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。","","Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。","","咱们还是实际操作一下吧……"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["还是准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)","","我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。","","咱们这次用 `git rebase` 实现此目标"],command:"git rebase main",afterMarkdowns:["怎么样?!现在 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。","","注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。","","现在唯一的问题就是 main 还没有更新,下面咱们就来更新它吧……"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在我们切换到了 `main` 上。把它 rebase 到 `bugFix` 分支上……"],command:"git rebase bugFix",afterMarkdowns:["好了!由于 `bugFix` 继承自 `main`,所以 Git 只是简单的把 `main` 分支的引用向前移动了一下而已。"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["要完成此关,执行以下操作:","","* 新建并切换到 `bugFix` 分支","* 提交一次","* 切换回 main 分支再提交一次","* 再次切换到 bugFix 分支,rebase 到 main 上","","祝你好运!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git rebase","",'*rebasing* 是 merge branch 的第二種方法。rebasing 就是取出一連串的 commit,"複製"它們,然後把它們接在別的地方。',"","雖然聽起來難以理解,rebasing 的優點是可以建立更線性的 commit history。假如只允許使用 rebasing 的話,則我們的 repo 中的 commit log 或者是 commit history 會更加簡潔好看。","","讓我們親身體會一下..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡,還是有兩個 branch;注意目前我們所在的 branch 是 bugFix(看那顆星啦)","","我們想要把在 bugfix 所做的修改直接移到 main branch上。使用 rebasing 的話,兩個 branch 看起來像是依序按順序進行修改,實際上它們的修改是平行進行的。","","用 `git rebase` 來實現吧"],command:"git rebase main",afterMarkdowns:["很厲害吧!現在 bugFix branch 上的工作在 main branch 的最前端,同時我們也得到了一個更加線性的 commit 順序。","",'注意,本來的 commit C3 沒有消失(在圖上面呈現陰影),而我們"複製" C3,將它的副本 C3\' 接在 main branch 的後面。',"","現在唯一的問題是 main branch 還沒有更新...我們接下來就更新它吧!"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在,切換到 `main` branch。接下來就把它 rebase 到 `bugFix` 上面吧..."],command:"git rebase bugFix",afterMarkdowns:["完成!因為 `main` branch 是 `bugFix` 的 parent,所以 git 只是把 `main` branch 往前移動到 `bugFix` 上。"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["想完成這一關,執行以下操作:","","* 建立 `bugFix` branch","* commit 一次","* 切換回 main branch 再 commit 一次","* 再次切換到 bugFix branch,接著 rebase bugFix 這個 branch 到 main branch 上","","祝你好運啦!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 리베이스(Rebase)","","브랜치끼리의 작업을 접목하는 두번째 방법은 *리베이스(rebase)*입니다. 리베이스는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 것입니다.","","조금 어렵게 느껴질 수 있지만, 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.","","어떻게 동작하는지 살펴볼까요..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 또 브랜치 두 개가 있습니다; bugFix브랜치가 현재 선택됐다는 점 눈여겨 보세요 (별표 표시)","","bugFix 브랜치에서의 작업을 main 브랜치 위로 직접 옮겨 놓으려고 합니다. 그렇게 하면, 실제로는 두 기능을 따로따로 개발했지만, 마치 순서대로 개발한 것처럼 보이게 됩니다.","","`git rebase` 명령어로 함께 해보죠."],afterMarkdowns:["오! 이제 `bugFix` 브랜치의 작업 내용이 `main`의 바로 위에 깔끔한 한 줄의 커밋으로 보이게 됐습니다.","","C3 커밋은 어딘가에 아직 남아있고(그림에서 흐려짐), C3'는 `main` 위에 올려 놓은 복사본입니다.","","`main`이 아직 그대로라는 문제가 남아있는데요, 바로 해결해보죠..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["우리는 지금 `main` 브랜치를 선택한 상태입니다. `bugFix` 브랜치쪽으로 리베이스 해보겠습니다..."],afterMarkdowns:["보세요! `main`이 `bugFix`의 부모쪽에 있었기 때문에, 단순히 그 브랜치를 더 앞쪽의 커밋을 가리키게 이동하는 것이 전부입니다."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["이하 작업을 하면 이번 레벨을 통과합니다","","* `bugFix`라는 새 브랜치를 만들어 선택하세요","* 커밋 한 번 합니다","* `main` 브랜치로 돌아가서 또 커밋합니다","* `bugFix`를 다시 선택하고 `main`에 리베이스 하세요","","화이팅!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","Второй способ объединения изменений в ветках - это *rebasing*. При ребейзе Git по сути копирует набор коммитов и переносит их в другое место.","","Несмотря на то, что это звучит достаточно непонятно, преимущество `rebase` в том, что c его помощью можно делать чистые и красивые линейные последовательности коммитов. История коммитов будет чище, если вы применяете `rebase`.","","Посмотрим, как это работает..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["У нас здесь снова две ветки. Обрати внимание, что выбрана ветка `bugFix` (отмечена звёздочкой)","","Хочется сдвинуть наши изменения из `bugFix` прямо на вершину ветки `main`. Благодаря этому всё будет выглядеть, как будто эти изменения делались последовательно, хотя на самом деле - параллельно.","","Применим `git rebase`."],afterMarkdowns:["Супер! Теперь изменения из `bugFix` находятся в конце ветки `main` и являют собой линейную последовательность коммитов.","",'Обрати внимание, что коммит С3 до сих пор существует где-то, а С3\' - это его "копия" в ветке `main`',"","Единственная проблема - ветка `main` не обновлена до последних изменений. Это легко исправить."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вот мы выбрали ветку `main`. Вперёд - сделаем rebase на `bugFix`."],afterMarkdowns:["Вуаля! Так как `main` был предком `bugFix`, git просто сдвинул ссылку на `main` вперёд."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, сделай следующее:","","* Переключись на ветку `bugFix`","* Сделай коммит","* Вернись на `main` и сделай коммит ещё раз","* Переключись на `bugFix` и сделай rebase на `main`","","Удачи!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Інший спосіб комбінування змін з різних бранчів називається *rebase*. Rebase по суті бере кілька комітів , "копіює" їх, й кладе їх в інше місце.',"","Це може звучати трохи незрозуміло, але основна перевага rebase в тому, що його використовують щоб створити зручну лінійну послідовність комітів. Коміт лог та історія будуть виглядати набагато чистіша, якщо користуватися лише rebase (а не merge)","","Спробуємо на практиці..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ми знову маємо дві гілки; зауваж, що наразі вибрана гілка bugFix (вважай зірочку)","","Ми хочемо перемістити наші зміни з гілки bugFix прямо до змін з гілки main. Тоді це буде виглядати наче ці зміни були додані одна за одною, хоча насправді вони були додані одночасно.","","Давайте зробимо це за допомогою команди `git rebase`."],afterMarkdowns:["Добре! Тепер зміни з гілки bugFix знаходяться прямо попереду змін з main й ми отримали зручну лінійну послідовність комітів.","",'Вважай що коміт C3 досі десь існує (в дереві він тьмяніший за решту), й C3\' це "копія" яку ми заребейсили в main.',"","Є лише одна проблема: гілка main також не була оновлена, давайте зробимо це наступним кроком..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер ми перейшли (checkout) до гілки `main`. Далі робимо rebase на `bugFix`..."],afterMarkdowns:["Вуаля! Так як `main` це предок `bugFix`, git просто просунув посилання гілки `main` вперед в історії."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, зроби наступне:","","* Зачекауть (checkout) новий бранч з назвою `bugFix`","* Зроби один коміт","* Повернись на main й зроби ще один коміт","* Зачекауть bugFix знову й заребейсь його на main","","Нехай щастить!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Cách thứ 2 để kết hợp thành quả của 2 nhánh là *rebase.* Rebase về căn bản là chọn một loạt các commit, "sao chép" chúng, và ném chúng sang chỗ khác.',"","Nghe có vẻ phức tạp, lợi thế của rebase là có thể tạo ra cây lịch sử thẳng tuột. Lịch sử commit nhìn sẽ gọn gàng hơn nhiều.","","Xem nó hoạt động thế nào nào..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giờ ta lại có 2 nhánh; để ý rằng nhánh bugFix đang được chọn (thấy dấu hoa thị chứ?)","","Ta muốn chuyển công việc từ bugFix trực tiếp sang main. Theo cách đó thì các chức năng nhìn có vẻ được phát triển tuần tự, trong khi thực tế chúng được phát triển song song.","","Dùng lệnh `git rebase` để thử nào."],afterMarkdowns:["Tuyệt vời! Giờ thành quả của nhánh bugFix nằm ngay trên main và ta có các commit nằm thẳng tuột.","",'Để ý rằng commit C3 vẫn nằm đâu đó (đã được làm mờ), và commit C3\' là bản "sao chép" mà ta dán lên nhánh main.',"","Vấn đề duy nhất bây giờ là nhánh main vẫn chưa được cập nhật, làm luôn cho nóng nào..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giờ thì ta đã chuyển sang nhánh `main`. Tiếp tục dán nó vào `bugFix` nào..."],afterMarkdowns:["Đó! Bởi vì `main` là cha ông của `bugFix`, Git đơn giản chuyển tham chiếu của nhánh `main` tiến lên."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, làm theo hướng dẫn sau","","* Chuyển sang nhánh mới tên là `bugFix`","* Commit một lần","* Quay về main và commit lần nữa","* Quay trở lại bugFix và rebase sang main","","Chúc may mắn!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Drugi način kombiniranja dela med branchi je *rebasing*. Rebasing vzame listo commitov, jih "skopira", nato pa jih položi nekam drugam.',"","To se morda sliši komplicirano, ampak prednost rebeasinga je, da se ga lahko uporabi za lepo linearno zaporedje commitov. Commit log / zgodovina repozitorija bo dosti lepša, če je dovoljeno le rebaseanje.","","Poglejmo to na primeru ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tu imamo spet dva brancha; trenutno izbran je branch bugFix (zvezdica).","","Radi bi prestavili naše delo iz bugFix direktno na delo iz masterja. Tako bi izgledalo, kot da sta bili ti dve funkcionalnosti razviti zaporedno, v resnici pa sta bili razviti vzporedno.","","Naredimo sedaj to z `git rebase` ukazom."],afterMarkdowns:["Super! Sedaj je naše delo iz bugFix brancha na vrhu masterja in imamo lepo zaporedje commitov.","",'Omenimo, da commit C3 še vedno obstaja nekje (v drevesu je zbledel), in C3\' je v bistvu "kopija", ki smo jo rebaseali na main.',"","Edini problem je, da tudi main ni bil posodobljen, naredimo to sedaj ..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sedaj smo checkoutani na `main` branchu. Pojdimo in rebaseajmo na `bugFix`..."],afterMarkdowns:["Tako! Ker je bil `main` prednik `bugFix`, je git enostavno premaknil `main` branch referenco naprej v zgodovini."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Da zaključiš to stopnjo, naredi naslednje:","","* Checkoutaj nov branch poimenovan `bugFix`","* Enkrat commitaj","* Pojdi nazaj na main in commitaj ponovno","* Ponovno checkoutaj bugFix in ga rebaseaj na main","","Srečno!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Drugim sposobem na łączenie naszej pracy z różnych gałęzi jest *rebase*. Rebase zasadniczo pobiera zestaw commitów, "kopiuje" je i wrzuca je gdzie indziej.',"","Chociaż brzmi to niejasno, zaletą rebase jest to, że można go użyć do stworzenia ładnej, liniowej sekwencji commitów. Rebase sprawi, że historia commitów w repozytorium będzie wyglądała na dużo prostszą, ponieważ nia ma wtedy commitów scalających.","","Sprawdźmy, jak to działa..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutaj znowu mamy dwie gałęzie. Zauważ, że gałąź bugFix jest aktualnie wybrana (zwróć uwagę, że ma gwiazdkę)","","Chcielibyśmy przenieść naszą pracę z gałęzi bugFix bezpośrednio na gałąź main. W ten sposób wyglądałoby to tak, jakby te dwa zadania były rozwijane sekwencyjnie, podczas gdy w rzeczywistości rozwijano je równolegle.","","Zróbmy to za pomocą polecenia `git rebase`."],afterMarkdowns:["Świetnie! Teraz nasz branch bugFix znajduje się tuż nad main i mamy ładną liniową sekwencję commitów.","",'Zauważ, że commit C3 nadal gdzieś istnieje (jest wyblakły w drzewie), a commit C3\' jest "kopią", którą przenosimy na main.',"","Jedynym problemem jest to, że `main` nie został jeszcze zaktualizowany. Zróbmy to teraz..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Znajdujemy się na gałęzi `main`. Przejdźmy dalej i zróbmy połączenie rebase z branchem `bugFix`..."],afterMarkdowns:["Gotowe! Ponieważ `main` był przodkiem `bugFix`, git po prostu przesunął odniesienie do `main` do przodu w historii."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, wykonaj następujące czynności:","","* Przejdź do nowej gałęzi o nazwie `bugFix`","* Zrób commit","* Wróć do gałęzi `main` i zrób kolejny commit","* Przejdź do `bugFix` i połącz za pomocą rebase z `main`","","Powodzenia!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Il secondo modo per unire il lavoro tra rami è il *rebasing* (ribasare). Quando si ribasa vengono presi una serie di commit, vengono "copiati", e incollati da qualche parte.',"","Anche se sembra un sistema complesso, il vantaggio del rebasing è che può essere usato per creare una sequenza lineare di commit. Il log / storia dei commit del repository sarebbe molto più ordinata e comprensibile se fosse consentito solo il rebasing.","","Vediamolo in azione..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Anche qui abbiamo ancora due rami; prestate attenzione al fatto che il ramo selezionato è bugFix (notare l'asterisco*)","","Ora vogliamo spostare il nostro lavoro dal ramo bugFix direttamente sul ramo main. In questo modo sembrerà che i due lavori sono stati sviluppati in sequenza, quando in realtà sono stati sviluppati in parallelo.","","Vediamo il comando `git rebase` all'opera."],afterMarkdowns:["Fantastico! Ora il lavoro del ramo bugFix è sopra al main e abbiamo una sequenza lineare di commit.","",'Nota che il commit C3 continua ad esistere (messo in trasparenza), e C3\' è la "copia" che abbiamo ribasato sul main.',"","L'unico problema è che il main non è ancora stato aggiornato, facciamolo ora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora il ramo selezionato è il main. Procediamo e facciamo rebase su `bugFix`..."],afterMarkdowns:["Ecco qua! Visto che main era un antenato di `bugFix`, git sposta semplicemente il riferimento al ramo `main` in avanti."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, esegui i seguenti passaggi","","* Crea un nuovo ramo di nome `bugFix`","* Crea un commit","* Torna al main e crea un nuovo commit","* Seleziona nuovamente bugFix e fai rebase sul main","","In bocca al lupo!"]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","Branch'ler arasında çalışmayı birleştirmenin ikinci yolu, *rebasing* (tekrar temele almak) işlemidir. Rebasing, temelde bir dizi commit'i alır, bunları \"kopyalar\" ve başka bir yere yerleştirir.","","Bu karmaşık gibi görünse de, rebasing'in avantajı, güzel bir doğrusal commit dizisi oluşturmak için kullanılabilmesidir. Yalnızca rebasing'e izin verildiğinde, repo commit kaydı / geçmişi çok daha temiz gözükebilmektedir.","","Nasıl çalıştığını görelim..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["İşte yine karşımızda iki branch'imiz var; bugFix branch'inin şu an seçili olduğuna dikkat edin (yıldız işareti ile belirtilmiş).","","BugFix branch'indeki çalışmamızı doğrudan main branch'indeki çalışmanın üzerine taşımak istiyoruz. Böylece bu iki özelliğin sırayla geliştirildiği görünürken, gerçekte eşzamanlı olarak geliştirildiği anlaşılacaktır.","","Hadi bunu `git rebase` komutuyla yapalım."],afterMarkdowns:["Harika! Şimdi bugFix branch'indeki çalışmamız doğrudan main'in üstünde ve güzel bir doğrusal commit dizimiz var.","","C3 commit'inin hala bir yerde bulunduğunu (ağaçta soluk bir görünümde olduğunu) ve C3'ün main üzerine yeniden temellendiği (rebase) ve bir \"kopya\" olduğunu unutmayın.","","Tek sorun, main'in henüz güncellenmemiş olması, hadi şimdi bunu yapalım..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Şu anda `main` branch'inde bulunuyoruz. Şimdi `bugFix` branch'ini yeniden temel alalım..."],afterMarkdowns:["İşte! main, bugFix'in atsı olduğu için, git sadece main dalının referansını tarihte ileri taşıdı."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Bu seviyeyi tamamlamak için aşağıdaki adımları uygulamanız gerekiyor:","","* `bugFix` isminde yeni bir branch'e geçin","* Bir commit atın","* main'e geri dönün ve bir commit daha atın","* bugFix'e geri dönün ve main'e rebase atın","","Bol Şans!"]}}]}}}},{}],126:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main","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":{"main":{"target":"C2","id":"main","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"}}',onlyEvaluateAsserts:!0,goalAsserts:{bugfix:[function(e){return e.__num_commits_upstream>5}]},name:{en_US:"Git Describe",fr_FR:"Git describe",de_DE:"Git Describe",ja:"Git Describe",es_AR:"Git Describe",es_MX:"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ả)",sl_SI:"Git Describe",it_IT:"Git Describe",pl:"Git describe",tr_TR:"git describe"},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_MX:"Simplemente crea un commit en la rama bugFix cuando estés listo para continuar",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",sl_SI:"Commitaj enkrat na bugFix, ko boš pripravljen za nadaljevanje.",it_IT:"Fai un commit da bugFix per procedere",pl:"Scommituj raz na bugFix, żeby przejść dalej",tr_TR:"Hazır olduğunuzda bugFix üzerine sadece bir commit atmanız yeterlidir."},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 the computer of a coworker 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:"GitDemonstrationView",options:{beforeMarkdowns:["Let's look at a quick example. For this tree below:"],afterMarkdowns:["The command `git describe main` 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"}},{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:[{type:"ModalAlert",options:{markdowns:["### Git describe","","Parce ce que les tags sont de très bonnes références dans le code, Git a 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 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 :"],afterMarkdowns:["La commande`git describe main` 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"}},{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:[{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:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來看一個例子,對於下面的 tree:"],afterMarkdowns:["`git describe main` 會輸出:","","`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"}},{type:"ModalAlert",options:{markdowns:["`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!","","當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P"]}}]},zh_CN:{childViews:[{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:"GitDemonstrationView",options:{beforeMarkdowns:["让我们来看一个例子,对于下面的提交树:"],afterMarkdowns:["`git describe main` 会输出:","","`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"}},{type:"ModalAlert",options:{markdowns:["`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!","","当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P"]}}]},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 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:"],afterMarkdowns:["El comando `git describe main` 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"}},{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 quieras, hacé un commit para terminar el nivel. Te estamos dando una gratis :P"]}}]},es_ES:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'Como los tags sirven genial como "marcas" en el código, git tiene un comando para _describir_ dónde estás relativo a la "marca" (es decir, al "tag") más cercana. Y ese comamndo se llama ¡`git describe`!',"","`git describe` puede ayudarte a saber dónde estás después de haberte 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 de debug) o cuando te sientas delante de la computadora de un compañero de trabajo que acaba de volver de 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 especificas ninguna referencia, git simplemente usa el commit en el que estás en ese momento (`HEAD`).","","La salida de ese comando se ve así:","","`__g`","","Donde `tag` es el tag más cercano en la historia, `numCommits` es a cuántos commits de ese tag estás, y `` es el hash del commit que está siendo descrito."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos un ejemplo rápido. Para este árbol de commits:"],afterMarkdowns:["El comando `git describe main` mostraría:","","`v1_2_gC2`","","Mientras que `git describe side` mostraría:","","`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:["¡Eso es prácticamente todo lo que hay sobre git describe! Prueba describiendo algunas _ubicaciones_ en este nivel para familiarizarte con el comando.","","Cuando estés listo, crea un commit para terminar el nivel. Te estamos dejando este nivel de regalo. :P"]}}]},es_ES:{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 sientas delante de la computadora de un compañero de trabajo que acaba de volver 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 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:["Veamos un ejemplo breve. Para este árbol de commits:"],afterMarkdowns:["El comando `git describe main` 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"}},{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"]}}]},pt_BR:{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:["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:["Vejamos um exemplo rápido. Para a árvore abaixo:"],afterMarkdowns:["O comando `git describe main` 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"}},{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"]}}]},gl:{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 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:["Vexamos un exemplo rápido. Para a árbore de abaixo:"],afterMarkdowns:["O comando `git describe main` 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"}},{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."]}}]},de_DE:{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:["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, wie viele 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äßig nur annotierte Tags. Um nicht annotierte Tags zu sehen, verwende bitte `git describe --tags`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns das schnell an einem Beispiel an. Für den folgenden Baum:"],afterMarkdowns:["Der Befehl `git describe main` 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"}},{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"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","","タグは、ソースリストの優秀な「アンカー(標識)」として作用するので、Gitには最も近く関係のある「アンカー」(タグの別名)を*記述するため*のコマンドがあります。そして、そのコマンドは`git describe`と呼ばれています!","","Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(このような状況は、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を走らせ終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。"]}},{type:"ModalAlert",options:{markdowns:["Gitの`describe`は、以下の形式をとります:","","`git describe <参照>`","","`<参照>`には、Gitが解釈可能なコミットの参照表現(ブランチやタグの指定、コミットハッシュなど)をいれます。もし、何も入力しなかった場合、Gitは現在の位置のコミット(`HEAD`)を使います。","","コマンドの結果は以下のようになります:","","`<タグ>_<コミット数>_g<ハッシュ>`","","`<タグ>`には履歴の一番最新のタグ名が、`<コミット数>`にはそのタグから幾つのコミットがあったか、`<ハッシュ>`はそのコミットのハッシュがそれぞれ入ります。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["軽い例を見てみましょう。この木においての例は以下のようになります:"],afterMarkdowns:["コマンド`git describe main`の結果は以下のようになります:","","`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"}},{type:"ModalAlert",options:{markdowns:["`describe`によってGitの情報が簡潔に全て記述されます!このレベルでは、このコマンドの感触をつかむため幾つかの場所で`describe`をしてみてください。","","終わったら、最新のコミットに行き一度コミットを行えばこのレベルを終了することができます。この先では、いくつかの挑戦課題を用意しています :P"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","","Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает, как далеко текущее состояние от ближайшего тега. И эта команда называется `git describe`","","Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали `git bisect` или если вы недавно вернулись из отпуска =)"]}},{type:"ModalAlert",options:{markdowns:["Git describe выглядит примерно так:","","`git describe `","","Где `ref` — это что-либо, что указывает на конкретный коммит. Если не указать `ref`, то git будет считать, что указано текущее положение (`HEAD`).","","Вывод команды выглядит примерно так:","","`__g`","","Где `tag` – это ближайший тег в истории изменений, `numCommits` – это на сколько далеко мы от этого тега, а `hash` – это хеш коммита, который описывается."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим на простой пример. Для дерева, показанного ниже:"],afterMarkdowns:["Команда `git describe main` выведет:","","`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"}},{type:"ModalAlert",options:{markdowns:["Это, в общем-то, всё, что можно сказать про `git describe`. Попробуй выполнить команду на нескольких коммитах.","","Как только наиграешься, просто сделай один коммит, и уровень будет пройден."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'커밋 트리에서 태그가 훌륭한 "닻"역할을 하기 때문에, git에는 여러분이 가장 가까운 "닻(태그)"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!',"","Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다."]}},{type:"ModalAlert",options:{markdowns:["Git describe 는 다음의 형태를 가지고 있습니다:","","`git describe `","","``에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).","","명령어의 출력은 다음과 같은 형태로 나타납니다:","","`__g`","","`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. ``는 묘사하고있는 커밋의 해시를 나타냅니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["간단한 예제를 확인해 봅시다. 아래의 트리에서:"],afterMarkdowns:["`git describe main` 명령은 다음을 출력합니다:","","`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"}},{type:"ModalAlert",options:{markdowns:["이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.","","준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P"]}}]},uk:{childViews:[{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:"GitDemonstrationView",options:{beforeMarkdowns:["Розгляньмо короткий приклад. Для дерева нижче:"],afterMarkdowns:["Команда `git describe main` виведе:","","`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"}},{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 đến vị trí "mỏ neo" (thẻ) gần nhất. Và đó là `git describe`!',"","`git describe` 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 main` 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"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'Ker tagi služijo kot tako odlična "sidra" v kodi, ima git ukaz za *opis* kje si, relativno glede na najbližje "sidro" (aka tag). Temu ukazu se reče `git describe`!',"","Git describe se ti lahko pomaga orientirati, če si premikal veliko commitov naprej in nazaj po zgodovini; to se lahko zgodi, če si končal git bisekcijo (iskanje kot debuggiranje) ali če se usedeš za sodelavčev računalnik, ko je ravno prišel z dopusta."]}},{type:"ModalAlert",options:{markdowns:["Git describe izgleda takole:","","`git describe `","","Kjer je `` karkoli kar lahko git prepozna kot commit. Če ne podaš ref-a, git uporabi mesto, kjer si trenutno checkoutan (`HEAD`).","","Izpis ukaza je sledeč:","","`__g`","","Kjer je `tag` najbližji prednik v zgodovini, `numCommits` je število commitov oddaljenosti tag-a in `` je hash commita, ki ga opisujemo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo hiter primer. Za drevo spodaj:"],afterMarkdowns:["Bi ukaz `git describe main` izpisal:","","`v1_2_gC2`","","Ukaz `git describe side` pa bi vrnil:","","`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:["To je približno vse, kar se tiče git describe-a! Poizkusi za občutek opisati nekaj lokacij v tej stopnji.","","Ko si pripravljen, samo enkrat commitaj, da zaključiš stopnjo. Tole ti častimo :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git describe","",'Ponieważ znaczniki służą jako świetne "kotwice" w bazie kodu, git ma polecenie *opisujące*, gdzie jesteś w stosunku do najbliższej "kotwicy". I jest to `git describe`!',"","Polecenie `git describe` może pomóc ci zorientować się w sytuacji, gdy przesuniesz wiele commitów wstecz lub do przodu w historii; może się to zdarzyć po użyciu `git bisect` (na potrzeby debugowania) lub gdy siedzisz przy komputerze współpracownika, który właśnie wrócił z wakacji."]}},{type:"ModalAlert",options:{markdowns:["Git describe przyjmuje postać:","","`git describe `","","Gdzie `` jest czymkolwiek, co git może odnieść do commita. Jeśli nie podasz ``, git użyje aktualnie checkoutowanego miejsca (`HEAD`).","","Wynik polecenia wygląda następująco:","","`__g`","","`tag` jest znacznikiem najbliższego przodka w historii, `numCommits` jest liczbą commitów od tego znacznika, a `` jest haszem opisywanego commitu."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Przyjrzyjmy się krótkiemu przykładowi. Dla tego drzewa poniżej:"],afterMarkdowns:["polecenie `git describe main` dałoby wynik:","","`v1_2_gC2`","","a `git describe side` dałoby wynik:","","`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:["To w zasadzie wszystko, co musisz wiedzieć o `git describe`! Spróbuj opisać kilka miejsc na tym poziomie, aby wyczuć to polecenie.","","Kiedy zechesz przejść dalej, po prostu zrób jeden commit, aby ukończyć poziom. Masz to w gratisie :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'Visto che i tag fungono da "ancore", si può usare il comando `git describe` per capire dove ci si trova in riferimento all\'"ancora" (tag) più vicina!',"","Git describe aiuta ad orientarti dopo che hai creato molti commit su per giù nell'albero; oppure dopo che hai concluso un git bisect (per ricercare bug) o quando utilizzi il computer di un collega che è appena tornato dalle vacanze."]}},{type:"ModalAlert",options:{markdowns:["Git describe ha questa forma:","","`git describe `","","Dove `` è qualunque cosa che può indicare un commit. Se non specifichi un ref, git farà riferimento alla tua posizione attuale (`HEAD`).","","L'output del comando sarà:","","`__g`","","Dove `tag` è il tag antenato più vicino, `numCommits` corrisponde al numero di commit tra ref e il tag, e `` è l'hash del commit che è descritto."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo un esempio semplice. In quest'albero:"],afterMarkdowns:["Il comando `git describe main` genera come output:","","`v1_2_gC2`","","Mentre `git describe side` genererà:","","`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:["Questo è più o meno quanto fa git describe! Prova questo comando in vari punti in questo livello per prendere confidenza.","","Quando hai finito, procedi e crea un commit per concludere il livello. Consideralo un omaggio della casa :P"]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe (Tanımla)","",'Etiketler kod tabanında harika "çekirdekler" olarak hizmet ettiği için, Git size en yakın "anchor\'a (etikete)" göre nerede olduğunuzu açıklamak için bir komut sunar. Bu komut `git describe` \'dır!',"","Git describe, birçok commit'i geriye veya ileriye doğru hareket ettikten sonra nerede bulunduğunuzun anlaşılmasına yardımcı olabilir; bu, bir hata ayıklama araması olan git bisect'i tamamladıktan sonra veya tatilden yeni dönen bir iş arkadaşının bilgisayarına oturduğunuzda karşınıza çıkabilir."]}}]}}}},{}],127:[function(e,t,o){o.level={compareOnlyMainHashAgnosticWithAsserts:!0,goalAsserts:{main:[function(e){return e.C4>e.C1}]},disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22main%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i main --solution-ordering C4; git rebase bugFix main",startTree:'{"branches":{"main":{"target":"C1","id":"main"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:{ko:"딱 한 개의 커밋만 가져오기",en_US:"Grabbing Just 1 Commit",fr_FR:"Choisir seulement 1 commit",de_DE:"Einen Commit pflücken",es_AR:"Tomando un único commit",es_ES:"Tomando un único commit",es_MX:"Tomando un único commit",pt_BR:"Pegando um único commit",gl:"Escollendo un único commit",ja:"一つのコミットのみを取得",zh_CN:"只取一个提交记录",zh_TW:"只取一個 commit",ru_RU:"Выберем один коммит.",uk:"Вибираємо всього один коміт",vi:"Chỉ lấy 1 commit",sl_SI:"Izbiranje Samo Enega Commita",it_IT:"Prendi solo 1 Commit",pl:"Wzięcie tylko 1 commita",tr_TR:"Sadece 1 commit'i yakalamak"},hint:{en_US:"Remember, interactive rebase or cherry-pick is your friend here",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がクリアのカギです",ko:"대화식 리베이스(rebase -i)나 or 체리픽(cherry-pick)을 사용하세요",zh_CN:"你有两个朋友,cherry-pick 和 rebase -i",zh_TW:"記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助",ru_RU:"Не забывай, что интерактивный rebase и cherry-pick – это твои друзья!",uk:"Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!",vi:"Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick",sl_SI:"Pomni, interaktivni rebase ali cherry-pick sta tu tvoja prijatelja.",it_IT:"Ricorda, rebase interattivo o cherry-pick sono tuoi amici",pl:"Pamiętaj, że znasz już interaktywny rebase oraz cherry-pick",tr_TR:"Unutmayın interactive rebase ve cherry-pick buradaki en iyi dostlarınız."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own commits. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `main` branch. If I simply fast-forwarded `main`, then `main` would get all my debug statements which is undesirable. There has to be another way..."]}},{type:"ModalAlert",options:{markdowns:["We need to tell git to copy only one of the commits over. This is just like the levels earlier on moving work around -- we can use the same commands:","","* `git rebase -i`","* `git cherry-pick`","","To achieve this goal."]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide which command you want to use, but in order to complete the level, make sure `main` receives the commit that `bugFix` references."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les commits empilés localement","","Voici une situation qui arrive souvent : j'ai un bug assez difficile à trouver et corriger. Pour localiser la source du problème je rajoute des commandes et prints de debug à travers le code.","","Tous ces debug se retrouvent dans une branche particulière. Je trouve le bug et le répare, comme toujours !","","Le problème c'est que je ne peux pas faire de merge ou rebase, car tous ces commits de debug seront dans le main. Il doit y avoir une autre façon..."]}},{type:"ModalAlert",options:{markdowns:["Pour réussir ce niveau, nous avons besoin de dire à Git quel commit particulier recopier. C'est comme pour le niveau précédent : nous pouvons utiliser les mêmes commandes :","","* `git rebase -i`","* `git cherry-pick`"]}},{type:"ModalAlert",options:{markdowns:["C'est un niveau avancé, donc à vous de choisir quelle commande utiliser, mais pour réussir ce niveau, assurez-vous que `main` reçoive le même commit que `bugFix` référence."]}}]},es_AR:{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 `main`. Si simplemente fast-forwardeo `main`, entonces `main` va a tener todos mis agregados de debugging, que es indeseado. 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 está en vos decidir cuál de los dos comandos querés usar, pero para completar el nivel asegurate de que `main` recibe el commit que `bugFix` referencia."]}}]},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 `main`. Si simplemente fast-forwardeo `main`, entonces `main` 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 `main` recibe el commit que `bugFix` referencia."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits localmente apilados","","Esta es una situación 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 depuración y algunas sentencias para imprimir el estado de mi sistema.","","Todas estas cosas de imprimir y depurar 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 `main`. Si simplemente fast-forwardeo `main`, entonces `main` va a tener todos mis agregados de depuración, 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 `main` recibe el commit que `bugFix` referencia."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits empilhados localmente","","Aqui está uma situação de acontece frequentemente com desenvolvedores: Estou tentando encontrar um bug, mas ele é escorregadio. Para auxiliar meu trabalho de detetive, eu coloco alguns comandos de debug e prints.","","Todos esses comandos de debug e mensagens estão em seus próprios ramos. Finalmente eu encontro o bug, corrijo, e me regozijo!","","O único problema é que agora eu preciso devolver o meu `bugFix` ao ramo `main`. Se eu simplesmente der um fast-forward no `main`, então o `main` terminará contendo todos os comandos de debug, o que é indesejável. Deve existir alguma outra forma..."]}},{type:"ModalAlert",options:{markdowns:["Precisamos dizer ao git para copiar somente um dos commits. Esta situação é exatamente a mesma dos níveis anteriores a respeito de como mover trabalho -- podemos usar os mesmos comandos:","","* `git rebase -i`","* `git cherry-pick`","","Para alcançar o objetivo."]}},{type:"ModalAlert",options:{markdowns:["Este é um nível avançado, então vamos deixar para você a decisão de qual comando usar, mas para completar este nível, certifique-se de que o `main` receba o commit referenciado por `bugFix`."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits apilados localmente","","Aquí estamos nunha situación que acontece de cotio con desenvolvedores: Estou intentando atopar un erro, mais é escorredizo. Para axudar ó meu traballo de detective, eu coloco algúns comandos de debug e prints.","","¡Todos esos comandos de debug e mensaxes están nas súas ramas propias. Finalmente eu atopo o erro, arránxoo e reorganizo!","","O único problema é que agora eu preciso devolver o meu `bugFix` á rama `main`. Se eu fixera simplemente un fast-forward en `main`, entón o `main` rematará contendo tódolos comandos de debug, o que é indesexable. Debe existir algunha outra forma..."]}},{type:"ModalAlert",options:{markdowns:["Precisamos decirlle a git que copie só os commits que nos interesa. Esta situación é exatamente a mesma dos niveis anteriores respecto de como mover o traballo -- podemos usar os mesmos comandos:","","* `git rebase -i`","* `git cherry-pick`","","Para acadar o objetivo."]}},{type:"ModalAlert",options:{markdowns:["Este é un nivel avanzado, entón imos deixarche a decisión de qué comando empregar, pero para completar este nivel, asegurate de que a rama `main` colla o commit referenciado por `bugFix`."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Lokale Commit-Haufen","","Folgende Situation habe ich beim Entwickeln des Öfteren: Ich bin auf der Suche nach einem Bug, aber er ist echt schwer zu finden. Um ihm auf die Spur zu kommen schreibe ich mehrere Debug-Kommandos und print-Befehle in den Code.","","Die committe ich auch immer wieder, je weiter die Suche mich trägt; natürlich in einem lokalen Branch. Schließlich finde ich den Bug, fixe ihn und freue mich!","","Einziges Problem ist, dass ich diesen `bugFix` jetzt zurück in den `main` kriegen muss. Wenn ich einfach den `main` vorspule oder meinen Branch hinein merge, bekäme der `main` auch die ganzen Debug-Befehle, was nicht gewünscht ist. Das muss anders gehen ..."]}},{type:"ModalAlert",options:{markdowns:["Wir müssten Git sagen können, dass es nur einen Commit herüber kopieren soll. Das ist genauso wie die Level vorhin zum Code-Verschieben. Wir können dieselben Befehle benutzen:","","* `git rebase -i`","* `git cherry-pick`",""]}},{type:"ModalAlert",options:{markdowns:["Da dies ein späterer Level ist, überlasse ich es dir zu entscheiden, welchen Befehl du benutzen willst. Aber um das Level zu schaffen musst du irgendwie sicherstellen, dass `main` den Commit bekommt, auf den `bugFix` zeigt."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## ローカルに積み上がったコミット","","実際の開発ではこういうケースがよくあります:「バグの原因調査を試みているがバグの再現性がかなり低い。調査の補助のために、いくつかのデバッグ用の命令やprint文を差し込んでいる。」","","これらのデバッグ用のコードはバグ修正用のブランチにコミットされています。そしてついにバグの原因を突き止めて、修正した!やった!","","あとは`bugFix`ブランチを`main`ブランチに統合できればOK。そこで単純に`main`をfast-forwardすればよいかというと、それでは`main`ブランチの中にデバッグ用のコードも混入してしまいます。"]}},{type:"ModalAlert",options:{markdowns:["ここでGitの魔法が力を発揮します。解決のためにはいくつかの方法がありますが、最も素直な解決方法は2つあって:","","* `git rebase -i`","* `git cherry-pick`","","インタラクティブモードの(`-i`オプションつきの)rebaseによって、保持したいコミットと破棄したいコミットを選り分けることができます。コミットの順序を変更することも可能です。この方法は、一部の変更をどこかへやってしまいたい時に便利です。","","もう一方のcherry-pickを使うと、持っていきたいコミットを選んで`HEAD`の先にストンと落とすことができます。"]}},{type:"ModalAlert",options:{markdowns:["後半の章ですのでどう解決するかをもう自分で考えることができると思います。このレベルをクリアするためには、`bugFix`が持っているコミットを`main`ブランチが受け取る必要がある点には注意してください。"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 本地栈式提交","","来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。","","这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!","","最后就差把 `bugFix` 分支里的工作合并回 `main` 分支了。你可以选择通过 fast-forward 快速合并到 `main` 分支上,但这样的话 `main` 分支就会包含我这些调试语句了。你肯定不想这样,应该还有更好的方式……"]}},{type:"ModalAlert",options:{markdowns:["实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样,我们可以使用","","* `git rebase -i`","* `git cherry-pick`","","来达到目的。"]}},{type:"ModalAlert",options:{markdowns:["由于我们刚刚闯过类似的关卡,所以要不要再尝试一次就看你自己了。但是如果你想试一把的话,确保 `main` 分支能得到 `bugFix` 分支上的相关提交。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 在 local 的堆疊的 commit","","有一個經常發生的情況:我在追蹤一個有點棘手的 bug,但是它實在太難抓出來了,在不得已的情況下我加入了一些 debug 的指令,並且做了一些 commit。","","所有的這些 debug 的指令都只在 `bugFix` 這個 branch 裡面。最後我終於找到這個 bug,並且 fix 掉它,接著撒花慶祝一下!","","現在唯一的問題就是要把我在 `bugFix` branch 裡面所做的修改 merge 回 `main` branch。我可以簡單地透過 fast-forward 來 merge ,但這樣的話 `main` branch 就會包含這些含有 debug 指令的 commit 了。我相信一定有其它方法..."]}},{type:"ModalAlert",options:{markdowns:["我們需要告訴 git 只去複製其中一個 commit。 這種情況跟之前的關卡有一點類似,我們可以使用一樣的指令","","* `git rebase -i`","* `git cherry-pick`","","來完成這個目的。"]}},{type:"ModalAlert",options:{markdowns:["這一個關卡是比較後面的關卡,你可以隨意決定你要選擇使用哪個指令,但是 `bugFix` 所指向的那個 commit 一定要可以被 `main` branch 包含到。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 로컬에 쌓인 커밋들","","개발 중에 종종 이런 상황이 생깁니다: 눈에 잘 띄지 않는 버그를 찾아서 해결하려고, 어떤 부분의 문제인지를 찾기 위해 디버그용 코드와 화면에 정보를 프린트하는 코드 몇 줄 넣습니다. ","","디버깅용 코드나 프린트 명령은 그 브랜치에 들어있습니다. 마침내 버그를 찾아서 고쳤고, 원래 작업하는 브랜치에 합치면 됩니다!","","이제 `bugFix`브랜치의 내용을 `main`에 합쳐 넣으려 하지만, 한 가지 문제가 있습니다. 그냥 간단히 `main`브랜치를 최신 커밋으로 이동시킨다면(fast-forward) 그 불필요한 디버그용 코드들도 함께 들어가 버린다는 문제죠."]}},{type:"ModalAlert",options:{markdowns:["여기에서 Git의 마법이 드러납니다. 이 문제를 해결하는 여러가지 방법이 있습니다만, 가장 간단한 두가지 방법 아래와 같습니다:","","* `git rebase -i`","* `git cherry-pick`","","대화형 (-i 옵션) 리베이스(rebase)로는 어떤 커밋을 취하거나 버릴지를 선택할 수 있습니다. 또 커밋의 순서를 바꿀 수도 있습니다. 이 커맨드로 어떤 작업의 일부만 골라내기에 유용합니다.","","체리픽(cherry-pick)은 개별 커밋을 골라서 `HEAD`위에 떨어뜨릴 수 있습니다."]}},{type:"ModalAlert",options:{markdowns:["이번 레벨을 통과하기 위해 어떤 방법을 쓰시든 자유입니다만, `main`브랜치가 `bugFix` 브랜치의 커밋을 일부 가져오게 해주세요."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["Вот ситуация, которая часто случается при разработке: мы пытаемся отследить ошибку, но она не очень очевидна. Для того, чтобы достичь успеха на этом поприще, мы используем несколько команд для отладки и вывода","","Каждая отладочная команда (команды) вывода находится в своём коммите. В итоге мы нашли ошибку, исправили её и порадовались!","","Но проблема в том, что мы хотим добавить в `main` только исправление ошибки из ветки `bugFix`. Если мы воспользуемся простым fast-forward, то в `main` попадут также отладочные команды. Должен быть другой способ..."]}},{type:"ModalAlert",options:{markdowns:["Надо заставить git копировать только один из коммитов. Это почти как в предыдущем уровне – мы можем использовать уже известные нам команды: ","","* `git rebase -i`","* `git cherry-pick`","","Чтобы достичь желаемого результата."]}},{type:"ModalAlert",options:{markdowns:["В этом уровне тебе решать, какую команду использовать, но чтобы закончить уровень, убедись, что в ветку `main` попал коммит, на который ссылается `bugFix`."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Локально складені коміти","","Ось ситуація з життя рядового програміста: я намагаюся відслідкувати баг, але це не завжди вдається. Щоб допомогти собі, я додаю кілька дебаг-команд та ще кілька println'ів.","","Всі ці команди для відлагодження та виводу данних знаходяться в своїх власних комітах. Врешті-решт я знаходжу баг, фікшу його та щиро радію!","","От тільки лишається проблема, що потрібно мій фікс перенести з `bugFix` назад в гілку `main`. Якщо я просто зроблю фастфорвард (fast-forwarded) в `main`, тоді в `main` потраплять всі мої println'и, що є зайвим. Має бути інший шлях..."]}},{type:"ModalAlert",options:{markdowns:["Ми маємо сказати гіту скопіювати лише один коміт. Це все те ж саме, що й у попередніх рівнях, і ми можемо використати ті ж самі команди:","","* `git rebase -i`","* `git cherry-pick`","","для досягнення мети."]}},{type:"ModalAlert",options:{markdowns:["На цьому рівні тобі вирішувати якими командами користуватися, але щоб пройти цей рівень, впевнись що в `main` потрапить коміт, на який посилається `bugFix`."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit xếp chồng cục bộ","","Có tình huống thế này thường hay xảy ra trong quá trình phát triển: Tôi đang cố dò lỗi nhưng mà nó lại khá khó tìm. Để hỗ trợ cho việc này, tôi thêm vào vài dòng lệnh gỡ lỗi và lệnh in.","","Mấy lệnh gỡ lỗi và in này nằm yên trong commit của chúng. Cuối cùng thì tôi cũng tìm ra lỗi, gỡ xong, ngon rồi!","","Bây giờ thì lại phải đưa `bugFix` trở về nhánh `main`. Nếu mà đơn giản dùng fast-forwarded lên `main`, thì `main` lại có tất cả các lệnh gỡ lỗi kia, chẳng muốn chút nào. Phải có cách khác chứ nhỉ..."]}},{type:"ModalAlert",options:{markdowns:["Ta cần phải bảo Git chỉ sao chép 1 commit thôi. Điều này giống với cấp độ trước về điều chỉnh vị trí -- ta có thể dùng các câu lệnh tương tự:","","* `git rebase -i`","* `git cherry-pick`","","Để đạt được mục tiêu này."]}},{type:"ModalAlert",options:{markdowns:["Bây giờ là cấp độ cao hơn rồi nên bạn hãy tự quyết định nên dùng câu lệnh nào, nhưng để hoàn thành được cấp độ, hãy đàm bảo rằng `main` nhận được commit mà `bugFix` tham chiếu tới."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Lokalno naloženi commiti","","Tu je razvijalska situacija, ki se zgodi pogosto: Hočem najti bug, ampak se kar izmika. V pomoč mojemu detektivskemu delu, sem dodal nekaj ukazov za debuggiranje in izpis.","","Vsi te ukazi za debuggiranje / izpisovanje so v svojih commitih. Končno odkrijem bug, ga popravim in se veselim!","","Edini problem je, da morem sedaj spraviti moj `bugFix` nazaj v `main` branch. Če uporabim samo fast-forward na `masterju`, potem bi `main` vseboval vse moje debug vrstice, česar si ne želim. Mora obstajati še neka druga pot ..."]}},{type:"ModalAlert",options:{markdowns:["Gitu moramo povedati naj skopira čez samo en commit. To je podobno stopnjam prej, ko smo premikali delo okoli -- uporabimo lahko iste ukaze:","","* `git rebase -i`","* `git cherry-pick`","","da dosežemo ta cilj."]}},{type:"ModalAlert",options:{markdowns:["Tebi prepuščam, da se odločiš, kateri ukaz boš uporabil, da končaš stopnjo. Poskrbi samo, da `main` dobi commit na katerega kaže `bugFix` referenca."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Lokalnie nałożone commity","","Oto sytuacja, która często się zdarza podczas pisania kodu: próbuję wytropić buga, ale jest on nieuchwytny. Aby pomóc sobie w poszukiwaniach, dodaję kilka poleceń debugowania i kilka instrukcji print.","","Wszystkie te polecenia debugowania / drukowania znajdują się w osobnych commitach. W końcu namierzam błąd, naprawiam go i cieszę się!","","Jedynym problemem jest to, że teraz muszę przywrócić mój `bugFix` do gałęzi `main`. Jeśli po prostu zrobiłbym fast-foward `main`, wtedy `main` dostałby wszystkie moje deklaracje debugowania, a tego bym nie chciał. Musi być na to inny sposób..."]}},{type:"ModalAlert",options:{markdowns:["Musimy powiedzieć Gitowi, żeby skopiował tylko jeden z commitów. Dokładnie w ten sam sposób jak we wcześniejszych poziomach z przenoszeniem pracy -- używając tych samych poleceń:","","* `git rebase -i`","* `git cherry-pick`","","aby osiągnać ten cel."]}},{type:"ModalAlert",options:{markdowns:["Jest to wyższy poziom, więc pozostawimy ci decyzję, której komendy chcesz użyć, ale aby ukończyć poziom, upewnij się, że `main` otrzyma commit, do którego odwołuje się `bugFix`."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit impilati localmente","","Ecco una situazione che accade spesso in fase di sviluppo: Sto cercando di scovare un bug. Per aiutarmi nel mio lavoro di detective, inserisco alcuni comandi per il debug e alcune print per fare stampe.","","Questi comandi aggiunti per il debug vengono salvati con un commit loro dedicato. Finalmente riesco a beccare il bug, sistemo il tutto, e brindo!","","Ora l'unico problema è che devo salvare il lavoro di `bugFix` nel ramo `main`. Se eseguo un semplice fast-forwarded `main`, allora il `main` andrebbe a prendere anche tutto ciò che è stato aggiunto per il debug. Se solo ci fosse un altro modo..."]}},{type:"ModalAlert",options:{markdowns:["Dobbiamo dire a Git di fare la copia di un solo commit. Questo assomiglia a quanto visto in precedenza -- possiamo riusare gli stessi comandi:","","* `git rebase -i`","* `git cherry-pick`","","Per raggiungere l'obiettivo."]}},{type:"ModalAlert",options:{markdowns:["Questo è un livello più avanzato, lascerò a te la libertà di decidere quale comando usare, ma per concludere il livello, assicurati che `main` riceva il commit puntato da `bugFix`."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Yerel Olarak Birikmiş Commitler","","Şu sıkça karşılaşılan bir geliştirme senaryosudur: Bir hatayı izlemeye çalışıyorum, ancak bu hata oldukça belirsiz. Dedektiflik çalışmalarıma yardımcı olmak için bazı hata ayıklama komutları ve yazdırma ifadeleri eklerim.","","Bu hata ayıklama veya yazdırma ifadeleri, her biri kendi commit'lerine sahiptir. Sonunda hatayı bulurum, düzeltirim ve sevinirim!","","Tek sorun şu ki şimdi `bugFix` branch'imi `main` branch'imden almalıyım. Eğer sadece `main` branch'ini süratle ileri alırsam, `main` branch'i tüm hata ayıklama ifadelerimi alır ki bu istenmeyen bir durumdur. Bunun için başka bir yol bulunmalıdır..."]}},{type:"ModalAlert",options:{markdowns:["Git'e sadece bir commit'i kopyalamasını söylememiz gerekiyor. Bu, daha önce yaptığımız işleri taşımak için yaptığımız işlemler gibi, orada kullandığımız;","","* `git rebase -i`","* `git cherry-pick`","","komutlarını burada da kullanabiliriz."]}},{type:"ModalAlert",options:{markdowns:["Bu biraz daha ileri bir seviye olduğundan hangi komutu kullanmak istediğiniz size kalmış, ancak `main` branch'inin `bugFix` tarafından atılan ve `main`'e atıfta bulunan commit'i alması gerektiğini unutmayın."]}}]}}}},{}],128:[function(e,t,o){o.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMainHashAgnosticWithAsserts:!0,goalAsserts:{main:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22main%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2 --solution-ordering C3,C2;git commit --amend;git rebase -i HEAD~2 --solution-ordering C2'',C3';git rebase caption main",startTree:'{"branches":{"main":{"target":"C1","id":"main"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:{ko:"커밋들 갖고 놀기",en_US:"Juggling Commits",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",es_MX:"Malabareando con las confirmaciones",pt_BR:"Malabarismo com commits",gl:"Argallando cos commits",ja:"コミットをやりくりする",zh_CN:"提交的技巧 #1",zh_TW:"commit 的戲法",ru_RU:"Жонглируем коммитами",uk:"Жонглюємо комітами",vi:"Tung hứng commit",sl_SI:"Žongliranje s Commiti",it_IT:"Giocoliere di commit",pl:"Żonglowanie commitami",tr_TR:"Commit Hokkabazlığı"},hint:{en_US:"The first command is git rebase -i HEAD~2",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",ko:"첫번째 명령은 git rebase -i HEAD~2 입니다",zh_CN:"第一个命令是 `git rebase -i HEAD~2`",zh_TW:"第一個命令是 'git rebase -i HEAD~2'",ru_RU:"Первой командой должна быть git rebase -i HEAD~2",uk:"Перша команда має бути git rebase -i HEAD~2",vi:"Lệnh đầu tiên là git rebase -i HEAD~2",sl_SI:"Prvi ukaz je git rebase -i HEAD~2.",it_IT:"Il primo comando è git rebase -i HEAD~2",pl:"Pierwsze polecenie to: git rebase -i HEAD~2",tr_TR:"İlk komutunuz git rebase -i HEAD~2"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `git commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move main to this updated part of the tree to finish the level (via the method of your choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique.","Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree ","","That being said, I can compare levels now based on structure and relative apostrophe differences. As long as your tree's `main` branch has the same structure and relative apostrophe differences, I'll give full credit."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jongler avec les commits","","Voici une autre situation fréquente. Vous avez certains changements (`newImage`) et un autre groupe de changements (`caption`) qui sont reliés, ils sont donc empilés l'un sur l'autre dans votre dépôt Git (i.e. l'un après l'autre).","","La situation se complique lorsque vous devez faire une petite modification dans un commit antérieur. Dans ce cas, les configurations de `newImage` devront changer un peu, même si ce commit est loin dans notre historique !!"]}},{type:"ModalAlert",options:{markdowns:["Nous allons régler le problème en faisant ceci :","","* Nous allons réordonner les commits pour que celui que nous voulions changer soit sur le dessus `git rebase -i`","* Nous allons utiliser `git commit --amend` pour faire les petites modifications","* Nous allons réordonner les commits dans l'ordre original avec `git rebase -i`","* Pour finir, nous allons déplacer main vers la nouvelle tête de l'arbre (avec la méthode de votre choix)","","Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez-vous sur cette technique.","","Pour terminer, Faites attention à l'objectif -- puisque nous déplaçons les commits 2 fois, ils se retrouvent tous les deux avec une apostrophe. Une deuxième apostrophe est ajoutée sur le commit que nous modifions, ce qui nous donne la forme finale de l'arbre.","","Ceci étant dit, je peux comparer le résultat avec la structure et les différentes apostrophes. Tant que votre arbre `main` a la même structure et les différentes apostrophes le niveau sera considéré comme réussi."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Haciendo malabares con los commits","","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!"]}},{type:"ModalAlert",options:{markdowns:["Superaremos esta dificultad haciendo lo siguiente:","","* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de todo con `git rebase -i`","* Vamos a hacer `git 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 main 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, prestá atención al estado final acá -- como movemos los commits dos veces, ambos quedan con un apóstrofe. El commit que corregimos tiene un apóstrofe extra, y así nos queda nuestro árbol final","","Habiendo dicho eso, puedo comparar los niveles basándome ahora en la estructura y las diferencias relativas de apóstrofes. Mientras que tu rama `main` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo."]}}]},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 `git 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 main 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 `main` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabareando con las confirmaciones","","Esta es otra situación que sucede comúnmente. 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 las confirmaciones para que la que queremos cambiar quede arriba de las demás con `git rebase -i`","* Vamos a hacer `git commit --amend` para aplicar la ligera modificación","* Después vamos a reordenar las confirmaciones a como estaban con `git rebase -i`","* Finalmente, vamos a mover main a esta parte actualizada de nuestro árbol de confirmaciones 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 las confirmaciones dos veces, ambas 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 `main` tenga la misma estructura y diferencias relativas de apóstrofes te voy a dar el puntaje completo."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabarismo com commits","","Aqui está outra situação que acontece com bastante frequência. Você fez algumas mudanças (`newImage`), além de um outro conjunto de mudanças (`caption`) que são relacionadas, de forma que elas estão empilhadas uma após a outra no seu repositório.","","O complicado é que algumas vezes você precisa fazer uma pequena modificação em um commit mais antigo. Neste caso, o pessoal do design quer que modifiquemos um pouco as dimensões da imagem introduzida em `newImage`, apesar de esse commit estar mais para trás no nosso histórico!!"]}},{type:"ModalAlert",options:{markdowns:["Superaremos essa dificuldade fazendo o seguinte:","","* Reordenaremos os commits de forma que aquele que desejamos esteja no topo, com `git rebase -i`","* Usaremos o comando `git commit --amend` para fazer uma pequena modificação","* Vamos, então, reordenar os commits na mesma ordem que estavam anteriormente com `git rebase -i`","* Finalmente, moveremos o main para essa parte atualizada da árvore para finalizar o nível (usando o método de sua escolha)","","Há muitas formas de alcançar o objetivo final (eu vejo o cherry-pick passando pela sua mente), e veremos mais delas depois, mas por enquanto foquemos nesta técnica.","",'Por último, preste atenção no estado do "objetivo" aqui -- como nós movemos os commits duas vezes, ambos ficam com um apóstrofo. Um apóstrofo adicional é colocado no commit que sofreu o "amend", o que nos dá a forma final da árvore ',"","Tendo dito isto, posso avaliar a resposta baseado na estrutura e nas diferenças relativas de número de apóstrofos. Desde que o ramo `main` da sua árvore tenha a mesma estrutura, e o número de apóstrofos seja igual a menos de uma constante, darei a você todos os pontos para esta tarefa."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argallando cos commits","","Aquí está outra situación que acontece con bastante frecuencia. Estás facendo algúns cambios (`newImage`), separado do resto de cambios (`caption`) que están relacionados, deste xeito están apilados un enriba do outro no teu repositorio.","","O complicado é que ás veces, poida que precises facer unha pequena nota nun commit máis antigo. Neste caso, a persoa de deseño quere mudar un pouco as dimensións da imaxe introducida en `newImage`, a pesar de que ese commit está máis abaixo no noso histórico!!"]}},{type:"ModalAlert",options:{markdowns:["Superamos este problema facendo o seguinte:","","* Reordenaremos os commits seleccionando aqueles que desexamos que estén no cambio, con `git rebase -i`","* Empregaremos o comando `git commit --amend` para facer unha pequena modificación","* Imos, entón, reordear os commits na mesma orde na que estaban anteriormente con `git rebase -i`","* Finalmente, moveremos o main para esa parte atualizada da árbore e así finalizar o nivel (usando o método que máis che pete)","","Hai moitas formas de obter o obxectivo final (eu vexo o cherry-pick pasando pola túa cachola), e verémolo máis adiante, pero agora ímonos centrar nesta técnica.","",'Por último, preste atención no estado do "objectivo" aquí -- como movemos os commits dúas veces, ambos teñen o apóstrofo sumado. O apóstrofo engádese polo commit que nos correximos (amend), o cal danos a forma final da árbore.',"","Contado todo esto, a resposta valídase baseándose na estructura e nos diferentes apóstrofes. Cando a rama `main` teña a mesma estructura, e o número de apóstrofos sexa igual, obterás todos os puntos da tarefa."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jonglieren mit Commits","","Eine weitere häufig vorkommende Situation: Du hast einige Änderungen in `newImage` und weitere Änderungen in `caption`. Die Änderungen hängen voneinander ab, das heißt in diesem Fall `caption` ist ein Nachfolger von `newImage`.","","Nun kann es vorkommen, dass du einen früheren Commit verändern willst. In unserem Fall will die Design-Abteilung, dass die Abmessungen in `newImage` leicht verändert werden, obwohl das mitten in unserer History liegt!"]}},{type:"ModalAlert",options:{markdowns:["Um das zu schaffen gehen wir wie folgt vor:","","* Wir sortieren die Commits mit `git rebase -i` so um, dass der Commit, den wir ändern wollen, ganz oben liegt.","* Wir verändern den Commit mit `git commit --amend`.","* Dann sortieren wir die Commits mit einem erneuten `git rebase -i` wieder in die alte Reihenfolge.","* Schließlich aktualisieren wir den `main` auf das Ende unseres fertigen Baums, um diesen Level abzuschließen.","","Es gibt sehr viele Wege um das Endziel dieses Levels zu erreichen (ich sehe, du schielst auf `cherry-pick`) und wir werden uns später noch andere ansehen. Aber für's erste lass uns diese Methode ausprobieren.","","Beachte den geschilderten Zielzustand. Da wir die Commits zweimal umsortieren, bekommen sie jedes Mal ein Apostroph hinzugefügt (weil sie jedes Mal kopiert werden). Ein weiteres Apostroph entsteht durch den `git commit --amend`.","","Zu guter Letzt noch eine Bemerkung: Ich kann Level nur auf Struktur und Apostroph-Differenz prüfen. So lange wie dein `main` am Ende dieselbe Struktur und Apostroph-Differenz aufweist wie der Ziel-`main`, ist der Level bestanden."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## コミットをやりくりする","","開発中に頻繁に起こるケースをもう1つ考えます。ある変更(`newImage`)とまた別の変更(`caption`)があって、それらに依存関係があるとします。この一連の変更が一列に積み重なっているとします。","","ここでトリッキーなのは、以前のコミットに対して微修正をかけなければならないケースがあるということです。今回の教材でも、過去のコミットであるにも関わらず`newImage`ブランチに僅かな修正を加えるような設計の修正が入ったとしましょう。"]}},{type:"ModalAlert",options:{markdowns:["この困難な状況を、以下の手順で克服することを考えます:","","* `git rebase -i`を使って順番を変更する。これで、変更をかけたいコミットを一番先頭に持ってくる。","* `git commit --amend`コマンドで僅かな変更を行う","* `git rebase -i`コマンドを再度使って、先頭に持ってきていたコミットを元に戻す","* 最後に、レベルクリアのためにmainブランチを先頭に持ってくる","","クリアのための方法はいくつもありますが(cherry-pickを使うこともできます)、別の回答はまた後程の章で見ることにして、今回は上記の方法でやってみることにしましょう。","","最後に、ゴール時点での状態に気を付けてください。今回2回ほどコミットを動かしますから、コミットへのポインタにはアポストロフィ(')が追加されます。commit --amendコマンドの実行でできたコミットには更にもう1つのアポストロフィが追加されます。 "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 提交的技巧 #1","","接下来这种情况也是很常见的:你之前在 `newImage` 分支上进行了一次提交,然后又基于它创建了 `caption` 分支,然后又提交了一次。","","此时你想对某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 `newImage` 中图片的分辨率,尽管那个提交记录并不是最新的了。"]}},{type:"ModalAlert",options:{markdowns:["我们可以通过下面的方法来克服困难:","","* 先用 `git rebase -i` 将提交重新排序,然后把我们想要修改的提交记录挪到最前","* 然后用 `git commit --amend` 来进行一些小修改","* 接着再用 `git rebase -i` 来将他们调回原来的顺序","* 最后我们把 main 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!","","当然完成这个任务的方法不止上面提到的一种(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。","最后有必要说明一下目标状态中的那几个`'` —— 我们把这个提交移动了两次,每移动一次会产生一个 `'`;而 C2 上多出来的那个是我们在使用了 amend 参数提交时产生的,所以最终结果就是这样了。","","也就是说,我在对比结果的时候只会对比提交树的结构,对于 `'` 的数量上的不同,并不纳入对比范围内。只要你的 `main` 分支结构与目标结构相同,我就算你通过。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## commit 的戲法","","下面這種情況也是經常出現的。例如你之前已經在 `newImage` branch 上做了一些 commit,然後又開了一個 branch 叫做 `caption` ,並且在上面做了一些相關的 commit ,因此它們看起來是一個接著一個的。","","有點棘手的就是有時候你又想在之前的 commit 裡面做一些修改。在這個例子裡面,我們要去稍微修改一下 `newImage` 所指向的 commit,儘管已經是之前的 commit 了 。"]}},{type:"ModalAlert",options:{markdowns:["為了克服這個困難,我們可以按照下面的方法來做:","","* 先用 `git rebase -i` 將 commit 重新排序,然後把我們想要修改的 commit 移到最前面","* 然後用 `git commit --amend` 來進行一些修改","* 接著再用 `git rebase -i` 來將他們按照最開始的順序重新排好","* 最後我們把 main 移到這個修改的最前端(用你自己喜歡的方法),就大功告成啦!","","當然還有許多方法可以完成這個任務(我知道你在想 cherry-pick 啦),之後我們會多點關注這些技巧啦,但現在暫時只注意上面這種方法。","","啊!最後還要提醒你一下最後所產生的 commit tree,因為我們把 commit 移動了兩次,所以會分別產生一個 apostrophe(單引號) commit。還有一個 apostrophe commit 是因為我們修改 commit 而加進來的。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 커밋들 갖고 놀기","","이번에도 꽤 자주 발생하는 상황입니다. `newImage`와 `caption` 브랜치에 각각의 변경내역이 있고 서로 약간 관련이 있어서, 저장소에 차례로 쌓여있는 상황입니다.","","때로는 이전 커밋의 내용을 살짝 바꿔야하는 골치아픈 상황에 빠지게 됩니다. 이번에는 디자인 쪽에서 우리의 작업이력(history)에서는 이미 한참 전의 커밋 내용에 있는 `newImage`의 크기를 살짝 바꿔 달라는 요청이 들어왔습니다."]}},{type:"ModalAlert",options:{markdowns:["이 문제를 다음과 같이 풀어봅시다:","","* `git rebase -i` 명령으로 우리가 바꿀 커밋을 가장 최근 순서로 바꾸어 놓습니다","* `git commit --amend` 명령으로 커밋 내용을 정정합니다","* 다시 `git rebase -i` 명령으로 이 전의 커밋 순서대로 되돌려 놓습니다","* 마지막으로, main을 지금 트리가 변경된 부분으로 이동합니다. (편하신 방법으로 하세요)","","이 목표를 달성하기 위해서는 많은 방법이 있는데요(체리픽을 고민중이시죠?), 체리픽은 나중에 더 살펴보기로 하고, 우선은 위의 방법으로 해결해보세요.","","최종적으로, 목표 결과를 눈여겨 보세요 -- 우리가 커밋을 두 번 옮겼기 때문에, 두 커밋 모두 따옴표 표시가 붙어있습니다. 정정한(amend) 커밋은 따옴표가 추가로 하나 더 붙어있습니다."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглируем коммитами","","Вот ещё одна ситуация, которая часто случается. Есть некоторые изменения (`newImage`) и другие изменения (`caption`), которые связаны так, что находятся друг поверх друга в репозитории.","","Штука в том, что иногда нужно внести небольшие изменения в более ранний коммит. В таком случае надо немного поменять `newImage`, несмотря на то, что коммит уже в прошлом!"]}},{type:"ModalAlert",options:{markdowns:["Преодолеть эти трудности можно следующим образом:","","* Переставить коммит так, чтобы нужный находился наверху при помощи `git rebase -i`","* Внести изменения при помощи `git commit --amend`","* Переставить всё обратно при помощи `git rebase -i`","* И наконец, переместить main на изменённую часть дерева, чтобы закончить уровень.","","Это задание можно выполнить несколькими способами (и, гляжу, ты посматриваешь на cherry-picking), но сейчас сосредоточься на вышеописанном методе.","","Обрати внимание на итоговое состояние в этом уровне – так как мы дважды перемещаем коммиты, оба они получат по апострофу. Ещё один апостроф добавляется, когда мы делаем `git commit --amend`.","","Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглюємо комітами","","Ось інша ситуація, що доволі часто трапляється. В тебе є якісь зміни (`newImage`) та ще якийсь набір комітів (`caption`), які зв’язані між собою, тому вони знаходяться один над одним в твоєму репозиторії (або один за одним).","","Штука в тому що іноді потрібно зробити невелику модифікацію до попереднього коміту. В цьому випадку, дизайнери хочуть щоб ми трохи змінили розміри `newImage`, не зважаючи на те, що цей коміт знаходиться досить глибоко в історії!!"]}},{type:"ModalAlert",options:{markdowns:["Ми поборимо цю складність наступним чином:","","* Ми відсортуємо коміти таким чином, щоб той, який ми хочемо змінити, був останнім за допомогою `git rebase -i`","* Ми виконаємо `git commit --amend` щоб внести невелику правку до останнього коміту","* Тоді ми відсортуємо коміти в попередньому порядку, за допомогою `git rebase -i`","* І на останок, ми пересунемо main на змінену частину дерева щоб закінчити цей рівень(ти можеш вибрати метод)","","Насправді є кілька способів як виконати поставлену задачу (Я бачу, ти поглядаєш на cherry-pick), і ми розберемося з ними всіма трохи пізніше, але зараз скористаймося саме цим методом.","Зверни увагу на фінальний стан в цьому рівні -- позаяк ми перемістили коміти двічі, кожен з них отримає по апострофу. Ще один апостроф додасться коли ми виконаємо commit --amend.","","Враховуючи сказане вище, я буду порівнювати дерево як за назвою коміта, так і за кількістю апострофів. Щойно дерево цілей та main співпадуть, ти пройдеш цей рівень."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tung hứng Commit","","Có một tình huống xảy ra khá thường xuyên. Bạn có vài thay đổi trên (`newImage`) và một vài thay đổi khác trên (`caption`) và chúng lại liên quan đến nhau, nên chúng nằm chồng lên nhau trong kho của bạn (một lại nối một).","","Tréo ngoe là bạn lại phải điều chỉnh một chút ở commit trước. Giả sử như tay thiết kế muốn ta đổi chiều của `newImage` một chút, mặc dù commit ấy đã xưa lắm rồi!!"]}},{type:"ModalAlert",options:{markdowns:["Để khắc phục khó khăn này ta có thể làm như sau:","","* Ta sẽ dùng `git rebase -i` sắp xếp lại commit để cái ta cần sửa sẽ nằm trên cùng","* Ta sẽ dùng `git commit --amend` tạo ra một điều chỉnh nhỏ","* Sau đó ta sẽ lại sắp xếp lại commit như trước bằng cách dùng `git rebase -i`","* Cuối cùng, ta sẽ chuyển `main` tới phần đã cập nhật để hoàn thành cấp độ (dùng cách nào tùy bạn)","","Có nhiều cách để hoàn thành mục tiêu (Tôi thấy bạn hấp háy sang cherry-pick rồi đấy), rồi ta sẽ thấy chúng nhiều hơn, nhưng giờ hãy cứ tập trung vào kỹ thuật này đã.","Sau cùng thì, hãy để ý các dấu nháy đơn (') -- Vì ta đã chuyển commit 2 lần, nên chúng có thêm một dấu nháy đơn và một dấu nữa cho commit mà ta đã sửa đổi, thế là ta có trạng thái cuối cùng của cây lịch sử ","","Nói cách khác, khi tôi so sánh kết quả, tôi chỉ so sánh cấu trúc của cây lịch sử. Sự khác biệt về số lượng `'` không được bao gồm trong so sánh. Miễn là cấu trúc nhánh `main` của bạn giống với cấu trúc đích, tôi sẽ vẫn để bạn qua bài."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Žongliranje s Commiti","","Tu je še ena situacija, ki se dogaja kar pogosto. Imaš nekaj sprememb (`newImage`) in še nekaj drugih sprememb (`caption`), ki so povezane in zložene druga na drugo v tvojem repozitoriju.","","Včasih se zgodi, da bi rad naredil manjšo spremembo na zgodnejšem commitu. V tem primeru si naš dizajner želi, da spremenimo dimenzije slike `newImage`, čeprav je commit daleč nazaj v naši zgodovini!!"]}},{type:"ModalAlert",options:{markdowns:["Ta izziv bomo rešili takole:","","* Preuredili bomo commite tako, da bo tisti, ki ga želimo spremeniti, na vrhu z `git rebase -i`","* Izvedli bomo `git commit --amend`, da naredimo naš popravek","* Nato bomo preuredili commite nazaj v začetno stanje z `git rebase -i`","* Za konec bomo premaknili main na ta posodobljen del drevesa, da zaključimo stopnjo (z metodo po tvoji izbiri)","","Obstaja več načinov, da dosežemo ta cilj (vidim te kako gledaš cherry-pick) s katerimi se bomo ukvarjali kasneje, ampak za zdaj se osredotočimo na to tehniko.","In nenazadnje, bodi pozoren na ciljno stanje -- ker premaknemo commit dvakrat, oba dobita pripet opuščaj zgoraj. Še eden je dodan za ammendan commit, torej skupno tri.","","Sedaj lahko primerjam stopnje po strukturi in relativni spremembi opuščajev. Dokler ima `main` branch na tvojem drevesu enako strukturo in število opuščajev, dobiš vse točke."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Żonglowanie commitami","","Oto inna sytuacja, która zdarza się dość często. Masz pewne zmiany (`newImage`) i inny zestaw zmian (`caption`), które są powiązane, więc są one ułożone jedne na drugim w twoim repozytorium (tzw. jeden po drugim).","","Problem polega na tym, że czasami trzeba dokonać małej modyfikacji wcześniejszego commitu. W tym przypadku projektant chce, abyśmy zmienili nieco wymiary `newImage`, mimo że ten commit jest daleko w tyle w naszej historii!!!"]}},{type:"ModalAlert",options:{markdowns:["Przezwyciężymy tę trudność, wykonując następujące czynności:","","* Zmienimy kolejność commitów tak, aby ten, który chcemy zmienić, był na górze, używając `git rebase -i`.","* Wykonamy `git commit --amend`, aby dokonać niewielkiej modyfikacji","* Następnie zmienimy kolejność commitów z powrotem na taką, jaka była poprzednio za pomocą `git rebase -i`.","* Na koniec przeniesiemy się do tej zaktualizowanej części drzewa, aby ukończyć ten poziom (w wybrany przez ciebie sposób)","","Istnieje wiele sposobów na osiągnięcie tego ogólnego celu (widzę, że masz na oku cherry-pick), i później zobaczymy ich więcej, ale na razie skupmy się na tej technice.","Na koniec zwróć uwagę na stan celu - ponieważ przenosimy commity dwukrotnie, oba otrzymują apostrof. Dodajemy jeszcze jeden apostrof dla commitu, który zmieniamy, co daje nam ostateczną postać drzewa.","","Uwzględniając to, mogę teraz porównać poziomy w oparciu o strukturę i względne różnice apostrofów. Tak długo, jak gałąź `main` twojego drzewa ma taką samą strukturę, rozwiązanie zostanie uznane."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Giocoliere di commit","","Ecco una situazione che capita spesso. Hai dei cambiamenti (`newImage`) e un altro insieme di modifiche (`caption`) che sono collegate tra loro, quindi sono posizionate una dopo l'altra nel repository.","","La cosa complicata è che a volte hai bisogno di fare una piccola modifica a un commit precedente. In questo caso, dobbiamo apporre una modifica a `newImage`, anche se questo commit non risulta essere l'ultimo!!"]}},{type:"ModalAlert",options:{markdowns:["Supereremo queste difficoltà facendo i seguenti passaggi:","","* Riordineremo i commit in modo che quello che vogliamo modificare risulti l'ultimo con `git rebase -i`","* Faremo `git commit --amend` per apporre la modifica","* Riordineremo i commit nello stesso ordine in cui erano, sempre con `git rebase -i`","* Alla fine, sposteremo main in questo ramo aggiornato dell'albero per finire il livello (utilizzate il metodo che volete)","","Ci sono vari modi per raggiungere l'obiettivo finale (vedo che strizzi l'occhio verso cherry-pick), e ne vedremo altri più tardi, ma per ora concentriamoci su questa tecnica.","In fine, presta attenzione all'obiettivo -- visto che spostiamo i commit due volte, a entrambi viene messo un apostrofo. Un ulteriore apostrofo è aggiunto per il commit --amend, che completa in fine l'albero.","","Detto questo, posso confrontare i livelli in base alla struttura e i relativi apostrofi. Finchè il tuo ramo `main` avrà la stessa struttura con i giusti apostrofi, ti darò pieni voti."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit Hokkabazlığı","","Şimdiki senaryomuz aslında sık karşılaşılan başka bir durumdur. İlgili olan iki değişiklik kümeniz (`newImage` ve `caption`) vardır, bu nedenle bu iki küme reponuzda üst üste yığılıdır (veya diğer adıyla birbiri ardına gelmişlerdir).","","Zor olan şey, bazen önceki bir commit üzerinde küçük bir değişiklik yapmanız gerektiğidir. Bu durumda, tasarım ekibi `newImage` 'in boyutlarını biraz değiştirmemizi istiyor, ancak bu commit geçmişimizde çok eski bir tarihte yer alıyor!!"]}},{type:"ModalAlert",options:{markdowns:["Bu zorluğun üstesinden şu şekilde gelebiliriz:","","* `git rebase -i` komutu ile değiştirmek istediğimiz commit'i en üste getireceğiz.","* Küçük değişikliği yapmak için `git commit --amend` komutunu kullanacağız.","* Ardından, `git rebase -i` komutu ile komitleri önceki sıralarına geri döndüreceğiz.","* Son olarak, main branch'ini ağacın bu güncellenmiş kısmına taşıyarak seviyeyi bitireceğiz (tabi sizin seçtiğiniz yöntemle).","","Bunu başarmak için birçok yol vardır (cherry-pick komutuna göz diktiğinizi görüyorum) ve ileride daha fazlasını göreceğiz, ancak şimdilik bu tekniğe odaklanalım.","Son olarak, buradaki hedef duruma dikkat edin - commit'leri iki kez taşıdığımızdan, her ikisi de bir tırnak işareti alıyor. Değiştirdiğimiz commit için bir tırnak işareti daha eklenir, bu da bize ağacın son halini verir. ","","Şunu da belirtmek isteriz ki, artık seviyeleri yapı ve göreceli tırnak işareti farklılıklarına göre karşılaştırabiliyoruz. Ağacınızın `main` branch'i aynı yapıya ve göreceli tırnak işareti farklılıklarına sahip olduğu sürece tam puan alacaksınız."]}}]}}}},{}],129:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout main;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"main":{"target":"C1","id":"main"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMainHashAgnosticWithAsserts:!0,goalAsserts:{main:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},name:{ko:"커밋 갖고 놀기 #2",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",es_MX:"Malabareando con las confirmaciones #2",pt_BR:"Malabarismo com commits #2",gl:"Argallando cos commits #2",de_DE:"Jonglieren mit Commits Teil 2",ja:"コミットをやりくりする その2",zh_CN:"提交的技巧 #2",zh_TW:"commit 的戲法 #2",ru_RU:"Жонглируем коммитами №2",uk:"Жонглюємо комітами #2",vi:"Tung hứng commit #2",sl_SI:"Žongliranje s Commiti #2",it_IT:"Giocoliere di commit #2",pl:"Żonglowanie commitami #2",tr_TR:"Commit Hokkabazlığı #2"},hint:{en_US:"Don't forget to forward main to the updated changes!",fr_FR:"N'oubliez pas d'appliquer les changements depuis la branche main",es_AR:"¡No te olvides de avanzar main a los cambios actualizados!",es_ES:"¡No te olvides de avanzar main a los cambios actualizados!",es_MX:"¡No te olvides de avanzar main a los cambios actualizados!",pt_BR:"Não se esqueça de avançar a referência do main para as mudanças efetuadas!",gl:"¡Non te esquezas de avanzar main ós cambios actualizados!",de_DE:"Vergiss nicht den main auf die aktuelle Version vorzuspulen",ja:"mainのポインタを先に進めることを忘れずに!",ko:"main을 변경 완료한 커밋으로 이동(forward)시키는 것을 잊지 마세요!",zh_CN:"别忘记了将 main 快进到最新的更新上!",zh_TW:"別忘記了將 main 推到最新的 commit 上面!",ru_RU:"Не забудь переместить main на последние изменения.",uk:"Не забудь перемістити main на останні зміни!",vi:"Đừng quên đẩy nhánh main lên cập nhật mới nhất!",sl_SI:"Ne pozabi prestaviti main naprej na posodobljene spremembe.",it_IT:"Non dimenticare di avanzare il main verso le ultime modifiche aggiornate!",pl:"Nie zapomnij sforwardować maina do najnowszych zmian!",tr_TR:"Main'i yaptığınız değişikliklere ilerletmeyi unutmayın!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't an ancestor of HEAD).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D","","Remember, the exact number of apostrophe's (') on the commit are not important, only the relative differences. For example, I will give credit to a tree that matches the goal tree but has one extra apostrophe everywhere."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jongler avec les commits #2","","*Si vous n'avez pas fait le défi Jongler avec les commits #1 (le niveau précédent), vous devriez le faire avant de continuer*","","Comme vu dans le niveau précédent, nous utilisons `rebase -i` pour réordonner les commits. Une fois que le commit à modifier est celui à la tête, nous pouvons facilement faire un --amend et réordonner dans l'ordre voulu.","","La difficulté ici est qu'il y a beaucoup de changements, ce qui peut introduire des conflits de rebase. Essayons avec l'autre méthode `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["N'oubliez pas que git cherry-pick va prendre un commit de n'importe où dans l'arbre de Git et le mettre devant HEAD (sauf s'il est un ancêtre de HEAD).","","Un petit rappel :"],afterMarkdowns:["Bien ! Continuons."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Dans ce niveau, nous voulons modifier `C2` sans utiliser `rebase -i`. À vous maintenant de trouver comment ! :D","","Petit rappel, le nombre exact d'apostrophes (') sur le commit n'est pas important. Par exemple, nous donnerons les points à une structure qui colle au résultat mais qui a une apostrophe en trop partout."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Haciendo malabares con los commits #2","","*Si no completaste Haciendo malabares con los commits #1 (el nivel anterior), hacelo 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 estaba 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:["Acordate de 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 main; 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 vos el darte cuenta cómo :D","","Acordate, la cantidad exacta de apóstrofes (') en el commit no es importante, sólo la diferencia relativa. Por ejemplo, le voy a dar puntaje a un árbol que matchee el objetivo pero cuyos commits tengan todos un apóstrofe extra."]}}]},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 main; 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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabareando con las confirmaciones #2","","*Si no completaste Malabareando con las confirmaciones #1 (el nivel anterior), hazlo antes de continuar*","","Como viste en el último nivel, usamos `rebase -i` para reordenar las confirmaciones. Una vez que la confirmación que queríamos cambiar se encontraba arriba de todo, pudimos `--amend` (enmendarlo) 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 demostración para refrescar la idea:"],afterMarkdowns:["¡Bien! Sigamos..."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; 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 puntos a un árbol que coincida con el objetivo pero cuyos commits tengan todos un apóstrofe extra."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabarismo com commits #2","","*Caso você não tenha completado o nível anterior (Malabarismo com commits #1), por favor faça-o antes de continuar*","","Como você viu no nível anterior, usamos `rebase -i` para reordenar os commits. Uma vez que o commit que queríamos mudar estava no topo, pudemos facilmente usar o `--amend` e depois reordená-lo de volta para obter nossa ordem preferida.","","O único problema aqui é que há muita reordenação ocorrendo, o que pode introduzir conflitos de rebase. Vamos dar uma olhada em outro método, usando o `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembre-se que o git cherry-pick copiará um commit de qualquer lugar na árvore sob o HEAD (desde que esse commit não seja um ancestral do HEAD).","","Aqui está uma demonstração para refrescar sua memória:"],afterMarkdowns:["Ótimo! Vamos em frente."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:['Então, neste nível, vamos alcançar o mesmo objetivo de fazer "amend" no `C2`, mas evitaremos usar o `rebase -i`. Agora vou deixar com você a tarefa de descobrir como fazer! :D',"","Lembre-se, o número exato de apóstrofos (') nos commits não é importante, apenas as diferenças relativas. Por exemplo, darei todos os pontos nesta tarefa se você obtiver o mesmo resultado da árvore da visualização de objetivo com um apóstrofo extra em todos os commits."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argallando cos commits #2","","*No caso de non ter rematado o tema anterior (Argallando cos commits #1), por favor faino antes de continuar*.","","Como puideches ver no anterior tema, usamos `rebase -i` para reordear os commits. Unha vez que atopamos o commit que queriamos modificar, puidemos empregar sinxelamente o `--amend`, e depois reordenalo de volta para obter a nosa orde preferida.","","O único problema aquí é que hai moita reordenación ocorrendo, o que pode introducir conflitos no rebase. Imos votar unha ollada a outro método, o uso de `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembra que `git cherry-pick` copiará un commit de qualquera lugar na árbore enriba do HEAD (sempre e cando non sexa ancestro do HEAD).","","Aquí está unha demostración para que refresques a memoria:"],afterMarkdowns:["¡A tope! Seguimos."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:['Entón, neste nivel, imos completar o mesmo obxectivo que facendo "amend" no `C2`, pero evitando facer o `rebase -i`. Agora deixámoste que lle des os miolos para sacar o exercicio! :D',"","Recorda, o número exacto de apóstrofos (') nos commits non é importante, só as diferencias relativas. Por exemplo, levarás todos os puntos desta tarefa se obtés o mesmo resultado da árbore que se mostra na visualización do exercicio con un apóstrofo extra en tódolos commits."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jonglieren mit Commits Teil 2","",'Du solltest "Jonglieren mit Commits" (den vorherigen Level) bestanden haben, bevor du dich an diesem hier versuchst.',"","Wie du im letzten Level gesehen hast, haben wir `git rebase -i` genutzt, um die Commits neu anzuordnen. Sobald der Commit, den wir ändern wollten, ganz oben war, konnten wir ihn einfach mit `git commit --amend` anpassen. Danach haben wir die alte Reihenfolge wiederhergestellt.","","Das einzige Problem ist hier, dass da eine Menge Umsortieren stattfindet, was zu Rebase-Konflikten führen kann. Schauen wir uns also eine Methode mit `git cherry-pick` an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wie du dich erinnerst, macht `git cherry-pick` eine Kopie des angegebenen Commits und fügt sie an `HEAD` an (es sei denn der Commit ist ein Vorgänger von `HEAD`).","","Hier eine kleine Demo zur Erinnerung:"],afterMarkdowns:["Schick! Und weiter geht's."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["In diesem Level ist das Ziel wieder, den Commit `C2` zu modifizieren, diesmal aber ohne `git rebase -i` zu benutzen. Ich überlass es dir herauszufinden, wie das gehen soll. :D","","Nicht vergessen, die genaue Anzahl von Kopien (d.h. Apostrophen) ist nicht ausschlaggebend, nur die Differenz. Der Level ist zum Beispiel auch gelöst, wenn dein fertiger Baum dieselbe Struktur wie der Ziel-Baum hat, aber *überall* ein Apostroph mehr aufweist."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## コミットをやりくりする その2","","*注:この一つ前のレベル「コミットをやりくりする」をクリアしていない人は、まずそちらの問題をクリアしてきてください!*","","前回見てきたように、コミット順序の変更のために、私たちは`rebase -i`コマンドを利用しました。ツリーの先頭に変更対象のコミットがあれば、--amendオプションを使うことで容易に変更を書きかえて、元の順序に戻すことができます。","","この場合に心配なことが一つだけあって、それは複数回の順序の変更が行われるので、rebaseのコンフリクト(衝突)が起こりうることです。こういうケースへの対策として、`git cherry-pick`を使った別の解決法について考えてみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git cherry-pickを使うと、ツリーの中から複数のコミットを選んで、HEADの下に新しく作ることができましたね。","","簡単なデモを見てみましょう:"],afterMarkdowns:["できました!次へ進みましょう"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルでは、`C2`をamendすることで前回と同じ目的を達成しましょう。但し`rebase -i`は使わずにクリアしてください。どんな方法で進めるかはあなたにおまかせします!:D"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 提交的技巧 #2","","*如果你还没有完成“提交的技巧 #1”(前一关)的话,请先通过以后再来!*","","正如你在上一关所见到的,我们可以使用 `rebase -i` 对提交记录进行重新排序。只要把我们想要的提交记录挪到最前端,我们就可以很轻松的用 `--amend` 修改它,然后把它们重新排成我们想要的顺序。","","但这样做就唯一的问题就是要进行两次排序,而这有可能造成由 rebase 而导致的冲突。下面还是看看 `git cherry-pick` 是怎么做的吧。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["要在心里牢记 cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。","","来看看这个例子:"],command:"git cherry-pick C2",afterMarkdowns:["看到了吧?我们继续"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["这一关的目标和上一关一样,通过 `--amend` 改变提交记录 `C2`,但你不能用 `rebase -i`。自己想想要怎么解决吧! :D","","对了,提交记录上面的`'`的数量并不重要,只是引用的不同而已。也就是说如果你的最终结果在某个提交记录上多了个`'`,我也会算你通过的。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## commit 的戲法 #2","","*假如你還沒有完成 commit 的戲法 #1(前面那一個關卡),請先完成之後再來這一關!*","","如你在上一個關卡所看到的,我們使用 `rebase -i` 來重新排列那些 commit。只要把我們想要修改的 commit 移到最前面,我們就可以很容易地重新修改它,然後再把它們重新排成我們想要的順序。","","但唯一的問題就是這樣做就要排很多次,有可能造成 rebase conflict。下面就看看用另外一種方法 `git cherry-pick` 是怎麼做的吧!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["要記住喔! cherry-pick 可以從 commit tree 的任何地方拿一個 commit 來放在 HEAD 上(只要那個 commit 不是 HEAD 的 parent)。","","下面是一個簡單清楚的 demo:"],command:"git cherry-pick C2",afterMarkdowns:["太棒了,我們繼續吧!"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["在這一關和上一關一樣要去修改一個 commit 叫做`C2`,但你要避免使用 `rebase -i`。自己想想看要怎麼解決吧!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 커밋 갖고 놀기 #2","","*만약 이전 레벨의 커밋 갖고 놀기 #1을 풀지 않으셨다면, 계속하기에 앞서서 꼭 풀어보세요*","","이전 레벨에서 보셨듯이 `rebase -i` 명령으로 커밋의 순서를 바꿀 수 있습니다. 정정할 커밋이 바로 직전(top)에 있으면 간단히 --amend로 수정할 수 있고, 그리고 나서 다시 원하는 순서로 되돌려 놓으면 됩니다.","","이번에 한가지 문제는 순서를 꽤 많이 바꿔야한다는 점인데요, 그러다가 리베이스중에 충돌이 날 수 있습니다. 이번에는 다른 방법인 `git cherry-pick`으로 해결해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git cherry-pick으로 HEAD에다 어떤 커밋이든 떨어 뜨려 놓을 수 있다고 알려드린것 기억나세요? (단, 그 커밋이 현재 가리키고 있는 커밋이 아니어야합니다)","","간단한 데모로 다시 알려드리겠습니다:"],afterMarkdowns:["좋아요! 계속할게요"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["그럼 이번 레벨에서는 아까와 마찬가지로 `C2` 커밋의 내용을 정정하되, `rebase -i`를 쓰지 말고 해보세요. ^.~"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглируем коммитами №2","","*Перед прохождением этого уровня обязательно надо пройти предыдущий уровень – 'Жонглируем коммитами №1'*","","В прошлом уровне мы использовали `rebase -i`, чтобы переставлять коммиты. Как только нужный нам коммит оказывался в конце, мы могли спокойно изменить его при помощи `--amend` и переставить обратно.","","Единственная проблема тут - это множество перестановок, которые могут спровоцировать конфликты. Посмотрим, как с этой же задачей справится cherry-pick."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Важно помнить, что cherry-pick поместит любой коммит сразу после HEAD (только если этот коммит не является предком HEAD)","","Вот небольшое демо для напоминания:"],afterMarkdowns:["Ок! Едем дальше!"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Итак, в этом уровне нужно достичь того же эффекта, но без использования `rebase -i`. Остальное – по усмотрению.","","Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглюємо комітами #2","","*Якщо ти ще не пройшов Жонглюємо комітами #1 (попередній рівень), будь ласка, зроби це перед тим як продовжити*","","Як ти бачив в попередньому рівні, ми використали `rebase -i` щоб впорядкувати набір комітів. Як тільки потрібний коміт опиняється вгорі, його досить легко змінити за допомогою --amend й потім відсортувати коміти в попередньому порядку.","","Єдина проблема з таким підходом полягає в тому, що виконується досить багато перестановок комітів, що може призвести до конфліктів при виконанні rebase. Спробуймо інший підхід який використовує `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Не забувай, що git cherry-pick вставить коміт з будь-якого місця в HEAD (якщо це не коміт-предок HEAD).","","Ось невелике демо, щоб пригадати:"],afterMarkdowns:["Добре! Продовжуємо"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Отже, в цьому рівні досягнімо тієї ж мети -- модифікації `C2` -- але без використання `rebase -i`. Я думаю, ти розберешся як це зробити! :D","","Зверни увагу, що точне число апострофів (') в коміті не важливе, важлива тільки відносна різниця. Наприклад, якщо кожен коміт буде містити додатковий апостроф, я все одно зарахую такий розв’язок."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tung hứng Commit #2","","*Nếu bạn vẫn chưa hoàn thành Tung hứng Commit #1 (cấp độ trước), hãy làm nó trước khi tiếp tục*","","Như bạn đã thấy ở cấp độ trước, ta dùng `rebase -i` để sắp xếp lại các commit. Một khi commit mà ta muốn sửa đã ở trên cùng, ta có thể dễ dàng --chỉnh sửa (amend) nó và sau đó sắp xếp lại trật tự lúc trước.","","Nhưng mà vẫn tồn tại vấn đề khi mà ta sắp xếp quá nhiều, điều này có thể dẫn đến xung đột khi rebase. Thử dùng cách khác với `git cherry-pick` nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy nhớ rằng cherry-pick sẽ thả commit ở bất cứ đâu xuống dưới HEAD (miễn là nó không phải cha ông hay tổ tiên gì của HEAD).","","Hãy xem thử minh họa nhỏ sau:"],afterMarkdowns:["Hay! Tiếp tục nào"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Vậy thì ở cấp độ này, hãy làm hoàn thành mục tiêu tương tự là chỉnh sửa `C2` một lần nhưng hãy tránh dùng `rebase -i`. Tự tìm cách đi nhé! :D","","Nhớ rằng, số lượng dấu nháy đơn (') trên commit không quan trọng, quan trọng là sự khác biệt tương đối. Nói cách khác, kể cả bất cứ commit nào của bạn có thêm một đấu(') tôi vẫn công nhận đáp án của bạn"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Žongliranje s Commiti #2","","Če še nisi končal Žongliranje s Commiti #1 (prejšnjo stopnjo), jo končaj pred nadaljevanjem","","Kot si videl v prejšnji stopnji, smo uporabili `rebase -i` za preureditev commitov. Ko je bil commit, ki smo ga želeli spremeniti, na vrhu, smo preprosto uporabili --amend in preuredili nazaj v naše željeno stanje.","","Edini problem tu je, da je veliko prerazporejanja, kar lahko povzroči rebase konflikte. Poglejmo si še eno drugo tehniko imenovano `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Git cherry-pick bo skopiral commit iz bilokaterega mesta na drevesu na HEAD (seveda dokler ni ta commit že prednik HEAD).","","Tu je mali osvežitveni primer:"],afterMarkdowns:["Odlično! Nadaljujmo ..."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Torej v tej stopnji bi radi enako spremenili `C2`, ampak tokrat brez uporabe `rebase -i`. Kako to narediti, prepustim tebi! :D","","Točno število opuščajev (') na commitu ni pomembno, pomembna je samo relativna sprememba. Naprimer, vse točko bom dal tudi za drevo, ki ustreza ciljenmu drevesu, a ima povsod dodaten opuščaj."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Żonglowanie commitami #2","","*Ukończ poprzedni poziom Żonglowania commitami przed przejściem dalej*","","Na poprzednim poziomie użyliśmy `rebase -i`, aby zmienić kolejność commitów. Kiedy commit, który chcieliśmy zmienić, był już na górze, mogliśmy łatwo to zrobić (`--amend`), a następnie przywrócić do odpowiedniej kolejności.","","Jedynym problemem jest to, że dokonuje się wiele zmian w kolejności, co może powodować konflikty podczas rebase'u. Przyjrzyjmy się innej metodzie korzystającej z `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pamiętaj, że `git cherry-pick` zrzuci commit z dowolnego miejsca drzewa na HEAD (o ile ten commit nie jest przodkiem HEAD).","","Oto małe demo na odświeżenie pamięci:"],afterMarkdowns:["Ładnie! Ruszajmy dalej."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Więc na tym poziomie osiągnijmy ten sam cel zmiany `C2`, ale unikając użycia `rebase -i`. Zostawię ci to do rozgryzienia! :D","","Pamiętaj, że dokładna liczba apostrofów (') nie jest ważna, tylko względne różnice. Na przykład, uznam drzewo, które pasuje do drzewa celu, ale ma wszędzie jeden dodatkowy apostrof."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Giocoliere di commit #2","","*Se non hai completato Giocoliere di commit #1 (il livello precedente), sei pregato di farlo prima di proseguire*","","Come hai visto nell'ultimo livello, abbiamo usato `rebase -i` per riordinare i commit. Una volta che il commit che volevamo modificare era in cima, abbiamo potuto facilmente fare --amend per poi ritornare nell'ordine di partenza.","","L'unico problema qui è che ci sono tanti riordini da fare, che può portare a conflitti nel rebase. Vediamo di farlo attraverso il metodo `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ricorda che git cherry-pick creerà un qualsiasi commit del repository su HEAD (a condizione che il commit non sia un antenato di HEAD).","","Qui un breve demo per rinfrescare la memoria:"],afterMarkdowns:["Grande! Andiamo avanti."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["In questo livello, dobbiamo fare amend di `C2` una volta, evitando di usare `rebase -i`. Lascerò a te il compito di scoprire come farlo! :D","","Ricorda, il numero esatto di apostrofi sul commit non sono importanti, solo le differenze tra essi. Per esempio, considererò l'albero che corrisponde a quello della soluzione ma che ha un apostrofo extra dappertutto."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit Hokkabazlığı #2","","*Eğer Commit Hokkabazlığı #1'i (bir önceki level) bitirmediyseniz, devam etmeden önce lütfen önce o bölümü bitirin*","","Bir önceki seviyeden hatırlayacağınız gibi, `rebase -i` kullanarak commit'leri yeniden sıralayabiliyorduk. Değiştirmek istediğimiz commit en üstte olduğunda, onu kolayca düzeltebilir `--amend` ve tercih ettiğimiz sıraya yeniden düzenleyebilirdik.","","Tek sorun şu ki, birçok yeniden sıralama yapıldığında, bu yeniden sıralama çatışmalarını ortaya çıkarabilir. Başka bir yöntemi, git cherry-pick ile inceleyelim."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Unutmayın ki git cherry-pick, HEAD'in herhangi bir yerinde (bu commit, HEAD'in atası değilse) bulunan bir commit'i HEAD üzerine bırakacaktır.","","İşte küçük bir hatırlatma demosu:"],afterMarkdowns:["Harika! Devam Edelim."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Bu seviyede, `C2` commit'ini düzeltmek için `rebase -i` kullanmadan aynı sonuca ulaşmaya çalışın. Nasıl ulaşabileceğimizi size bırakıyorum! :D","","Unutmayın, commit'lerdeki tırnakların (') tam olarak eşleşmesi önemli değil, yalnızca göreceli farklar önemlidir. Örneğin, hedef ağaçla eşleşen ancak her yerde ekstra bir tırnak bulunan bir ağaçtan da puan alınabilir."]}}]}}}},{}],130:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C5","id":"main","remoteTrackingBranchID":null},"side":{"target":"C3","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"tags":{"v1":{"target":"C2","id":"v1","type":"tag"},"v0":{"target":"C1","id":"v0","type":"tag"}},"HEAD":{"target":"C2","id":"HEAD"}}',solutionCommand:"git tag v1 side~1;git tag v0 main~2;git checkout v1",startTree:'{"branches":{"main":{"target":"C5","id":"main","remoteTrackingBranchID":null},"side":{"target":"C3","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Git Tags",de_DE:"Git Tags",ja:"Gitのタグ",es_AR:"Tags en git",es_ES:"Tags en git",es_MX:"Tags de Git",pt_BR:"Tags no Git",gl:"Etiquetas en git",fr_FR:"Git Tags",zh_CN:"Git Tag",zh_TW:"git tag",ru_RU:"git tag",ko:"Git 태그",uk:"Git Tags",vi:"Tag trong Git",sl_SI:"Git Tagi",it_IT:"Git Tag",pl:"Tagi Gita",tr_TR:"Git Tagleri"},hint:{en_US:"you can either check out the commit directly or simply checkout the tag!",fr_FR:"Vous pouvez faire le checkout sur le commit ou sur le tag !",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!",es_MX:"Puedes cambiar (checkout) directamente a la confirmación, ¡o simplemente cambiar (checkout) al 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 上",zh_CN:"你可以直接 checkout 到 commit 上,或是简单地 checkout 到 tag 上",ru_RU:"Можно сделать checkout напрямую на коммит или же на тег",ko:"커밋을 직접 또는 태그를 이용해서 체크아웃할수 있습니다!",uk:"ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!",vi:"Bạn có thể chuyển trực tiếp sang commit hoặc đơn giản là chuyển sang tag!",sl_SI:"Checkoutaš lahko neposredno commit ali pa preprosto njegov tag!",it_IT:"Puoi fare direttamente checkout del commit o semplicemente del tag!",pl:"Możesz checkoutować commit bezpośrednio lub po prostu tag!",tr_TR:"İsterseniz direkt commit'e veya direkt tag'e checkout yapabilirsiniz!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","As you have learned from previous lessons, branches are easy to move around and often refer to different commits as work is completed on them. Branches are easily mutated, often temporary, and always changing.","","If that's the case, you may be wondering if there's a way to *permanently* mark historical points in your project's history. For things like major releases and big merges, is there any way to mark these commits with something more permanent than a branch?",""]}},{type:"ModalAlert",options:{markdowns:['You bet there is! Git tags support this exact use case -- they (somewhat) permanently mark certain commits as "milestones" that you can then reference like a branch.',"",'More importantly though, they never move as more commits are created. You can\'t "check out" a tag and then complete work on that tag -- tags exist as anchors in the commit tree that designate certain spots.',"","Let's see what tags look like in practice."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try making a tag at `C1` which is our version 1 prototype."],afterMarkdowns:["There! Quite easy. We named the tag `v1` and referenced the commit `C1` explicitly. If you leave the commit off, git will just use whatever `HEAD` is at."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["For this level just create the tags in the goal visualization and then check `v1` out. Notice how you go into detached `HEAD` state -- this is because you can't commit directly onto the `v1` tag.","","In the next level we'll examine a more interesting use case for tags."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","Comme appris dans les niveaux précédents, les branches sont faciles à manipuler et se réfèrent aux commits qui ont été faits pour compléter le travail fait sur celles-ci. Les branches sont donc constamment en mouvement.","","Dans ce cas, vous vous demandez peut-être s'il y a un moyen d'ajouter une marque *permanente* dans l'historique de votre projet. Pour des commits comme des livraisons majeures ou d'importantes fusions, existe-t-il une façon plus stable qu'une branche pour garder l'état d'une branche à un instant précis ?",""]}},{type:"ModalAlert",options:{markdowns:['Vous l\'avez deviné ! Les tags Git offrent cette fonctionnalité : les tags marquent à jamais certains commits comme "milestone" (étape clé) auxquels vous pouvez vous référer comme à des branches.',"","Encore plus important, ils sont définitifs. Vous ne pouvez donc pas rajouter de commit dans un tag : les tags sont un peu comme un pointeur définitif dans l'arbre des commits.","","Voyons les tags en pratique."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Essayons de faire un tag sur C1 (qui représente la version 1 de notre prototype)."],afterMarkdowns:["Voila, facile non ? Nous nommons le tag `v1` et il pointe vers le commit `C1`. Si vous ne spécifiez pas le commit, le tag pointera là où se trouve `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Pour ce niveau, créez simplement les tags visibles dans les objectifs puis faites un checkout sur le tag `v1`. Remarquez le passage à l'état `HEAD` détachée -- c'est parce que vous ne pouvez pas commiter sur le tag `v1`.","","Dans les niveaux suivants vous verrez un cas plus intéressant d'utilisation des tags."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git tag","","就像你之前學到的一樣,branch 很容易被移動,而且當有新的 commit 時,又會再移動,branch 經常指向不同的 commit,branch 很容易改變。","","你可能會有疑問,有沒有什麼方法可以*永遠*有一個指向 commit 的記號,例如,表示重大的軟體釋出,或者是修正很大的 bug,有沒有其它比 branch 更好的方法,可以永遠地指向這些 commit?",""]}},{type:"ModalAlert",options:{markdowns:['你說對了!git tag 可以解決這個問題,它們可以永遠地指向某個特定的 commit,就像是表示一個"里程碑"一樣。',"",'更重要的是,當有新的 commit 時,它們也不會移動,你不可以 "checkout" 到 tag 上面 commit,tag 的存在就像是一個在 commit tree 上的表示特定訊息的一個錨。',"","讓我們來實際看一下 tag 長什麼樣子..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們試著建立一個 tag,指向 commit `C1`,表示這是我們第一個版本。"],afterMarkdowns:["看吧!非常容易,我們命名這個 tag 叫做 `v1`,並且讓它指向 commit `C1`,如果你離開了該 commit,git 會根據 `HEAD` 所指向的位置才分辨。"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["在這個關卡中,建立一個如視覺化目標裡面的 tag,然後 checkout 到 `v1` 上面,要注意你會進到分離 `HEAD` 的狀態,這是因為你不能夠直接在 `v1` 上面做 commit。","","在下個關卡中我們會介紹更多 tag 的應用..."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","相信通过前面课程的学习你已经发现了:分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。","","你可能会问了:有没有什么可以*永远*指向某个提交记录的标识呢,比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性,有没有比分支更好的可以永远指向这些提交的方法呢?",""]}},{type:"ModalAlert",options:{markdowns:["当然有了!Git 的 tag 就是干这个用的啊,它们可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了。","","更难得的是,它们并不会随着新的提交而移动。你也不能切换到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。","","咱们来看看标签到底是什么样。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们先建立一个标签,指向提交记录 `C1`,表示这是我们 1.0 版本。"],afterMarkdowns:["很容易吧!我们将这个标签命名为 `v1`,并且明确地让它指向提交记录 `C1`,如果你不指定提交记录,Git 会用 `HEAD` 所指向的位置。"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["在这个关卡中,按照目标建立两个标签,然后切换到 `v1` 上面,要注意你会进到分离 `HEAD` 的状态 —— 这是因为不能直接在`v1` 上面做 commit。","","在下个关卡中我们会介绍更多关于标签的有趣的应用。"]}}]},es_AR:{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 podés referenciar como a un branch.',"",'Aún más importante, los tags no avanzan cuando se crean nuevos commits. No podés "checkoutear" 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 especificás 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 creá los tags en la visualización final y después checkouteá `v1`. Notá cómo entrás en el estado detached -- esto es porque no podés commitear directamente sobre el tag `v1`.","","En el próximo nivel vamos a examinar un caso de uso más interesante para los tags."]}}]},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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tags en git","","Como aprendiste en lecciones anteriores, las ramas pueden moverse fácilmente y en general van referenciando distintas confirmaciones 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 mezclas (merges), ¿hay algún modo de marcar esas confirmaciones con algo más permanente que una rama?",""]}},{type:"ModalAlert",options:{markdowns:['¡Apuesto a que lo hay! Los tags de Git soportan exactamente este caso de uso -- marcan (bastante) permanentemente determinadas confirmaciones como "hitos" que puedes referenciar como a una rama.',"","Aún más importante, los tags no avanzan cuando se crean nuevas confirmaciones. No puedes hacer checkout a un tag y completar el trabajo en ese tag - los tags son marcas fijas en el árbol de confirmaciones que designan ciertos puntos.","","Veamos cómo se ven los tags en práctica..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Intentemos crear un tag en `C1`, que es la versión 1 de nuestro prototipo"],afterMarkdowns:["¡Ahí está! Bastante simple. Nombramos al tag `v1` y referenciamos explícitamente a la confirmación `C1`. Si no especificas la confirmación 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 confirmar (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:[{type:"ModalAlert",options:{markdowns:["## Tags no Git","","Como você aprendeu nas lições anteriores, ramos são fáceis de mover e geralmente vão se referindo a diferentes commits conforme você vai trabalhando no código. Ramos são facilmente mutáveis, frequentemente temporários, e estão sempre mudando.","","Se este é o caso, você pode estar se perguntando se não existe uma forma de marcar *permanentemente* pontos históricos do projeto. Para coisas como grandes releases ou grandes merges, existe alguma forma de marcar commits com algo mais permanente que um ramo?",""]}},{type:"ModalAlert",options:{markdowns:['Você acertou a aposta, existe sim! As tags do Git foram criadas exatamente para esse caso de uso -- elas marcam de forma (relativamente) permanente certos commits como se fossem "pedras de kilometragem" ("milestones") em uma estrada, e você pode referenciá-las exatamente como faz com ramos.',"",'O mais importante, no entanto, é que elas nunca se movem sozinhas quando novos commits são criados. Você pode fazer "checkout" em uma tag e então completar trabalho nessa tag -- tags existem como âncoras na árvore de commits que estão atreladas a certos pontos.',"","Vejamos como as tags se comportam na prática."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Criemos uma tag em `C1`, que é nosso protótipo da versão 1"],afterMarkdowns:["Aqui! Bem fácil. Nós chamamos a tag de `v1` e referenciamos o commit `C1` explicitamente. Se você chamar o comando sem especificar um commit, o git vai usar seja lá qual commit para o qual o `HEAD` estiver apontando."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:['Para completar esta tarefa, simplesmente crie as tags mostradas na visualização do objetivo, e então faça checkout em `v1`. Veja que você vai para o estado "Detached HEAD" -- isso é devido ao fato de que você não pode commitar diretamente na tag `v1`.',"","No próximo nível, examinaremos mais um caso de uso interessante para as tags."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Etiquetas en Git","","Como aprendiches nas leccións previas, as ramas pódense mover sinxelamente, e xeralmente refírense a distintos commits según vas completando o código. As ramas mutan con facilidade, soen ser temporais, e sempre cambiantes.","","Se estamos nese caso, podes preguntarte se existe unha forma de marcar *permanentemente* puntos históricos no proxecto. Para cousas como grandes entregas ou grandes merges, ¿existe algunha forma de marcar commits con algo máis permanente que unha rama?",""]}},{type:"ModalAlert",options:{markdowns:['Acertaches seguro, ¡si que existe! As etiquetas de git foron creadas para ese propósito -- elas marcan de forma (relativamente) permanente algún commits coma se fosen "marcos das fincas" ("milestones") nun campeiro, e podes facer referencias a elas mellor que o catastro.',"",'É moi importante saber que, as etiquetas non avanzan cando se crean novos commits. Non podes facer "checkout" nun tag e completar o traballo de esa etiqueta cun commit amend ou rebasándoo -- as etiquetas existen como áncoras na árbore de commits que están pegadas a certos puntos.',"","Vexamos como se comportan as etiquetas na práctica."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Creamos un tag na rama `C1`, que é o noso prototipo da versión 1"],afterMarkdowns:["¡Ahí o tes!. Sinxelo. Nomeamos a etiqueta de `v1` e referenciamos o commit `C1` explícitamente. Se non indicas o commit, git vai empregar o commit onde está situado o `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:['Para completar esta tarefa, crea as etiquetas amosadas na visualización do obxectivo, e entón fai checkout en `v1`. Mira que terminas no estado "Detached HEAD" -- eso é porque non podes facer commit directamente na etiqueta `v1`.',"","No próximo nivel, examinaremos un caso de uso máis interesante para as etiquetas."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","Wie du aus den vorhergehenden Levels weißt, sind Branches einfach durch die Gegend zu schieben und zeigen auf verschiedene Commits, während die Arbeit in ihnen fortschreitet. Ein Branch wird oft verändert, manchmal nur temporär, und ist ständig in Bewegung.","","Da das so ist fragst du dich vielleicht, ob es nicht eine Möglichkeit gibt, eine bestimmte Stelle in deiner Projekt-History *permanent* zu kennzeichnen. Kann man nicht zum Beispiel für große Releases und Meilensteine nicht einen Commit mit etwas festerem kennzeichnen, als mit einem Branch-Namen?",""]}},{type:"ModalAlert",options:{markdowns:["Aber klar! In Git gibt es genau zu diesem Zweck Tags -- sie kennzeichnen einen Commit (ziemlich) permanent als Meilenstein oder ähnliches und man kann sie ansprechen wie Branch-Namen.","","Noch viel wichtiger, Tags verändern nicht ihre Position, wenn man Commits hinzufügt. Du kannst ein Tag nicht in diesem Sinne auschecken und dann Modifikationen darauf committen. Tags sind Anker im Commit-Baum, die bestimmte Stellen anzeigen.","","Lass uns anschauen wie Tags in der Praxis funktionieren."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lass uns ein Tag bei `C1` anlegen und damit die Version 1 unseres Prototyps markieren."],afterMarkdowns:["Peng! Ziemlich einfach. Wir haben das Tag `v1` genannt und lassen es auf `C1` zeigen. Wenn du den Commit weglässt, wird das Tag für den Commit erzeugt, auf den `HEAD` zeigt."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:['Um diesen Level zu schaffen, erstelle einfach die Tags wie sie in der Zielbeschreibung stehen und mach dann einen Checkout auf `v1`. Beachte wie du dabei in den "Detached HEAD" Zustand gehst -- das liegt daran, dass du keine Commits direkt auf das `v1` Tag machen kannst.',"","Im nächsten Level schauen wir uns dann einen interessanteren Anwendungsfall für Tags an."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitのタグ","","私たちは、前回、ブランチが簡単に移動でき、またしばしば異なる作業の完了しているコミットを参照できることを学びました。ブランチは、簡単に変化させることができ、しばしば一時的で、いつも移動しています。","","そのような場合に、もしプロジェクトの歴史的な点に*恒久的*にマークをつける方法があったならと思うかもしれません。例えば、メジャーリリースや大きなマージを行った時などに、そのコミットにブランチより恒久的な印をつける方法はないのでしょうか?",""]}},{type:"ModalAlert",options:{markdowns:["それは存在します!Gitのタグは当にそのような場面で最適です。 -- ブランチのように参照でき、「マイルストーン(標識)」のような確かで(多少)永久的な印をコミットにつけます。","","重要なことは、コミットを新たに作ってもタグは動かないということです。あなたは、タグにチェックアウトしてそのタグで作業を完了させるということはできません -- タグは、コミットツリーの特定の地点を指定する錨のようなものとして機能します。","","では、実際にタグがどのように動作するかを見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["私たちのバージョン1の原本となる`C1`にタグを付けてみましょう"],afterMarkdowns:["見てください!とても簡単ですね。私たちは、`v1`という名前のタグを明示的に`C1`コミットに付与しました。もし、コミットを指定しなかった場合、`HEAD`にあるものにタグがつけられることになります。"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルは、ゴールとして提示されている図のようにタグを作り、`v1`にチェックアウトすることで完了します。そうすると、あなたは`HEAD`分離状態になることに気づくでしょう -- これは、あなたが直接`v1`タグにコミットができないことを意味しています。","","次のレベルでは、タグのより興味深い使い方について学びます。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Теги","","В прошлых уроках мы усвоили, что ветки просто двигать туда-сюда и они часто ссылаются на разные коммиты как на изменения данных в ветке. Ветки просто изменить, они часто временны и постоянно меняют своё состояние.","","В таком случае, где взять *постоянную* ссылку на момент в истории изменений? Для таких вещей, как релиз и большие слияния, нужно нечто более постоянное, чем ветка.",""]}},{type:"ModalAlert",options:{markdowns:["Такое средство имеется. Git предоставляет нам теги, чья основная задача – ссылаться постоянно на конкретный коммит.","","Важно, что после создания они никогда не сменят своего положения, так что можно с лёгкостью сделать checkout конкретного момента в истории изменений","","Посмотрим на это на практике."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Создадим тег на `C1`, который будет нашей версией 1"],afterMarkdowns:["Готово! Всё просто. Мы назвали тег `v1` и заставили его ссылаться на `C1` явным образом. Если конкретный коммит не указан, гит пометит тегом `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, просто создай теги так, как показано на визуализации, и потом перейди на тег `v1`. Обрати внимание, что ты перейдёшь в состояние `detached HEAD`, так как нельзя сделать коммит прямо в тег `v1`.","","В следующем уровне мы попробуем более интересные способы применения тегов."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 태그","","이전 강의에서 배웠듯이, 브랜치는 이동하기 쉽습니다. 작업의 완료, 진행에 따라 이리저리 이동하면서 서로 다른 커밋을 참조하게 됩니다. 브랜치는 쉽게 변하며 임시적인 것입니다 항상 바뀌고 있죠.","","이런 상황에서, 여러분은 여러분의 프로젝트의 역사(작업 이력)에서 중요한 지점들에 *영구적으로* 표시를 할 방법이 없을까 궁금할것입니다. 주요 릴리즈나 큰 브랜치 병합(merge)이 있을때가 그런 상황이겠군요. 이런 상황에 커밋들을 표시할 브랜치보다 영구적인 방법이 있을까요?",""]}},{type:"ModalAlert",options:{markdowns:['당연히 있습니다! Git 태그는 딱 이런 상황을 위해 존재합니다 -- Git 태그는 특정 커밋들을 브랜치로 참조하듯이 영구적인 "milestone(이정표)"으로 표시합니다.',"",'중요한 점은, Git 태그는 커밋들이 추가적으로 생성되어도 절대 움직이지 않는다는 것입니다. 여러분은 태그를 "체크아웃"한 후에 그 태그에서 어떤 작업을 완료할 수 없습니다 -- 태그는 커밋 트리에서 특정 지점을 표시하기위한 닻같은 역할을 합니다.',"","자 태그가 무엇을 하는지 예제를 통해 알아봅시다"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" 프로토타입의 첫 버전인 `C1`에 태그를 만들어 봅시다."],afterMarkdowns:["자! 아주 쉽죠. 우리는 태그의 이름을 `v1`이라고 지었고 커밋 `C1`을 지정해서 참조했습니다. 만약 커밋을 지정해주지 않으면 git은 `HEAD`가 있는지점에 태그를 붙일 것입니다."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨에서는 goal에 나타난것과 같이 태그를 만들고 `v1`을 체크아웃하면 됩니다. 분리된 `HEAD` 상태로 변하는것을 확인 해 보십시오 -- 이것은 `v1` 태그에 직접 커밋을 할 수 없기 때문입니다.","","다음 레벨에서는 태그의 더 흥미로운 활용 방법을 확인해 볼 것입니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Таги в Git","","Як ти вже знаєш з попередніх уроків, гілки досить просто переносити в інші місця, і вони постійно вказують на різні коміти в процесі того? як ті в них додаються. Гілки легко модифікувати, часто тимчасово, й вони постійно змінюються.","","В такому разі, де взяти *постійне* посилання на момент в історії твого проекту? Для таких речей як релізи чи великі мерджі потрібно щось більш стале ніж гілка.",""]}},{type:"ModalAlert",options:{markdowns:['Є один спосіб! Таги в гіт якраз для цього й були створені -- вони (більш-менш) постійно вказують на певні коміти, й відмічають певні "віхи" в житті проекту, на які ти можеш потім посилатись так само як на гілки.',"",'Але, що важливіше, вони ніколи не переміщуються під час створення нових комітів. Ти не зможеш "зачекаутити" таг а потім закомітити якісь зміни в цей таг -- таги просто відмічають корисні чи символічні місця в дереві комітів.',"","Розгляньмо це на практиці"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Спробуймо зробити новий таг на `C1`, що є прототипом нашої першої версії (вигаданого проекту)"],afterMarkdowns:["Ось і маєш! Все досить просто. Ми назвали наш таг `v1` і він явно посилається на `C1`. Якщо пропустити коміт, git просто відмітить те, на чому знаходиться `HEAD` в данний момент"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Для того щоб пройти цей рівень, достатньо створити кілька тагів, як показано на візуалізації цілей, і потім зачекаутити `v1`. Зауваж, що ти потрапиш в стан `detached HEAD` -- це тому що ти не можеш напряму комітити в таг `v1`.","","В наступному рівні ми розглянемо більш цікавий приклад роботи з тагами."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tag trong Git","","Qua các bài học trước, bạn đã biết được rằng rất dễ dàng để di chuyển qua lại giữa các nhánh và chúng thường tham chiếu đến các commit khác nhau trong quá trình ta làm việc trên chúng. Nhánh dễ dàng chỉnh sửa, thường tạm thời và luôn thay đổi.","","Nếu như vậy thì bạn có thể sẽ thắc mắc liệu có cách nào để đánh dấu *vĩnh viễn* một thời điểm nào đó trong lịch sử làm việc không? Khi mà dự án càng ngày càng mở rộng và merge thì diễn ra liên tục, vậy thì có cách nào để đánh dấu những commit đó một cách cố định hơn nhánh không?",""]}},{type:"ModalAlert",options:{markdowns:['Tất nhiên là có chứ! Git có các tag (thẻ) để hỗ trợ vấn đề này -- chúng (một phần chứ không hoàn toàn) đánh dấu vĩnh viễn một số commit nhất định là "cột mốc" mà sau này bạn có thể tham chiếu đến như với nhánh.',"",'Quan trọng hơn là, khi ta commit thì chúng không hề bị di chuyển. Bạn không thể "check out" một tag rồi làm việc trên đó -- tag giống như là mỏ neo để chỉ định một điểm cụ thể nào đó trên cây lịch sử.',"","Cùng xem tag thực tế là như thế nào nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy thử tạo một thẻ ở commit `C1` chỉ định rằng đây là phiên bản thứ nhất của ta."],afterMarkdowns:["Đó! Đơn giản như đan rổ. Ta tạo ra thẻ `v1` và tham chiếu đến commit `C1`. Nếu bạn không chỉ định commit, git sẽ gắn thẻ vào commit mà `HEAD` đang trỏ tới"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Trong cấp độ này hãy tạo ra một thẻ tại vị trí chỉ định và chuyển sang `v1`. Để ý rằng bạn sẽ chuyển sang trạng thái tách biệt `HEAD` -- bởi vì bạn không thể tham chiếu đến thẻ `v1`.","","Sang cấp độ tới ta sẽ xem xét một vài cách hay ho để dùng thẻ."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tagi","","Kot si se naučil v prejšnjih lekcijah, so branchi enostavni za premikat okoli in pogosto kažejo na različne commite in delo za njimi. Veliko se spreminjajo in združujejo, pogosto le začasno.","","Če je temu res tako, se morda sprašuješ, če obstaja kak način, ki bi *trajno* označil točke v zgodovini projekta. Za stvari kot so večji release-i ali pomembni merge-i, ali obstaja način, ki je trajnejši kot branch?",""]}},{type:"ModalAlert",options:{markdowns:['Itak da je! Git tagi podpirajo točno ta primer uporabe -- oni trajno (do neke mere) označijo določene commite kot "mejnike" na katere se lahko sklicujemo kot na branche.',"",'Toda še pomembneje, oni se ne premikajo, ko se ustvarjajo novi commiti. Ne moreš "checkoutat" tag in nato končati delo na tem tagu -- tagi obstajajo kot sidra na drevesu commitov, ki označujejo določene točke.',"","Poglejmo kako to izgleda v praksi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poizkusimo narediti tag na `C1`, ki je recimo naša prva različica prototipa."],afterMarkdowns:["Tako! Kar enostavno. Tag smo poimenovali `v1` in se sklicuje na commit `C1`. Če ne navedeš commita, bo git postavil tag tam, kjer je trenutno `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Za to stopnjo ustvari tage kot so določeni na ciljnem prikazu in nato checkoutaj `v1`. Opazil boš, kako prideš v stanje ločenega `HEAD-a` -- to je zato, ker ne moreš commitat direktno na `v1` tag.","","V naslednji stopnji si bomo pogledali zanimivejši primer za uporabo tagov."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tagi Gita","","Jak wiesz z poprzednich lekcji, gałęzie łatwo przemieszczać, a w momencie ukończenia pracy nad nimi, często odnoszą się do różnych commitów. Gałęzie łatwo ulegają mutacjom, często są tymczasowe i zawsze się zmieniają.","","A skoro tak, to możesz się zastanawiać, czy istnieje sposób na *trwałe* zaznaczanie ważnych punktów w historii projektu. Czy istnieje jakiś sposób na oznaczenie tych commitów czymś bardziej trwałym niż gałąź, w przypadku takich rzeczy jak duże wydania i duże scalenia/ merge?",""]}},{type:"ModalAlert",options:{markdowns:['Pewnie, że tak! Znaczniki/tagi Gita obsługują dokładnie ten przypadek użycia -- (do pewnego stopnia) trwale oznaczają pewne commity jako "kamienie milowe", do których można się następnie odnieść (po nazwie) jak do gałęzi.',"",'Co ważniejsze jednak, nigdy się nie przesuwają, gdy tworzone są kolejne commity. Nie można "checkoutować" tagu, a następnie zakończyć pracy nad nim (jakby był gałęzią, na której można zapisać nowe zmiany) - tagi są jak kotwice w drzewie commitów, które wyznaczają pewne miejsca.',"","Zobaczmy, jak tagi wyglądają w praktyce."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spróbujmy zrobić tag w `C1`, który jest prototypem naszej wersji 1."],afterMarkdowns:["Otóż to! Całkiem proste. Nazwaliśmy tag `v1` i odwołaliśmy się do commitu `C1` w sposób jawny. Jeśli nie wskażesz konkretnego commitu, Git użyje commitu, na który wskazuje `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Dla tego poziomu utwórz tagi takie jak w wizualizacji celu, a następnie checkoutuj `v1`. Zauważ, że przechodzisz do odłączonego stanu `HEAD` - to dlatego, że nie możesz commitować bezpośrednio na tagu `v1`.","","Na kolejnym poziomie przeanalizujemy bardziej interesujący przypadek użycia tagów."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tag","","Come hai già imparato nelle lezioni precedenti, i rami sono facili da spostare e puntano a commit differenti man mano che il lavoro avanza. I rami subiscono modifiche, spesso temporaneamente, ma sono sempre in continua evoluzione.","","Ti starai chedendo se esiste un modo *definitivo* per segnare un particolare commit del repository. Nel caso di release importanti e grandi merge (fusioni), esiste un modo per segnare questi commit con qualcosa di più permanente dei rami?",""]}},{type:"ModalAlert",options:{markdowns:['Ci puoi scommettere! Git tag serve proprio a questo -- i tag contrassegnano in modo permanente dei commit "importanti" a cui puoi far riferimento come avviene con i rami.',"","Ancora più importante il fatto che non si spostano anche se vengono eseguiti nuovi commit. Non puoi selezionare un tag e aggiungere del lavoro su quel tag -- i tag esistono come ancore nell'albero dei commit, e si riferiscono a determinati punti.","","Vediamo in pratica a cosa servono i tag."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Creiamo un tag in `C1` che è la nostra versione 1 del prototipo."],afterMarkdowns:["Ecco! Abbastanza facile. Abbiamo creato il tag `v1` che si riferisce al solo commit `C1`. Se non specifichi il commit, git creera il tag sul commit puntato da `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["In questo livello riproduci gli stessi tag mostrati nell'obiettivo, e alla fine seleziona il tag `v1`. Presta attenzione a come vai nello stato di detached `HEAD` -- questo perché non puoi creare commit direttamente dal tag `v1.","","Nel livello successivo vedremo un utilizzo più interessante dell'uso dei tag."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tag'leri","","Önceki derslerden öğrendiğiniz gibi, branch'ler kolayca taşınabilir ve üzerlerinde çalışma tamamlandıkça farklı commitlere işaret ederler. Branch'ler kolayca değiştirilebilir, genellikle geçici ve her zaman değişkendirler.","","Eğer durum buysa, projenizin tarihindeki belirli noktaları *kalıcı* olarak işaretlemenin bir yolunun olup olmadığını merak ediyor olabilirsiniz. Büyük sürümler ve önemli birleştirmeler gibi durumlar için, bunları bir branch üzerine tag'lemek yerine daha kalıcı bir şekilde nasıl tag'leyeceğinizi düşünüyor olabilirsiniz.",""]}},{type:"ModalAlert",options:{markdowns:["Direkt olarak işaretlemek mümkün! Git tag'leri tam da bu kullanım durumunu destekler - belirli commit'leri \"milestone\" olarak (bir dereceye kadar) kalıcı olarak işaretler ve sonra bir branch gibi başvurabileceğiniz şekilde kullanabilirsiniz.","",'Daha da önemlisi, daha fazla commit oluşturulduğunda asla hareket etmezler. Bir etiketi "checkout" edemez ve sonra o etiket üzerinde çalışmayı tamamlayamazsınız - tagler, belirli noktaları belirleyen commit ağacındaki referans noktaları olarak varlıklarını sürdürürler.',"","Gelin, tag'ler pratikte nasıl görünüyor bakalım."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hadi `C1` üzerinde bir tag oluşturmayı deneyelim, bu bizim 1. sürüm prototipimizdir."],afterMarkdowns:["İşte bu! Oldukça kolay. Etiketi `v1` olarak adlandırdık ve `C1` commit'ini açıkça refere ettik. Eğer commit'i belirtmezseniz, git sadece `HEAD` neredeyse onu kullanır."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Bu seviye için sadece hedef görselleştirmede tag'leri oluşturun ve ardından `v1`i kontrol edin. Dikkatinizi çekecektir ki bağımsız (detached) `HEAD` durumuna giriyorsunuz - bu, `v1` etiketi üzerine doğrudan commit yapamayacağınız içindir.","","Sonraki seviyede, etiketlerin daha ilginç bir kullanım durumunu inceleyeceğiz."]}}]}}}},{}],131:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C6%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git cherry-pick C3 C4 C7",compareOnlyMainHashAgnostic:!0,disabledMap:{"git rebase":!0},startTree:'{"branches":{"main":{"target":"C1","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C5","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C1"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{fr_FR:"Introduction à cherry-pick",en_US:"Cherry-pick Intro",de_DE:"Einführung Cherry-Picking",ja:"cherry-pick入門",es_AR:"Introducción a cherry-pick",es_ES:"Introducción a cherry-pick",es_MX:"Introducción a cherry-pick",pt_BR:"Introdução ao cherry-pick",gl:"Introuducción a cherry-pick",zh_CN:"Git Cherry-pick",zh_TW:"介紹 cherry-pick",ru_RU:"Введение в Cherry-pick",ko:"Cherry-pick 소개",uk:"Знайомство з cherry-pick",vi:"Giới thiệu về cherry-pick",sl_SI:"Uvod v Cherry-pick",it_IT:"Introduzione al cherry-pick",pl:"Wprowadzenie do cherry-pick"},hint:{fr_FR:"git cherry-pick suivi par les noms de commits",en_US:"git cherry-pick followed by commit names!",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 后面要跟提交的名字",zh_TW:"git cherry-pick 後面要接著 commit 的名稱",ru_RU:"git cherry-pick основывается на именах коммитов!",ko:"커밋의 이름들로 git cherry-pick 하세요!",uk:"git cherry-pick базується на іменах комітів!",vi:"git cherry-pick sau đó là tên commit!",sl_SI:"git cherry-pick nato pa imena commitov.",it_IT:"git cherry-pick seguito dai nomi dei commit!",pl:"git cherry-pick a po nim nazwy commitów!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moving Work Around","","So far we've covered the basics of git -- committing, branching, and moving around in the source tree. Just these concepts are enough to leverage 90% of the power of git repositories and cover the main needs of developers.","",'That remaining 10%, however, can be quite useful during complex workflows (or when you\'ve gotten yourself into a bind). The next concept we\'re going to cover is "moving work around" -- in other words, it\'s a way for developers to say "I want this work here and that work there" in precise, eloquent, flexible ways.',"","This may seem like a lot, but it's a simple concept."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","The first command in this series is called `git cherry-pick`. It takes on the following form:","","* `git cherry-pick <...>`","","It's a very straightforward way of saying that you would like to copy a series of commits below your current location (`HEAD`). I personally love `cherry-pick` because there is very little magic involved and it's easy to understand.","","Let's see a demo!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here's a repository where we have some work in branch `side` that we want to copy to `main`. This could be accomplished through a rebase (which we have already learned), but let's see how cherry-pick performs."],afterMarkdowns:["That's it! We wanted commits `C2` and `C4` and git plopped them down right below us. Simple as that!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["To complete this level, simply copy some work from the three branches shown into main. You can see which commits we want by looking at the goal visualization.",""]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Déplacer votre travail","","Nous avons maintenant pratiqué les bases de Git -- commits, branches, et déplacements dans l'arbre des commits. Ces seuls concepts sont suffisants pour utiliser 90% du pouvoir des dépôts Git et satisfaire les principaux besoins des développeurs.","",'Les 10% restants, cependant, peuvent être assez utiles pour les systèmes assez complexes (ou quand vous vous êtes mis tout seul dans le pétrin). Le prochain concept que nous allons aborder est "déplacer son travail" (moving work around) -- en d\'autres termes, c\'est une façon pour les développeurs de dire "Je veux ce travail ici et cet autre là.".',"","Cela peut sembler compliqué, mais c'est un concept simple."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","La première commande de cette série est `git cherry-pick`. Elle s'utilise ainsi :","","* `git cherry-pick <...>`","","C'est une manière simple de dire qu'on voudrait copier une série de commits en-dessous de notre emplacement actuel (`HEAD`). Personnellement, j'adore `cherry-pick` parce qu'il y a un petit peu de magie dedans, et parce que c'est facile à comprendre.","","Faisons une démonstration !",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici le dépôt que nous avons contient du travail dans la branche `side`, que nous voulons copier dans `main`. Cela pourrait être fait avec un rebase (que nous avons déjà appris), mais voyons comment cherry-pick fonctionne."],afterMarkdowns:["Voilà ! Nous voulions les commits `C2` et `C4` et Git les a fait apparaître juste sous nos pieds. Aussi simple que ça !"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, copiez simplement le travail désigné dans la branche main. Vous pouvez voir les commits que nous souhaitons avoir en regardant dans la fenêtre d'objectif.",""]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moviendo el trabajo por ahí","","Hasta ahora cubrimos lo básico de git -- commitear, branchear, 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 quienes programan.","",'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 quienes programan de decir "Quiero este trabajo allá 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 querés 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:["Acá tenemos un repositorio con algo de trabajo en la rama `side` que queremos copiar a `main`. 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 main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente copiá algo de trabajo desde otras tres ramas a main. Podés ver qué commits queremos en la visualización del objetivo.",""]}}]},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 `main`. 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 main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a main. Puedes ver qué commits queremos en la visualización del objetivo.",""]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moviendo el trabajo por ahí","","Hasta ahora hemos cubierto lo básico de Git -- hacer confirmaciones, crear ramas y movernos por el árbol de confirmaciones. 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 demostración!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí tenemos un repositorio donde tenemos algo de trabajo en la rama `side` que queremos copiar a `main`. 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 main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a main. Puedes ver qué commits queremos en la visualización del objetivo.",""]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Movendo o trabalho por aí","","Por enquanto nós abordamos o básico do Git -- commitar, criar ramos, e mover-se pela árvore. Apenas esses conceitos já são suficientes para utilizar 90% do poder dos repositórios Git, e cobrem as principais necessidades dos desenvolvedores.","",'Os 10% restantes, entretanto, podem ser extremamente úteis em fluxos de trabalho complexos (ou quando você estiver em uma enrascada). O próximo conceito que vamos abordar é "movendo trabalho por aí" -- em outras palavras, veremos as formas como o desenvolvedor pode dizer "eu quero este trabalho aqui, e aquele ali" de formas precisas, eloquentes e flexíveis.',"","Isso pode parecer muito, mas os conceitos são simples."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","O primeiro comando desta série é o `git cherry-pick`. Ele é chamado da seguinte forma:","","* `git cherry-pick <...>`","","Trata-se de uma forma bastante direta de dizer que você gostaria de copiar uma série de commits abaixo do seu local atual (`HEAD`). Eu pessoalmente amo o `cherry-pick` porque há muito pouca mágica envolvida e é fácil de entender o funcionamento.","","Vejamos uma demonstração!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui está um repositório onde temos algum trabalho no ramo `side` que desejamos copiar para o `main`. Isso poderia ser obtido por meio de um rebase (que já aprendemos), mas vamos ver como o cherry-pick se sai."],afterMarkdowns:["É isso! Queríamos os commits `C2` e `C4` e o git os inseriu logo abaixo de nós. Simples assim!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, simplesmente copie algum trabalho dos outros três ramos para o main. Você pode ver quais commits queremos copiar na visualização do objetivo.",""]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Movendo traballo por ahí","","Ata agora cubrimos o uso básico de git -- facer commit, crear ramas, e moverse pola árbore. Estes conceptos chegan para aproveitar o 90% do poder dos repositorios de git e cubrilas necesidades principais dos desenvolvedores.","",'O 10% restante, ademáis, poden ser extremadamente útiles nos fluxos de traballo complexos (ou cando te meteches nalgún problema complicado). O próximo concepto que imos abordar é "movendo o traballo por ahí" -- noutras verbas, unha forma que teñen os desenvolvedores de dicir "eu quero este traballo aquí, e aquel alí" de forma precisa, elocuente e flexible.',"","Eso pode ser moito, pero os conceptos son simples."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","O primeiro comando desta serie é `git cherry-pick`. O comando emprégase da seguinte forma:","","* `git cherry-pick <...>`","","Trátase dunha forma bastante directa de dicir que queres copiar unha serie de commits sobre a túa ubicación actual (`HEAD`). Eu persoalmente adoro `cherry-pick` porque hai moita maxia envolta e é un funcionamento sinxelo de entender.","","Vexamos unha demostración!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí está un repositorio onde hai algún traballo na rama `side` que desexamos copiar para a rama `main`. Iso podería ser obtido por medio dun rebase (que xa aprendemos), pero imos ver como o resolve cherry-pick."],afterMarkdowns:["¡Eso é! Queríamos os commits `C2` e `C4` e git insertounos por baixo de nós. ¡Moi sinxelo!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, copia algo de traballo das outras ramas na main. Podes ver qué commits queremos copiar na visualización do obxectivo.",""]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["移動 commit","","目前為止我們已經講了 git 的基礎,這些基礎包括 commit、branch 以及在 commit tree 中移動,只要有這些概念你就能發揮 git 90% 的功力,而且對於程式設計師來說,這樣就很夠了。","",'而剩下的 10%,在很複雜的專案上面,是非常有用的(或者當你陷入困惑時),我們下一個要講的概念是 "移動 commit",換句話說,當你會這個非常有彈性的招數之後,你就可以說"我想要把這個 commit 放這裡,而那個 commit 放在那裡"。',"","這看起來很複雜,但其實它很簡單。"]}},{type:"ModalAlert",options:{markdowns:["## git cherry-pick","","我們要講的第一個指令叫作 `git cherry-pick`,它的用法如下:","","* `git cherry-pick <...>`","","當你想要複製幾個 commit 並且接在你目前的位置(`HEAD`)下面的時候,這會是一個非常直接的方式。我個人非常喜歡用 `cherry-pick`,因為它並不複雜,很容易就可以了解。","","讓我們來看一個例子!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡有一個 repo,在 `side` branch 中,我們有一些 commit 想要複製到 `main` branch 上,這可以透過一個 rebase 來完成(我們之前已經學到了),但是讓我們看看 `git cherry-pick` 怎麼做。"],afterMarkdowns:["就是那樣!我們複製了 `C2` 以及 `C4` 並且把它們放到我們的後面,很簡單吧!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,只需要從三個 branch 複製幾個 commit 到 `main` 下面,你可以從視覺化的目標看到我們需要哪些 commit。",""]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 整理提交记录","","到现在我们已经学习了 Git 的基础知识 —— 提交、分支以及在提交树上移动。 这些概念涵盖了 Git 90% 的功能,同样也足够满足开发者的日常需求 ","","然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显得尤为重要了。接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。","","看起来挺复杂, 其实是个很简单的概念。"]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","本系列的第一个命令是 `git cherry-pick`, 命令形式为: ","","* `git cherry-pick <提交号>...`","","如果你想将一些提交复制到当前所在的位置(`HEAD`)下面的话, Cherry-pick 是最直接的方式了。我个人非常喜欢 `cherry-pick`,因为它特别简单。","","咱们还是通过例子来看一下!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这里有一个仓库, 我们想将 `side` 分支上的工作复制到 `main` 分支,你立刻想到了之前学过的 `rebase` 了吧?但是咱们还是看看 `cherry-pick` 有什么本领吧。"],afterMarkdowns:["这就是了!我们只需要提交记录 `C2` 和 `C4`,所以 Git 就将被它们抓过来放到当前分支下了。 就是这么简单!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["要通过此关, 只需要简单的将三个分支中的提交记录复制到 main 上就可以了。目标窗口展示了我们想要哪些提交记录,如果你不小心关掉了的话,通过 `show goal` 命令可以打开,左上角也有“显示目标按钮”",""]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Inhalte verschieben","","Bis jetzt haben wir uns die Grundlagen von Git angeschaut -- comitten, verzweigen und sich im Commit-Baum bewegen. Nur damit lässt sich schon 90% der Macht von Git-Repositorys nutzen und die meisten Anforderungen von Entwicklern erfüllen.","",'Die übrigen 10% jedoch können in komplexeren Abläufen sehr hilfreich sein (oder wenn man sich in eine schwierige Lage manövriert hat). Das nächste was wir uns anschauen, ist, Inhalte durch den Commit-Baum zu schieben. Es gibt dem Entwickler die Möglichkeit in präziser, eloquenter Manier zu sagen "Ich will diese Inhalte hier und diese dort haben".',"","Das klingt vielleicht nach einer Menge, aber es ist sehr einfach."]}},{type:"ModalAlert",options:{markdowns:["## git cherry-pick","","Der erste Befehl in dieser Serie ist `git cherry-pick`. Er sieht so aus:","","* `git cherry-pick <...>`","","Er ist eine einfache Möglichkeit um auszudrücken, dass du eine Folge von Commits unter deinen aktuellen Checkout (also `HEAD`) hängen möchtest. Ich persönlich liebe `cherry-pick`, weil es wenig Magie enthält und einfach zu verstehen ist.","","Schauen wir's uns mal an.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir ein Repository mit einigem Zeugs im Branch `side`, das wir in den Branch `main` kopieren wollen. Das könnten wir mit einem Rebase machen (wie bereits gesehen), aber schauen wir mal, wie das mit `cherry-pick` geht."],afterMarkdowns:["Das war's! Wir wollten die Commits `C2` und `C4` und Git hat die einfach unter unseren aktuellen Checkout kopiert. So einfach ist das."],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu schaffen, musst du einfach nur einige Commits aus den drei gezeigten Branches in den `main` kopieren. Der Zielbaum zeigt dir, welche.",""]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## コードの移動","","今まででは、gitの基本をひたすら見てきました -- コミットしたりブランチを派生したり、そしてソースツリーの中の色々な場所に移動することなどです。これらの概念だけで、gitリポジトリの力を90%使いこなすことができ、開発者としての主な需要を満たしています。","","しかし最後の10%はより複雑なワークフローやちょっとトラブった時にとても役にたちます。これから取り上げる次の課題は「作業内容の移動」 –- 詳しく言えば、「この作業はここに置き、その作業はそこに置きたい」と言う開発者のために、優しく具体的で正確にその方法をお教えしましょう。","","ちょっと複雑に聞こえるかもしれませんが、概念は簡単です。"]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","このシリーズの一つ目のコマンドは、`git cherry-pick`。このコマンドの使い方は、次の形になります:","","* `git cherry-pick <...>`","","現在の位置(`HEAD`)の下に一連のコミットをコピーしたいという意を単純に表す方法です。分かりにくいところが少ないので、個人的に私がとても好きなコマンドです。","","デモを見ていきましょう!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["このリポジトリには、現在`side`ブランチから`main`にコピーしたいコードがあります。この前に学んだrebaseコマンドでも実現可能ですが、ここではcherry-pickの動作を見ていきましょう。"],afterMarkdowns:["これだけで終わりです!コミット`C2` と `C4`を取得したかったわけですが、gitが現在の位置の直下に落としてくれました。単純ですね!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、3つのブランチからmainにコードをコピーしてください。どのコミットを取得するかについてはゴールのツリーをみてください。",""]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Поперемещаем изменения","","Итак, мы уже освоили основы Git: коммиты, ветки, перемещение по дереву изменений. Уже этих знаний достаточно, чтобы овладеть 90% мощью Git-репозиториев и покрыть нужды разработчиков.","",'А оставшиеся 10% будут очень полезны при сложных workflow (или если ты попал в сложную ситуацию). Теперь речь пойдёт о перемещении изменений — возможности, позволяющей разработчику сказать "Хочу, чтобы эти изменения были вот тут, а вот эти — вон там" и получить точные, правильные результаты, не теряя при этом гибкости разработки.',"","На первый взгляд запутанно, но на самом деле всё просто."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Первая из таких команд - это `git cherry-pick`. Она выглядит вот так:","","* `git cherry-pick <...>`","","Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммитов на место, где сейчас находишься (`HEAD`). Мы обожаем `cherry-pick` за то, что в нём очень мало магии и его очень просто понять и применять.","","Посмотрим на демонстрацию.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вот репозиторий, где есть некие изменения в ветке `side`, которые мы хотим применить и в ветку `main`. Мы можем сделать это при помощи команды rebase, которую мы уже прошли, но давай посмотрим, как cherry-pick справится с этой задачей."],afterMarkdowns:["Вуаля! Мы хотели перенести коммиты `C2` и `C4`, Git дал нам их там, где они нужны. Всё просто!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, просто скопируй изменения из этих трёх веток в мастер. Чтобы понять, какие коммиты копировать, посмотри на визуализацию уровня.",""]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 작업을 여기저기로 옮기기","","지금까지 우리는 git의 기초를 배웠습니다. -- 커밋을하고, 브랜치를 만들고, 소스 트리 여기저기를 돌아다녔습니다. 이런 개념들을 아는 것만으로도 git repository의 힘을 90%이상 사용하고 개발자들이 필요로하는 작업의 대부분을 할 수 있습니다.","",'그 나머지 10% 기능이, 복잡한 작업(또는 작업중 막혔을때) 중에 꽤 유용할 수 있습니다. 이제 배워 볼 다음 개념은 "작업을 여기저로 옮기기" 다시 말해, 개발자들의 언어로 "이 일은 여기에, 저 일은 저기에 두고 싶어" 정확하고 우아하고 유연하게.',"","다소 과해 보일 수 있지만, 간단한 개념입니다."]}},{type:"ModalAlert",options:{markdowns:["## Git 체리-픽 (Cherry-pick)","","이 시리즈의 첫 명령어는 `git cherry-pick` 입니다. 다음 과 같은 형태로 사용합니다:","","* `git cherry-pick <...>`","","현재 위치(`HEAD`) 아래에 있는 일련의 커밋들에대한 복사본을 만들겠다는 것을 간단히 줄인 말입니다. 개인적으로 저는 `cherry-pick`을 아주 좋아합니다 왜냐하면 조금의 마법이 첨가되있고 이해하기 쉽기 때문입니다.","","데모를 확인해봅시다",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 repository가 있습니다. `main` 으로 복사하고 싶은 작업이 있는 브랜치 `side`가 있습니다. 이것은 rebase를 통해서 할 수 있습니다(이미 배운), 하지만 체리-픽이 이 작업을 어떻게 수행하는지 확인해 봅시다."],afterMarkdowns:["됐습니다! 우리는 `C2`와 `C4` 커밋을 원했고 git이 우리가 원하는 곳 바로 밑에 톡 떨어뜨려 줬습니다. 아주 간단하죠!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["이 레벨을 통과하기 위해서는 몇개의 작업을 세개의 브랜치들에서 `main` 브랜치로 복사해와야합니다. 어떤 커밋들이 필요한지는 goal을 보고 확인하면 됩니다.",""]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Переміщуємо зміни","","Поки що ми розглядали основи git -- як працювати з комітами та гілками й переміщення по дереву комітів. Цього вже достатньо щоб використовувати 90% фунцкій гіт та мати змогу ефективно працювати з гіт як розробник.","",'Решта 10%, тим не менш, можуть бути надзвичайно корисними при роботі зі складними робочими процесами (workflow), чи коли ти чи ще хтось щось зробили не так і ти хочеш це виправити. Наступна концепція з якою ми познайомимось це "перенесення змін" -- іншими словами, це можливість розробника переміщувати коміти між гілками в простий та зручний спосіб.',"","Це може видаватися складним, але насправді це дуже проста концепція."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Перша команда в цій серії називається `git cherry-pick`. Вона має наступну форму:","","* `git cherry-pick <Коміт1> <Коміт2> <...>`","","Це надзвичайно простий спосіб вказати гіту що потрібно скопіювати серію комітів до поточного розташування (`HEAD`). Персонально я обожнюю `cherry-pick` за його прямолінійнсть, це дуже зрозуміла концепція що не використовує прихованої магії","","Давайте подивимось на практиці!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ми бачимо репозиторій де є певні зміни в гілці `side` які ми хочемо скопіювати в `main`. Для цього можна використати rebase (який ми вже вивчили), але подивимось як з цим впорається cherry-pick."],afterMarkdowns:["Овва! Ми хотіли коміти `C2` та `C4` і git додав їх до поточного розташування. Просто й доступно!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти це рівень, просто скопіюй якісь зміни з трьох гілок показаних на діаграмі в main. В візуалізації видно які коміти потрібно скопіювати.",""]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Di Chuyển Commit","","Cho đến giờ thì ta đã nắm được cơ bản về Git -- commit, rẽ nhánh, và dịch chuyển qua lại trên cây mã nguồn. Chừng ấy khái niệm là đã đủ để tận dụng đến 90% sức mạnh của Git và đáp ứng đủ nhu cầu chính cho nhà phát triển phần mềm.","",'Tuy nhiên 10% còn lại thì lại khá hữu ích trong các quy trình làm việc phức tạp (hoặc khi bạn vướng phải tình huống khó khăn). Khái niệm tiếp theo chúng ta sẽ đề cập đến là "di chuyển commit" -- đó là cách để nhà phát triển nói rằng "Tôi muốn lấy bản ghi ở đây và cả bản ghi ở đó" một cách chính xác, trôi chảy và linh hoạt.',"","Nghe thì có vẻ phức tạp, nhưng thực ra khái niệm này khá đơn giản."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Lệnh đầu tiên của loạt bài này là `git cherry-pick`, dạng lệnh là:","","* `git cherry-pick <...>`","","Đó là cách rất trực tiếp để copy một loạt commit xuống dưới vị trí hiện tại của bạn (`HEAD`). Cá nhân tôi thì rất thích `cherry-pick` bởi tính tiện dụng và dễ hiểu của nó.","","Hãy xem qua một ví dụ!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ở đây ta có một kho chứa mà ta muốn sao chép thành quả công việc từ nhánh `side` sang nhánh `main`. Có thể dùng rebase để làm việc này (kỹ thuật mà ta đã học), nhưng hãy xem thử cherry-pick làm điều này ra sao."],afterMarkdowns:["Thế thôi! Chúng ta chỉ cần các commit `C2` và `C4`, vì vậy Git sẽ lấy chúng và đặt chúng dưới nhánh hiện tại. Thật đơn giản!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, hãy copy thành quả công việc từ 3 nhánh khác vào main. Bạn có thể nhìn vào mô tả mục tiêu để biết chúng ta cần những commit nào.",""]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Premikanje dela naokoli","","Zaenkrat smo pokrili osnove gita -- commitanje, branchanje in pomikanje po drevesu. Samo te koncepti so dovolj za koriščenje 90% moči git repozitorijev in pokrijejo večino potreb razvijalcev.","",'Preostalih 10% pa je lahko kar uporabnih med reševanjem kompleksnejših situacij (ali ko ste zašli v zagato). Naslednji koncept, ki ga bomo pokrili je "premikanje dela naokoli" -- z drugimi besedami, tako razvijalci rečejo "Rad bi to delo tu in tisto delo tam" na natančen, zgovoren in prilagodljiv način.',"","Morda se zdi veliko, a gre za preprost koncept."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Prvi ukaz v zaporedju je `git cherry-pick`. Je sledeče oblike:","","* `git cherry-pick <...>`","","Gre za jasen način, da povemo, da bi radi skopirali zaporedje commitov pod trenutno lokacijo (`HEAD`). Sam imam rad `cherry-pick`, ker je vključeno le malo čarovnije in je preprost za razumet.","","Poglejmo predstavitev!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tu je repozitorij, kjer imamo nekaj dela na branchu `side`, ki bi ga radi skopirali na `main`. To bi lahko dosegli z rebase-om (kar smo se že naučili), ampak poglejmo kako se odreže cherry-pick."],afterMarkdowns:["To je to! Želeli smo commita `C2` in `C4` in git ju je prilimal točno pod nas. Preprosto!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Za končanje te stopnje enostavno skopiraj nekaj dela iz predstavljenih treh branchev v main. V priloženi vizualizaciji lahko vidiš katere commite.",""]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Przenoszenie pracy","","Do tej pory zajmowaliśmy się podstawami Gita - commitami, gałęziami i poruszaniem się w drzewie źródłowym. Samo to wystarczy, aby wykorzystać 90% mocy repozytoriów Git i zaspokoić główne potrzeby programistów.","",'Pozostałe 10% może być jednak dość użyteczne podczas niecodziennych zadań (lub kiedy wpakujesz się w kłopoty). Kolejny temat, który zamierzamy omówić, to "przenoszenie pracy" - innymi słowy, jest to sposób, w jaki programiści mogą powiedzieć: "Chcę te zmiany tu, a tamte tam" w precyzyjny, elegancki i elastyczny sposób.',"","Może się to wydawać skomplikowane, ale tak nie jest."]}},{type:"ModalAlert",options:{markdowns:["## Git cherry-pick","","Pierwsze polecenie w tej serii nazywa się `git cherry-pick`. Przyjmuje ono następującą formę:","","* `git cherry-pick <...>`","","Jest to bardzo prosty sposób określenia, że chcesz przenieść zmiany poniżej swojej obecnej lokalizacji (`HEAD`). Osobiście uwielbiam `cherry-pick`, ponieważ działa prosto i skutecznie.","","Zobaczmy demo!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["W tym repozytorium mamy trochę pracy na gałęzi `side`, którą chcemy skopiować do gałęzi `main`. Można by to osiągnąć przy użyciu rebase (którego już się nauczyliśmy), ale zobaczmy, jak działa cherry-pick."],afterMarkdowns:["No i fajnie! Chcieliśmy commity `C2` i `C4` i Git zrzucił je nam zaraz pod spód. Bułka z masłem!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, po prostu skopiuj część pracy z trzech pokazanych gałęzi do `main`. Commity, które należy skopiować, znajdują się na wizualizacji celu.",""]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Spostare il lavoro in giro","","Finora abbiamo intravisto le basi di git -- creazione di commit, rami, e come spostarsi sull'albero dei commit. Questi concetti sono sufficienti per sfruttare il 90% della potenza di git, e soddisfano gli utilizzi standard degli sviluppatori.","",'Il restante 10%, può rivelarsi utile in situazioni più complesse (o se ti sei messo nei guai). Il prossimo concetto che affronteremo è lo "spostare il lavoro in giro" -- in altre parole, è un modo per gli sviluppatori di dire "Voglio questo lavoro qua e quel lavoro là" in maniera chiara e precisa.',"","Sembra un grosso lavoro, ma è un concetto semplice."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Il primo comando si chiama `git cherry-pick`. Il comando ha il seguente aspetto:","","* `git cherry-pick <...>`","","È un modo chiaro e diretto di dire che vuoi la copia di una serie di commit da applicare sulla posizione in cui ti trovi attualmente (`HEAD`). Io personalmente adoro `cherry-pick` perché semplice e facile da capire.","","Vediamo una demo!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["In questo repository abbiamo del lavoro nel ramo `side` che vogliamo copiare nel `main`. Questo può essere eseguito tramite rebase (che abbiamo già imparato), ma vediamo il cherry-pick all'opera."],afterMarkdowns:["Ecco qua! Volevamo i commit `C2` e `C4` e git li ha copiati sotto di noi. Semplicissimo!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, copia il lavoro dai tre rami sul main. Puoi vedere quali sono i commit richiesti guardando l'obiettivo.",""]}}]}}}},{}],132:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main"},"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":{"main":{"target":"C2","id":"main"},"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_MX:"Separa tu 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",sl_SI:"Ločevanje tvoje glave - HEAD-a",it_IT:"Perdere la testa (HEAD)",pl:"Odczep sobie HEAD"},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!",sl_SI:"Uporabi oznako (hash) commita za pomoč!",it_IT:"Usa l'etichetta (hash) sul commit per aiutarti!",pl:"Użyj nazwy commita (hasza)!"},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:["## 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."],afterMarkdowns:["See! HEAD was hiding underneath our `main` branch all along."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["And now it's","","HEAD -> C1"],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."]}}]},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:["## 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:["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 `main` todo este tiempo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["Y así queda ahora:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{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."]}}]},es_ES:{childViews:[{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","",'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:["Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit."],afterMarkdowns:["¡Ves! HEAD estuvo oculta bajo nuestra rama `main` todo este tiempo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["Y así queda ahora:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moviéndonos por ahí en 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 confirmaciones 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 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:["Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit."],afterMarkdowns:["¡Ves! HEAD estuvo oculta bajo nuestra rama `main` todo este tiempo."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Separando HEAD","","Separar HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:","","HEAD -> main -> C1",""],afterMarkdowns:["Y así queda ahora:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, separemos HEAD de `bugFix` y juntémoslo en su lugar al commit.","","Especifica este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa."]}}]},pt_BR:{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:["## 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:["Vejamos isto em ação. Aqui vamos mostrar o HEAD antes e depois de um commit."],afterMarkdowns:["Veja! O HEAD estava se escondendo ao lado do nosso `main` esse tempo todo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["E agora é","","HEAD -> C1"],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)."]}}]},gl:{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:["## 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:["Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit."],afterMarkdowns:["Ves! O HEAD estivo ó lado do noso `main` todo este tempo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["E agora é","","HEAD -> C1"],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)."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Se déplacer dans Git","","Avant que nous ne 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 à l'aise avec ces déplacements, votre puissance avec les autres commandes de Git en sera amplifiée !","","","","",""]}},{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:["Voyons cela en action. Ici nous allons indiquer où se situe HEAD avant et après un commit."],afterMarkdowns:["Vous voyez ! HEAD était caché en-dessous de la branche `main` tout le long."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["Et maintenant c'est","","HEAD -> C1"],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."]}}]},de_DE:{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:["## 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:["Schauen wir uns das mal in Aktion an. Wir werden hier `HEAD` vor und nach dem Commit anzeigen."],afterMarkdowns:["Siehst du? `HEAD` war die ganze Zeit unter `main` versteckt."],command:"git checkout C1; git checkout main; 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` -> `main` -> `C1`",""],afterMarkdowns:["Und jetzt:","","`HEAD` -> `C1`"],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."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 在提交树上移动","","在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。","","一旦熟悉了如何在 Git 提交树上移动,你驾驭其它命令的能力也将水涨船高!",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","","我们首先看一下 “HEAD”。 HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。","","HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。","","HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["下面咱们通过实际操作看一下。我们将会观察提交前后 HEAD 的位置。"],afterMarkdowns:["看到了吗? HEAD 指向了 `main`,随着提交向前移动。","","(译者注:实际这些命令并不是真的在查看 HEAD 指向,看下一屏就了解了。如果想看 HEAD 指向,可以通过 `cat .git/HEAD` 查看,","如果 HEAD 指向的是一个引用,还可以用 `git symbolic-ref HEAD` 查看它的指向。但是该程序不支持这两个命令)"],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### 分离的 HEAD","","分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示: ","","HEAD -> main -> C1","","HEAD 指向 main, main 指向 C1"],afterMarkdowns:["现在变成了","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["想完成此关,从 `bugFix` 分支中分离出 HEAD 并让其指向一个提交记录。","","通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 在 git 中前後移動","","在接觸 git 的更多進階的主題之前,我們先學習用不同的方法在你的 project 中的 commit tree 上面移動。","","一旦能夠熟練地在 commit tree 中隨意地移動,你使用其它的 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:"GitDemonstrationView",options:{beforeMarkdowns:["在實際的例子中。我們將會觀察 commit 前後 HEAD 的位置。"],afterMarkdowns:["看吧!HEAD 一直藏在 `main` 分支的後面。"],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### 分離 HEAD","","分離 HEAD 就是讓其指向一個 commit 而不是 branch 的名稱。這是指令執行之前的樣子:","","HEAD -> main -> C1",""],afterMarkdowns:["現在變成了","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["想要完成這一個關卡,從 `bugFix` 分離出 HEAD 並且讓它指向一個 commit。","","通過 hash 值可以指定 commit。每個 commit 的 hash 值顯示在各自的圓圈中。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 任意の位置への移動","","Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。","","移動方法が身につけば、他のgitコマンドをよりうまく扱えるようになるでしょう!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'まずは"HEAD"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語です -- ようするに今作業中のコミットを表します。',"","HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。","","HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。"],afterMarkdowns:["ほら、HEADが元から`main`ブランチの下に隠れていたんですね!"],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### HEADの分離","","HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:","","HEAD -> main -> C1",""],afterMarkdowns:["そして実行後はこう:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。","","このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸に刻まれています。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Прогулка по Git","","Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по дереву коммитов вашего проекта.","","Как только вы научитесь свободно передвигаться по дереву коммитов, ваши возможности в Git приумножатся.","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'В первую очередь, поговорим о "HEAD". HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данный момент работаем.',"","HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.","","Обычно HEAD указывает на имя ветки (например, `bugFix`). Когда вы делаете коммит, статус ветки `bugFix` меняется и это изменение видно через HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, как это работает. Обратите внимание на то, где находится HEAD до и после коммита."],afterMarkdowns:["Вот! HEAD всё это время скрывался за веткой `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Detaching HEAD","","Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:","","HEAD -> main -> C1",""],afterMarkdowns:["А вот что получилось теперь","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти уровень, давай отделим HEAD от ветки `bugFix` и присвоим его последнему коммиту в этой же ветке.","","Укажи коммит при помощи его идентификатора (hash). Hash для каждого коммита указан в кружке на схеме."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git에서 여기저기로 옮겨다니기","","Git의 고급기능들에 대해 더 알아보기 전에, 여러분의 프로젝트를 표현하는 커밋 트리(commit tree)에서 이동 할 수 있는 여러가지 방법들을 아는것이 중요합니다.","","여기저기 이동하는 것에 익숙해지면, 여러분이 다른 git 명령어들을 사용하는 능력도 아주 좋아질 것입니다!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'먼저"HEAD"에 대해 이야기해 봅시다. HEAD는 현재 체크아웃된 커밋을 가리킵니다. -- 다시 말하자면 현재 작업중인 커밋입니다.',"","HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작합니다.","","일반적으로 HEAD는 브랜치의 이름을 가리키고있습니다(bugFix와 같이). 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["직접 확인해 봅시다. 여기서 우리는 보이지 않던 HEAD를 커밋전, 후에 드러낼 것입니다."],afterMarkdowns:["보세요! HEAD가 `main`브랜치 아래에 숨어 있던 거군요."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### HEAD 분리하기","","HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:","","HEAD -> main -> C1",""],afterMarkdowns:["이제는 이렇게 되는군요","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.","","각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Прогулянка по Git","","Перед тим як ми перейдемо до складніших можливостей гіта, важливо розуміти різні способи переміщення по дереву комітів твого проекту.","","Дуже важливо щоб тобі було комфортно переміщатись по репозиторію, так як цей навик тобі знадобиться для використання в більшості команд git!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD (голова)","",'Спочатку розберемось з "HEAD". HEAD це символьне ім’я поточного вибраного коміта -- по суті це той коміт з яким ти зараз працюєш.',"","HEAD завжди вказує на найновіший коміт з робочого дерева. Більшість команд що змінюють локальне дерево комітів, також модифікують HEAD.","","Зазвичай HEAD вказує на ім’я бранча (наприклад bugFix). Коли ти комітиш, змінюється статус гілки bugFix й це можна побачити подивившись на HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Розберемось з цим на практиці. Зараз ми перевіримо HEAD до та після коміту."],afterMarkdowns:["Ти диви! HEAD весь цей час ховався за гілкою `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Відокремлюємо голову","","Detached HEAD (відокремлена голова) просто означає що HEAD посилається на коміт, а не на якусь гілку. Ось як це виглядає спочатку:","","HEAD -> main -> C1",""],afterMarkdowns:["А в стані detached head:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{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 thạo 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 hiệ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 trỏ tới tên nhánh (ví dụ bugFix). Khi bạn commit, 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ẽ làm rõ HEAD trước và sau khi commit."],afterMarkdowns:["Thấy chứ? HEAD đã ẩn dưới nhánh `main` suốt."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Tháo HEAD","","Tháo HEAD đơn 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 -> main -> 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` và 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 đó."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Premikanje po Gitu","","Preden se lotimo nekaj naprednejših funkcij Gita je pomembno, da razumemo različne načine premikanja po drevesu commitov, ki predstavljajo tvoj projekt.","","Ko ti je enkrat premikanje po drevesu domače, bodo tvoje sposobnosti z ostalimi git ukazi še močnejše!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'Najprej moramo spozanti "HEAD". HEAD (glava) je simbolično ime za trenutno checkoutan commit -- v bistvu povemo na katerem commitom bomo nadaljevali.',"","HEAD vedno kaže na zadnji commit na trenutnem drevesu. Večina git ukazov, ki spreminjajo to delovno drevo, bo začelo s spremembo HEAD-a.","","Ponavadi HEAD kaže na ime brancha (npr. bugFix). Ko commitaš, je stanje bugFix spremenjeno in ta sprememba je opazna tudi skozi HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo to v akciji. Sedaj bomo razkrili HEAD pred in po commitu."],afterMarkdowns:["Evo! HEAD se je vseskozi skrival pod našim `main` branchom."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Ločevanje HEAD-a","","Ločevanje HEAD-a pomeni samo, da ga namestno na branch sedaj pripnemo na commit. Tako je izgledalo prej:","","HEAD -> main -> C1",""],afterMarkdowns:["Sedaj pa je takole:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje odstranimo HEAD iz `bugFix` in ga pritrdimo raje na commit.","","Določi ta commit z njegovim hash-om. Hash za vsak commit je predstavljen v krogu, ki predstavlja commit."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Poruszanie się w Git","","Zanim przejdziemy do niektórych z bardziej zaawansowanych funkcji Gita, ważne jest, aby zrozumieć różne sposoby poruszania się po drzewie commitów, które reprezentują twój projekt.","","Kiedy już poczujesz się z tym wygodnie, to i inne komendy Gita nabiorą więcej mocy!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'Najpierw musimy porozmawiać o "HEAD". HEAD to symboliczna nazwa dla aktualnie checkoutowanego (wyciągniętego) commita - jest to zasadniczo commit z najnowszymi zmianami.',"","HEAD zawsze wskazuje na najnowszy commit, który jest odzwierciedlony w drzewie zmian. Większość poleceń git, które wprowadzają zmiany w drzewie, zaczyna się od zmiany HEADa.","","Normalnie HEAD wskazuje na nazwę gałęzi (jak np. `bugFix`). Kiedy commitujesz zmiany, status gałęzi `bugFix` się zmienia i zmiana ta jest widoczna właśnie poprzez przemieszczenie się HEADa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak to działa. Pokażemy HEAD przed i po commicie."],afterMarkdowns:["Zobacz! HEAD przez cały czas ukrywał się pod naszą gałęzią `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Odłączanie HEADa","","Odłączenie HEADa oznacza po prostu dołączenie go do commita, a nie gałęzi. Tak to wyglądało przed:","","HEAD -> main -> C1",""],afterMarkdowns:["A tak po:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, odłącz HEADa od gałęzi `bugFix` i dołącz go do commita.","","Możesz wybrać konkretnego commita, posługując się jego haszem. Hasz każdego commita jest wyświetlany na okręgu, który go reprezentuje."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Spostarsi in Git","","Prima di imparare comandi avanzati in Git, è fondamentale conoscere i diversi modi per spostarsi nell'albero dei commit che costituiscono il tuo progetto.","","Una volta che ti sentirai a tuo agio, il tuo potere con gli altri comandi git sarà amplificato!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'Prima di tutto dobbiamo parlare di "HEAD". HEAD (testa) è il nome simbolico dato al commit selezionato -- in pratica è il commit su cui stai lavorando.',"","HEAD punta sempre al commit più recente. La maggior parte dei comandi git che apportano modifiche all'albero dei commit, vanno a cambiare per primo HEAD.","","Di norma HEAD punta al nome di un ramo (per esempio bugFix). Quando esegui un commit, lo stato di bugFix viene modificato, e questo cambiamento è visibile attraverso HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamolo in azione. Qui mostreremo HEAD prima e dopo un commit."],afterMarkdowns:["Visto! HEAD era nascosto sotto il ramo `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Detaching HEAD (testa distaccata)","","Detaching HEAD significa attaccare la testa a un commit invece che a un ramo. All'inizio la situazione è questa:","","HEAD -> main -> C1",""],afterMarkdowns:["E ora è","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, stacchiamo HEAD da `bugFix` e attacchiamolo a un commit.","","Per specificare un commit si usa l'hash. L'hash per ogni commit è presente sul cerchio che rappresenta il commit."]}}]}}}},{}],133:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22main%22%7D%2C%22overHere%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22overHere%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i overHere --solution-ordering C3,C5,C4",compareOnlyMainHashAgnostic:!0,disabledMap:{"git cherry-pick":!0},startTree:'{"branches":{"main":{"target":"C5","id":"main"},"overHere":{"target":"C1","id":"overHere"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"main","id":"HEAD"}}',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",es_MX:"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.",fr_FR:"Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spécifier la cible à rebaser",zh_CN:"branch 或者是相对位置(HEAD~)都可以用來指定 rebase 的目标",zh_TW:"你可以指定 branch 或者是相對位置(HEAD~)來表示 rebase 的目標",ru_RU:"Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase",ja:"リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます",ko:"리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다",uk:"ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase",vi:"bạn có thể sử dụng tham chiếu tương đối (HEAD~) hoặc nhánh để chỉ định mục tiêu rebase",sl_SI:"Uporabiš lahko bilokateri branch ali relativno referenco (HEAD~), da določiš cilj za rebase.",it_IT:"Puoi usare sia i rami che i riferimenti relativi (HEAD~) per specificare l'obiettivo del rebase",pl:"Możesz użyć gałęzi lub referencji względnych (HEAD~), aby określić cel rebase'a"},name:{en_US:"Interactive Rebase Intro",es_AR:"Introducción al rebase interactivo",es_ES:"Introducción al rebase interactivo",es_MX:"Introducción al rebase interactivo",pt_BR:"Introdução ao rebase interativo",gl:"Introducción ó rebase interativo",de_DE:"Einführung Interaktives Rebase",ja:"インタラクティブrebase入門",fr_FR:"Introduction au rebase interactif",zh_CN:"交互式 rebase",zh_TW:"介紹互動式的 rebase",ru_RU:"Введение в интерактивный Rebase",ko:"인터랙티브 리베이스 소개",uk:"Знайомство з інтерактивним rebase",vi:"Giới thiệu về rebase tương tác",sl_SI:"Interaktivni uvod v Rebase",it_IT:"Introduzione al rebase interattivo",pl:"Wprowadzenie do interaktywnego rebase'a"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interactive Rebase","","Git cherry-pick is great when you know which commits you want (_and_ you know their corresponding hashes) -- it's hard to beat the simplicity it provides.","","But what about the situation where you don't know what commits you want? Thankfully git has you covered there as well! We can use interactive rebasing for this -- it's the best way to review a series of commits you're about to rebase.","","Let's dive into the details..."]}},{type:"ModalAlert",options:{markdowns:["All interactive rebase means Git is using the `rebase` command with the `-i` option.","","If you include this option, git will open up a UI to show you which commits are about to be copied below the target of the rebase. It also shows their commit hashes and messages, which is great for getting a bearing on what's what.","",'For "real" git, the UI window means opening up a file in a text editor like `vim`. For our purposes, I\'ve built a small dialog window that behaves the same way.']}},{type:"ModalAlert",options:{markdowns:["When the interactive rebase dialog opens, you have the ability to do two things in our educational application:","","* You can reorder commits simply by changing their order in the UI (via dragging and dropping with the mouse).","* You can choose to keep all commits or drop specific ones. When the dialog opens, each commit is set to be included by the `pick` button next to it being active. To drop a commit, toggle off its `pick` button.","","*It is worth mentioning that in the real git interactive rebase you can do many more things like squashing (combining) commits, amending commit messages, and even editing the commits themselves. For our purposes though we will focus on these two operations above.*","","Great! Let's see an example."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["When you hit the button, an interactive rebase window will appear. Reorder some commits around (or feel free to unpick some) and see the result!"],afterMarkdowns:["Boom! Git copied down commits in the exact same way you specified through the UI."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["To finish this level, do an interactive rebase and achieve the order shown in the goal visualization. Remember you can always `undo` or `reset` to fix mistakes :D"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interactive Rebase","","Git cherry-pick est pratique quand vous savez exactement quels commits vous voulez (_et_ que vous connaissez leurs identifiants) -- il est difficile de battre sa simplicité.","","Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement Git a pensé à vous pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de réexaminer une série de commits que vous vous apprêtez à rebaser.","","Entrons un peu plus dans les détails..."]}},{type:"ModalAlert",options:{markdowns:["Tout rebase interactif signifie utiliser la commande `rebase` avec l'option `-i`.","","Si vous mettez cette option, Git va ouvrir une interface graphique pour vous montrer quels commits vont être copiés en-dessous de la cible sur laquelle vous rebasez. Elle vous montre aussi les identifiants et commentaires des commits, ce qui est pratique pour s'orienter parmi les commits.","","Pour le \"vrai\" Git, l'interface graphique correspond en fait à ouvrir un fichier dans un éditeur de texte comme `vim`. Pour notre exemple, j'ai construit une petite fenêtre de dialogue qui se comporte de la même façon."]}},{type:"ModalAlert",options:{markdowns:["Quand le rebase interactif s'ouvre, vous avez trois possibilités :","","* Vous pouvez réarranger les commits simplement en changeant leur ordre dans l'interface graphique (dans notre fenêtre de dialogue, cela signifie déplacer les objets avec la souris -- drag and drop).","* Vous pouvez omettre certains commits. Cela est désigné par `pick` : cliquer sur `pick` désélectionne/resélectionne le commit.","* Enfin, vous pouvez écraser des commits. Malheureusement notre niveau ne supporte pas cette option, nous allons donc sauter les détails concernant cette possibilité. Pour faire court, cela vous permet de mélanger des commits.","","Super ! Voyons un exemple."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Quand vous activez le bouton, une fenêtre de rebase interactif va s'ouvrir. Reordonnez quelques commits (ou supprimez-en certains) et regardez le résultat !"],afterMarkdowns:["Boum ! Git a copié les commits de la même manière que vous l'aviez spécifié."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, faites un rebase interactif et atteignez l'ordre indiqué dans la fenêtre d'objectif. Souvenez-vous que vous pouvez toujours exécuter les commandes `undo` ou `reset` pour réparer vos erreurs :D"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git interactive rebase","","當你知道你要複製哪些 commit(而且你也知道他們所對應的 hash 值),那麼 `git cherry-pick` 很適合你。","","但是如果你不知道你要的是哪些 commit 呢? 很幸運的是,git 也有考慮到這個問題喔!我們可以用互動式的 rebase 來做到,當你想要檢查你想要的 commit 的時候,這會是最好的方法。","","讓我們來看一下這些細節..."]}},{type:"ModalAlert",options:{markdowns:["互動式的 rebase 相當於使用 rebase 這個指令的時候,後面加上一個 `-i` 的選項。","","如果你有包含了這個選項,git 就會打開一個 UI,讓你知道說有哪些 commit 會被複製下來,它也會告訴你它們的 hash 值以及可以讓你知道它們是什麼的訊息。","",'在"實務上",UI 會利用一個編輯器(例如 vim)打開一個檔案,對於我們來說,我已經設計了一個有同樣功能的對話視窗。']}},{type:"ModalAlert",options:{markdowns:["當互動式的 rebase 的對話視窗打開之後,你就可以做到三件事情:","","* 你可以藉由改變這些 commit 在 UI 的位置(在我們的視窗中,可以透過滑鼠去拖拉),來重新排序它們的順序。","* 你可以選擇完全忽略掉某些 commit,可以用滑鼠按一下,使它變暗,就表示你要忽略掉該 commit。","* 最後, 你可以把 commit 合併在一起,但基於某些理由,在我們的關卡裡面並沒有這個功能。","","太棒了!讓我們來看一個例子!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["當你按下按鈕的時候,一個互動式的 rebase 的視窗就會跳出來,重新排序一些 commit(大膽忽略掉某些 commit),然後看一下結果吧!"],afterMarkdowns:["看吧! git 根據你所選擇的 commit,把它們複製了下來。"],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,使用互動式的 rebase,並且完成視覺化目標所表示 commit 的順序,記住!你可以經常使用 `undo` 或者 `reset` 來修正你的一些錯誤:D"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 交互式的 rebase","","当你知道你所需要的提交记录(**并且**还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。","","但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了","","咱们具体来看一下……"]}},{type:"ModalAlert",options:{markdowns:["交互式 rebase 指的是使用带参数 `--interactive` 的 rebase 命令, 简写为 `-i`","","如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。","","在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。 考虑到课程的初衷,我弄了一个对话框来模拟这些操作。"]}},{type:"ModalAlert",options:{markdowns:["当 rebase UI界面打开时, 你能做3件事:","","* 调整提交记录的顺序(通过鼠标拖放来完成)","* 删除你不想要的提交(通过切换 `pick` 的状态来完成,关闭就意味着你不想要这个提交记录)","* 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。","","接下来咱们看个实例"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["当你点击下面的按钮时,会出现一个交互对话框。对提交记录做个排序(当然你也可以删除某些提交),点击确定看结果"],afterMarkdowns:["Git 严格按照你在对话框中指定的方式进行了复制。"],command:"git rebase -i HEAD~4",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要通过本关, 做一次交互式的 rebase,整理成目标窗口中的提交顺序。 记住,你随时都可以用 `undo`、`reset` 修正错误,这是不会记入步数的 :D"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## git rebase interactivo","","git cherry-pick es genial cuando sabés cuáles commits querés (_y_ sabés sus hashes) -- es dificil superar la simpleza que provee.","","Pero ¿qué pasa cuando no sabés qué commits querés? 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 por rebasear.","","Entremos en los detalles..."]}},{type:"ModalAlert",options:{markdowns:["Todo rebase interactivo significa usar el comando `rebase` con la opción `-i`.","","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 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.']}},{type:"ModalAlert",options:{markdowns:["Cuando el diálogo de rebase interactivo se abre, tenés la capacidad de hacer 3 cosas:","","* Podés reordenar los commits con solamente cambiar su orden en la UI (en nuestra ventana, eso significa hacer drag & drop con el mouse).","* Podés elegir ignorar completamente algunos commits. Esto se designa con `pick` -- no hacerle `pick` a algún commit significa que querés ignorarlo.","* Finalmente, podés _squashear_ commits. Desafortunadamente, nuestros niveles no soportan esto por cuestiones logísticas, por lo que voy a ahorrarte los detalles. Haciéndola corta, te permite combinar varios commits en uno solo.","","¡Genial! Veamos un ejemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cuando apretes el botón, va a aparecer una ventana de rebase interactivo. Reordená los commits (sentite libre de ignorar alguno, también) ¡y mirá el resultado!"],afterMarkdowns:["¡Boom! 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, hacé un rebase interactivo y alcanzá el orden que se muestra en la visualización objetivo. Acordate que siempre podés hacer `undo` y `reset` para arreglar errores :D"]}}]},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"]}}]},es_MX:{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 2 cosas:","","* Puedes reordenar las confirmaciones con solamente cambiar su orden en la UI (en nuestra ventana, eso significa arrastrar y soltar con el mouse).","* Puedes elegir mantener todas las confirmciones o ignorar algunas específicas. Cuando la ventana se abre, cada confirmación se asigna como incluido por medio del botón `pick` que está activo al lado. Para ignorar una confirmación, desactiva el botón `pick`.","","Vale la pena mencionar que en el rebase interactivo puedes hacer muchas más cosas como combinar confirmaciones, modificar los mensajes d elas confirmaciones e incluso editar las confirmaciones. Para nuestros propósitos nos centraremos en las dos operaciones anteriores.","","¡Genial! Veamos un ejemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cuando presiones 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:["¡Vientos! Git copió las cofirmaciones 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:[{type:"ModalAlert",options:{markdowns:["## Rebase Interativo do Git","","O cherry-pick é ótimo quando você sabe de antemão quais commits você quer (_e_ você sabe os hashes correspondentes) -- é difícil bater a simplicidade que ele oferece.","","Mas e quando você não sabe quais commits você quer? Felizmente o git pode te ajudar nesta situação também! Podemos usar o rebase interativo para isso -- trata-se da melhor forma de rever uma série de commits sobre os quais você está prestes a fazer um rebase.","","Mergulhemos nos detalhes..."]}},{type:"ModalAlert",options:{markdowns:["O rebase interativo é simplesmente o comando `rebase` com a opção `-i`.","","Se você incluir essa opção, o git abrirá uma interface para mostrar quais commits estão prestes a serem copiados abaixo do alvo do rebase. Ele também mostra os hashes e as mensagens dos commits, o que é ótimo para ter noção do que é o que.","",'No git "de verdade", a interface nada mais é que um arquivo aberto em um editor de texto (por exemplo o `vim`). Para os nossos propósitos, eu montei uma pequena janela que se comporta da mesma forma.']}},{type:"ModalAlert",options:{markdowns:["Quando a janela de rebase interativo abrir, você pode fazer 3 coisas diferentes:","","* Você pode reordenar os commits simplesmente mudando sua ordem na interface (na nossa janela isso significa arrastar e soltar com o mouse).","* Você pode escolher simplesmente omitir alguns commits. Para isso, clique no botão `pick` -- deixar o `pick` desligado significa que você quer descartar o commit.",'* Por fim, você pode "esmagar" (fazer squash) nos commits. Infelizmente, nosso tutorial não será capaz de cobrir essa funcionalidade por alguns motivos logísticos, então vamos pular os detalhes disto. Em resumo, no entanto, o squash permite que você combine commits.',"","Ótimo! Vejamos um exemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Quando você clicar o botão, uma janela de rebase interativo se abrirá. Reordene alguns commits da forma como você preferir (ou sinta-se livre para desmarcar o `pick` de alguns) e veja o resultado!"],afterMarkdowns:["Boom! O Git copiou alguns commits exatamente da mesma forma que você os especificou na janela."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Para finalizar este nível, faça um rebase interativo e obtenha a ordem mostrada na visualização do objetivo. Lembre-se que você pode usar os comandos `undo` ou `reset` para corrigir erros :D"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rebase Interativo en Git","","Empregar cherry-pick é xenial cando coñeces qué commits queres (_e_ coñeces os seus códigos hash) -- é difícil mellorar a súa simplicidade.","","Pero ¿qué pasa cando non sabes qué commits son os que queres? Por sorte, ¡git cúbrete nesta situación tamén! Podemos empregar o rebase interactivo para esto -- é a mellor forma de revisar unha serie de commits que estás a rebasar.","","Mergullémonos nos detalles..."]}},{type:"ModalAlert",options:{markdowns:["O rebase interativo é o comando `rebase` coa opción `-i`.","","Se ti inclúes esta opción, o git abrirá unha interfaz para mostrar qué commits están hábiles para ser copiados sobre o obxectivo do rebase. Tamén amosa os seus códigos hash e mensaxes dos commits, o cal axuda moito para saber qué é cada commit.","",'En git "de verdade", a interfaz significa abrir un arquivo de texto nun editor (por exemplo `vim`). Para os nosos propósitos, aquí aparecerá unha pequena ventá que se comporta do mesmo xeito.']}},{type:"ModalAlert",options:{markdowns:["Cando a xanela de rebase interativo abra, poderás facer 3 cousas distintas:","","* Podes reordenar os commits simplemente cambiando a súa orde na interface (na nosa ventá significa arrastrar e soltar os commits).","* Podes escoller a opción de omitir algúns commits. Para iso, pincha no botón `pick` -- deixar o `pick` desligado significa que queres descartar o commit.",'* Ademáis, ti podes "esmagar" (fazer squash) nos commits. Tristemente, este tutorial non será capaz de cubrir esa funcionalidade por algúns motivos loxísticos, entón imos pulir algúns detalles ó respecto. Resumindo, o squash permite combinar commits.',"","¡Xenial! Vexamos un exemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cando pinches o botón, unha ventá de rebase interativo abrirase. Reordena algúns commits da forma que ti prefieras (ou se o prefires desmarca o `pick` de algúns) e mira o seu resultado!"],afterMarkdowns:["¡Veña! Git copiou algúns commits exatamente da mesma forma que o indicaches na ventá."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Para finalizar este nivel, fai un rebase interativo e obteñaa a orde amosada na visualización do obxectivo. Lembra que podes usar os comandos `undo` ou `reset` para correxir erros :D"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Interaktiver Rebase","","Cherry-pick ist großartig, wenn du genau weißt, welche Commits du willst (_und_ ihre jeweiligen Hashes kennst) -- es ist dann schwer an Einfachheit zu überbieten.","","Aber wie sieht es aus, wenn du die benötigten Commits nicht genau kennst? Zum Glück bietet Git auch dafür eine Lösung an. Das können wir mit interaktivem Rebase machen -- die beste Art sich eine Serie von Commits in einem Rebase genau anzusehen.","","Schauen wir uns die Details an ..."]}},{type:"ModalAlert",options:{markdowns:["Interaktives Rebase bedeutet einfach nur, dass man dem `rebase` Befehl die Option `-i` hinzufügt.","","Wenn du das machst, zeigt Git dir jeden einzelnen Commit, der durch den Rebase kopiert werden würde. Es zeigt dir die Hashes und Kommentare, was gut ist um einen Überblick zu bekommen.","",'Im "echten" Git werden die Commits in einem Text-Editor angezeigt (z.B. in `vim`). Für unsere Zwecke habe ich ein kleines Dialog-Fenster gebaut, das sich ähnlich verhält.']}},{type:"ModalAlert",options:{markdowns:["Wenn sich der Dialog für den interaktiven Rebase öffnet, kannst du drei Dinge tun:","","* Du kannst die Reihenfolge der Commits durch Ziehen und Ablegen ändern.","* Du kannst einen Commit beim Rebase ignorieren, indem du im Dialog auf die Schaltfläche `omit` klickst. Du kannst einen Commit wieder aufnehmen, indem du auf `pick` klickst.","* Außerdem kannst du Commits zusammenfassen (squash). Leider wird das hier nicht unterstützt, aber im echten Git fasst es Commits zu einem zusammen.","","Super! Schauen wir uns ein Beispiel an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wenn du die Schaltfläche anklickst, wird sich der Rebase-Dialog öffnen. Verändere die Reihenfolge der Commits oder klicke bei einigen auf `pick` bzw. `omit` und schaue dir das Ergebnis an."],afterMarkdowns:["Bämm! Git hat die Commits genau so kopiert, wie du es ausgewählt hast."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level zu schaffen mach einen interaktiven Rebase, um genau die Reihenfolge zu erzeugen, die im Ziel-Baum angezeigt wird. Denk daran, dass du jederzeit mit `undo` oder `reset` Fehler rückgängig machen kannst. :D"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git インタラクティブrebase","","どのコミットを操りたいか(そしてそれを指定するハッシュ)がわかる時に`git cherry-pick`はとても便利で、その簡単さはとてもありがたいです。 ","","しかし、どのコミットを操りたいかがわからない時はどうでしょう?ありがたいことに、そんな時にぴったりのコマンドがgitに備わっています。このためにgitのインタラクティブrebaseを使えます。rebaseしたい一連のコミットを一括で見るベストな方法です。","","具体的に見てみましょう..."]}},{type:"ModalAlert",options:{markdowns:["インタラクティブrebaseとは単に、`rebase`コマンドに`-i`オプションを合わせて使うことです。","","このオプションをつければ、gitがインタフェースを開き、どのコミットがrebase対象の下にコピーされるかを確認できます。それらのコミットのハッシュやメッセージも表示され、rebaseの概要を一眼で見るのに便利です。","",'"ホンモノ"のgitでは、その「インターフェース」とは`vim`などのテキストエディタの中でファイルが開くだけです。ここでコンセプトを見せるために同じような動作をする小さなダイアログウィンドウを作りました。']}},{type:"ModalAlert",options:{markdowns:["インタラクティブrebaseダイアログが開くと、3つの操作から選べます:","","* UIウィンドウのなかで順番を調整するだけでコミットの順番を変えられます(こちらのダイアログでは、マウスでドラッグアンドドロップで操作します)。","* 特定のコミットを丸ごと除くこともできます。除きたいコミットを指定するには`pick`をオフにします。","* 最後に、コミットを組み合わせられます。技術的に制限があり再現できないのでその詳細な説明を省きますが、短く言いますと、複数のコミットを一つにまとめることができる機能です。","","さて、例を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["ボタンを押せば、インタラクティブrebaseウィンドウが現れます。コミットの順番を変更したり、`pick`を外したりしてみて、その結果を見てみましょう!"],afterMarkdowns:["よっしゃー。gitがUIで指定されたようにコミットをコピーしました!"],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするにはインタラクティブrebaseを実行し、ゴールのビジュアライズに表示されている順番を実現しましょう。ミスがあれば`undo`や`reset`で修正できるのをお忘れなく。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interactive Rebase","","Git cherry-pick прекрасен, когда точно известно, какие коммиты нужны (и известны их точные хеши)","","Но как быть в случае, когда точно не известно какие коммиты нужны? К счастью, Git позаботился о таких ситуациях! Можно использовать интерактивный rebase для этого - лучший способ отобрать набор коммитов для rebase.","","Углубимся в детали."]}},{type:"ModalAlert",options:{markdowns:["Всё, что нужно для интерактивного rebase - это опция `-i`","","Если добавить эту опцию, Git откроет интерфейс просмотра того, какие коммиты готовы к копированию на цель rebase (target). Также показываются хеши коммитов и комментарии к ним, так что можно легко понять что к чему.","",'Для "реального" Git, этот интерфейс означает просто открытие файла в редакторе типа vim. Для этой обучалки, я сделал небольшое диалоговое окно, которое по сути делает то же, что и редактор.']}},{type:"ModalAlert",options:{markdowns:["После открытия окна интерактивного rebase есть три варианта для каждого коммита:","","* Можно сменить положение коммита по порядку, переставив строчку с ним в редакторе (у нас в окошке строку с коммитом можно перенести просто мышкой).",'* Можно "выкинуть" коммит из ребейза. Для этого есть `pick` - переключение его означает, что нужно выкинуть коммит.',"* Наконец, можно соединить коммиты. В этом уровне игры у нас не реализована эта возможность, но, вкратце, при помощи этой функции можно объединять изменения двух коммитов.","","Ну что ж, посмотрим на примеры!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["После нажатия на эту кнопку появится окно интерактивного rebase. Переставь несколько коммитов (или удали кое-какие) и посмотри, что получится в итоге!"],afterMarkdowns:["Бах! Git скопировал коммиты в точности так, как было указано через интерфейс!"],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, переставь коммиты при помощи интерактивного rebase в таком порядке, как указано на визуализации. На всякий случай, помни, что всегда можно исправить ошибку, вызвав команду undo или reset."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 인터렉티브 리베이스(Interactive Rebase)","","Git 체리-픽은 여러분이 원하는 커밋이 무엇인지 알때(각각의 해시값도) 아주 유용합니다 -- 체리-픽이 제공하는 간단함은 아주 매력적입니다.","","하지만 원하는 커밋을 모르는 상황에는 어쩌죠? 고맙게도 git은 이런상황에 대한 대안이 있습니다. 우리는 이럴 때 인터렉티브 리베이스를 사용하면됩니다 -- 리베이스할 일련의 커밋들을 검토할 수 있는 가장 좋은 방법입니다.","","자세히 알아보죠..."]}},{type:"ModalAlert",options:{markdowns:["인터렉티브 리베이스가 의미하는 뜻은 `rebase` 명령어를 사용할 때 `-i` 옵션을 같이 사용한다는 것입니다.","","이 옵션을 추가하면, git은 리베이스의 목적지가 되는 곳 아래에 복사될 커밋들을 보여주는 UI를 띄울것 입니다. 각 커밋을 구분할 수 있는 각각의 해시들과 메시지도 보여줍니다.","",'"실제" git 에서는 UI창을 띄우는것 대신에 `vim`과 같은 텍스트 편집기에서 파일을 엽니다. 저희는 배우는 것이 목적이기에 같은 역할을 하는 작은 대화창을 만들어서 대신했습니다.']}},{type:"ModalAlert",options:{markdowns:["인터렉티브 리베이스 대화창이 열리면, 3가지를 할 수 있습니다:","","* 적용할 커밋들의 순서를 UI를 통해 바꿀수 있습니다(여기서는 마우스 드래그앤 드롭으로 가능합니다)","* 원하지 않는 커밋들을 뺄 수 있습니다. 이것은 `pick`을 이용해 지정할 수 있습니다(여기서는 `pick`토글 버튼을 끄는것으로 가능합니다)","* 마지막으로, 커밋을 스쿼시(squash)할 수 있습니다. 불행히도 저희 레벨은 몇개의 논리적 문제들 때문에 지원을 하지 않습니다. 이거에 대해서는 넘어가겠습니다. 요약하자면 커밋을 합칠 수 있습니다","","자! 예시를 확인해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["버튼을 누르면 인터렉티브 리베이스 대화창이 뜰 것 입니다. 커밋들의 순서를 바꿔보고(커밋을 빼 봐도 됩니다) 결과를 확인해봅시다!"],afterMarkdowns:["Boom! Git이 UI를 통해 명시한 그대로 커밋들을 복사했습니다."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨을 통과하기 위해서 goal에 나타난 순서대로 만들기 위해 인터렉티브 리베이스를 사용해봅시다. `undo`와 `reset`을 통해 했던 실수들은 되돌릴 수 있습니다 :D"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Інтерактивний Rebase","","Git cherry-pick зручно користуватись, коли ти знаєш які коміти тобі потрібні (_і_ ти знаєш їхні хеші) -- важко вигадати щось простіше.","","Але що робити в ситуації, коли ти не знаєш які коміти потрібні? На щастя git може впоратись і з цим! Для цього випадку використовують інтерактивний rebase -- це найкращий спосіб перевірити серію комітів які потрібно заребейсити.","","Розглянемо це детальніше..."]}},{type:"ModalAlert",options:{markdowns:["Інтерактивний rebase це насправді команда `rebase` з опцією `-i`.","","Якщо додати цю опцію, git відкриє діалог в якому покаже які коміти будуть скопійовані до кінцевого призначення. Він також покаже хеші комітів та їхні повідомлення, що допоможе розібратися що й до чого.","",'В "справжньому" git, замість UI вікна відкриється файл в сконфігурованому текстовому редакторі, можливо `vim`. Для цього туторіалу я створив невеличке діалогове вікно що поводиться приблизно так само.']}},{type:"ModalAlert",options:{markdowns:["Коли відкриється вікно інтерактивного rebase ти можеш зробити три речі:","","* Ти можеш переставити коміти між собою просто змінивши їх порядок в діалозі (в нашому вікні ти зможеш перетягнути їх мишкою).","* Ти можеш повністю пропустити якісь коміти. В туторіалі потрібно вимкнути опцію `pick`, але в справжньому гіт потрібно просто видалити відповідний рядок.","* Також можна розчавити (squash) якісь коміти. На жаль наш туторіал не підтримує цю фічу (так як ми не підтримуємо роботу з файлами), але це дуже зручна опція в справжньому гіт. За її допомогою можна декілька різніх комітів об’єднати в один.","","Чудово! Розгляньмо це на прикладі"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Коли ти натиснеш кнопку, відкриється вікно інтерактивного rebase. Перестав якісь коміти (можеш пропустити якісь якщо хочеш), і подивись що вийде!"],afterMarkdowns:["Ка-бум! Git cкопіював коміти відповідно до того що було вказано в UI."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень за допомогою інтерактивного rebase впорядкуй коміти як показано на візуалізації. Пам’ятай що ти завжди можеш використати `undo` чи `reset` щоб виправити помилку :D"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase Tương tác","","Khi bạn biết rõ mình muốn những commit nào (và mã băm tương ứng của chúng) thì Git cherry-pick là công cụ tuyệt vời -- nó đơn giản đến bất ngờ.","","Nhưng mà lỡ như bạn không biết mình cần commit nào thì sao? May mà Git cũng có công cụ cho việc này! Ta có thể dùng rebase tương tác cho việc này -- đó là cách tốt nhất để cân nhắc lựa chọn các commit mà bạn muốn rebase.","","Hãy đi sâu vào chi tiết nào..."]}},{type:"ModalAlert",options:{markdowns:["Rebase tương tác nghĩa là dùng lệnh `rebase` với tùy chọn `-i`.","","Nếu lệnh của bạn có bao hàm tùy chọn này, Git sẽ mở một giao diện người dùng để cho bạn biết những commit nào sẽ được sao chép xuống dưới mục tiêu rebase. Nó cũng đồng thời thể hiện mã băm và thông điệp của commit, điều này thật tuyệt bởi nhờ đó ta có thể phân biệt được chúng.","",'Với Git "thật", cửa sổ UI (giao diện người dùng) sẽ được mở thông qua một tệp nhờ công cụ chỉnh sửa văn bản như là `vim`. Vì mục đích học tập, tôi đã xây dựng một hộp thoại nhỏ mà nó hành xử cũng tương tự như vậy.']}},{type:"ModalAlert",options:{markdowns:["Khi hộp thoại rebase tương tác bật lên, trong ứng dụng giáo dục của chúng tôi, bạn có khả năng làm hai điều sau:","","* Bạn có thể sắp xếp lại commit một cách đơn giản thông qua UI (bằng cách kéo thả trên công cụ của chúng tôi).","* Bạn có thể chọn hoặc loại bỏ một vài commit cụ thể. Điều này được thể hiện qua nút `pick` -- tắt nút `pick` nghĩa là bạn loại bỏ commit đó.","","*Chú ý rằng, đối với rebase tương tác trong thực tế, bạn có thể làm nhiều thứ hơn như squash (kết hợp) commit, sửa đổi commit message, thậm chí là chỉnh sửa commit. Tuy nhiên, chúng ta chỉ cần tập trung vào hai thao tác trên.*","","Tuyệt! Cùng xem qua một ví dụ nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Khi bấm nút, một cửa sổ rebase tương tác sẽ xuất hiện. Bạn có thể sắp xếp lại một số commit (hoặc có thể xóa bớt) và xem thử kết quả!"],afterMarkdowns:["BÙÙM! Git sao chép chính xác các commit mà bạn chọn thông qua UI."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, thực hiện rebase tương tác sao cho thứ tự commit giống với mục tiêu. Hãy nhớ rằng nếu gặp lỗi bạn luôn có thể hoàn tác hoặc đặt lại :D"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interaktivni Rebase","","Git cherry-pick je odličen način, ko veš katere commite bi rad (in poznaš njihove hashe) -- težko je premagati njegovo enostavnost.","","Ampak kaj pa situacija, ko ne veš katere commite želiš? K sreči ima git pokrito tudi to! Uporabimo lahko interaktivni rebase -- gre za najboljši način za pregled commitov, ki jih želiš rebaseati.","","Spustimo se v podrobnosti ..."]}},{type:"ModalAlert",options:{markdowns:["Vse kar interaktvini rebase pomeni je, da uporabimo `rebase` ukaz z opcijo `-i`.","","Če vključiš to opcijo, bo git odprl okno, da ti pokaže, kateri commiti bodo skopirani pod naš ciljni commit rebaseanja. Prav tako pokaže tudi njihove hashe in sporočila, kar je super za razumevanje kaj je kaj.","",'Za "pravi" git, odpiranje okna pomeni odpiranje datoteke v urejevalniku kot je `vim`. Za naš namen sem zgradil majhno okno, ki se obnaša enako.']}},{type:"ModalAlert",options:{markdowns:["Ko se odpre okno za interaktivno rebaseanje, imaš možnost narediti 3 stvari:","","* Enostavno lahko preurediš commite v vrstni red, ki ga želiš (v našem oknu to dosežeš kar s klikom in vlečenjem miške).","* Odločiš se lahko, da čisto izpustiš nekatere commite. To je omogočeno s `pick` -- izklop `pick` opcije pomeni, da bi rad commit izpustil.","* Nenazadnje, commite lahko tudi stisnemo. Nažalost naše stopnje tega ne podpirajo zaradi logističnih razlogov, zato bom preskočil podrobnosti tega. Toda če povzamem -- omogoča združevanje commitov.","","Super! Poglejmo primer."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ko pritisneš gumb, se bo pojavilo interaktivno okno. Prerazporedi nekaj commitov okoli (ali pa jih odstrani z omit) in poglej rezultat!"],afterMarkdowns:["Boom! Git je na dno skopiral commite v točno takšnem vrstnem redu, kot si ga določil v oknu."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje naredi interaktvini rebase in doseži vrstni red, kot je predstavljen v ciljni vizualizaciji. Vedno lahko razveljavjiš z `undo` ali ponastaviš z `reset` ukazom, da popraviš napake :D"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Interaktywny rebase w Gicie","","Cherry-pick jest świetny, gdy wiesz, które commity chcesz przenieść (_oraz_ znasz ich hasze) - trudno jest dyskutować z prostotą, którą zapewnia.","","Ale co w sytuacji, gdy nie wiesz, które commity chcesz przenieść? Na szczęście Git jest przygotowany również na tę sytuację! Możemy wykorzystać do tego interaktywny rebase - to najlepszy sposób, aby przejrzeć serię commitów, które zamierzasz rebase'ować (czyli: przebazować).","","Przejdźmy do szczegółów..."]}},{type:"ModalAlert",options:{markdowns:["Wszystkie interaktywne znaczniki rebase używają polecenia `rebase` z opcją `-i`.","","Jeśli włączysz tę opcję, Git otworzy okno, aby pokazać ci, które commity mają być skopiowane poniżej wskazanego celu przebazowania (np. HEADa). W oknie pokażą się również wiadomości i hasze commitów, żeby ułatwić ci zrozumienie, co jest czym.","",'Dla "prawdziwego" Gita otwarte okno oznacza otwarcie pliku w edytorze tekstu, takim jak np. `vim`. Dla naszych potrzeb zbudowałem małe okno dialogowe, które zachowuje się tak samo.']}},{type:"ModalAlert",options:{markdowns:["Kiedy otworzy się okno dialogowe do interaktywnego przebazowania, masz możliwość zrobienia dwóch rzeczy w naszej aplikacji edukacyjnej:","","* Możesz zmienić kolejność commitów, po prostu przeciągając i upuszczając je myszką w oknie.","* Możesz zdecydować się zachować wszystkie commity lub pominąć niektóre z nich. Jest to oznaczone przez aktywny przycisk `pick`. Wyłączenie przycisku spowoduje pominięciu commitu.","","* Warto wspomnieć, że w prawdziwym interaktywnym rebase'ie możesz zrobić wiele innych rzeczy, takich jak squash (łączenie) commitów, poprawianie wiadomości commitów, a nawet edycja samych commitów. Dla naszych potrzeb jednak wystarczy, że skupimy się na dwóch omówionych operacjach.","","Świetnie! Spójrzmy na przykład."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Po naciśnięciu przycisku pojawi się interaktywne okno przebazowania. Zmień kolejność niektórych commitów (lub usuń niektóre z nich, a co!) i zobacz wynik!"],afterMarkdowns:["Tadam! Git skopiował commity w sposób podany w oknie."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, zrób interaktywny rebase i ustaw kolejność pokazaną w wizualizacji celu. Pamiętaj, że zawsze możesz użyć `undo` lub `reset`, aby naprawić błędy :D"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git rebase interattivo","","Git cherry-pick è fantastico quando sai quale commit vuoi (_e_ conosci l'hash corrispondente) -- è difficile avere di meglio.","","Ma cosa accade se non sai quale commit ti serve? Per fortuna git ci viene in contro anche in questo caso! Possiamo usare il rebase interattivo -- è il miglior modo per rivedere la sequenza di commit di cui stai per fare il rebase.","","Vediamolo nel dettaglio..."]}},{type:"ModalAlert",options:{markdowns:["Fare rebase interattivo significa usare il comando `rebase` con l'opzione `-i`.","","Se aggiungi quest'opzione, git aprirà un'interfaccia per mostrarti quali commit stanno per essere copiati sotto il commit su cui vuoi fare il rebase. Verrà anche mostrato l'hash e il messaggio del commit, il che è grandioso per darci l'idea di cosa è cosa","",'Nel git "vero", l\'interfaccia che si apre in realtà è un editor di testo come `vim`. Nel nostro caso, ho creato una piccola finestra che si comporta allo stesso modo.']}},{type:"ModalAlert",options:{markdowns:["Quando la finestra si apre, hai la possibilità di fare due cose:","","* Puoi riordinare i commit modificandone l'ordine (drag & drop con il mouse).","* Puoi decidere se conservare tutti i commit o rimuoverne qualcuno. Quando la finestra si apre, ogni commit è considerato preso dal pulsante `pick` attivo affianco a esso. Per scartare un commit, disattiva il suo pulsante `pick`.","","*Vale la pena ricordare che nel vero rebase interattivo puoi fare molte più cose come lo squashing (combinazione) di commit, la modifica del messaggio di commit (amending), e perfino la modifica dello stesso commit. Noi ci concentreremo sulle due funzioni descritte sopra.*","","Bene! Vediamo un esempio."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Quando premi il pulsante, apparirà la finestra del rebase interattivo. Riordina qualche commit (o sentiti libero di scartarne qualcuno) e vediamo il risultato!"],afterMarkdowns:["Boom! Git ha fatto la copia nell'ordine esatto che hai specificato nell'interfaccia grafica."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Per concludere questo livello, esegui un rebase interattivo e raggiungi l'obiettivo mostrato. Ricordati che puoi sempre fare `undo` o `reset` per correggere gli errori :D"]}}]}}}},{}],134:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main"},"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":"C3","id":"HEAD"}}',solutionCommand:"git checkout bugFix^",startTree:'{"branches":{"main":{"target":"C2","id":"main"},"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":"main","id":"HEAD"}}',name:{en_US:"Relative Refs (^)",fr_FR:"Références relatives (^)",ja:"相対リファレンス (^)",zh_CN:"相对引用(^)",zh_TW:"相對引用(^)",es_AR:"Referencias relativas (^)",es_MX:"Referencias relativas (^)",es_ES:"Referencias relativas (^)",pt_BR:"Referências relativas (^)",gl:"Referencias relativas (^)",de_DE:"Relative Referenzen (^)",ru_RU:"Относительные ссылки (^)",ko:"상대 참조 (^) (Relative Refs)",uk:"Відносні посилання",vi:"Tham chiếu tương đối (^)",sl_SI:"Relativne Reference (^)",it_IT:"Riferimenti relativi (^)",pl:"Referencje względne (^)"},hint:{en_US:"Remember the Caret (^) operator!",fr_FR:"Rappelez-vous de l'opérateur circonflexe (^)",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:"记住操作符(^)!",zh_TW:"不要忘記插入(^)符號!",ru_RU:"Не забудь оператор `^`",ko:"(^)연산자를 기억하세요!",uk:"Не забудь оператор `^`",vi:"Đừng quên dấu mũ (^)!",sl_SI:"Spomni se na (^) operator!",it_IT:"Ricorda l'operatore Caret(^)... l'accento circonflesso!",pl:"Pamiętaj o operatorze wstawienia (^)!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relative Refs","","Moving around in Git by specifying commit hashes can get a bit tedious. In the real world you won't have a nice commit tree visualization next to your terminal, so you'll have to use `git log` to see hashes.","","Furthermore, hashes are usually a lot longer in the real Git world as well. For instance, the hash of the commit that introduced the previous level is `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Doesn't exactly roll off the tongue...","","The upside is that Git is smart about hashes. It only requires you to specify enough characters of the hash until it uniquely identifies the commit. So I can type `fed2` instead of the long string above."]}},{type:"ModalAlert",options:{markdowns:["Like I said, specifying commits by their hash isn't the most convenient thing ever, which is why Git has relative refs. They are awesome!","","With relative refs, you can start somewhere memorable (like the branch `bugFix` or `HEAD`) and work from there.","","Relative commits are powerful, but we will introduce two simple ones here:","","* Moving upwards one commit at a time with `^`","* Moving upwards a number of times with `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's look at the Caret (^) operator first. Each time you append that to a ref name, you are telling Git to find the parent of the specified commit.","",'So saying `main^` is equivalent to "the first parent of `main`".',"","`main^^` is the grandparent (second-generation ancestor) of `main`","","Let's check out the commit above main here."],afterMarkdowns:["Boom! Done. Way easier than typing the commit hash."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["You can also reference `HEAD` as a relative ref. Let's use that a couple of times to move upwards in the commit tree."],afterMarkdowns:["Easy! We can travel backwards in time with `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, check out the parent commit of `bugFix`. This will detach `HEAD`.","","You can specify the hash if you want, but try using relative refs instead!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Références relatives","","Se déplacer dans Git en spécifiant des identifiants de commits (hashes) peut être un peu agaçant. Dans le monde réel vous n'aurez pas une vue sur un joli arbre des commits à côté de votre terminal, et vous devrez donc utiliser `git log` pour connaître les identifiants.","","De plus, les identifiants sont plus longs dans le vrai monde de Git qu'ici. Par exemple, l'identifiant du commit introduit au précédent niveau était `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Difficilement mémorisable...","","Le côté positif est que Git est intelligent avec les identifiants. Vous avez seulement à spécifier les premiers caractères de l'identifiant jusqu'à ce qu'il reconnaisse exactement le commit. Ainsi je peux taper `fed2` au lieu de la longue chaîne ci-dessus."]}},{type:"ModalAlert",options:{markdowns:["Comme je l'ai dit, spécifier un commit par son identifiant n'est pas très pratique, c'est pourquoi Git a des références relatives. Elles sont géniales !","","Avec les références relatives vous pouvez commencer par vous placer à un endroit mémorisable (comme la branche `bugFix` ou `HEAD`) et travailler depuis cet endroit.","","Les commits relatifs sont puissants, et on va en présenter deux simples ici :","","* Revenir d'un commit en arrière avec `^`","* Revenir de plusieurs en arrière avec `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Regardons l'opérateur circonflexe (^) d'abord. Chaque fois que vous le faites suivre un nom de référence, vous êtes en train de demander à Git de trouver le parent du commit spécifié.","",'Ainsi, `main^` est équivalent à "le premier parent de `main`".',"","`main^^` est le grand-parent (ancêtre de seconde génération) de `main`","","Faisons un checkout du commit avant main."],afterMarkdowns:["Boum ! Fini. Bien plus facile que d'écrire l'identifiant du commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vous pouvez aussi utiliser `HEAD` comme une référence relative. Utilisons cela plusieurs fois pour remonter l'arbre des commits."],afterMarkdowns:["Facile ! Nous pouvons voyager dans le temps avec `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour compléter ce niveau, faites un checkout du commit parent de `bugFix`. Cela va détacher `HEAD`.","","Vous pouvez spécifier l'identifiant du commit si vous voulez, mais essayez plutôt d'utiliser les références relatives !"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relative Referenzen","","Es kann etwas mühselig werden, sich in einem Commit-Baum mittels Angabe der Hashes zu bewegen. Im echten Leben hat man normalerweise keine hübsche Visualisierung des Baumes neben seinem Terminal, also benutzt man `git log` um die Hashes zu sehen.","","Außerdem sind die echten Hashes sehr viel länger und nicht fortlaufend nummeriert. Beispielsweise heißt der Hash, mit dem ich den letzten Level committet habe, in echt `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Nicht gerade einprägsam ...","","Zum Glück ist Git intelligent wenn es um die Hashes geht. Du musst nur soviele Zeichen eines Hashes angeben, bis der Hash eindeutig ist. Ich kann also `fed2` eingeben anstatt die komplette Zeichenkette tippen zu müssen."]}},{type:"ModalAlert",options:{markdowns:["Wie ich schon sagte: Commits über ihren Hash zu referenzieren ist nicht gerade der bequemste Weg. Weshalb es in Git relative Referenzen gibt. Welche super sind!","","Mit relativen Referenzen kann man bei einem leicht zu merkenden Bezeichner anfangen (zum Beispiel dem Branch-Namen `bugFix` oder der Referenz `HEAD`) und sich von dort vorarbeiten.","","Relative Referenzierung von Commits kann komplex sein, aber wir starten mit zwei einfachen Beispielen:","","* Geh einen Commit zurück mit `^`","* Geh eine bestimmte Anzahl von Commits zurück mit `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns zuerst den Dach-Operator (`^`) an. Jedes mal wenn du ihn hinter einen Referenz-Namen setzt, sagst du Git damit, dass es zum Vorgänger des angegebenen Commits gehen soll.","",'Das heißt `main^` ist gleichbedeutend mit "direkter Vorgänger des Commits, auf den `main` zeigt".',"","`main^^` ist also der Vorgänger des Vorgängers von `main`.","","Wir checken jetzt mal den Commit vor `main` aus:"],afterMarkdowns:["Bämm! Fertig. Einfacher, als den Commit-Hash zu tippen (oder zu kopieren)."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Du kannst auch `HEAD` als Basis für relative Referenzen benutzen. Lass uns das ein paar Mal verwenden, um uns im Commit-Baum nach oben zu bewegen."],afterMarkdowns:["Das war einfach. Wir reisen mit `HEAD^` in der Zeit zurück."],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level abzuschließen musst du den direkten Vorgänger von `bugFix` auschecken. Dadurch wirst du `HEAD` von `bugFix` abkoppeln.","","Du kannst natürlich den Hash angeben, aber versuch doch relative Referenzen zu benutzen!"]}}]},es_AR:{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 copado 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 podés arrancar de algún lugar recordable (como la rama `bugFix`, o `HEAD`) y manejarte desde ahí.","","Los commits relativos son poderosos, pero ahora vamos a presentar sólo dos formas simples:","","* Moverse un commit atrás con `^`","* Moverse una cantidad de commits atrás con `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos el operador ^ primero. Cada vez que le agregás eso al nombre de una referencia, le estás diciendo a git que use el padre del commit especificado.","",'Entonces, decir `main^` es equivalente a "el primer padre de `main`".',"","`main^^` es el _abuelo_ (segunda generación de ancestros) de `main`","","Veamos el commit que está antes de main acá."],afterMarkdowns:["¡Boom! Ahí está. Mucho más simple que tipear el hash de ese commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["También podés 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, checkouteá el padre del commit de `bugFix`. Esto va a detachear a `HEAD`.","","Podés especificar el hash si querés, pero mejor ¡tratá de usar la referencia relativa!"]}}]},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 `main^` es equivalente a "el primer padre de `main`".',"","`main^^` es el _abuelo_ (segunda generación de ancestros) de `main`","","Veamos el commit que está antes de main aquí."],afterMarkdowns:["¡Zas! Ahí está. Mucho más simple que escribir el hash de ese commit."],command:"git checkout main^",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!"]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Referencias relativas","","Moverse por ahí en 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 larga cadena 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 memoralbe (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, `main^` quiere decir que es equivalente a "el primer padre de `main`".',"","`main^^` es el _abuelo_ (segunda generación de ancestros) de `main`","","Veamos el commit que está antes de main aquí."],afterMarkdowns:["Vientos! Ahí está. Mucho más simple que escribir el hash de ese commit."],command:"git checkout main^",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:[{type:"ModalAlert",options:{markdowns:["## Referências relativas","","Mover-se pela árvore do Git especificando o hash do commit pode se tornar um pouco entediante. No mundo real, você não terá à sua disposição essa bonita visualização da árvore ao lado do seu terminal, então você terá de usar o comando `git log` para ver os hashes.","","Além disso, os hashes são geralmente muito maiores no mundo real. Por exemplo, o hash do commit que introduziu o nível de exercícios anterior é `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Não é algo exatamente fácil de lembrar.","","O que salva é que o Git é inteligente com os hashes. Ele só exige que você especifique a quantidade de caracteres do hash suficiente para identificar unicamente o commit. Então eu posso digitar apenas `fed2` em vez da grande string acima."]}},{type:"ModalAlert",options:{markdowns:["Como eu disse, especificar commits pelo hash não é a sempre o mais conveniente, e é por isso que o Git suporta referências relativas. Elas são fantásticas!","","Com referências relativas, você pode começar a partir de um ponto fácil de lembrar (como o ramo `bugFix` ou o `HEAD`) e referenciar a partir dali.","","Commits relativos são poderosos, mas vamos introduzir apenas dois tipos simples aqui:","","* Mover para cima um commit por vez com `^`","* Mover para cima um número de vezes com `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos dar uma olhada no operador circunflexo (^) primeiro. Cada vez que você adicioná-lo a um nome de referência, você está dizendo ao Git para encontrar o pai do commit especificado.","",'Então, dizer `main^` é equivalente a "o primeiro pai do `main`".',"","`main^^` é o avô (ancestral de segunda geração) do `main`","","Vamos fazer checkout do commit logo acima do main."],afterMarkdowns:["Boom! Pronto. Muito mais fácil que digitar o hash do commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Você também pode usar o `HEAD` como parte de uma referência relativa. Vamos usar isso para nos mover para cima algumas vezes na árvore de commits."],afterMarkdowns:["Fácil! Podemos viajar para trás no tempo com `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 esse nível, faça checkout do commit pai de `bugFix`. Isso soltará o `HEAD`.","","Você pode especificar o hash se quiser, mas tente usar referências relativas em vez disso!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Referencias relativas","","Moverse por a árbore de git usando os códigos hash dos commits pode volverse un pouco tedioso. Neste mundo real non vas ter unha visualización dos commits tan bonita no terminal, así que vas ter que usar `git log` para ver cada código hash.","","Inda peor, os códigos hash són xeralmente moito máis grandes no mundo real. Por exemplo, o hash do commit que introduxemos no nivel anterior é `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Non é algo sinxelo de lembrar.","","O bo é que git aínda afina cos hashes. El só precisa que expecifiques a cantidade mínima de caracteres suficientes para identificar unívocamente ó commit. Entón eu podo escribir `fed2` e non o hash completo."]}},{type:"ModalAlert",options:{markdowns:["Como xa dixemos, indicar os commits polo seu código hash non é a forma máis convinte, e é por eso que git ten referencias relativas. ¡Son a caña!","","Cas referencias relativas, podes comezar por un punto sinxelo de lembrar (como a rama `bugFix` ou o `HEAD`) e referenciar a partir de ahí.","","Os commits relativos son poderosos, pero agora imos presentar só dous formas sinxelas:","","* Moverse un commit por riba con `^`","* Mover unha cantidade de commits atrás con `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Votémoslle unha ollada o operador (^) primeiro. Cada vez que o engadimos a unha referencia, estaslle dicindo a commit que queres o pai de esa referencia.","",'Entón, dicir `main^` é equivalente a "o primeiro pai do `main`".',"","`main^^` é o avó (ancestral de segunda xeración) do `main`","","Imos facer checkout do commit que está enriba de main."],afterMarkdowns:["Boom! Ahí o tes. Moito máis rápido que por o hash do commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tamén podes usar o `HEAD` como parte dunha referencia relativa. Ímolo utilizar para nos mover uns commits cara arriba na árbore."],afterMarkdowns:["¡Chupado! Podemos viaxar cara atrás no tempo 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, fai checkout do commit pai de `bugFix`. Iso soltará o `HEAD`.","","¡Podes indicar o hash que queiras, pero intenta empregar as referencias relativas, é moito mellor!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 相对引用","","通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用 `git log` 来查查看提交记录的哈希值。","","并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`。舌头都快打结了吧...","","比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入`fed2` 而不是上面的一长串字符。"]}},{type:"ModalAlert",options:{markdowns:["正如我前面所说,通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!","","使用相对引用的话,你就可以从一个易于记忆的地方(比如 `bugFix` 分支或 `HEAD`)开始计算。","","相对引用非常给力,这里我介绍两个简单的用法:","","* 使用 `^` 向上移动 1 个提交记录","* 使用 `~` 向上移动多个提交记录,如 `~3`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["首先看看操作符 (^)。把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的 parent 提交。","","所以 `main^` 相当于“`main` 的 parent 节点”。","","`main^^` 是 `main` 的第二个 parent 节点","","现在咱们切换到 main 的 parent 节点"],afterMarkdowns:["搞定。这种方式是不是比输入哈希值方便多了?!"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你也可以将 `HEAD` 作为相对引用的参照。下面咱们就用 `HEAD` 在提交树中向上移动几次。"],afterMarkdowns:["很简单吧?!我们可以一直使用 `HEAD^` 向上移动。"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成此关,切换到 `bugFix` 的 parent 节点。这会进入分离 `HEAD` 状态。","","如果你愿意的话,使用哈希值也可以过关,但请尽量使用相对引用!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 相對引用","","如果要在 git 中移動,透過指定 commit 的 hash 值的方式會變得比較麻煩。在實際例子中,你的終端機上面不會出現漂亮且具備視覺效果的 commit tree,所以你不得不用 `git log` 來查詢 hash 值。","","另外,hash 值的長度在真實的 git 環境中很長。舉個例子,前一個關卡的介紹中的 commit 的 hash 值是 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`。舌頭不要打結了...","","幸運的是,git 對於處理 hash 值很有一套。你只需要提供能夠唯一辨識出該 commit 的前幾個字元就可以了。所以,我可以只輸入 `fed2` 而不是上面的一長串字元。"]}},{type:"ModalAlert",options:{markdowns:["我說過,透過 hash 值來指定 commit 不是很方便,所以 git 加入了相對引用。這個就很厲害了!","","使用相對引用,你可以從一個易於記憶的地方(比如說 branch 名稱 `bugFix` 或 `HEAD`)開始工作。","","相對引用非常好用,這裡我介紹兩個簡單的用法:","","* 使用 `^` 向上移動一個 commit","* 使用 `~` 向上移動多個 commit"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["首先看看插入(^)這一個符號。把這個符號接在某一個 reference 後面,就表示你告訴 git 去找到該 reference 所指向的 commit 的 parent commit。","",'所以 `main^` 相當於 "`main` 的 parent commit"。',""," `main^^` 是 `main` 的 grandparent commit(往前推兩代)","","切換到 main的 parent commit"],afterMarkdowns:["看吧!完成了。這種方式比輸入代表 commit 的 hash 值簡單多了!"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你也可以把 `HEAD` 當作相對引用。以下指令使用 `HEAD` 在 commit tree 中向上移動數次。"],afterMarkdowns:["簡單吧!我們可以一直使用 `HEAD^` 向上移動。"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,切換到 `bugFix` 的 parent commit。這會分離出 `HEAD`。","","如果你願意的話,透過直接指定 hash 值的方式也可以過關,但是還是試試看相對引用吧!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 相対リファレンス","","コミットのハッシュを利用してgitの中で移動するのも少し疲れる時もあります。現実の世界では、このチュートリアルのようにターミナルの隣に見やすいツリーのビジュアライズがないので、ハッシュを見るには`git log`を使う必要があります。","","その上、実際のハッシュはこちらで見たものよりずっと長いです。例えば、先ほどのレベルの紹介のコミットハッシュは`fed2da64c0efc5293610bdd892f82a58e8cbc5d8`です。少し覚えにくいですね...","","そのため、gitでは手短くコミットを指定する方法があります。ユニークな存在だと確認できるだけのハッシュの字数を入力すれば良いです -- 上記の長い文字列の代わりに`fed2`を入力するだけで済みます。"]}},{type:"ModalAlert",options:{markdowns:["先ほど言いましたように、ハッシュでコミットを指定するのがめんどくさくなる時もあるので、gitには相対リファレンスという素晴らしい機能があります。","","相対リファレンスを使うことで、覚えやすい位置(例えば`bugFix`ブランチや`HEAD`)から始め、そのところから相対的な位置を指定できます。","","相対コミットは強力ですが、ここでは二つをご紹介します:","","* 一つずつ上へ移動させる`^`(カレット)","* 複数回上へ移動させる `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["まずはカレット(^)から始めましょう。リファレンス名にカレットを追加すると、指定コミットの親コミットを見つけるようにとgitに命令を出しています。","",'なので `main^`と記述すれば、"`main`の一個上の親"、という意味になります。',"","そして`main^^`とはその親の一つの上のコミット(2代前の親)を指します。","","mainの上のコミットをここで見てみましょう"],afterMarkdowns:["やりました!コミットハッシュを書くよりずっと簡単ですね。"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`HEAD`を相対リファレンスとして参照することもできます。 ここで数回そのコマンドを使い、コミットツリーの中で上へと移動しましょう。"],afterMarkdowns:["簡単ですね!`HEAD^`で時間を巻き戻せます。"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、`bugFix`の親コミットをチェックアウトしてください。その操作により`HEAD`が分離されます。","","ハッシュを使用してもいいですが、その代わりに相対リファレンスを試してみましょう!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Относительные ссылки","","Передвигаться по дереву Git при помощи указания хешей коммитов немного неудобно. В реальной ситуации у вас вряд ли будет красивая визуализация дерева в терминале, так что придётся каждый раз использовать `git log`, чтобы найти хеш нужного коммита","","Более того, хеши в реальном репозитории Git намного более длинные. Например, хеш для коммита, который приведён в предыдущем уровне - `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Не очень просто для произношения =)","","Хорошая новость в том, что Git достаточно умён в работе с хешами. Ему нужны лишь первые несколько символов для того, чтобы идентифицировать конкретный коммит. Так что можно написать просто `fed2` вместо колбасы выше."]}},{type:"ModalAlert",options:{markdowns:["Как мы уже говорили, указание на коммит при помощи его хеша - не самый удобный способ, поэтому Git поддерживает относительные ссылки и они прекрасны!","","С относительными ссылками можно начать с какого-либо удобного места (например, с ветки `bugFix` или от HEAD) и двигаться от него","","Относительные ссылки - мощный инструмент, но мы покажем два простых способа использования:","","* Перемещение на один коммит назад `^`","* Перемещение на несколько коммитов назад `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Для начала рассмотрим оператор каретки (^). Когда мы добавляем его к имени ссылки, Git воспринимает это как указание найти родителя указанного коммита.","",'Так что `main^` означает "первый родитель ветки `main`".',"","`main^^` означает прародитель (родитель родителя) `main`","","Давайте переключимся на коммит Выше `main`"],afterMarkdowns:["Опачки! Готово. Сильно проще, чем поиск и указание хеша."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Можно также использовать `HEAD` как относительную ссылку. Попробуем пройти несколько раз назад по дереву коммитов"],afterMarkdowns:["Изи! Мы можем путешествовать во времени при помощи `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, переместись на первого родителя ветки `bugFix`. Это отделит `HEAD` от ветки.","","Конечно, можно указать хеш, но надо попробовать использовать относительные ссылки!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 상대 참조","","Git에서 여기저기 이동할 때 커밋의 해시를 사용하는 방법은 조금 귀찮습니다. 실제로 Git을 사용할 때는 터미널화면 옆에 예쁘장하게 커밋트리가 보이진 않으니까요. 매번 해시를 확인하려고 `git log` 명령어를 치고 있을 겁니다.","","나아가서, 실제 Git에서는 해시들이 훨씬 더 깁니다. 예를 들어 이전 레벨에 소개했던 커밋의 해시는 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`입니다. 쓰기 쉬워 보이진 않네요....","","다행히도, Git은 똑똑합니다. 해시가 커밋의 고유한 값임을 보여줄 수 있을 만큼만 명시해주면 됩니다. 위의 긴 문자열 대신 `fed2`만 입력해도 되는 겁니다."]}},{type:"ModalAlert",options:{markdowns:["말했듯이, 커밋들을 해시로 구분하고 사용하는것이 아주 편하다고 볼 수는 없습니다. Git의 상대 참조(Relative Ref)가 여기서 등장합니다. 굉장한 기능입니다.","","상대 참조로 우리가 기억할 만한 지점(브랜치 `bugFix`라던가 `HEAD`라던가)에서 출발해서 이동하여 다른 지점에 도달해 작업을 할 수 있습니다.","","상대 커밋은 강력한 기능인데, 여기서 두가지 간단한 방법을 소개하겠습니다.","","* 한번에 한 커밋 위로 움직이는 `^`","* 한번에 여러 커밋 위로 올라가는 `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["먼저 캐럿 (^) 연산자 부터 알아보겠습니다. 참조 이름에 하나씩 추가할 때마다, 명시한 커밋의 부모를 찾게 됩니다.","",'`main^`는 "`main`의 부모"와 같은 의미 입니다.',"",'`main^^` 는 "`main`의 조부모(부모의 부모)"를 의미합니다',"","main 위에 있는 부모를 체크아웃 해 봅시다."],afterMarkdowns:["Boom! 됐습니다. 커밋의 해시를 입력하는 것보다 훨씬 쉬운 방법입니다."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["또한 참조인 `HEAD`도 상대참조를 위해 사용할 수 있습니다. 커밋트리 위쪽으로 움직이기위해 여러번 사용 해 봅시다."],afterMarkdowns:["쉽군요! 이제 우린 `HEAD^`를 통해 시간을 거슬러 올라갈 수 있습니다."],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["이 레벨을 완료하기 위해서는, `bugFix`의 부모 커밋을 체크아웃 하십시오. 이렇게 하면 `HEAD`가 분리 될 것입니다.","","해시를 이용해서도 할 수 있지만, 상대 참조를 활용하는 것을 연습해 보세요!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Відносні посилання","","Пересуватися по гіту використовуючи хеш комітів може бути трохи напряжно. В справжньому гіті в тебе не буде візуалізації дерева комітів в терміналі, тому доведеться використовувати `git log` щоб подивится хеші комітів.","","Більше того, хеші як правило набагато довші в справжньому гіті. Типовий хеш виглядає як `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Без мнемонік не обійтися)...","","З іншого боку git дуже розумно працює з хешами. Він просить вказати рівно стільки літер, скільки потрібно щоб відрізнити один коміт від іншого. Отже, замість довгого хеша зверху можна просто набрати `fed2`."]}},{type:"ModalAlert",options:{markdowns:["Як було сказано, вказувати коміти за хешем не найзручніша річ, через це git підтримує відносні посилання. Вони реально круті!","","З відносними посиланнями ти можеш почати з якогось зручного місця (наприклад гілки `bugFix` чи посилання `HEAD`) й вказати потрібний коміт відносно цього посилання","","Відносні коміти є дуже потужним інструментом, але ми почнемо з двох простих прикладів:","","* Йдемо вверх на один коміт за допомогою `^`","* Йдемо вверх на кілька комітів за допомогою `~<число>`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Розберемось спочатку з оператором каретки (^). Кожна каретка додана до посилання (напр. до імені коміту) вказує git що потрібно знайти батька посилання до якого застосована каретка.","",'Тож `main^` тотожнє до "перший предок посилання `main`".',"","`main^^` це дідусь (предок другого покоління) посилання `main`","","Давайте перейдемо на коміт трохи вище від main:"],afterMarkdowns:["Бум! Готово. Трохи простіше ніж набирати хеш коміту"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ти також можеш використовувати `HEAD` з відносними посиланнями. Давай використаємо це щоб трошки піднятися по дереву."],afterMarkdowns:["Просто! Ми можемо переміщуватись назад в часі з `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень перемістись на першого предка гілки `bugFix`. Ти опинишся в стані `detach HEAD`.","","Ти, звичайно, можеш вказати хеш, але натомість спробуй користуватися відносними посиланнями!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham chiếu tương đối","","Dịch chuyển trong Git bằng cách chỉ định mã băm (hash) của commit cỏ vẻ hơi buồn tẻ. Trong đời thực thì sẽ không có mô tả Git trực quan ngay bên cạnh terminal của bạn đâu, nên nếu bạn muốn nhìn mã băm của commit thì phải dùng `git log` thôi.","","Hơn nữa, mã băm thực tế thường dài hơn rất nhiều. Ví dụ, mã băm của commit được giới thiệu trong phần trước là `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Đọc mà xoắn hết cả lưỡi...","","Được cái là Git cũng khá thông minh về mã băm. Chỉ cần cung cấp kí tự mã băm đủ để phân biệt với các commit khác. Cho nên tôi có thể đơn giản chỉ cần gõ `fed2` thay vì cái chuỗi dài ngoằng phía trên."]}},{type:"ModalAlert",options:{markdowns:["Như tôi đã nói, xác định commit bằng mã băm chẳng hề thuận tiện tẹo nào, đó là tại sao Git có những `tham chiếu tương đối`. Chúng rất tuyệt vời!","","Với tham chiếu tương đối, bạn có thể bắt đầu từ những nơi có thể ghi nhớ được (như là nhánh `bugFix` hoặc `HEAD`) và làm việc trên đó.","","Những commit tương đối (relative commits) rất mạnh mẽ, nhưng chúng tôi sẽ chỉ giới thiệu 2 loại đơn giản sau:","","* Dịch chuyển lên 1 commit mỗi lần với `^`","* Dịch chuyển lên nhiều commit mỗi lần với `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Xem thử cái dấu mũ (^) trước nào. Mỗi lần bạn nối nó với một cái tên tham chiếu, bạn đang ra lệnh cho Git tìm kiếm cha của một commit cụ thể.","",'Cho nên `main^` nghĩa là "cha đầu tiên của `main`".',"","`main^^` là ông nội (tổ tiên thế hệ 2) của `main`","","Thử nhảy sang commit trước main nào"],afterMarkdowns:["BÙUM! Đã xong. Đơn giản hơn gõ mã băm nhiều."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bạn cũng có thể dùng `HEAD` như là tham chiếu tương đối. Thử dùng nó để leo commit vài lần nào."],afterMarkdowns:["Game là dễ! Du hành ngược thời gian với `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, nhảy sang cha của `bugFix`. Tức là tháo `HEAD`.","","Nếu muốn thì bạn có thể dùng mã băm, nhưng thế thì còn gì vui nữa dùng tham chiếu tương đối đi!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relativne Reference","","Premikanje po Gitu z določanjem hashev commitov je lahko včasih nerodno. V praksi ne boš imel na voljo lepe vizualizacije drevesa zraven ukaznega terminala, zato boš moral uporabljati `git log`, da boš videl hashe.","","Hashi so ponavadi v praksi tudi veliko daljši. Naprimer, hash commita, predstavljenega v prejšnji stopnji, je `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Ni ravno preprosto za izgovoriti ...","","Pozitivna stran je, da je Git pameten glede hashev. Zahteva, da napišeš le toliko znakov hasha, da lahko prepozna unikaten commit. Tako lahko napišem `fed2`, namesto dolge verzije zgoraj."]}},{type:"ModalAlert",options:{markdowns:["Kot sem rekel, izbiranje commitov po njihovih hashih ni ravno najpriročnejša stvar na svetu, zato ima Git relativne reference. In te so super!","","Z relativni referencami lahko izhajaš iz nekje (npr. branch `bugFix` ali `HEAD`) in delaš od tam.","","Relativni commiti so močni in obsegajoči, ampak tu bomo predstavili dva preprosta:","","* Premikanje navzgor en commit naenkrat z `^`","* Premikanje navzgor n-krat z `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo najprej operator `^`. Vsakič, ko pripneš to imenu reference, poveš Gitu, naj najde starša tega commita.","",'Torej `main^` je isto kot "prvi starš brancha `main`".',"","`main^^` je stari starš (prednik druge generacije) `main`.","","Checkoutajmo sedaj commit nad masterjem."],afterMarkdowns:["Boom! Narejeno. Veliko enostavneje kot tipkanje hasha commita."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prav tako se lahko sklicuješ na `HEAD` kot relativno referenco. Uporabimo to nekajkrat, da se pomakenmo višje po drevesu commitov."],afterMarkdowns:["Enostavno! Lahko potujemo nazaj v čas z `HEAD^`."],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, checkoutaj starša commita `bugFix`. To bo ločilo `HEAD`.","","Hash lahko določiš, če želiš, ampak probaj raje z relativnimi referencami!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Referencje względne","","Poruszanie się w Gicie poprzez określanie haszy commitów może być trochę nudne. W prawdziwym świecie nie zobaczysz ładnej wizualizacji drzewa commitów obok swojego terminala (chyba, że używasz Forka lub TortoiseGita). Musisz użyć `git log`, aby zobaczyć hasze.","","Co więcej, hasze są zazwyczaj o wiele dłuższe w prawdziwym Gicie. Na przykład hash commita, który był na początku poprzedniego poziomu, to `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Spróbuj to przeczytać!","","Plusem jest to, że Git sprytnie radzi sobie z haszami. Wymaga jedynie podania tylu znaków hasza, ile potrzebuje, aby jednoznacznie zidentyfikować konkretny commit. Dlatego mogę wpisać jedynie `fed2` zamiast długiego łańcucha powyżej."]}},{type:"ModalAlert",options:{markdowns:["Jak już powiedzieliśmy, wybieranie commitów, używając ich hasza, nie jest najprzyjemniejszą rzeczą w życiu, dlatego Git ma referencje względne. Są niesamowite!","","Korzystając z referencji względnych, możesz zacząć od miejsca, które zapamiętasz (jak np. gałąź `bugFix` lub `HEAD`), i pracować stamtąd.","","Relatywne commity są potężne, ale pokażemy tu tylko dwie proste sytuacje:","","* Poruszanie się wstecz o jeden commit za pomocą `^`","* Poruszanie się wstecz o ileś commitów z `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spójrzmy najpierw na operator karety / daszek (^). Za każdym razem, gdy dodajesz go do referencji względnej, mówisz Gitowi, aby znalazł rodzica określonego commita.","",'Wpisując zatem `main^`, mamy na myśli "pierwszego rodzica z gałęzi `main`".',"","`main^^` to dziadek (przodek drugiego stopnia) gałęzi `main`.","","Zcheckoutujmy commit powyżej `main`:"],afterMarkdowns:["Tadam! Gotowe! O wiele łatwiej niż wpisując hasz commita."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Możesz również odwołać się do `HEAD` jako referencji względnej. Użyjmy tego kilka razy, aby przesunąć się w górę drzewa commitów."],afterMarkdowns:["Łatwizna! Możemy cofać się w czasie, używając `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, checkoutuj commita-rodzica z gałęzi `bugFix`. To spowoduje odczepienie `HEADa`.","","Możesz wybrać commita po haszu, jeżeli chcesz, ale spróbuj wykorzystać nowe umiejętności i użyć referencji względnej!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Riferimenti relativi","","Spostarsi in Git specificando l'hash dei commit può essere una scocciatura. Nella vita vera non avrai un bell'albero con tutti i commit sullo schermo, dovrai usare `git log` per vedere gli hash.","","Inoltre, gli hash sono solitamente molto più lunghi. Per esempio, l'hash del commit nel livello precedente è `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Non così semplice da ricordare...","","La nota positiva è che Git è furbo con gli hash. Richiede un numero di caratteri dell'hash tali da poter identificare in modo univoco il commit. Posso scrivere `fed2` invece dell'hash completo."]}},{type:"ModalAlert",options:{markdowns:["Come detto prima, specificare un commit tramite l'hash non è assolutamente il modo migliore, ragion per cui Git ha i riferimenti relativi. Sono stupendi!","","Tramite i riferimenti relativi, puoi partire da un punto facile da ricordare (per esempio dal ramo `bugFix` o `HEAD`) e procedere da lì.","","Questi riferimenti sono strumenti potenti, introduciamo i più semplici:","","* Risalire di un commit alla volta con `^`","* Risalire di tot commit alla volta con `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diamo un occhiata all'operatore (^) chiamato Caret o accento circonflesso. Ogni volta che lo aggiungi a un riferimento, stai dicendo a Git di cercare il genitore del commit specificato.","",'Quindi, dire `main^` è equivalente a dire "il primo genitore di `main`".',"","`main^^` è il nonno (antenato di seconda generazione) di `main`","","Selezioniamo il commit sopra main."],afterMarkdowns:["Colpito! Fatto. Mille volte meglio che scrivere l'hash."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Puoi considerare `HEAD` come un riferimento relativo. Usiamolo un paio di volte per risalire l'albero dei commit."],afterMarkdowns:["Facile! Possiamo viaggiare in dietro nel tempo con `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, seleziona il commit padre di `bugFix`. Questo provocherà una detached `HEAD`.","","Puoi usare l'hash se vuoi, ma prova a usare i riferimenti relativi!"]}}]}}}},{}],135:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main"},"bugFix":{"target":"C0","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":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C1","id":"HEAD"}}',solutionCommand:"git branch -f main C6;git checkout HEAD~1;git branch -f bugFix HEAD~1",startTree:'{"branches":{"main":{"target":"C4","id":"main"},"bugFix":{"target":"C5","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":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C2","id":"HEAD"}}',hint:{en_US:"You'll need to use at least one direct reference (hash) to complete this level",fr_FR:"Vous aurez besoin d'utiliser au moins une référence directe (hash) pour compléter ce niveau.",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",ja:"このレベルをクリアするには少なくとも一つの直接リファレンス(hash)を使用する必要があります",ru_RU:"Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень",ko:"이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다.",uk:"Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень",vi:"Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này",sl_SI:"Moral boš uporabiti vsaj eno direktno referenco (hash) za dokončanje te stopnje.",it_IT:"Dovrai usare almeno un riferimento diretto (hash) per completare questo livello",pl:"Aby ukończyć ten poziom, musisz użyć co najmniej jednej bezpośredniej referencji (hasza)."},name:{en_US:"Relative Refs #2 (~)",de_DE:"Relative Referenzen #2 (~)",ja:"相対リファレンス その2 (~)",es_AR:"Referencias relativas #2 (~)",es_ES:"Referencias relativas #2 (~)",es_MX:"Referencias relativas #2 (~)",pt_BR:"Referências relativas #2 (~)",gl:"Referencias relativas #2 (~)",fr_FR:"Références relatives #2 (~)",zh_CN:"相对引用2(~)",zh_TW:"相對引用二(~)",ru_RU:"Относительные ссылки №2",ko:"상대 참조 #2 (~)",uk:"Відносні посилання №2",vi:"Tham chiếu tương đối #2 (~)",sl_SI:"Relativne Reference #2 (~)",it_IT:"Riferimenti relativi #2 (~)",pl:"Referencje względne #2 (~)"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:['### The "~" operator',"","Say you want to move a lot of levels up in the commit tree. It might be tedious to type `^` several times, so Git also has the tilde (~) operator.","","","The tilde operator (optionally) takes in a trailing number that specifies the number of parents you would like to ascend. Let's see it in action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's specify a number of commits back with `~`."],afterMarkdowns:["Boom! So concise -- relative refs are great."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","You're an expert on relative refs now, so let's actually *use* them for something.","","One of the most common ways I use relative refs is to move branches around. You can directly reassign a branch to a commit with the `-f` option. So something like:","","`git branch -f main HEAD~3`","","moves (by force) the main branch to three parents behind HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see that previous command in action."],afterMarkdowns:["There we go! Relative refs gave us a concise way to refer to `C1` and branch forcing (`-f`) gave us a way to quickly move a branch to that location."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Now that you have seen relative refs and branch forcing in combination, let's use them to solve the next level.","","To complete this level, move `HEAD`, `main`, and `bugFix` to their goal destinations shown."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:['### El operador "~"',"","Digamos que querés moverte un montón de niveles atrás en tu árbol de commits. Podría ser tedioso tipear `^` muchas veces, por lo que git tiene el operador ~.","","","El operador ~ (opcionalmente) toma una cantidad que especifica la cantidad de padres que querés volver hacia atrás. Veámoslo en acción"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especifiquemos una cantidad de commits hacia atrás con `~`."],afterMarkdowns:["¡Boom! Bien conciso -- las referencias relativas la rompen."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forzando los branches","","Ahora que conocés todo sobre 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. Podés reasignar directamente una rama a un commit usando la opción `-f`. Así que algo como:","","`git branch -f main HEAD~3`","","Mueve (forzadamente) la rama main tres padres atrás de HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos ese comando previo en acción"],afterMarkdowns:["¡Ahí vamos! Las referencias relativas nos dieron 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 main 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, mové `HEAD`, `main` y `bugFix` a sus destinos finales."]}}]},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 main HEAD~3`","","Mueve (forzadamente) la rama main 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 main 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`, `main` y `bugFix` a sus destinos finales."]}}]},es_MX:{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 y por eso Git tiene el operador ~.","","","El operador ~ (opcionalmente) toma la cantidad especificada de padres que quieres volver hacia atrás. Veámoslo en acción"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especifiquemos una cantidad de confirmaciones hacia atrás con `~`."],afterMarkdowns:["¡Vientos! Genial -- las referencias relativas son lo mejor."],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 main HEAD~3`","","Mueve (forzadamente) la rama main 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 breve 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 main 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`, `main` y `bugFix` a sus destinos finales."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:['### O operador "~"',"","Digamos que você queira se mover vários níveis para cima na árvore de commits. Pode ser entediante digitar `^` várias vezes, e por isso o Git possui também o operador til (`~`).","","","Um número pode ser passado (opcionalmente) após o operador til, especificando o número de ancestrais que você deseja subir. Vamos vê-lo em ação"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos especificar um número de commits para trás com `~`."],afterMarkdowns:["Boom! Tão conciso -- referências relativas são incríveis."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forçando os ramos","","Agora que você é um especialista em referências relativas, vamos *usá-las* de fato para alguma coisa.","","Uma das situações mais comuns na qual eu uso referências relativas é quando quero trocar ramos de lugar. Você pode redefinir diretamente o commit para o qual um ramo aponta com a opção `-f`. Desta forma, o seguinte comando:","","`git branch -f main HEAD~3`","","Move (à força) o ramo main 3 ancestrais acima do HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos o comando anterior em ação"],afterMarkdowns:["Aqui vamos nós! As referências relativas nos deram uma forma concisa de nos referirmos ao `C1`, e a movimentação de ramos (com `-f`) nos deu uma forma de apontar rapidamente um ramo para esse local."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Agora que você viu referências relativas e movimentação de ramos combinadas, vamos usá-las para resolver o próximo nível.","","Para completar este nível, mova o `HEAD` e os ramos `main` e `bugFix` para os destinos mostrados no objetivo."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:['### O operador "~"',"","Digamos que queres moverte un montón de commits cara atrás nunha árbore de git. Sería moi tedioso escribir `^` moitas veces, e por iso que git tamén ten o operador (`~`).","","","Pódeselle pasar un número (opcionalmente) despois da tilde, especificando o número de commits que se quere mover cara atrás. Mira como é en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos especificar un número de commits cara atrás con `~`."],afterMarkdowns:["¡Veeeña! Ben apuntado -- as referencias relativas son a leche."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forzando as ramas","","Agora que eres un especialista en referencias relativas, imos *usalas* para algunha cousiña.","","Un dos usos máis comúns para o uso das referencias relativas é para movelas ramas de lugar. Ti podes reasignar directamente unha rama a un commit usando a opción `-f`. Así que con algo coma:","","`git branch -f main HEAD~3`","","Move (de forma forzosa) a rama main 3 commits enriba do HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos o comando anterior en acción"],afterMarkdowns:["¡Agora é o a nosa quenda! As referencias relativas nos darán unha forma concisa de nos referír a `C1`, e forzar a rama (con `-f`) deunos unha forma rápida de movela rama `main` a esa posición."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Xa viches as referencias relativas e o movemento de ramas combinadas, ímolas usar para resolver o próximo exercicio.","","Para completar este nivel, mova o `HEAD` e as ramas `main` e `bugFix` para os destinos mostrados no obxectivo."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:['### L\'opérateur "~"',"","Imaginons que vous souhaitiez remonter beaucoup de niveaux dans l'arbre des commits. Cela peut être ennuyeux d'utiliser `^` plusieurs fois, c'est pourquoi Git a aussi l'opérateur tilde (~).","","","L'opérateur tilde prend optionnellement à sa suite un nombre qui spécifie le nombre de parents que vous souhaitez remonter. Voyons cela en action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spécifions le nombre de commits en arrière avec `~`."],afterMarkdowns:["Boum ! Tellement rapide ! Les références relatives sont géniales."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forcer les branches","","Vous êtes maintenant un expert des références relatives, alors servons-nous en.","","L'une des principales raisons pour lesquelles j'utilise les références relatives est qu'elles permettent de réorganiser les branches. Vous pouvez directement réassigner les branches à un commit avec l'option `-f`. Ainsi la commande suivante :","","`git branch -f main HEAD~3`","","bouge (de force) la branche main à trois parents derrière HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons l'effet de la précédente commande."],afterMarkdowns:["On y est ! Les références relatives nous donnent une méthode concise pour référencer `C1` et le forçage de branche (`-f`) nous donne une méthode rapide pour déplacer une branche à cet emplacement."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Maintenant que vous avez vu les références relatives et le forçage de branche, utilisons-les pour résoudre le niveau suivant.","","Pour compléter ce niveau, bouger `HEAD`, `main`, et `bugFix` à leurs destinations désignées."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:['### Der "~"-Operator',"","Nehmen wir an, du willst viele Schritte im Commit-Baum zurückgehen. Dann wird es schnell mühsam immer wieder `^` einzugeben; deswegen gibt es in Git den Tilde-Operator `~`.","","Der Tilde-Operator akzeptiert optional eine Zahl, mit der du angeben kannst, wie viele Vorgänger du zurückgehen willst. Keine Anzahl anzugeben, bewirkt dasselbe wie `~1`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Geben wir mit `~` an, wie viele Commits wir zurückgehen wollen."],afterMarkdowns:["Peng! So einfach -- relative Referenzen sind super."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Erzwungene Branches","","Du bist jetzt Experte in Sachen relative Referenzen, also lass sie uns mal richtig einsetzen.","","Das Verschieben von Branches ist einer der häufigsten Anwendungsfälle dafür. Du kannst einen Branchnamen direkt auf einen bestimmten Commit setzen (_ohne_ ihn vorher ausgecheckt haben zu müssen!), indem du den Parameter `-f` benutzt. So in etwa:","","`git branch -f main HEAD~3`","","Das bewegt (erzwungenermaßen) den `main` auf den Commit drei Vorgänger vor `HEAD`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns das mal in Aktion an:"],afterMarkdowns:["Das war's schon! Relative Referenzen ermöglichen es uns den Commit `C1` sehr einfach anzugeben und `git branch -f` ermöglicht es uns, den Branch sehr schnell auf diesen Commit zu setzen."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Jetzt wo du relative Referenzen und erzwungenes Branching in Kombination gesehen hast können wir damit den nächsten Level bewältigen.","","Bewege `HEAD`, `main` und `bugFix` an die jeweils angegebenen Positionen, um diesen Level abzuschließen."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### “~”操作符","","如果你想在提交树中向上移动很多步的话,敲那么多 `^` 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 `~`。","","","该操作符后面可以跟一个数字(可选,不跟数字时与 `^` 相同,向上移动一次),指定向上移动多少次。咱们还是通过实际操作看一下吧"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们用 `~` 一次后退四步。"],afterMarkdowns:["多么的简洁 —— 相对引用就是方便啊!"],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### 强制修改分支位置","","你现在是相对引用的专家了,现在用它来做点实际事情。","","我使用相对引用最多的就是移动分支。可以直接使用 `-f` 选项让分支指向另一个提交。例如:","","`git branch -f main HEAD~3`","","上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在咱们来演示一下刚才的命令:"],afterMarkdowns:["这就对了! 相对引用为我们提供了一种简洁的引用提交记录 `C1` 的方式, 而 `-f` 则容许我们将分支强制移动到那个位置。"],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["既然你已经看过相对引用与强制移动分支的演示了,那么赶快使用这些技巧来挑战这一关吧!","","要完成此关,移动 `HEAD`,`main` 和 `bugFix` 到目标所示的位置。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:['### "~" 符號',"","假設需要在 commit tree 中向上移動多個 commit。使用太多 `^` 會非常討人厭,所以 Git 也加入了波浪(~)符號。","","","波浪符號後面可以選擇一個數字(你也可以不選擇),該數字可以告訴 Git 我要向上移動多少個 commit 。舉個例子"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用 `~` 一次往上移動多個 commit。"],afterMarkdowns:["哇!太簡潔了 -- 相對引用真的很好用!"],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","你現在是相對引用的高手了,現在用它來實際做點事情。","","我使用相對引用最多的就是移動分支。你可以使用 `-f` 選項直接讓分支指向另一個 commit。舉個例子:","","`git branch -f main HEAD~3`","","(強制)移動 main 指向從 HEAD 往上數的第三個 parent commit。"]}},{type:"ModalAlert",options:{markdowns:["要完成這一關,移動 `HEAD`,`main` 和 `bugFix` 到目標所示的位置。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:['###"~" 演算子',"","コミットツリーの中で複数の段階上へ移動したいとします。毎回毎回`^`と打つのは面倒くさくなるかもしれませんので、gitにはチルダの演算子も備わっています。","","","チルダ演算子のあとには、上へ移動したい親コミットの数を表す数字もオプションでつけられます。実際の動作を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["遡る前のコミット数を`~`で指定しましょう。"],afterMarkdowns:["よっしゃ!効率が良いですね -- 相対リファレンスはなんと便利です。"],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["###ブランチの強制","","今はあなたも相対リファレンスの達人なので、実践的な使い方を覚えましょう。","","相対リファレンスのよくある使い方としてあるのは、ブランチの移動です。`-f`オプションを使ってブランチを直接コミットに関連付けられます。次のようになります","","`git branch -f main HEAD~3`","","mainブランチを(強制的に)HEADより親三代前へと移動します。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["先ほどのコマンドの動作を見てみましょう。"],afterMarkdowns:["できました!相対リファレンスを使うことで、手短く`C1`を指定することができ、`-f`でブランチを強制的にそこへ移動することができました。"],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["相対リファレンスとブランチの強制関連付けを見ましたので、いまここでそれらの方法を使ってみましょう。","","このレベルをクリアするには`HEAD`、`main`、`bugFix`をゴールで指定されている目的位置まで移動してください。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:['### Оператор "~"',"","Предположим, нужно переместиться на много шагов назад по дереву. Было бы неудобно печатать `^` несколько раз (или несколько десятков раз), так что Git поддерживает также оператор тильда (~).","","","К тильде (опционально) можно добавить количество родительских коммитов, через которые нужно пройти. Посмотрим, как это работает."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Укажем после `~` число коммитов, через которые надо пройти."],afterMarkdowns:["Оп! Очевидно, относительные ссылки прекрасны."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Перемещение ветки (branch forcing)","","Теперь мы разбираемся в относительных ссылках, так что можно реально использовать их для дела.","","Одна из наиболее распространённых целей, для которых используются относительные ссылки - это перемещение веток. Можно напрямую прикрепить ветку к коммиту при помощи опции `-f`. Например, команда:","","`git branch -f main HEAD~3`","","Переместит (принудительно) ветку `main` на три родителя назад от `HEAD`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, как работает эта команда"],afterMarkdowns:["Вуаля! Относительная ссылка дала нам возможность просто сослаться на `C1`, а branch forcing (`-f`) позволил быстро переместить указатель ветки на этот коммит."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Мы рассмотрели относительные ссылки и branch forcing вкупе, так что теперь пришло время пройти следующий уровень.","","Чтобы пройти этот уровень, передвинь `HEAD`, `main` и `bugFix` так, как показано на визуализации."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:['### "~" 연산자',"","커밋트리에서 위로 여러 단계를 올라가고 싶을 수 있습니다. `^`를 계속 입력해서 올라가는것 말고 좋은 방법이 있습니다. Git 에는 틸드 (~) 연산자가 있습니다.","",""," (~) 틸드 연산자는 (선택적) 올라가고 싶은 부모의 갯수가 뒤에 숫자가 옵니다. 직접 확인해 보죠."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["돌아가고 싶은 커밋의 갯수를 `~`뒤의 숫자로 명시해 줍시다."],afterMarkdowns:["Boom! 아주 간결합니다. -- 상대 참조는 대단해요."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### 브랜치 강제로 옮기기","","이제 여러분은 상대 참조의 전문가 입니다. 이제 이걸로 무언가를 해봅시다.","","제가 상대 참조를 사용하는 가장 일반적인 방법은 브랜치를 옮길 때 입니다. `-f` 옵션을 이용해서 브랜치를 특정 커밋에 직접적으로 재지정 할 수 있습니다. 이런 식으로 말이죠:","","`git branch -f main HEAD~3`","","(강제로) main 브랜치를 HEAD에서 세번 뒤로 옮겼습니다. (three parents behind HEAD)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["방금의 커맨드를 직접 확인해 봅시다."],afterMarkdowns:["됐네요! 우리는 상대 참조를 통해 `C1`을 간결한 방법으로 참조할 수 있었고 브랜치 강제(`-f`)를 통해 브랜치를 저 위치로 빠르게 옮길 수 있었습니다."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["자 이제 상대 참조와 브랜치 강제의 조합을 봤으니 다음 레벨을 해결해 봅시다.","","이 레벨을 통과하기 위해서, `HEAD`와 `main`과 `bugFix`를 제시되는 골지점으로 옮겨 주십시오."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:['### Оператор "~"',"","Уявімо, що тобі потрібно піднятися досить високо вгору в дереві комітів. Було б трохи напряжно набирати `^` багато разів, тому Git також має оператор тильда(~).","","","До оператор тильда (не обов’язково) можна дописати справа число, що вказує на яку кількість предків потрібно піднятися вверх. Подивимось на практиці"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте вкажемо на яку кількість комітів повернутися з `~`."],afterMarkdowns:["Ка-бум! Так коротко -- відносні посилання прекрасні."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Форсуємо гілку","","Тепер ти експерт в відносних посиланнях, давай же *використаємо* їх для справи.","","Один з найуживаніших прийомів де я використовую відносні посилання це переміщення гілок. Ти можеш напряму переспрямувати бранч на якийсь коміт використавши опцію `-f` (force, тобто насильно). Щось на зразок:","","`git branch -f main HEAD~3`","","Переміщує (насильно) гілку main на три предки позад HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте подивимось на попередню команду в дії"],afterMarkdowns:["Ось і маєш! Відносні посилання дають нам зручний спосіб доступу до коміту `C1`, крім того форсування бранчів (`-f`) дає нам можливість швидко перемістити гілку на цей коміт"],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Тепер, коли ти побачив відносні посилання та форсування гілок в купі, давай використаємо це щоб пройти поточний рівень.","","Щоб пройти цей рівень, перемісти `HEAD`, `main` та `bugFix` так як показано в візуалізації."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:['### Toán tử "~"',"","Giả sử bạn muốn leo lên nhiều cấp trong Git. Dùng `^` vài lần thì tù lắm, nên Git đã có dấu ngã (~) cho việc đó.","","","Theo sau toán tử ngã (~) là số lượng cha ông mà bạn muốn leo lên (không bắt buộc). Xem thử làm thật thì thế nào nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy chỉ định số lượng commit với `~`."],afterMarkdowns:["BÙUM! Quá chuẩn luôn -- tham chiếu tương đối tuyệt vời."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","Giờ thì bạn là cao thủ về tham chiếu tương đối rồi, *làm* thật thôi chứ nhỉ.","","Tôi thì hay thường dùng tham chiếu tương đối để dịch chuyển nhánh. Bạn có thể trực tiếp gán lại nhánh cho commit với cú pháp `-f`. Kiểu như thế này:","","`git branch -f main HEAD~3`","","dịch chuyển (ép buộc) nhánh main lên 3 commit phía trên HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Xem thử cái lệnh trên hoạt động sao nào."],afterMarkdowns:["Đóóóó! Tham chiếu tương đối cho chúng ta một cách chuẩn xác để trỏ tới `C1` và ép nhánh bằng (`-f`) để dịch chuyển nhanh chóng nhánh tới đó."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Bây giờ khi bạn đã biết về các tham chiếu tương đối và ép buộc nhánh, hãy sử dụng chúng để giải quyết cấp độ tiếp theo","","Để hoàn thành cấp độ này, chuyển `HEAD`, `main`, và `bugFix` đến mục tiêu được xác định của chúng."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:['### Operator "~"',"","Recimo, da se želiš premakniti veliko stopenj višje po drevesu commitov. Malo je nerodno večkrat tipkati `^`, zato ima Git tudi tilda (~) operator.","","","Tilda operator (opcijsko) sprejme številko, ki določi, koliko staršev bi se rad povzpel po drevesu. Poglejmo to v praksi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Določimo število prejšnjih commitov z `~`."],afterMarkdowns:["Boom! Tako jedrnato -- relativne reference so super."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forcanje Branchev","","Sedaj si strokovnjak za relativne reference, zato jih končno *uporabimo* za nekaj.","","Eden izmed najpogostejših načinov, kjer uporabljam relativne reference je za premikanje branchev naokoli. Direktno lahko premakneš branch na nek commit z `-f` opcijo. Takole nekako:","","`git branch -f main HEAD~3`","","premakne (s force-om) main branch tri commite za HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si prejšnji ukaz v praksi."],afterMarkdowns:["Tako ja! Relativne reference so nam dale jedrnat način s katerim se lahko nanašamo na `C1` in branch force-anje (`-f`) nam je omogočilo, da hitro prestavimo branch na to lokacijo."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Sedaj ko smo si pogledali relativne reference in force branchanje v kombinaciji, uporabimo to, da rešimo naslednjo stopnjo.","","Za dokončanje te stopnje, premakni `HEAD`, `main` in `bugFix` na njihove ciljne prikazane destinacije."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:['### Operator "~"',"","Powiedzmy, że chcesz przejść o wiele poziomów wstecz na drzewie commitów. Wielokrotne wpisywanie `^` może być męczące. Na tę okazję Git ma również operator - tyldę (~).","","","Do operatora tyldy możesz (opcjonalnie) dodać numer, który określa, o jaką liczbę rodziców chcesz się cofnąć. Zobaczmy, jak to działa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Podajmy liczbę commitów, które chcemy przeskoczyć, za `~`."],afterMarkdowns:["Tadam! Ale szybko - referencje względne są czadowe."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forsowanie gałęzi","","Jesteś teraz ekspertem ds. referencji. *Wykorzystajmy* je do czegoś.","","Jednym z najczęstszych sposobów, w jaki korzystam z referencji względnych, są działania na gałęziach. Możesz bezpośrednio przypisać gałąź do commita za pomocą opcji `-f`. Na przykład tak:","","`git branch -f main HEAD~3`","","przenosi (na siłę) gałąź `main` trzy commity wstecz - za HEADa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak działa poprzednie polecenie."],afterMarkdowns:["Proszę bardzo! Referencje względne umożliwiły ci odnieść się w zwięzły sposób do `C1`, a forsowanie gałęzi (`-f`) pozwoliło na szybkie przeniesienie gałęzi w to konkretne miejsce."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Teraz, gdy wiesz już, jak połączyć referencje względne i forsowanie gałęzi, użyj ich do rozwiązania następnego poziomu.","","Aby ukończyć ten poziom, przenieś `HEAD`, `main` oraz `bugFix` do wskazanych celów."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:['### L\'operatore "~"',"","Nel caso in cui voglia risalire di più livelli l'albero dei commit, è una seccatura aggiungere `^` per ogni salto, per questo Git ha l'operatore tilde(~).","","","A questo operatore si può (facoltativamente) aggiungere un numero che specifica di quanti livelli si vuole risalire l'albero dei commit. Vediamolo in azione."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Specifichiamo il numero di commit con `~`."],afterMarkdowns:["Fatto! Breve ed efficace -- i riferimenti relativi sono stupendi."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forzatura dei rami (branch forcing)","","Ormai sei un esperto di riferimenti relativi, quindi facciamone realmente *uso* per qualcosa.","","Uno dei motivi più comuni per cui uso i riferimenti relativi è per spostare i rami. E' possibile assegnare un ramo a un commit con l'opzione `-f`. Per esempio:","","`git branch -f main HEAD~3`","","sposta (con la forza) il ramo main al terzo antenato di HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamolo in azione."],afterMarkdowns:["Ecco qua! I riferimenti relativi ci permettono facilmente di specificare `C1` e il branch forcing (`-f`) ci da modo di spostare rapidamente il ramo su quella posizione."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Ora che hai visto i riferimenti relativi e il branch forcing, usiamoli per completare il prossimo livello.","","Per completare questo livello, sposta `HEAD`, `main`, e `bugFix` alla loro destinazione finale mostrata nell'obiettivo."]}}]}}}},{}],136:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22main%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",compareOnlyBranches:!0,startTree:'{"branches":{"main":{"target":"C1","id":"main"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:{en_US:"Reversing Changes in Git",de_DE:"Änderungen in Git rückgängig machen",ja:"変更を元に戻す",fr_FR:"Annuler des changements avec Git",es_AR:"Revirtiendo cambios en git",es_ES:"Revirtiendo cambios en git",es_MX:"Revirtiendo cambios en Git",pt_BR:"Revertendo mudanças no Git",gl:"Revertindo cambios en git",ko:"Git에서 작업 되돌리기",zh_CN:"撤销变更",zh_TW:"在 git 中取消修改 ",ru_RU:"Отмена изменений в Git",uk:"Відміна змін в Git",vi:"Hoàn tác thay đổi trong Git",sl_SI:"Revertanje Sprememb v Gitu",it_IT:"Annullare i cambiamenti in Git",pl:"Odwracanie zmian w Gicie"},hint:{en_US:"Notice that revert and reset take different arguments.",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_MX:"Observa que revert y reset utilizan 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 使用的参数不同。",zh_TW:"注意 revert 和 reset 使用不同的參數。",ko:"revert와 reset이 받는 인자가 다름을 기억하세요",ja:"revertとresetとで引数が異なることに注意。",ru_RU:"Обрати внимание, что revert и reset принимают разные параметры.",uk:"Зверни увагу на те що revert та reset приймають різні параметри",vi:"Lưu ý rằng hoàn tác (revert) và đặt lại (reset) có những đối số khác nhau.",sl_SI:"Revert in reset sprejmeta različne argumente.",it_IT:"Revert e reset hanno parametri diversi.",pl:"Zauważ, że revert i reset przyjmują różne argumenty"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverses changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git moved the main branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'While resetting works great for local branches on your own machine, its method of "rewriting history" doesn\'t work for remote branches that others are using.',"","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action."],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the most recent commit on both `local` and `pushed`. You will revert two commits total (one per branch).","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you choose your methods."]}}]},es_AR:{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 esos a continuación",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` revierte los cambios moviendo la referencia de una rama hacia atrás en el tiempo a un commit anterior. En este sentido podés pensarlo 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 main 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 genial para ramas locales en tu máquina, su método de "reescribir la historia" no funciona para ramas remotas que utilizan otras personas.',"","Para revertir cambios y *compartir* esa _revertida_ con el resto, 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 usás revert, podés pushear ese cambio para compartirlo con otros."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, revertí el commit más reciente, 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."]}}]},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 main 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, revierte el commit más reciente, 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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Revirtiendo cambios en Git","","Hay varias maneras de revertir cambios en Git. Y tal como al confirmar, 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 se ve eso:"],afterMarkdowns:["¡Genial! git simplemente movió la referencia de la rama main 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 reiniciar (reset) 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, revierte el commit más reciente, 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:[{type:"ModalAlert",options:{markdowns:["## Revertendo Mudanças no Git","","Existem várias maneiras de reverter mudanças no Git. E assim como o ato de commitar, reverter mudanças no Git também tem um componente de baixo nível (a preparação, ou staging, de arquivos ou trechos de arquivos individuais) e um componente de alto nível (como as mudanças são, de fato, revertidas). Aqui vamos focar neste último ponto.","","Há duas maneiras principais de desfazer mudanças no Git -- uma delas é usando `git reset`, e a outra é usando `git revert`. Vamos olhar cada uma delas na próxima janela",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'O comando `git reset` reverte mudanças movendo para trás no tempo (para um commit mais antigo) a referência do ramo. Desta forma, você pode pensar nessa operação como uma "reescrita do histórico"; o `git reset` vai mover o ramo para trás como se o commit nunca tivesse existido.',"","Vejamos como funciona:"],afterMarkdowns:["Legal! O Git simplesmente moveu a referência do ramo main de volta para `C1`; agora o nosso repositório local está em um estado como se o `C2` nunca tivesse acontecido."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Embora o reset funcione muito bem em ramos locais no seu próprio computador, o método utilizado de "reescrever o histórico" não funciona com ramos remotos que outras pessoas estejam usando.',"","Para reverter mudanças e conseguir *compartilhar* essas mudanças com os outros, precisamos usar o `git revert`. Vejamo-lo em ação"],afterMarkdowns:["Estranho, um novo commit surgiu abaixo do commit que queríamos reverter. Isso é porque o novo commit `C2'` introduz *mudanças* -- acontece que as mudanças que ele introduz revertem exatamente aquelas do commit `C2`.","","Com o `revert`, você pode fazer `push` das suas mudanças para compartilhá-las com os outros."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, reverta o commit mais recente tanto em `local` como em `pushed`.","","Tenha em mente que `pushed` é um ramo remoto, e `local` é um ramo local -- isso deve ajudá-lo a escolher o método apropriado."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Revertindo cambios en Git","","Existen varias formas de revertir os cambios en git. E, como cando se fai commit, desfacer cambios supon unha operación de baixo nivel (a indexación de arquivos ou trozos de eles) e unha operación de alto nivel (desfacer os cambios xa aplicados). Aquí ímonos enfocar neste último punto.","","Hai dúas formas de desfacer os cambios en git -- unha delas é `git reset`, e a outra é usando `git revert`. Imos comparalas na próxima ventá.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'O comando `git reset` desfai os cambios movendo a referencia dunha rama cara un commit máis antigo na rama. Desta forma, podes pensar nesta operación como "reescritura do histórico"; o `git reset` vai movela rama cara atrás, como se ós commits nunca antes se fixeran.',"","Vexamos o seu funcionamento:"],afterMarkdowns:["¡Bye bye! Git moveu a referencia da rama main cara atrás, ata o commit `C1`; agora o teu repositorio local está coma se o commit `C2` nunca acontecera."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Mentres que resetear os cambios funciona xenial para as ramas locales na túa máquina, o método utilizado de "reescribir o histórico" non funciona con ramas remotas que outra xente usa.',"","Para revervir os cambios e *compartir* eses cambios ca outra xente, precisamos usar `git revert`. Atende a cómo funciona."],afterMarkdowns:["Estrano, xurdíu un novo commit por baixo do commit que queriamos desfacer. Iso é porque o novo commit `C2'` engadíu *cambios* -- o que pasa é que o commit desfai exactamente os cambios feitos no commit `C2`.","","Con `revert`, ti podes facer `push` dos teus cambios para compartilos cos outros."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, reverte o commit máis recente tanto en `local` como en `pushed`.","","Ten en mente que `pushed` é unha rama remota, e `local` é unha rama local -- Iso poida que te axude a aplicar o método apropriado."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Änderungen in Git rückgängig machen","","Es gibt viele Möglichkeiten, Änderungen in Git zurückzunehmen. Und ebenso wie das Committen hat auch das Rückgängigmachen eine Basis-Komponente (Dateien und Inhalte vormerken) und einen übergeordneten Aspekt (wie die Änderungen tatsächlich zurückgenommen werden). Dieses Level beschäftigt sich mit den übergeordneten Vorgängen.","","Es gibt grundsätzlich zwei Arten in Git etwas rückgängig zu machen -- einerseits `git reset` und andererseits `git revert`. Wir schauen uns beide mal an.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` nimmt Änderungen zurück, indem es eine Branch-Referenz auf einen anderen Commit setzt. Es ist ein bisschen (aber nicht wirklich) wie "Geschichte umschreiben"; `git reset` bewegt einen Branch auf einen anderen Commit, als hätte er nie anders ausgesehen.',"","Schauen wir, wie das aussieht:"],afterMarkdowns:["Schick! Git hat den `main` einfach auf `C1` gesetzt; unser lokales Repository sieht nun so aus, als hätte `C2` nie stattgefunden."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Obwohl `git reset` super im lokalen Kontext funktioniert, ist der Ansatz vom "Umschreiben" der Commit-Geschichte nicht geeignet für Branches, die auf einem Server liegen und auch von anderen benutzt werden.',"","Um Änderungen rückgängig zu machen und das mit anderen zu *teilen* müssen wir `git revert` benutzen. Schauen wir uns das in Aktion an."],afterMarkdowns:["Komisch, es ist ein neuer Commit entstanden. Das liegt daran, dass `C2'` genau die *Änderungen* enthält, die die Änderungen aus `C2` aufheben.","","Durch Reverten kannst du das Zurücknehmen von Änderungen mit anderen teilen."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level abzuschließen musst du sowohl auf `local` als auch auf `pushed` jeweils den letzten Commit zurücknehmen.","","Vergiss nicht, dass `pushed` auch auf einem Server liegt und `local` ein rein lokaler Branch ist -- das sollte dir helfen, die richtige Methode zu wählen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 変更を元に戻す","","Gitでは変更を元に戻す方法がたくさんあります。コミットと同じように、低レベルな動作(ファイル別だったりファイルの中の一部だったり)も高レベルな動作(変更のまとまりのキャンセル)もできます。このアプリケーションでは後者の方法について紹介します。","","基本的な巻き戻しの方法は2つあります -- 一つは`git reset`を使う方法で、もう1つは`git revert`を使う方法です。次のダイアログで一つ一つを見ていきます。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset`はブランチのポインタを後方に移動することで変更のキャンセルを実現します。履歴を上書きするような動作だと思うと良いでしょうか。`git reset`はそもそも前のコミットなんかなかったかのように、ブランチのポインタを元に戻してくれます。","","どういう感じか見てみましょう。"],afterMarkdowns:["いいですね!Gitは単純にmainブランチへのポインタを`C1`へ戻しました。これでこのローカルリポジトリにはまるで`C2`なんて無かったかのように変更をキャンセルできました。"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","自分のマシン上のブランチではさっきの`git reset`でうまくいきましたが、この「履歴を上書きする」手段は、他の人も使っているリモートにあるリポジトリに対しては使うことができません。","","変更を巻き戻して他の人とそれを共有するためには、`git revert`を使う必要があります。今度はこれを見てみましょう。"],afterMarkdowns:["あれ、おかしいな。巻き戻したいと思ってたコミットの下に新しいコミットが出来上がってしまったみたいです。そう、この新しい`C2'`コミットには`C2`コミットの内容を巻き戻す変更が含まれているのです。","","こんな風にして、巻き戻した内容を他人と共有するためにはrevertを使います。"],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["この章の仕上げに、`local`と`pushed`の両方の直近のコミットを巻き戻してみましょう。","","`pushed`はリモートのブランチで、`local`はローカルであることに注意。正しくコマンドを使い分けましょう。"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Annuler des changements avec Git","","Il y a de nombreuses façons d'annuler des changements avec Git. De même que pour les commits, annuler des changements avec Git est à la fois un aspect bas niveau (gestion des fichiers et morceaux de fichiers) et un aspect de plus haut niveau (comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.","","Il y a principalement deux façons d'annuler des changements avec Git : l'une est `git reset` et l'autre est `git revert`. Nous allons maintenant voir chacune d'entre elles.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset` annule des changements en déplaçant la référence en arrière dans le temps sur un commit plus ancien. En ce sens, on peut considérer cela comme une façon de \"réécrire l'histoire\"; `git reset` fait remonter une branche en arrière comme si le(s) commit(s) n'avai(en)t jamais eu lieu.","","Regardons à quoi cela ressemble :"],afterMarkdowns:["Bravo ! Git a simplement déplacé la référence de la branche main en la faisant revenir sur `C1`; désormais notre dépôt est dans le même état que si `C2` n'avait jamais eu lieu."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","Bien que le reset marche parfaitement pour les branches locales sur notre propre machine, cette façon de \"réécrire l'histoire\" ne marche pas avec les banches distantes (remote) que d'autres personnes utilisent.","","Pour pouvoir annuler des changements et *partager* ces annulations avec d'autres, nous devons utiliser `git revert`. Regardons comment cela fonctionne."],afterMarkdowns:["Étrangement, un nouveau commit est apparu en bas sous le commit que nous voulions annuler. C'est parce que ce nouveau commit `C2'` introduit des *modifications* -- celles qui correspondent justement à l'annulation de celles du commit `C2`.","","Avec revert, vous pouvez diffuser (push) vos modifications et les partager avec tout le monde."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, annulez les derniers commits à la fois sur `local` et sur `pushed`. Vous devez annuler en tout 2 commits (un pour chaque branche).","","Ayez à l'esprit que `pushed` est une branche distante et `local` est une branche locale ; cela devrait vous guider dans le choix de la méthode à employer."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 撤销变更","","在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。","","主要有两种方法用来撤销变更 —— 一是 `git reset`,还有就是 `git revert`。接下来咱们逐个进行讲解。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset` 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。`git reset` 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。","","让我们来看看演示:"],command:"git reset HEAD~1",afterMarkdowns:["漂亮! Git 把 main 分支移回到 `C1`;现在我们的本地代码库根本就不知道有 `C2` 这个提交了。","","(译者注:在reset后, `C2` 所做的变更还在,但是处于未加入暂存区状态。)"],beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","虽然在你的本地分支中使用 `git reset` 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!","","为了撤销更改并**分享**给别人,我们需要使用 `git revert`。来看演示:"],command:"git revert HEAD",afterMarkdowns:["奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 `C2'` 引入了**更改** —— 这些更改刚好是用来撤销 `C2` 这个提交的。也就是说 `C2'` 的状态与 `C1` 是相同的。","","revert 之后就可以把你的更改推送到远程仓库与别人分享啦。"],beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["要完成此关,分别撤销 `local` 分支和 `pushed` 分支上的最近一次提交。共需要撤销两个提交(每个分支一个)。","","记住 `pushed` 是远程分支,`local` 是本地分支 —— 这么说你应该知道用分别哪种方法了吧?"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 取消 git 的修改","","在 git 裡面取消修改的方法很多。和 commit 一樣,在 git 裡面取消修改同時具有底層的部份(暫存一些獨立的文件或者片段)和高層的部份(修改是如何被取消)。我們主要講的重點是後者。","","在 git 裡主要用兩種方法來取消修改,一種是 `git reset`,另外一種是 `git revert`。讓我們在下一個對話視窗中逐一瞭解它們。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` 把分支的參考點退回到上一個 commit 來取消修改。你可以認為這是在"重寫歷史"。`git reset` 往回移動 branch,原來的 branch 所指向的 commit 好像從來沒有存在過一樣。',"","讓我們來看看要怎麼操作:"],command:"git reset HEAD~1",afterMarkdowns:["太好了! Git 把 main branch 簡單地移回到 `C1`;現在在我們的 local 已經退回到沒有 commit 過 `C2` 的狀態了。"],beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","雖然在你的 local branch 中使用 `git reset` 很方便,但是這種「改寫歷史」的方法對別人的 remote branch 是無效的哦!","","為了取消修改並且把這個狀態*分享*給別人,我們需要使用 `git revert`。舉個例子"],command:"git revert HEAD",afterMarkdowns:["很奇怪吧!在我們要取消的 commit 後面居然多了一個新的 commit!這是因為新的 commit `C2'` 引入了*修改*——用來表示我們取消 `C2` 這個 commit 的修改。","","多虧了 revert,現在可以把你的修改分享給別人啦。"],beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,分別取消 `local` branch 和 `pushed` branch 上的最近的一次 commit。","","記住 `pushed` 是一個 remote branch,`local` 是一個 local branch,有了這麼明顯的提示應該知道要用哪種方法了吧?"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git에서 작업 되돌리기","","Git에는 작업한 것을 되돌리는 여러가지 방법이 있습니다. 변경내역을 되돌리는 것도 커밋과 마찬가지로 낮은 수준의 일(개별 파일이나 묶음을 스테이징 하는 것)과 높은 수준의 일(실제 변경이 복구되는 방법)이 있는데요, 여기서는 후자에 집중해 알려드릴게요.","","Git에서 변경한 내용을 되돌리는 방법은 크게 두가지가 있습니다 -- 하나는 `git reset`을 쓰는거고, 다른 하나는 `git revert`를 사용하는 것입니다. 다음 화면에서 하나씩 알아보겠습니다.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git 리셋(reset)","",'`git reset`은 브랜치로 하여금 예전의 커밋을 가리키도록 이동시키는 방식으로 변경 내용을 되돌립니다. 이런 관점에서 "히스토리를 고쳐쓴다"라고 말할 수 있습니다. 즉, `git reset`은 마치 애초에 커밋하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것입니다.',"","어떤 그림인지 한번 보죠:"],afterMarkdowns:["그림에서처럼 main 브랜치가 가리키던 커밋을 `C1`로 다시 옮겼습니다; 이러면 로컬 저장소에는 마치 `C2`커밋이 아예 없었던 것과 마찬가지 상태가 됩니다."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git 리버트(revert)","",'각자의 컴퓨터에서 작업하는 로컬 브랜치의 경우 리셋(reset)을 잘 쓸 수 있습니다만, "히스토리를 고쳐쓴다"는 점 때문에 다른 사람이 작업하는 리모트 브랜치에는 쓸 수 없습니다.',"","변경분을 되돌리고, 이 되돌린 내용을 다른 사람들과 *공유하기* 위해서는, `git revert`를 써야합니다. 예제로 살펴볼게요."],afterMarkdowns:["어색하게도, 우리가 되돌리려고한 커밋의 아래에 새로운 커밋이 생겼습니다. `C2`라는 새로운 커밋에 *변경내용*이 기록되는데요, 이 변경내역이 정확히 `C2` 커밋 내용의 반대되는 내용입니다.","","리버트를 하면 다른 사람들에게도 변경 내역을 밀어(push) 보낼 수 있습니다."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["이 레벨을 통과하려면, `local` 브랜치와 `pushed` 브랜치에 있는 최근 두 번의 커밋을 되돌려 보세요.","","`pushed`는 리모트 브랜치이고, `local`은 로컬 브랜치임을 신경쓰셔서 작업하세요 -- 어떤 방법을 선택하실지 떠오르시죠?"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Отмена изменений в Git","","Есть много путей для отмены изменений в Git. Так же как и коммит, отмена изменений в Git возможна и на низком уровне (добавление в коммит отдельных файлов и наборов строк), и на высоком (как изменения реально отменяются). Сейчас сфокусируемся на высокоуровневой части.","","Есть два основных способа отмены изменений в Git: первый - это `git reset`, а второй - `git revert`. Попробуем оба на следующем шаге.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` отменяет изменения, перенося ссылку на ветку назад, на более старый коммит. Это своего рода "переписывание истории"; `git reset` перенесёт ветку назад, как будто некоторых коммитов вовсе и не было.',"","Посмотрим, как это работает:"],afterMarkdowns:["Неплохо! Git просто перенёс ссылку на `main` обратно на коммит `C1`. Теперь наш локальный репозиторий в состоянии, как будто `C2` никогда не существовал."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","Reset отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи.","","Чтобы отменить изменения и поделиться отменёнными изменениями с остальными, надо использовать `git revert`. Посмотрим, как это работает"],afterMarkdowns:["Забавно, появился новый коммит. Дело в том, что новый коммит `C2'` просто содержит изменения, полностью противоположные тем, что сделаны в коммите `C2`.","","После `revert` можно сделать `push` и поделиться изменениями с остальными."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, отмени два последних коммита и в `local`, и в `pushed`","","Помни, что `pushed` - это remote ветка, а `local` - это локальная ветка. Это поможет выбрать способ отмены изменений."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Відміна змін в Git","","Є декілька шляхів відмини змін в Git. І так само як і коміти, зміни в гіт можна відміняти використовуючи або низькорівневі методи (додавання в коміт окремих файлів) так і високорівневі. Ми зосередемось на останніх.","","Є два основні шляхи відміни змін в Git -- перший це використовувати `git reset` й інший це `git revert`. В наступному слайді ми подивимося на кожний з них",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` відміняє зміни переміщуючи вказівник гілки назад в історії на старіший коміт. В принципі, можна вважати що це певне "переписування історії;" Коли `git reset` перемістить гілку назад буде здаватися, що відмінений коміт взагалі ніколи не створювався.',"","Давайте подивимося, як це виглядає:"],afterMarkdowns:["Чудово! Git перемістив посилання гілки main назад до `C1`; тепер наш локальний репозиторій в такому стані, наче коміту `C2` ніколи не було."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Команда reset чудово працює для локальних бранчів на власному комп’ютері, але так як вона спричиняє "переписування історії", її не можна використовувати в ситуації коли кілька користувачів працюють з цим бранчем',"","Для того щоб відкотити зміни й потім *поділитися* цими відкоченими змінами з друзями, потрібно використовувати `git revert`. Давай подивимось на прикладі"],afterMarkdowns:["Дивно, був створений новий коміт, нижче того коміту який ми хотіли відкотити. Це сталося тому що новий коміт `C2'` містить *зміни* які повністю протилежні змінам `C2`.","","Після revert, ти зможеш зробити push щоб поділитися гілкою з іншими."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень відміни два останні коміти на гілках `local` та `pushed`.","","Зауваж, що `pushed` це віддалена гілка, а `local` це локальна гілка -- це має допомогти з вибором методу."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Hoàn tác trong Git","","Có rất nhiều cách để hoàn tác thay đổi trong Git. Và cũng tương tự như commit, hủy thay đổi trong Git có cả thành phần bậc thấp (tạm thời lưu trữ một số tệp hoặc đoạn độc lập) và thành phần bậc cao (cách mà các thay đổi thực sự bị hủy). Ứng dụng của chúng tôi tập trung vào cái sau.","","Có 2 cách cơ bản để hủy thay đổi trong Git -- một là dùng `git reset`, hai là dùng `git revert`. Chúng ta sẽ xem xét từng cái trong hộp thoại sau",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` hoàn tác bằng cách chuyển tham chiếu của nhánh ngược lên commit cũ hơn. Bạn có thể hiểu nó như kiểu "viết lại lịch sử;" `git reset` sẽ dịch chuyển nhánh lên trên như thể commit chưa bao giờ được tạo ra vậy.',"","Cùng xem thử nó trông thế nào nào:"],afterMarkdowns:["Hay! Git chuyển tham chiếu của main trở lại `C1`; bây giờ kho lưu trữ trông như thể commit `C2` chưa bao giờ xảy ra vậy."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Trong khi git reset hoạt động rất tốt tại nhánh cục bộ trên máy cá nhân, cách thức "viết lại lịch sử" chẳng hề có tác dụng lên nhánh ở từ xa mà người khác sử dụng.',"","Để có thể hoàn tác và *chia sẻ* hoàn tác đó với người khác, thì ta cần sử dụng `git revert`. Xem thử cách thức nó hoạt động nào"],afterMarkdowns:["Lạ nhỉ, một commit mới được thả vào bên dưới commit mà ta muốn hoàn tác. Đó là bởi vì commit mới `C2'` này có chứa những *thay đổi* hoàn toàn ngược lại với những thay đổi trong commit `C2`.","","Dùng revert thì bạn có thể đẩy thay đổi mình lên và chia sẻ với người khác."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, hoàn tác commit gần nhất trên cả `local` và `pushed`. Bạn sẽ hoàn tác tổng cộng 2 commit (một trên mỗi nhánh).","","Nhớ rằng `pushed` là nhánh từ xa và `local` là nhánh cục bộ -- như thế thì bạn sẽ chọn được phương án phù hợp."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Revertanje Sprememb v Gitu","","Veliko načinov je, kako revertati (razveljaviti) spremembe v Gitu. In tako kot commitanje ima tudi revertanje sprememb v Gitu low-level komponente (stageanje posameznih datotek ali kosov) in high-level komponente (kako so spremembe dejansko povrnjene). Naša aplikacija se bo osredotočila na slednje.","","Obstajata dva glavna načina kako razveljaviti spremembe v Gitu -- prvi je uporaba `git reset` in drugi je uporaba `git revert`. V naslednjem dialogu si bomo pogledali oba pristopa.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` povrne spremembe tako, da prestavi referenco brancha na starejši commit. Lahko si predstavljaš kot "pisanje zgodovine na novo"; `git reset` bo prestavil branch nazaj, kot da se commiti sploh niso zgodili.',"","Poglejmo kako to izgleda:"],afterMarkdowns:["Lepo! Git je premaknil main branch referenco nazaj na `C1`; sedaj je naš lokalen repozitorij v stanju, kot da se `C2` sploh ni nikoli zgodil."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Medtem ko ponastavljanje z reset deluje super na lokalnih brancih na tvoji mašini, njegova metoda "prepisovanja zgodovina" ne deluje na remote brancih, ki jih uporabljajo drugi.',"","Če želimo ponastaviti spremembe in *deliti* te ponastavitve z drugimi, moramo uporabiti `git revert`. Poglejmo si to v praksi."],afterMarkdowns:["Čudno, nov commit se je naredil pod commitom, ki smo ga želeli reversati. To je zato, ker ta nov commit `C2'` uvede *spremembe* -- spremembe so pač v tem primeru točno nasprotne od `C2`.","","Z revertanjem lahko pushas in deliš svoje spremembe tudi z drugimi."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, povrni oba zadnja commita, tako na `local` kot na `pushed` brancih. Skupno boš revertal dva commita (enega na branch).","","Upoštevaj, da je `pushed` oddaljen branch in `local` lokalen branch -- to bi ti moralo pomagati izbrati metodo."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Odwracanie zmian w Gicie","","Istnieje wiele sposobów na odwrócenie zmian w Gicie. Podobnie jak w przypadku commitowania, odwracanie zmian w Gicie ma zarówno komponent niskopoziomowy (zapisywanie stanów plików lub ich fragmentów), jak i wysokopoziomowy (sposób, w jaki zmiany są faktycznie odwracane). Nasza aplikacja skupi się na tym ostatnim.","","Istnieją dwa podstawowe sposoby na cofnięcie zmian w Gicie - jeden z nich to `git reset`, a drugi `git revert`. W następnym oknie przyjrzymy się każdemu z nich.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` odwraca zmiany poprzez przesunięcie referencji gałęzi wstecz w czasie do starszego commita. Można myśleć o tym jako "przepisywaniu historii"; "resetowanie" spowoduje cofnięcie gałęzi, tak jakby commit nigdy nie został dodany.',"","Sprawdźmy, jak to działa:"],afterMarkdowns:["Nieźle! Git przeniósł referencję gałęzi `main` do `C1`; teraz nasze lokalne repozytorium jest w takim stanie, jakby commita `C2` nigdy nie było."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Mimo że resetowanie działa świetnie w przypadku lokalnych gałęzi na twoim komputerze, jego metoda "przepisywania historii" nie działa dla gałęzi zdalnych, które są używane przez innych.',"","W celu odwrócenia zmian i *podzielenia się* nimi z innymi, musimy użyć `git revert`. Zobaczmy, jak to działa."],afterMarkdowns:["Dziwne, nowy commit spadł poniżej tego, który chcieliśmy odwrócić. To dlatego, że ten nowy commit `C2'` wprowadza *zmiany* -- akurat takie, które idealnie odwracają commit `C2`.","","Dzięki `git revert` możesz wypchnąć swoje zmiany, by podzielić się nimi z innymi."],command:"git revert HEAD",beforeCommand:"git commit"}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Annullare i cambiamenti in Git","","Esistono molti modi per annullare i cambiamenti in Git. Come la creazione di commit, anche l'annullamento in Git ha sia una componente di basso livello (tracciatura dei singoli file o blocchi) e uno di alto livello (come l'annullamento viene realmente eseguito). La nostra applicazione si concentrerà su quest'ultima.","","Ci sono due modi principali per annullare con Git -- uno è usare `git reset` e l'altro è `git revert`. Entreremo nel dettaglio per entrambi.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` annulla le modifiche spostando il puntatore al ramo indietro nel tempo a un commit precedente. Puoi vederla come se stessi "riscrivendo la storia;" `git reset` torna al commit precedente come se il nuovo commit non fosse mai esistito.',"","Vediamone una rappresentazione:"],afterMarkdowns:["Grande! Git ha spostato il puntatore del ramo main the main sul commit `C1`; ora il nostro repository locale è come se non avesse mai avuto un commit `C2`."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Git reset funziona perfettamente in locale sul proprio computer, ma la funzione di "riscrivere la storia" non va d\'accordo con i rami salvati in remoto utilizzati da altri colleghi.',"","Per fare in modo di annullare e *condividere* con gli altri le modifiche annullate, dobbiamo usare `git revert`. Vediamolo in azione."],afterMarkdowns:["Strano, un nuovo commit è stato creato sotto il commit che volevamo annullare. Questo perché il nuovo commit `C2'` porta *cambiamenti* -- per l'esattezza i cambiamenti sono quelli che annullano il commit `C2`.","","Con git revert, aggiungi i cambiamenti che possono essere poi condivisi con altri."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, annulla i commit più recenti sia in `local` che in `pushed`. Alla fine annullerai due commit in totale (uno per ramo).","","Tieni presente che `pushed` è un ramo remoto e `local` è un ramo locale -- questo dovrebbe aiutarti a scegliere quale metodo usare."]}}]}}}},{}],137:[function(e,t,o){o.level={compareOnlyMainHashAgnostic:!0,disabledMap:{"git revert":!0,"git cherry-pick":!0},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase main bugFix;git rebase bugFix side;git rebase side another;git rebase another main",startTree:'{"branches":{"main":{"target":"C2","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Rebasing over 9000 times",de_DE:"10000 Rebases unter dem `HEAD`",es_AR:"Rebaseando más de 9000 veces",es_MX:"Rebaseando más de 8000... 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",ko:"9천번이 넘는 리베이스",ja:"9000回以上のrebase",zh_CN:"多次 Rebase",zh_TW:"N次Rebase",ru_RU:"Rebase over 9000 раз",uk:"Rebase over 9000 разів",vi:"Rebase hơn 9000 lần",sl_SI:"Več kot 9000 Rebaseov",it_IT:"Rebasing livello 8000",pl:"Rebase ponad 8000 razy"},hint:{en_US:"Remember, the most efficient way might be to only update main at the end...",de_DE:"Nicht vergessen: Nur den main zu aktualisieren könnte die effizienteste Möglichkeit sein ...",es_AR:"Acordate, la manera más eficiente podría ser actualizar main sólo al final...",es_MX:"Recuerda, la manera más eficiente podría ser actualizar main hasta el final...",es_ES:"Recuerda, la manera más eficiente podría ser actualizar main sólo al final...",pt_BR:"Lembre-se, a forma mais eficiente pode ser atualizar o main por último...",gl:"Lembra, a forma máis eficiente pode ser actualizar a rama main ó final...",fr_FR:"Rappelez-vous, la façon la plus efficace peut être de mettre à jour main seulement à la fin...",ja:"最も効率的なやり方はmainを最後に更新するだけかもしれない・・・",ko:"아마도 main을 마지막에 업데이트하는 것이 가장 효율적인 방법일 것입니다...",zh_CN:"记住,最后更新 main 分支可能是最高效的方法……",zh_TW:"要記住喔! 把 main branch 留到最後更新可能是最有效率的方法。",ru_RU:"Не забудь, что лучше всего сдвинуть мастер в самом конце...",uk:"Не забувай, що краще всього буде перемістити main в самому кінці... ",vi:"Hãy nhớ rằng, cách tốt nhất có thể là cập nhật nhánh `main` sau cùng...",sl_SI:"Pomni, morda je najbolj učinkovit način posodabljanje masterja samo na koncu ...",it_IT:"Ricorda, il modo migliore potrebbe essere di aggiornare il main alla fine...",pl:"Pamiętaj, że najskuteczniejszym sposobem może być aktualizacja `main` dopiero na samym końcu..."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto main.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, and so on, all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebaseando múltiples ramas","","Che, ¡hay un montón de ramas acá! Rebaseemos todo el trabajo de esas ramas sobre main.","","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 hacés líos en el camino, sentite libre de usar `reset` para empezar de nuevo. ¡Asegurate de verificar tu solución y ver si podés hacerla en alguna cantidad menor de commandos!"]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebaseando múltiples ramas","","Mira eso, ¡hay un montón de ramas aquí! Hagamos rebase de todo el trabajo de esas ramas hacia main.","","La alta dirección nos está haciendo las cosas un poco más complicadas -- 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í, todos en orden.","","Si te revuelves durante el camino, siéntete libre de usar `reset` para empezar de nuevo. ¡Asegúrate de verificar nuestra solución y ver si puedes lograrlo en un número menor de comandos!"]}}]},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 main.","","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 comandos!"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Fazendo rebase em múltiplos ramos","","Cara, temos um monte de ramos aqui! Vamos fazer um rebase de todo o trabalho contido nesses ramos para o main.","","No entanto, a cúpula da administração está tornando as coisas mais difíceis -- eles querem que os commits estejam todos em ordem sequencial. Isso significa que a nossa árvore final precisa ter o `C7'` por último, `C6'` acima disso, e assim por diante, tudo ordenado.","","Se você fizer besteira, sinta-se livre para usar o comando `reset` para recomeçar do zero. Depois lembre de olhar nossa solução do gabarito para ver se consegue resolver a tarefa usando menos comandos!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Fazendo rebase en múltiples ramas","","Neno, temos unha chea de ramas aquí! Imos facer rebase de todo o traballo contido nesas ramas para a main.","","A xente de administración estanos a facer as cousas complicadas, igual eles queren que os commits estén todos en orde secuencial. Isto significa que a nosa árbore final precisa ter `C7'` de último, `C6'` inda por riba, está por adiante, todo ordeado.","","Se te fas un lio polo camiño, síntete ceibe para usar o comando `reset` para comezar de cero outra vez. Despois lembra ollar a nosa solución para ver se consegues resolver a tarefa usando menos comandos!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebaser plusieurs branches","","Dis-donc, nous avons beaucoup de branches par ici ! Rebasons tout le travail de ces branches dans main.","","Les patrons rendent cela encore plus compliqué -- ils veulent que les commits soient faits de manière séquentielle. Cela signifie donc que dans votre arbre final `C7'` est tout en bas, `C6'` juste au-dessus, et ainsi de suite, dans cet ordre.","","Si vous faites une erreur en cours de route, n'hésitez pas à utiliser `reset` pour recommencer. Pensez à comparer votre solution à la nôtre et voyez si vous pouvez le faire en moins de commandes !"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Mehrere Branches rebasen","","Wow, wir haben hier ja eine Menge Branches! Lass uns mal die ganze Arbeit, die in diesen Branches steckt, auf den `main` packen, um sie auf Stand zu bringen.","","Die Führungsetage macht die Sache allerdings etwas trickreicher -- sie möchte, dass alle Commits in aufsteigender Reihenfolge geordnet sind. Das heißt unser fertiger Baum sollte `C7` ganz unten haben, darüber `C6` und so weiter und so fort.","","Wenn du irgendwo einen Fehler machst, benütze ruhig `reset` um wieder von vorne anzufangen oder `undo` um einen Schritt zurückzugehen. Schau dir die Lösung an und versuche es in weniger Schritten hinzubekommen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### 複数のブランチをリベースする","","さあ、いくつものブランチが出てきます。このブランチたち全てをmainブランチにリベースしましょう。","","おエライさん方が今回の仕事を少しトリッキーにしてくれました -- コミットはすべて一列の連続した状態にしてほしいそうです。つまり私たちが作るリポジトリの最終的なツリーの状態は、`C7'`が最後に来て、`C6'`がその一つ上に来て、、と順に積み重なるイメージです。","","試行錯誤してツリーが汚くなってきたら、`reset`コマンドを使ってツリーの状態を初期化してください。模範解答をチェックして、それよりも簡単なコマンドで済ませられるかどうかを考えるのも忘れずに!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 多分支 rebase","","哇,现在我们这里出现了很多分支呢!让我们把所有这些分支上所做的工作都通过 rebase 合并到 main 分支上吧。","","但是你的领导给你提了点要求 —— 他们希望得到有序的提交历史,也就是我们最终的结果应该是 `C6'` 在 `C7'` 上面, `C5'` 在 `C6'` 上面,依此类推。","","即使你搞砸了也没关系,用 `reset` 命令就可以重新开始了。记得看看我们提供的答案,看你能否使用更少的命令来完成任务!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["### rebase 多個 branch","","嗨!現在我們有很多 branch 了啦!讓我們做一下 rebase,將這些分支接到 main branch 上吧。","","但是你的主管找了點麻煩,他們希望得到有序的 commit history,也就是我們最終的結果是 `C7'` 在最下面,`C6'` 在它上面,以此類推。","","假如你搞砸了,沒有關係啦!你用 `reset` 就可以重新開始!記得看看我們提供的答案,看你是否能夠使用更少的指令完成這一關!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### 여러 브랜치를 리베이스(rebase)하기 ","","음, 여기 꽤 여러개의 브랜치가 있습니다! 이 브랜치들의 모든 작업내역을 `main` 브랜치에 리베이스 해볼까요?","","윗선에서 일을 복잡하게 만드네요 -- 그 분들이 이 모든 커밋들을 순서에 맞게 정렬하라고 합니다. 그럼 결국 우리의 최종 목표 트리는 제일 아래에 `C7'` 커밋, 그 위에 `C6'` 커밋, 또 그 위에 순서대로 보여합니다.","","만일 작업중에 내용이 꼬인다면, `reset`이라고 쳐서 처음부터 다시 시작할 수 있습니다. 모범 답안을 확인해 보시고, 혹시 더 적은 수의 커맨드로 해결할 수 있는지 알아보세요!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebase на нескольких ветках","","У нас тут куча веток! Было бы круто перенести все изменения из них в мастер.","","Но начальство усложняет нашу задачу тем, что желает видеть все коммиты по порядку. Так что коммит `С7'` должен идти после коммита `С6'` и так далее.","","Если что-то пойдёт не так – не надо стесняться использовать `reset`, чтобы начать всё с чистого листа. Постарайся сделать как можно меньше манипуляций!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Ребейсимо кілька гілок","","В нас тут до біса гілок! Перенесімо всі зміни з різних гілок в main.","","Але вище керівництво нам не полегшує життя -- вони хочуть, щоб всі коміти були впорядковані. Це означає, що в результаті коміт `C7'` має бути з самого низу, `C6'` трохи вище, і так далі, все за порядком.","","Якщо ти щось зробиш не так, сміливо використовуй `reset` щоб почати спочатку. Подивись на наш розв’язок і подумай, чи ти можеш обійтись меншою кількістю команд!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebase nhiều nhánh","","Giời ạ, sao mà nhiều nhánh thế không biết! Chuyển hết chúng vào `main` thôi.","","Nhưng mà cha quản lý lại muốn oái oăm hơn cơ -- hắn muốn tất cả commit xếp thẳng hàng. Nghĩa là cây lịch sử của ta sẽ có `C7'` ở cuối, phía trên là `C6'`, và cứ thế theo đúng thứ tự.","","Nếu mà nhỡ may bạn làm nhầm thì có thể dùng lệnh `reset` để bắt đầu lại. Hãy nhớ đối chiếu với đáp án của chúng tôi xem bạn có thể hoàn thành với ít câu lệnh hơn không!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Večih Branchev","","Uf, tu imamo pa res veliko branchev! Pojdimo in rebaseajmo vse delo iz teh branchev na main.","","Toda vodstvo se je odločilo, da le ne bo tako preprosto -- žeijo da so vsi commiti v zaporednem vrstnem redu. To pomeni, da bo naše ciljno drevo moralo imeti `C7'` na dnu, `C6'` nad njim, in tako dalje po vrsti.","","Če med reševanjem zamočiš, preprosto uporabi `reset`, da začneš znova. Poglej tudi našo rešitev in preveri, če lahko stopnjo rešiš še z manj ukazi!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebase wielu gałęzi","","Człowieku, ależ tu pełno gałęzi! Przenieśmy wszystkie prace z tych gałęzi na `main`.","","Kierownictwo trochę utrudnia sprawę -- chcą, aby wszystkie commity były w odpowiedniej kolejności. Oznacza to, że nasze końcowe drzewo powinno mieć `C7'` na dole, `C6'` powyżej i tak dalej.","","Jeśli po drodze namieszasz, nie krępuj się użyć `reset`, aby zacząć od nowa. Przeanalizuj nasze rozwiązanie i sprawdź, czy dasz radę to zrobić, używając mniejszej liczby poleceń!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Fare rebase con più rami","","Hey, qui abbiamo un bel po' di rami! Facciamo un po' di rebase di questi rami nel main.","","I piani alti ci stanno rendendo la vita complicata -- vogliono i commit tutti in ordine progressivo. Questo significa che alla fine il nostro albero avrà `C7'` come ultimo commit, `C6'` sopra di esso, e così via, tutto in ordine.","","Se ti smarrisci lungo la via, usa `reset` senza problemi per ripartire da capo. Assicurati di raggiungere l'obiettivo e cerca di farlo con il minor numero di comandi!"]}}]}}}},{}],138:[function(e,t,o){o.level={compareAllBranchesHashAgnostic:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22main%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22two%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout one; git cherry-pick C4 C3 C2; git checkout two; git cherry-pick C5 C4 C3 C2; git branch -f three C2",startTree:'{"branches":{"main":{"target":"C5","id":"main"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{ko:"브랜치 스파게티",en_US:"Branch Spaghetti",fr_FR:"Branche spaghetti",de_DE:"Branch-Spaghetti",es_AR:"Ensalada de branches",es_MX:"Espagueti de ramas",es_ES:"Ensalada de ramas",pt_BR:"Espaguete de ramos",gl:"Espaguete de ramas",ja:"ブランチスパゲッティ",zh_CN:"纠缠不清的分支",zh_TW:"branch 漿糊",ru_RU:"Спутанные ветки",uk:"Макарони з гілок",vi:"Nhánh rối như canh hẹ",sl_SI:"Špageti iz Branchev",it_IT:"Rami spaghettificati",pl:"Spaghetti gałęzi"},hint:{en_US:"Make sure to do everything in the proper order! Branch one first, then two, then three",fr_FR:"Faites attention à tout faire dans le bon ordre ! La première branche 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_MX:"¡Asegúrate de hacer las cosas en el orden correcto! Primero la rama uno, después la dos, y después la tres.",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を片付ける。",ko:"이 문제를 해결하는 방법은 여러가지가 있습니다! 체리픽(cherry-pick)이 가장 쉽지만 오래걸리는 방법이고, 리베이스(rebase -i)가 빠른 방법입니다",zh_CN:"确保你是按照正确的顺序来操作!先操作分支 `one`, 然后 `two`, 最后才是 `three`",zh_TW:"確認你是按照正確的順序來操作!先操作 branch `one`, 然後 `two`, 最後才是 `three`",ru_RU:"Убедись, что у нас всё по порядку! Сначала ветка `one`, потом `two` и только потом `three`",uk:"Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`",vi:"Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`",sl_SI:"Glej da boš vse opravil v pravilnem vrstnem redu! Najprej branch ena, nato pa dva in tri.",it_IT:"Assicurati di fare tutto nel giusto ordine! Prima il primo ramo, poi il secondo, poi il terzo",pl:"Upewnij się, że robisz wszystko w odpowiedniej kolejności! Gałąź pierwsza, potem druga, potem trzecia."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `main` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on main.","","Branch `one` needs a re-ordering of those commits and an exclusion/drop of `C5`. Branch `two` just needs a pure reordering of the commits, and `three` only needs one commit transferred!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branche spaghetti","","WOAHHHhhh ! Nous avons pas mal d'objectifs dans ce niveau.","","Actuellement nous avons `main` qui se situe quelques commits en avance par rapport aux branches `one` `two` et `three`. Pour une raison quelconque, nous avons besoin de mettre ces trois branches à jour avec les modifications des derniers commits sur main.","","La branche `one` a besoin d'une réorganisation et de la suppression de `C5`. `two` doit simplement être réordonnée, et `three` ne nécessite qu'un commit !","","Nous vous laissons imaginer la solution pour ce niveau; comparez avec notre solution après-coup avec la commande `show solution`. "]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ensalada de branches","","¡WOAHHHhhh Nelly! Tenemos un _pequeño_ objetivo al que llegar en este nivel.","","Tenemos un `main` que está algunos commits adelante de `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de main.","","La rama `one` necesita reordenarse, y eliminar `C5`. `two` necesita sólo reordenamiento, y `three` ¡sólo necesita un commit!","","Te vamos a dejar darte cuenta cómo resolver este -- asegurate de mirar la solución, después, usando `show solution`. "]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Espagueti de ramas","","¡Oh vaya! Tenemos un _pequeño_ objetivo al que llegar en este nivel.","","La rama `main` se encuentra algunos commits por delante de las ramas `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de main.","","La rama `one` necesita esos commits reordenados, y eliminar/excluir a `C5`. La rama `two` sólo necesita reordenarlos, y `three` ¡sólo necesita avanzar un commit!","","Vamos a dejar que averigues cómo resolver este -- asegúrate de revisar nuestra solución después, usando `show solution`. "]}}]},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 `main` 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 main.","","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:[{type:"ModalAlert",options:{markdowns:["## Espaguete de ramos","","Uhuuuuu Nelly! Temos um belo de um objetivo para alcançar neste nível.","","Temos aqui um `main` que está alguns commits atrás dos ramos `one`, `two` e `three`. Seja lá por qual razão, precisamos atualizar esses três outros ramos com versões modificadas dos últimos commits do main.","","O ramo `one` precisa de uma reordenação e da exclusão do `C5`. O `two` precisa apenas de reordenação. O `three` precisa de um único commit!","","Vamos deixar você descobrir como resolver esta tarefa -- mas não deixe de ver a nossa solução depois com o comando `show solution`. "]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Espaguete de ramas","","¡Íscalle lura! Temos un _pequeno_ obxectivo que acadar neste nivel.","","Temos aquí un `main` que está algúns commits por detrás das ramas `one`, `two` e `three`. Por algunha razón, precisamos atualizar esas tres ramas con versións modificadas dos últimos commits de main.","","A rama `one` precisa de unha reordenación, e votar fora a `C5`. O `two` precisa apenas de reordenacións. O `three` precisa dun único commit!","","Ímoste deixar resolver o problema por ti mesmo -- pero non deixes de ver a nosa solución, para eso escrebe `show solution`. "]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch-Spaghetti","","Puh! Wir haben ein ganz schön schweres Ziel für dieses Level.","","Wir haben hier einen `main`, der ein paar Commits weiter ist als die Branche `one`, `two` und `three`. Aus welchem Grund auch immer müssen wir diese drei anderen Branches mit modifizierten Versionen der paar letzten Commits von `main` aktualisieren.","","Branch `one` benötigt eine Umsortierung und `C5` muss gelöscht werden. `two` muss nur umsortiert werden und `three` braucht nur einen Commit!","","Ich lass dich diese Aufgabe selbst lösen -- schau dir hinterher auf jeden Fall die Lösung mit `show solution` an."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## ブランチスパゲッティ","","なんということでしょう。今回のレベルクリアのために、やることがたくさんあります。","","いま`main`が指しているコミットの数個前のコミットに、ブランチ`one`、`two`それから`three`があります。何か事情があって、これらの3つのブランチをmainが指している最新の状態に更新したいケースを考えます。","","ブランチ`one`に対しては、順序の変更と`C5`の削除が必要です。`two`では順序の変更のみ、`three`に対しては1回だけコミットすればOKです。","","`show solution`コマンドで模範解答を確認できますから、こちらも利用してください。 "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 纠缠不清的分支","","哇塞大神!这关我们要来点不同的!","","现在我们的 `main` 分支是比 `one`、`two` 和 `three` 要多几个提交。出于某种原因,我们需要把 `main` 分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。","","`one` 需要重新排序并删除 `C5`,`two` 仅需要重排排序,而 `three` 只需要提交一次。","","慢慢来,你会找到答案的 —— 记得通关之后用 `show solution` 看看我们的答案哦。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","哇塞大神!這關我們要來點不同的!","","現在我們的 `main` branch 是比 `one` `two` 和 `three` 這三個 branch 多了幾個 commit。由於某種原因,我們需要將 main 所新增的幾個 commit 套用到其它三個 branch 上面。","","`one` branch 需要重新排序和取消 `C5` 這一個 commit, `two` 需要完全重排,而 `three` 只需要再一個 commit。","","我們會讓你知道如何解決這個問題,之後請記得用 `show solution` 看看我們的答案喔。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 브랜치 스파게티","","음, 이번에는 만만치 않습니다!","","여기 `main` 브랜치의 몇 번 이전 커밋에 `one`, `two`,`three` 총 3개의 브랜치가 있습니다. 어떤 이유인지는 몰라도, main의 최근 커밋 몇 개를 나머지 세 개의 브랜치에 반영하려고 합니다.","","`one` 브랜치는 순서를 바꾸고 `C5`커밋을 삭제하고, `two`브랜치는 순서만 바꾸며, `three`브랜치는 하나의 커밋만 가져옵시다!","","자유롭게 이 문제를 풀어보시고 나서 `show solution`명령어로 모범 답안을 확인해보세요."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Спутанные ветки","","УОУ! В этом уровне придётся попотеть!","","У нас тут по несколько коммитов в ветках `one`, `two` и `three`. Не важно почему, но нам надо видоизменить эти три ветки при помощи более поздних коммитов из ветки `main`.","","Ветка `one` нуждается в изменении порядка и удалении `C5`. `two` требует полного перемешивания, а `three` хочет получить только один коммит","","Как пройти этот уровень – решать тебе, а как найдёшь решение – сравни его с нашим при помощи `show solution`."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Макарони з гілок","","Ооо Неля! Ну й завданнячко.","","Ми маємо гілку `main`, яка на кілька комітів попереду гілок `one`, `two` та `three`. З незрозумілих причин, нам потрібно оновити ці гілки більш пізніми змінами з мастеру.","","Гілку `one` потрібно впорядкувати і видалити `C5`. Гілку `two` також потрібно впорядкувати, а в гілку `three` потрібно додати ще один коміт!","","Ми повністю покладаємось на тебе -- порівняй свій розв’зок з нашим, який можна подивитись командою `show solution`. "]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh rối như canh hẹ","","Chààà, anh bạn! Thử thách lần này hơi khoai đây.","","Hiện tại thì nhánh `main` đang có trước vài commit so với các nhánh `one`, `two` và `three`. Vì một lý do nào đó, ta cần cập nhật những commit trên nhánh `main` lên các nhánh còn lại kèm với một vài điều chỉnh.","","Nhánh `one` cần sắp xếp lại commit và xóa commit `C5`, nhánh `two` chỉ cần sắp xếp commit, còn `three` thì cần chuyển đi một commit!","","Cố gắng động não tìm ra cách đi nhé -- khi bạn làm xong thì nhớ so sánh với đáp án của chúng tôi bằng lệnh `show solution`. "]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Špageti iz Branchev","","WOAHHHhhh Miško! Ta stopnja bo pa pravi izziv.","","Tu imamo `main`, ki je nekaj commitov pred branchi `one`, `two` in `three`. Iz neznanega razloga moramo posodobiti te tri druge branche z modificiranimi različicami zadnjih nekaj commitov na masterju.","","Branch `one` potrebuje prerazporeditev in izbris `C5`. `two` rabi samo prerazporeditev, `three` pa potrebuje samo en commit!","","Prepustili ti bomo, da sam ugotoviš, kako tole rešiti -- vseeno lahko na koncu preveriš našo rešitev s `show solution`. "]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Spaghetti gałęzi","","Łałałiła! Na tym poziomie mamy poważny cel do osiągnięcia.","","Mamy tutaj gałąź `main`, która jest kilka commitów przed gałęziami `one`, `two` i `three`. Z jakiegoś powodu musimy zaktualizować te trzy inne gałęzie zmodyfikowanymi wersjami ostatnich kilku commitów na main.","","Gałąź `one` wymaga zmiany kolejności i usunięcia `C5`. `two` potrzebuje wyłącznie zmiany kolejności, a `three` potrzebuje tylko przeniesienia jednego commitu!","","Samodzielnie zastanów się, jak rozwiązać to zadanie -- po wykonaniu go koniecznie sprawdź nasze rozwiązanie za pomocą `show solution`. "]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami spaghettificati","","Accidenti! C'è tanto da fare per raggiungere l'obiettivo questa volta.","","Qui abbiamo il `main` situato qualche commit più avanti rispetto ai rami `one` `two` e `three`. Per una qualche ragione, dobbiamo aggiungere questi altri tre rami con versioni aggiornate degli ultimi commit sul main.","","Il ramo `one` deve essere riordinato e il commit `C5` è da rimuovere. `two` deve essere riordinato, e `three` deve avere un solo commit!","","Tocca a te capire come farlo -- controlla la soluzione alla fine con il comando `show solution`. "]}}]}}}},{}],139:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git clone",name:{en_US:"Clone Intro",fr_FR:"Introduction à clone",de_DE:"Clone Einführung",ja:"Clone入門",es_AR:"Introducción a clone",es_MX:"Introducción a clone",es_ES:"Introducción a clone",pt_BR:"Introdução à clonagem",gl:"Introducción a clone",zh_CN:"Git Clone",zh_TW:"介紹 clone",ru_RU:"Введение в клонирование",ko:"Clone 소개",uk:"Знайомство з clone",vi:"Giới thiệu về clone",sl_SI:"Uvod v Git Clone",pl:"Wstęp do klonowania (clone)",it_IT:"Introduzione al clone"},hint:{en_US:"Just git clone!",fr_FR:"Simplement git clone !",de_DE:"Einfach git clone ausführen!",ja:"単にgit clone!",zh_CN:"只要 git clone 就可以了!",es_AR:"Simplemente hacé git clone!",es_MX:"Simplemente haz 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 就好了",ru_RU:"Простой git clone!",ko:"그냥 git clone 하세요!",uk:"Просто git clone!",vi:"Đơn giản là git clone!",sl_SI:"Preprosto samo git clone!",pl:"Po prostu git clone!",it_IT:"Semplicemente git clone!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Remote repositories aren't actually that complicated. In today's world of cloud computing it's easy to think that there's a lot of magic behind git remotes, but they are actually just copies of your repository on another computer. You can typically talk to this other computer through the Internet, which allows you to transfer commits back and forth.","","That being said, remote repositories have a bunch of great properties:","","- First and foremost, remotes serve as a great backup! Local git repositories have the ability to restore files to a previous state (as you know), but all that information is stored locally. By having copies of your git repository on other computers, you can lose all your local data and still pick up where you left off.","","- More importantly, remotes make coding social! Now that a copy of your project is hosted elsewhere, your friends can contribute to your project (or pull in your latest changes) very easily.","","It's become very popular to use websites that visualize activity around remote repos (like [GitHub](https://github.com/)), but remote repositories _always_ serve as the underlying backbone for these tools. So it's important to understand them!"]}},{type:"ModalAlert",options:{markdowns:["## Our Command to create remotes","","Up until this point, Learn Git Branching has focused on teaching the basics of _local_ repository work (branching, merging, rebasing, etc). However now that we want to learn about remote repository work, we need a command to set up the environment for those lessons. `git clone` will be that command.","","Technically, `git clone` in the real world is the command you'll use to create _local_ copies of remote repositories (from github for example). We use this command a bit differently in Learn Git Branching though -- `git clone` actually makes a remote repository out of your local one. Sure it's technically the opposite meaning of the real command, but it helps build the connection between cloning and remote repository work, so let's just run with it for now.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lets start slow and just look at what a remote repository looks like (in our visualization).",""],afterMarkdowns:["There it is! Now we have a remote repository of our project. It looks pretty similar except for some visual changes to make the distinction apparent -- in later levels you'll get to see how we share work across these repositories."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["To finish this level, simply `git clone` your existing repository. The real learning will come in following lessons."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Les dépôts distants (remote repositories) ne sont pas si compliqués que ça. Dans l'ère actuelle du cloud computing il est facile de croire qu'il y a un peu de magie derrière les branches distantes, mais elles sont en fait juste des copies de votre dépôt local sur un autre ordinateur. Vous pouvez donc vous connecter à cet ordinateur par Internet, ce qui vous permet de transférer les commits en retard et en avance.","","Cela dit, les branches distantes ont plusieurs propriétés puissantes :","","- Tout d'abord, le dépôt distant sert de sauvegarde ! Le dépôt local de Git a la capacité de restaurer des fichiers à un état précédent (comme vous le savez), mais toutes les informations sont stockées localement. En ayant des copies de votre dépôt Git sur d'autres ordinateurs, vous pouvez perdre vos données et toujours repartir de là où vous en étiez resté.","","- Plus important encore, les dépôts distants sociabilisent le projet ! Maintenant qu'il est hébergé quelque part ailleurs, vos amis peuvent y contribuer facilement (ou récupérer vos derniers changements).","","Il est devenu courant de visualiser l'activité sur dépôt distant via des sites internet (comme [GitHub](https://github.com/)), mais les dépôts distants servent _toujours_ de colonne vertébrale à ce système. Il est donc important de les comprendre !"]}},{type:"ModalAlert",options:{markdowns:["## Les commandes pour créer des dépôts distants","","Jusqu'à maintenant, Learn Git Branching s'est surtout concentré sur l'apprentissage des bases du travail sur un dépôt _local_ (branch, merge, rebase, etc). Cependant maintenant que nous voulons savoir comment travailler sur les dépôts distants, nous avons besoin d'une commande pour l'environnement de ces leçons. `git clone` sera cette commande.","","Techniquement, `git clone` dans le monde réel sera la commande que vous utiliserez pour créer des copies _locales_ des dépôts distants (de github par exemple). Nous utilisons cette commande un peu différemment dans Learn Git Branching car `git clone` crée ici un dépôt distant à partir de votre dépôt local. Il est vrai qu'il s'agit donc du sens opposé de la commande originale, mais cela aide à construire la connexion entre le clonage et le travail sur le dépôt distant, travaillons donc avec cela pour l'instant.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Commençons doucement et regardons à quoi ressemble un dépôt distant (dans notre visualisation).",""],afterMarkdowns:["Nous y sommes ! Maintenant nous avons un dépôt distant de notre projet. Cela ressemble fortement à ce que nous avons d'habitude, en dehors de quelques changements pour rendre compte des différences -- dans les niveaux suivants vous allez voir comment partager le travail entre ces dépôts."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, faites simplement un `git clone` du dépôt existant. Le réel apprentissage arrivera dans les prochaines leçons."]}}]},es_AR:{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 copadas:","","- Primero y principal, los remotos ¡son un genial backup! Los repositorios locales de git tienen la habilidad de restaurar archivos a un estado previo (como ya sabés), pero toda esa información está almacenada localmente. Al tener copias de tu repositorio git en otras computadoras, podés perder todos tus datos locales y aún así retomar de donde habías dejado.","","- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, cualquiera puede 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/)), 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 (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.",""]}},{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 hacé `git clone` de tu repositorio existente. El verdadero aprendizaje viene en las próximas lecciones."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Los repositorios remotos no son realmente _tan_ complicados. En el mundo actual de la computación en la nube es facil pensar que hay un montón de magia detrás de los git remotes, pero en realidad sólo son copias de tu repositorio en otra computadora. Típicamente vas a comunicarte con esta otra computadora a través de Internet, lo que te permite transferir commits de un lado a otro.","","Habiendo dicho eso, los repositorios remotos tienen un montón de propiedades geniales:","","- Primero y principalmente, los remotes ¡funcionan como un respaldo increible! 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 donde lo dejaste.","","- Más importante, ¡los remotes hacen más social la programación! Ahora que hay una copia de tu proyecto almacenada en otro lugar, tus amigos pueden contribuir a tu proyecto (u obtener los últimos cambios) de un modo muy sencillo.","","Se ha vuelto bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [GitHub](https://github.com/)), pero los repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"]}},{type:"ModalAlert",options:{markdowns:["## Nuestro comando para crear remotes","","Hasta este punto, Learn Git Branching se ha centrado en enseñar las bases del trabajo con repositorios _locales_ (manejo de ramas, mezclar, 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 (de GitHub, por ejemplo). Nosotros, en Learn Git Branching, lo usamos de un modo un poco diferente -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que técnicamente es lo opuesto al comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a seguir así por ahora.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Comencemos despacio y simplemente veamos cómo se ve un repositorio remoto en nuestro caso.",""],afterMarkdowns:["¡Ahí está! Ahora tenemos un repositorio remoto de nuestro proyecto. Se ve bastante similar, excepto por 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."]}}]},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/)), 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:[{type:"ModalAlert",options:{markdowns:["## Remotos no Git","","Repositórios remotos não são algo muito complicado. Nos dias atuais de computação em nuvem, seria fácil pensar que existiria muita mágica por trás dos remotos do Git, mas não é o caso -- eles são na verdade apenas cópias do seu repositório em outro computador. Você pode geralmente comunicar-se com esse outro computador por meio da Internet, o que permite que você transfira commits de um lado para o outro.","","Tendo dito isto, repositórios remotos tem uma série de propriedades interessantes:","","- Primeiro e antes de tudo, repositórios remotos servem como um ótimo backup! Repositórios Git locais possuem a habilidade de restaurar um arquivo para um estado anterior (como você sabe), mas toda a informação está guardada localmente. Tendo cópias do seu repositório Git em outros computadores, mesmo se você perder todos os seus dados locais, ainda terá como recomeçar do mesmo ponto de onde você tinha parado.","","- Ainda mais importante, repositórios remotos tornam o desenvolvimento uma atividade social! Agora que uma cópia do seu projeto está hospedada em outro lugar, seus amigos podem contribuir para o seu projeto (ou obter as suas últimas alterações) de uma forma bastante simples.","","Está se tornando bastante popular o uso de websites para visualizar a atividade em repositórios (como o [GitHub](https://github.com/)), mas o recurso de repositórios remotos _sempre_ serve como mecanismo base para essas ferramentas. Então é importante entender como ele funciona!"]}},{type:"ModalAlert",options:{markdowns:["## Nosso comando para criar remotos","","Até este ponto, o Learn Git Branching focou em ensinar o básico a respeito de trabalho em repositórios _locais_ (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como repositórios remotos funcionam, precisamos de um comando para configurar o ambiente para essas lições. Esse comando será o `git clone`.","","Tecnicamente, o `git clone` do mundo real é um comando que se usa para criar cópias _locais_ de repositório remotos (do GitHub para o seu computador, por exemplo). Todavia, por motivos logísticos, nós usaremos esse comando de uma forma um pouco diferente no Learn Git Branching -- aqui o `git clone` criará um repositório remoto a partir do repositório local. Certamente, esse comportamento é exatamente o oposto do comando real, mas apesar disso ele ajuda a formar a conexão mental entre a clonagem e a forma como repositórios remotos funcionam, então vamos usá-lo dessa forma mesmo por enquanto.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos começar devagar e apenas olhar como um repositório remoto se parece na nossa visualização.",""],afterMarkdowns:["Aqui está ele! Agora temos um repositório remoto do nosso projeto. Ele é muito parecido exceto por algumas mudanças visuais para tornar a distinção factível -- nas tarefas a seguir veremos como compartilhar trabalho entre esses repositórios."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, simplesmente chame o comando `git clone`. Você aprenderá algo de verdade somente nas próximas lições."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Repositorios remotos en Git","","Os repositorios remotos non son complicados en git. Actualmente ca computación na nube, pódese pensar que hai moita maxia tras os repositorios remotos de git, pero para nada é así -- en verdade son copias do repositorio, pero noutra máquina. Ti podes comunicarte xeralmente con esa outra máquina por medio de internet, o que permite que mandes commits de un repositorio cara o outro.","","Dito isto, os repositorios remotos teñen propiedades interesantes:","","- Primeiro e antes de todo, os repositorios remotos serven como unha copia de seguranza! Os repositorios locais posúen a habilidade de restaurar un arquivo nun estado anterior (como xa sabes), pero toda á información está gardada. Tendo copias do repositorio noutras máquinas, incluso poderías perder tódolos datos da túa computadora, e comenzar a traballar no punto onde o deixaches no último commit.","","- Máis importante aún, ¡os repositorios remotos fan que o desenvolvemento sexa social! Agora que existe unha copia do teu código noutro lugar, os teus amigos poden contribuír no teu proxecto (ou obter os últimos cambios) dunha forma moi simple.","","Hai webs moi populares onde se pode ver a actividade dos repositorios (como [GitHub](https://github.com/)), pero estes recursos remotos _sempre_ axudan como mecanismo de base para esas ferramentas. ¡Entón é importante saber cómo funcionan!"]}},{type:"ModalAlert",options:{markdowns:["## O noso comando para crear remotos","","Ata este punto, Learn Git Branching enfocouse en ensinar o básico respecto do traballo en repositorios _locais_ (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como os repositorios remotos funcionan, precisamos dun comando para configurar o entorno para esas leccións. Este comando será `git clone`.","","Técnicamente, `git clone` no mundo real é un comando que fai copias _locais_ de repositório remotos (de GitHub para a túa máquina, por exemplo). Todavía, por motivos loxísticos, nós usaremos ese comando dunha forma un pouco diferente, Learn Git Branching -- aquí `git clone` creará un repositorio remoto a partir do repositorio local. Certamente, ese comportamento é exactamente o oposto do comando real, pero a pesares de iso axudarate a formar unha conexión mental entre a clonación e como funcionan os repositorios remotos, entón imos usalo desa forma.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos comenzar a modo, e só ollar cómo un repositorio remoto semellase á nosa visualización.",""],afterMarkdowns:["¡Aquí o tes! Agora temos un respositorio remoto do noso proxecto. El é moi parecido exceto por algúns cambios visuais para ter a unha distinción visible -- nas tarefas a seguir veremos como compartir o traballo entre eses repositorios."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, escribe o comando `git clone`. Aprenderás algo de verdade sóamente nas próximas leccións."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","remote (遠端) repository 並不會很難了解. 藉由現在的雲端運算,可以很輕易地了解到在 git remote 裡面有很多有趣的事情,但它們其實其實就只是你的或者是其它電腦上的 repository 的副本。你可以輕易地透過網路去發送你的 commit 給其它的電腦。","","也就是說,remote repository 有很多有趣的地方:","","- 第一,remote 是用來備份的! 本地端的 git 有能力可以回復文件到前一個狀態 (你知道的),但是全部的資訊還是儲存在本地端。如果你在其它的電腦上面有你的 git repository 的副本,則你可以在資料不小心遺失的時候進行救援備份","","- 更重要的是, remote 讓大家一起來 coding!現在你的 project 放在 remote 上面,你的朋友可以很容易地對你的 project 做出貢獻(或者是 pull 你最後的修改) 。","","使用網站去對 remote repository 做視覺化非常流行(例如 [GitHub](https://github.com/) 或者是 [Phabricator](http://phabricator.org/)),但這背後最大的功臣是 remote repository,因此我們務必要了解它。"]}},{type:"ModalAlert",options:{markdowns:["## 我們去建立 remotes 的指令","","到目前為止,Learn Git Branching 著重在解釋本地端的工作(branching, merging, rebasing 以及其它指令), 但是我們現在想要學習針對 remote 的指令,我們需要一個指令去建立環境,`git clone` 就是我們需要的指令","","技術上來說, `git clone` 表示你想要把遠端的 repository 複製一份下來放在本地端( 例如從 github 複製)。 雖然 `git clone` 實際上是把遠端的 repository 複製下來放在本地端,在 Learn Git Branching 中,我們用的這個指令會有一點不同。雖然他跟真實的指令的意思相反,但是它可以建立起本地端以及遠端的一個連結,現在讓我們看看如何使用它吧。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們慢慢來,並且看看 remote repository 是長什麼樣子(在我們的視覺化圖形中)。",""],afterMarkdowns:["就是那樣!現在我們有了一個放置了我們 project 的 remote repository。除了一些視覺上的改變之外,它們看起來很像,在之後的關卡中你就會看到我們如何分享我們的工作到這些 repository 上面。"],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,只要打 `git clone,其它的學習會在後面的關卡中出現。"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 远程仓库","","远程仓库并不复杂, 在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝。你可以通过因特网与这台计算机通信 —— 也就是增加或是获取提交记录","","话虽如此, 远程仓库却有一系列强大的特性","","- 首先也是最重要的的点, 远程仓库是一个强大的备份。本地仓库也有恢复文件到指定版本的能力, 但所有的信息都是保存在本地的。有了远程仓库以后,即使丢失了本地所有数据, 你仍可以通过远程仓库拿回你丢失的数据。","","- 还有就是, 远程让代码社交化了! 既然你的项目被托管到别的地方了, 你的朋友可以更容易地为你的项目做贡献(或者拉取最新的变更)","","现在用网站来对远程仓库进行可视化操作变得越发流行了(像 [GitHub](https://github.com/)), 但远程仓库**永远**是这些工具的顶梁柱, 因此理解其概念非常的重要!"]}},{type:"ModalAlert",options:{markdowns:["## 我们创建远程仓库的命令","","直到现在, 教程都聚焦于**本地**仓库的操作(branch、merge、rebase 等等)。但我们现在需要学习远程仓库的操作 —— 我们需要一个配置这种环境的命令, 它就是 `git clone`。","从技术上来讲,`git clone` 命令在真实的环境下的作用是在**本地**创建一个远程仓库的拷贝(比如从 github.com)。 但在我们的教程中使用这个命令会有一些不同 —— 它会在远程创建一个你本地仓库的副本。显然这和真实命令的意思刚好相反,但是它帮咱们把本地仓库和远程仓库关联到了一起,在教程中就凑合着用吧。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们慢慢来,先看看远程仓库(在图示中)的样子。",""],afterMarkdowns:["就是它了! 现在我们有了一个自己项目的远程仓库。除了远程仓库使用虚线之外, 它们几乎没有什么差别 —— 在后面的关卡中, 你将会学习怎样在本地仓库和远程仓库间分享工作成果。"],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["要完成本关, 用 `git clone` 复制下你的仓库就可以了。后续的课程我们会正式地学习"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Entfernte Repositorys sind nicht weiter kompliziert. In dieser Welt des Cloud Computings könnte man vielleicht glauben, dass hinter entfernten Git-Repositorys eine Menge Magie steckt, aber es sind einfach nur Kopien eines Repositorys auf einem anderen Rechner. Du kannst mit diesem Rechner typischerweise über das Internet kommunizieren, was es dir ermöglicht Commits hin und her zu schicken.","","Nichts desto weniger haben entfernte Repositorys eine Menge toller Eigenschaften:","","- Vor allem: Sie sind ein super Backup! Lokale Git-Repositorys können deine Arbeitskopie in jeden beliebigen früheren Zustand versetzen (wie du ja weißt), aber all diese Informationen liegen eben bei dir lokal. Wenn es Kopien von deinem Repository auf anderen Rechnern gibt, kannst du ruhig all deine Daten verlieren und trotzdem genau da weitermachen, wo du aufgehört hast.","","- Noch wichtiger: Remotes geben dem Entwickeln eine soziale Komponente! Wenn eine Kopie deines Projekts woanders liegt, können deine Freunde sehr einfach etwas zu dem Projekt beitragen (oder sich deine neuesten Änderungen holen).","","Websites, die die Aktivitäten um diese entfernten Repositorys darstellen (wie [GitHub](https://github.com/)) erfreuen sich zunehmender Beliebtheit. Aber entfernte Repositorys sind _immer_ das Rückgrat für diese Werkzeuge. Deshalb ist es wichtig, sie zu verstehen."]}},{type:"ModalAlert",options:{markdowns:["## Der Befehl um ein Remote zu erstellen","","Bis jetzt hat sich Learn Git Branching darauf konzentriert, die Grundlagen der _lokalen_ Arbeit mit Repositorys zu vermitteln (Branche anlegen, zusammenführen, Rebasen etc). Jetzt wollen wir allerdings lernen mit entfernten Repositorys zu arbeiten und brauchen für die Level eine entsprechende Umgebung. Die schaffen wir mit `git clone`.","",'In der Realität ist `git clone` eigentlich der Befehl, mit dem du eine _lokale_ Kopie eines _entfernten_ Repositorys erstellst (das zum Beispiel auf GitHub liegt). Wir benutzen diesen Befehl in Learn Git Branching allerdings ein wenig anders -- hier macht `git clone` stattdessen eine Kopie von deinem lokalen Repository auf einem "entfernten Server". Klar, das ist eigentlich genau das Gegenteil von dem, was der echte Befehl macht, aber es hilft den Zusammenhang zwischen Cloning und der Arbeit mit entfernten Repositorys herzustellen, also machen wir\'s einfach so.',""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Fangen wir langsam an und schauen nur wie ein entferntes Repository in unserer Darstellung aussieht.",""],afterMarkdowns:["Da ist es! Jetzt haben wir ein entferntes Repository unseres Projektes. Es sieht so aus wie das lokale, nur mit ein paar Änderungen in der Darstellung -- in späteren Leveln wirst du sehen, wie man Änderungen zwischen den Repositorys austauschen kann."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Um diesen Level abzuschließen führ einfach `git clone` auf deinem bestehenden Repository aus. Alles weitere kommt in den nächsten Leveln."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitリモート","","リモートのリポジトリというのはそんなに複雑なものでもありません。クラウドコンピューティングが普及している現在の世界では、gitリモートの裏には何か不思議な仕組みが動いていると思いやすいのですが、実は別のコンピュータ上に保存されているあなたのリポジトリのコピーにすぎません。通常、インターネットを媒体に使って別のコンピュータと対話し、コミットを交互にやり取りすることができます。","","とはいえ、リモートリポジトリにはいくつかの素晴らしい特徴があります:","","- まず、リモートはバックアップの役割を果たします。ご存知の通り、ローカルのgitリポジトリは以前の状態にファイルを復帰する機能を持っているのですが、その情報はすべてローカルに保存されています。gitリポジトリを別のコンピュータにも保存することで、ローカルのデータがすべて失われたとしても、保存状態からコーディングを続けられます。","","- それよりも大切なこととして、リモートではコードをより一般的に公開できます!プロジェクトのコピーが別の場所に保存されているため、友達などが簡単にそのプロジェクトに参加したり最近の変更をpullしたりできます。","","最近ではリモートリポジトリに関するデータをビジュアル的に表示するウェブサイト([GitHub](https://github.com/)や[Phabricator](http://phabricator.org/)など)の使用が人気を集めていますが、リモートリポジトリは_そのいずれの_ウェブサイトの裏にも使われています。なので理解する必要があります。"]}},{type:"ModalAlert",options:{markdowns:["## リモートを作成するコマンド","","今までLearn Git Branchingでは_ローカル_リポジトリの様々な作業(branch, merge, rebaseなど)に焦点を当ててきました。しかし、これからはリモートリポジトリの作業を学びますので、レッスンのために環境をセットアップする必要があります。そのコマンドは`git clone`になります。","","通常、`git clone`はリモートリポジトリ(githubなどから)を_ローカル_にコピーする時に使います。しかしLearn Git Branchingでは少し違ったように使います -- ここでは`git clone`が_ローカルリポジトリ_をリモートにコピーします。本当のコマンドの逆の動作になっているのですが、学んでいくうちにcloneとリモートリポジトリのつながりが見えてくるはずです。なので、今はとりあえず例として使ってみましょう。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["最初の一歩として、ビジュアライズでリモートリポジトリを見てみましょう。",""],afterMarkdowns:["できました! プロジェクトのリモートリポジトリが保存されました。結構似ているのですが、その違いを明らかにするために少しだけビジュアルを工夫しました -- これからのレベルではこれらのリポジトリの間で作業をどう共有するか見ていきます。"],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、`git clone`で既存のリポジトリのクローンを作成します。次のレッスンでより詳細に見ていきます。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Удалённые репозитории в Git","","На самом деле удалённые репозитории в Git не так сложны, как кажутся на первый взгляд. Кажется, что в современном мире облачных вычислений под термином «удалённый репозиторий» подразумевается что-то сложное и загадочное. Однако, удалённые репозитории — это всего-навсего копии вашего репозитория, хранящиеся на другом компьютере. Обычно вы можете связываться с этим другим компьютером через Интернет, что позволяет вам передавать коммиты туда и сюда.","","Как уже было сказано, удалённые репозитории обладают рядом замечательных свойств:","","- В первую очередь, удалённые репозитории - это замечательное средство резервного копирования! Насколько вам известно, локальные репозитории способны восстанавливать файлы, используя предыдущие состояния, но вся эта информация хранится локально. Потеряв все свои локальные данные, вы способны восстановить их при наличии копии своего репозитория на другом компьютере.","","- Что ещё более важно, удалённые репозитории позволяют сделать процесс разработки более социальным! Теперь, когда копия вашего проекта размещена в другом месте, ваши друзья запросто могут внести свой вклад в ваш проект или забрать последние и актуальные изменения.","","Набирает популярность использование web-сайтов для визуализации активности удалённых репозиториев (например, [GitHub](https://github.com/)), однако удалённые репозитории _всегда_ выступают в качестве базы для таких инструментов. Поэтому так важно понимать, как устроены удалённые репозитории!"]}},{type:"ModalAlert",options:{markdowns:["## Наша команда для создания удалённого репозитория","","До настоящего момента мы были сфокусированы на изучении основ работы с _локальным_ репозиторием (ветвление, слияние, перемещение и т.д.). Однако теперь, когда мы хотим научиться работать с удалёнными репозиториями, нам нужны новые команды для настройки рабочей среды для этих упражнений. Такой командой нам послужит `git clone`","","Технически, `git clone` в реальной жизни - это команда, которая создаст _локальную_ копию удалённого репозитория (например, с GitHub). На наших занятиях в Learn Git Branching мы используем эту команду немного иначе - `git clone` создаёт удалённый репозиторий на основе вашего локального репозитория. На самом деле, это является полной противоположностью реальной команды, однако такой подход поможет нам наладить связь между склонированным и удалённым репозиторием. Давайте просто запустим эту команду.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте начнём постепенное изучение и взглянем на то, что собой представляет удалённый репозиторий (в нашем представлении).",""],afterMarkdowns:["Вот так! Теперь у нас есть удалённый репозиторий нашего проекта. Выглядит всё довольно одинаковым за исключением некоторых визуальных различий - в последующих уровнях вы увидите, как мы разделяем работу по этим репозиториям."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Чтобы завершить уровень, просто выполните `git clone` на своём существующем репозитории. Настоящее обучение появится в последующих уроках."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remote(원격)","","원격 저장소라는 것이 사실 그다지 복잡한 개념은 아닙니다. 오늘날의 클라우드 컴퓨팅을 떠올리면 git remote의 이면에 수많은 마법이 부려지고 있을 것 같지만, 사실 git remote 또 하나의 컴퓨터에 있는 여러분의 저장소의 복사본일 뿐입니다. 여러분은 일반적으로 인터넷을 통해서 이 또 하나의 컴퓨터와 커밋을 주고받는 등의 대화를 할 수 있습니다.","","소개한 김에 자랑까지 하자면 원격 저장소는 수많은 장점이 있습니다:","","- 무엇보다 먼저, 원격 저장소는 백업으로서의 역할을 훌륭하게 수행합니다! 로컬 git 저장소는 파일들을 이전의 상태로 되돌리는 기능을 가지고 있습니다(아시다시피). 하지만 그 모든 정보가 로컬(내 PC)에 저장되어 있습니다. 여러분의 git 저장소를 다른 컴퓨터가 복사본으로 가지고 있으면 로컬 데이터를 다 잃더라도 다른 컴퓨터에 남아있는 복사본으로 다시 출발 할 수 있습니다.","","- 더 중요한 것은, 원격 저장소를 통해 코딩을 다른 사람들과 함께 할 수 있다는 것입니다. 여러분의 프로젝트의 복사본이 어느 곳에선가 호스트되기 때문에 여러분의 친구가 프로젝트에 아주 쉽게 기여할 수 있게 됩니다(최근의 변화를 pull하거나).","","원격 저장소에서의 활동을 시각화해주는 웹 사이트들을 사용하는 것이 추세입니다. ([GitHub](https://github.com/) 또는 [Phabricator](http://phabricator.org/)등이 있습니다). 원격 저장소가 _항상_ 이러한 도구들의 중심 뼈대를 이루고 있습니다. 그래서 잘 아는 것이 중요해요!"]}},{type:"ModalAlert",options:{markdowns:["## 원격 저장소를 생성하는 명령어","","지금까지, Git 브랜치 배우기는 _로컬_ 저장소가 어떻게 활용되는지에 대해 중점적으로 소개해 왔습니다(브랜치, 합병, 리베이스 등등). 이제 원격 저장소를 어떻게 활용하는지에 대해 배워보려고 합니다. 앞으로 이어질 레슨의 환경을 마련할 명령어가 필요합니다. `git clone`이 바로 그 명령어입니다.","","실제로 `git clone`은 원격 저장소의 복사본을 _로컬_에 생성할때 사용하는 명령어입니다(github에서 가져올 때라던가). Git 브랜치 배우기에서는 이 명령어를 살짝 다르게 사용합니다 -- `git clone`이 당신의 로컬 저장소에서 원격 저장소를 생성해냅니다. 물론 실제 명령어와 반대로 작동하는 것이지만 클론과 원격 저장소 사이의 연결관계를 이해하는데 도움이되서 이렇게 했습니다. 일단은 그냥 해봅시다.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["천천히 시작해봅시다. 일단 원격저장소가 우리 시각화 자료에서 어떻게 보이는지부터 봅시다.",""],afterMarkdowns:["자! 이제 우리 프로젝트의 원격 저장소를 가지게 되었습니다. 구분을 하기위해 조금 모양이 다른것 말고는 둘이 똑같게 생긴걸 알 수 있습니다 -- 뒤의 레벨에서는 우리가 이 저장소들 사이에서 어떻게 작업을 공유하는지 알아보겠습니다."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["이 레벨을 통과하기 위해서 `git clone`을 입력하세요. 뒤의 레슨에서 더많은 것들을 배워볼 것입니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Віддалені репозиторії","",'Віддалені репозиторії не є дуже складними. В сучасному світі, де на кожному кроці можна зустріти "хмарні обчислення", може видатися, що концепція віддалених репозиторіїв є дуже складною, але насправді вони -- просто звичайні копії твого репозиторію на віддаленому комп’ютері. Зазвичай з цим віддаленим комп’ютером можна зв’язатися через інтернет, що дозволяє обмінюватись комітами.',"","Приймаючи до уваги все сказане вище, віддалені репозиторії мають купу чудових властивостей:","","- В першу чергу, віддалені сервери -- це завжди чудова резевна копія (бекап)! Локальний репозиторій дає можливість відкотитися до попереднього стану, але вся інформація зберігається локально. Маючи копії свого репозиторію на віддалених машинах, ти можеш пережити втрату жорсткого диску чи пошкодження данних і продовжити працювати з того місця, на якому закінчив.","","- Що не менш важливо, віддалені репозиторії роблять програмування соціальним! Коли копія твого проекту розміщена в мережі, твої друзі мають змогу допомогти твоєму проекту (чи стягнути останні зміни) без зайвих зусиль.","","Стало дуже популярним користуватися веб-сайтами, що візуалізують активність на віддалених репозиторіях (наприклад [GitHub](https://github.com/)), але віддалені репозиторії _завжди_ слугують як основа цих сервісів. Тому важливо розуміти їх!"]}},{type:"ModalAlert",options:{markdowns:["## Команда, що створює віддалені репозиторії","","До цього моменту, Learn Git Branching концентрувало увагу на основах роботи з _локальним_ репозиторієм (гілкування, злиття гілок, ребейс, тощо). Однак тепер, коли ми вчимо віддалені репозиторії, нам потрібно налаштувати середовище для подальших уроків. `git clone` впорається з цим завданням.","","В принципі, `git clone` в справжньому git -- це команда для створення _локальної_ копії віддаленого репозиторію (наприклад з github). Але у Learn Git Branching ми використовуватимемо цю команду по-іншому -- `git clone` буде створювати віддалений репозиторій з локального. Я згодний, що це виходить трохи догори-дригом, але це допоможе створити зв’язок в голові між клонуванням та роботою з віддаленми репо, тому поки що будемо використовувати її таким чином.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Низький старт - просто подивімося, як віддалений репозиторій виглядає (в нашій візуалізації).",""],afterMarkdowns:["Ось і все! Тепер ми маємо віддалений репозиторій нашого проекту. Він виглядає досить схоже, хіба що деякі візуальні елементи інші, щоб краще показати різницю -- в наступних рівнях ти навчишся ділитися роботою між цими репозиторіями."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, просто зроби `git clone` свого поточного репозиторію. Справжні знання ти отримаєш в подальших рівнях."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes (Kho lưu trữ từ xa)","","Thực ra thì kho chứa từ xa cũng không khó hiểu lắm đâu. Giờ đây, đâu đâu cũng thấy điện toán đám mây nên ai ai cũng tưởng git remote nó là cái gì đó ma thuật lắm, nhưng chúng thực ra chỉ là những bản sao chép kho chứa của bạn lên máy tính khác. Bạn có thể giao tiếp với chúng qua internet, từ đó mà chuyển giao commit qua lại.","","Vì lẽ đó mà kho chứa từ xa có những đặc tính tuyệt vời:","","- Trước hết, có tác dụng như là bản sao dự phòng! Bạn đã biết rằng kho cục bộ có thể khôi phục trở lại trạng thái trước đó, nhưng tất cả thông tin đó chỉ được lưu trữ cục bộ. Bằng cách sao chép toàn bộ kho chứa của bạn lên máy tính ở xa, một khi dữ liệu trong máy tính bị mất, bạn vẫn có thể tiếp tục làm việc như chưa có gì xảy ra.","","- Quan trọng hơn nữa, kho chứa từ xa khiến lập trình có tính cộng đồng hơn! Bây giờ bản sao dự án của bạn đã được lưu trữ ở nơi khác, bạn bè của bạn có thể đóng góp (hoặc kéo về cập nhật mới nhất) dự án của bạn rất dễ dàng.","","Trực quan hóa các kho lưu trữ từ xa bằng cách sử dụng các trang web đang trở nên phổ biến hơn (như [GitHub](https://github.com/)), nhưng các kho lưu trữ từ xa _luôn luôn_ là trụ cột của các công cụ này, vì vậy điều quan trọng là phải hiểu khái niệm này!"]}},{type:"ModalAlert",options:{markdowns:["## Câu lệnh của chúng tôi để tạo kho lưu trữ từ xa","","Cho đến bây giờ, Học Nhánh Git đã tập trung dạy về làm việc trên kho chứa _cục bộ_ (rẽ nhánh `branch`, hợp nhánh `merge`, dịch chuyển nhánh `rebase`,...). Nhưng bây giờ ta lại muốn học về làm việc trên kho lưu trữ từ xa, ta cần một câu lệnh để cài đặt môi trường cho những bài học này. Đó là `git clone`.","","Về mặt kỹ thuật, thì `git clone` thực tế là câu lệnh dùng để tạo một bản sao chép _cục bộ_ của kho chứa từ xa (ví dụ từ GitHub chẳng hạn). Nhưng trong Học Nhánh Git ta sẽ dùng câu lệnh này hơi khác biệt một chút -- `git clone` sẽ tạo ra một bản sao chép lên kho lưu trữ từ xa dựa trên kho chứa cục bộ của bạn. Điều này hoàn toàn ngược lại với câu lệnh thực tế, nhưng nó giúp ta nhân bản và làm việc với kho lưu trữ từ xa, nên ta sẽ dùng nó trong quá trình học.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào cùng khởi động bằng cách nhìn xem kho lưu trữ từ xa trông như thế nào (trong mô tả của chúng tôi).",""],afterMarkdowns:["Nó đây rồi! Giờ ta đã có kho lưu trữ dự án từ xa. Nhìn nó cũng khá tương tự chỉ là được minh họa khác biệt một chút -- đến các cấp độ sau ta sẽ tìm hiểu thêm về cách thức trao đổi nội dung giữa các kho chứa này."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này chỉ cần đơn giản gõ lệnh `git clone` để sao chép kho chứa hiện tại. Ta sẽ học sâu hơn ở các bài học sau."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Oddaljeni Git","","Oddaljeno repozitoriji sploh niso tako zakomplicirani. V današnjem svetu oblačnih storitev si lahko kdo predstavlja, da je veliko čarovnije za oddaljnim Gitom, a gre preprosto za tvoj repozitorij na drugem računalniku. Ponavadi lahko komuniciraš s tem računalnikom preko interneta, ki ti omogoča da prenašaš commite naprej in nazaj.","","Poleg tega imajo oddaljeni repozitoriji tudi veliko super lastnosti:","","- Prvič, oddaljenost služi za odlično rezervo! Lokalni git repozitoriji imajo možnost obnovitve datotek v prejšnje stanje (kot že veš), ampak vse te informacije so shranjene lokalno. S tem da imaš shranjene kopije gita na drugih računalnikih, lahko izgubiš vse tvoje lokalne podatke, pa imaš še zmeraj opcijo nadaljevati, kjer si ostal.","","- Še pomembneje, kodiranje lahko naredijo družabno! Sedaj, ko je kopija tvojega projekta nekje objavljena, lahko tvoji prijatelji pomagajo tvojemu projektu (ali pridobijo zadnje spremembe) zelo enostavno.","","Uporaba strani, ki vizualizirajo oddaljene repozitorije je postala zelo popularna (npr. [GitHub](https://github.com/)), ampak bistvo teh strani vseeno predstavljajo oddaljeni repozitoriji. Zato je pomembno, da jih razumemo!"]}},{type:"ModalAlert",options:{markdowns:["## Naši ukazi za kreiranje oddaljenih repozitorijev","","Do te točke, se je Learn Git Branching osredotočil na učenje osnov dela na lokalnih repozitorijih (branching, merging, rebasing, itd). Ampak sedaj, ko se hočemo naučiti še o delu na oddaljenih repozitorijih, potrebujemo ukaz, da postavi okolje za te lekcije. `git clone` bo ta ukaz.","","Tehnično je `git clone` v pravem svetu ukaz, ki ga boš uporabil za ustvarjanje lokalnih kopij oddaljenih repozitorijev (iz githuba naprimer). Mi uporabljamo ta ukaz nekoliko drugače na Learn Git Branching -- `git clone` ubistvu naredi oddaljen repozitorij iz tvojega lokalnega. Seveda, tehnično je nasproten pomen pravega ukaza, ampak pomaga ustvariti povezavo med kloniranjem in delom na oddaljenem repozitoriju, zato ga zdaj pač uporabljajmo.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Začnimo počasi in poglejmo kako izgleda oddaljen repozitorij (v naši vizualizaciji).",""],afterMarkdowns:["Evo ga! Sedaj imamo oddaljen repozitorij našega projekta. Izgleda precej podoben razen nekaj vizualnih sprememb, da se opazi razlika -- v kasnejših stopnjah boš spoznal, kako si delimo delo preko teh repozitorijev."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, uporabi `git clone` na svojem obstoječem repozitoriju. Pravo učenje pride v lekcijah, ki sledijo."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zdalny Git","","Zdalne repozytoria nie są w rzeczywistości bardzo skomplikowane. W dzisiejszym, działającym w chmurze, świecie łatwo jest uznać, że za zdalnym Gitem kryje jakaś wielka magia, ale w rzeczywistości są to tylko kopie twojego repozytorium na innym komputerze. Zazwyczaj możesz połączyć się z nim przez internet, co umożliwia przesyłanie commitów tam i z powrotem. ","","Ale oczywiście zdalne repozytoria mają kilka świetnych właściwości:","","- Przede wszystkim zdalne repozytoria służą jako świetna kopia zapasowa! Lokalne repozytoria Git (jak już wiesz) mają możliwość przywracania plików do poprzedniego stanu, ale wszystkie te informacje są przechowywane lokalnie. Mając kopie repozytorium Git na innych komputerach, nawet jeśli stracisz wszystkie swoje dane lokalne, i tak możesz kontynuować pracę od tego samego miejsca.","","- Co ważniejsze, zdalne repozytoria sprawiają, że kodowanie jest społeczne! Teraz, gdy kopia twojego projektu jest umieszczona gdzie indziej, twoi znajomi mogą bardzo łatwo wnieść swój wkład do twojego projektu (lub pobrać najnowsze zmiany).","","Bardzo popularne stało się korzystanie ze stron internetowych, które wizualizują aktywność w zdalnych repozytoriach (takich jak [GitHub](https://github.com/)), ale podstawą tych narzędzi _zawsze_ są zdalne repozytoria. Dlatego ważne jest, aby je zrozumieć!"]}},{type:"ModalAlert",options:{markdowns:["## Polecenia do tworzenia zdalnych repozytoriów","","Do tego momentu kurs Learn Git Branching skupiał się na nauczaniu podstaw pracy z repozytoriami _lokalnymi_ (branch, merge, rebase itp.). Jednak teraz, gdy chcemy dowiedzieć się więcej o pracy ze zdalnym repozytorium, potrzebujemy polecenia, aby skonfigurować środowisko tych lekcji. Tym poleceniem będzie `git clone`.","","Technicznie rzecz biorąc, `git clone` w prawdziwym świecie jest poleceniem, którego będziesz używać do tworzenia _lokalnych_ kopii zdalnych repozytoriów (na przykład z GitHuba). Używamy tego polecenia nieco inaczej w Learn Git Branching -- `git clone` faktycznie tworzy repozytorium zdalne z lokalnego. Jasne, jest to technicznie odwrotne znaczenie prawdziwego polecenia, ale pomaga zrozumieć zależność między klonowaniem a pracą na zdalnym repozytorium, więc na razie zobaczmy, jak to wygląda w działaniu.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zacznijmy powoli i spójrzmy tylko, jak wygląda zdalne repozytorium (w naszej wizualizacji).",""],afterMarkdowns:["No i jest! Teraz mamy zdalne repozytorium naszego projektu. Wygląda dość podobnie, z wyjątkiem pewnych wizualnych zmian pomagających odróżnić je od lokalnego -- na kolejnych poziomach zobaczysz, jak udostępniamy pracę w tych repozytoriach."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, po prostu wpisz `git clone` na swoim repozytorium. Czas na prawdziwą naukę przyjdzie w kolejnych lekcjach."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remoto","","I repository remoti non sono così tanto complicati. Nell'odierno mondo del cloud computing è facile pensare che vi sia una sorta di magia dietro i remote di git, ma in effetti sono solo copie del tuo repository in un altro computer. Puoi comunicare con quest'altro computer tramite Internet, consentendoti di trasferire commit dall'uno all'altro.","","Detto ciò, i repository remoti hanno diverse proprietà interessanti:","","- Prima di tutto, un repository remoto può servire come backup! Con i repository git locali si possono riportare file ad uno stato precedente (come sai), ma tutte le informazioni sono memorizzate localmente. Avendo copie del tuo repository git in altri computer, tu potresti perdere tutti i tuoi dati locali e riprenderli da dove avevi interrotto.","","- Seconda cosa, ancora più importante, l'utilizzo di repository remoti introduce al coding sociale! Ora che una copia del tuo progetto è ospitata anche altrove, i tuoi amici possono contribuire al tuo progetto molto agevolmente (o recuperare le tue ultime modifiche) .","","E' diventato molto popolare l'utilizzo di siti web che mostrano le attività di repository remoti (come [GitHub](https://github.com/)), ma questi repository _sempre_ rappresentano la base sottostante per questi strumenti. Per cui è importante conoscerli a fondo!"]}},{type:"ModalAlert",options:{markdowns:["## I nostri comandi per creare repository remoti","","Finora, Learn Git Branching si è focalizzato nell'insegnare le basi del lavoro _locale_ sui repository (creazione di rami, fusione, rebasing, etc). Tuttavia, ora che vogliamo esplorare il lavoro con i repository remoti, abbiamo bisogno di un comando per impostare l'ambiente per tali lezioni. Questo comando sarà `git clone`.","","Tecnicamente, `git clone` nel mondo reale è il comando che userai per creare copie _locali_ di repository remoti (da github per esempio). In Learn Git Branching, però, useremo questo comando in modo leggermente diverso -- `git clone` creerà un repository remoto a partire da quello tuo locale. E' chiaro che questo è il significato tecnicamente opposto del comando reale, ma questo aiuta nel costruire la connessione tra il cloning e il lavoro sui repository remoti, quindi per ora lo utilizzeremo così.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Partendo lentamente, esaminiamo come un repository remoto appare nella nostra visualizzazione.",""],afterMarkdowns:["Eccolo! Ora abbiamo un repository remoto del nostro progetto. Appare molto similie eccetto per qualche modifica nella visualizzazione per far notare la distinzione -- nei successivi livelli vedrai come condividere il lavoro tra questi repository."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, semplicemente esegui `git clone` nel tuo repository esistente. Il succo dell'apprendimento avverrà nelle prossime lezioni."]}}]}}}},{}],140:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C5","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C3","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C4":{"parents":["C1"],"id":"C4"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C5":{"parents":["C3","C4"],"id":"C5"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git clone;git fakeTeamwork 2;git commit ;git pull",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Faking Teamwork",fr_FR:"Simulation du travail d'équipe",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:"模拟团队合作",zh_TW:"模擬團隊合作",ru_RU:"Коллективная работа",uk:"Симуляція колективної роботи",ko:"가짜 팀워크",vi:"Giả lập làm việc nhóm",sl_SI:"Lažno Ekipno Delo",pl:"Symulacja pracy zespołowej",it_IT:"Simulare il lavoro di squadra"},hint:{en_US:"Remember you can specify the number of commits to fake",fr_FR:"Rappelez-vous que vous pouvez spécifier le nombre de commits à simuler",de_DE:"Nicht vergessen, du kannst angeben wie viele 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:"记住你可以指定仿真提交的个数",zh_TW:"你要記得指定要送多少個 commit 出去",ru_RU:"помните, Вы можете указать количество фейковых коммитов",uk:"пам’ятай що ти можеш вказати кількість фейкових комітів",ko:"가장할 커밋의 갯수를 조절할 수 있습니다.",vi:"Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập",sl_SI:"Spomni se, da lahko določiš število lažnih commitov.",pl:"Pamiętaj, że możesz określić liczbę symulowanych commitów",it_IT:"Tieni a mente che puoi specificare il numero di commit da simulare"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulating collaboration","","So here is the tricky thing -- for some of these upcoming lessons, we need to teach you how to pull down changes that were introduced in the remote.","",'That means we need to essentially "pretend" that the remote was updated by one of your coworkers / friends / collaborators, sometimes on a specific branch or a certain number of commits.',"","In order to do this, we introduced the aptly-named command `git fakeTeamwork`! It's pretty self explanatory, let's see a demo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["The default behavior of `fakeTeamwork` is to simply plop down a commit on main."],afterMarkdowns:["There we go -- the remote was updated with a new commit, and we haven't downloaded that commit yet because we haven't run `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["You can also specify the number of commits or the branch by appending them to the command."],afterMarkdowns:["With one command we simulated a teammate pushing three commits to the `foo` branch on our remote."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["The upcoming levels are going to be pretty difficult, so we're asking more of you for this level.","","Go ahead and make a remote (with `git clone`), fake some changes on that remote, commit yourself, and then pull down those changes. It's like a few lessons in one!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simuler la collaboration","","C'est là que cela devient compliqué : pour certaines des leçons à venir, nous avons besoin de vous enseigner comment récupérer les changements effectués sur le dépôt distant.","","Cela signifie que nous devons faire semblant que le dépôt distant a été modifié par un collègue / ami / collaborateur, et parfois même sur une branche spécifique ou avec plusieurs commits.","","Pour faire cela, nous introduisons à point nommé la commande `git fakeTeamwork` ! Elle devrait vous paraître assez intuitive, voyons une démo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Le comportement par défaut de `fakeTeamwork` est tout simplement de faire apparaître un commit sur le main distant :"],afterMarkdowns:["Voilà : le dépôt distant a été mis à jour avec un nouveau commit, et nous n'avons pas encore téléchargé ce commit parce que nous n'avons pas exécuté la commande `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vous pouvez aussi spécifier le nombre de commits ou la branche en les ajoutant à la fin de la commande."],afterMarkdowns:["Avec une seule commande, nous avons simulé un collègue ayant pushé 3 commits sur la branche `foo` de notre dépôt distant."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Les niveaux suivants vont devenir assez difficiles, nous augmentons donc un peu la difficulté de cet exercice.","","Vous devrez créer un dépôt distant (avec `git clone`), simuler quelques changements sur ce dépôt, commiter les vôtres, et enfin appliquer les changements distants dans votre dépôt local (pull). C'est presque plusieurs leçons en une !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulando la colaboración","","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 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..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["El comportamiento por default de `fakeTeamwork` es simplemente crear un commit en main."],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 podés 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.","","Animate y creá un remoto (con `git clone`), simulá algunos cambios en ese remoto, commiteá en tu repo local, y luego pulleate esos cambios. ¡Es como varias lecciones en una!"]}}]},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 main."],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 rama 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:[{type:"ModalAlert",options:{markdowns:["## Simulando colaboração","","Neste ponto, temos uma pequena dificuldade -- para algumas das lições a seguir, precisaremos ensinar como fazer pull de mudanças que foram introduzidas no repositório remoto.","",'Isso significa que precisaremos essencialmente "fingir" que o repositório remoto foi atualizado por algum de seus colegas / amigos / colaboradores, algumas vezes em um ramo específico ou com um certo número de commits.',"","Para esta finalidade, criamos o comando fictício `git fakeTeamwork`! Ele é bastante auto-explicativo, vejamos uma demonstração..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O comportamento padrão do `fakeTeamwork` é simplesmente fazer aparecer um commit no main."],afterMarkdowns:["Aqui vamos nos -- o repositório remoto foi atualizado com um novo commit, e ainda não baixamos esse commit porque não executamos um `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Você também pode especificar o número de commits ou o ramo, anexando-os ao comando."],afterMarkdowns:["Com um único comando, nós simulamos um colega enviando 3 commits para o ramo `foo` do repositório remoto."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Os níveis posteriores serão mais difíceis, então estamos pedindo um pouco mais de você neste nível.","","Vá em frente e crie um repositório remoto (chamando `git clone`), simule algumas mudanças no repositório remoto, commite no repositório local, e então faça um pull das mudanças que haviam sido simuladas. É como se fossem várias lições em uma só!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulando o traballo no repositorio","","Entón, hai algo con trampa aquí -- para algunhas das leccións seguintes, precisamos explicarche cómo baixar os cambios introducidos no repositorio remoto.","",'Eso significa que escencialmente temos que "finxir" que o repositorio remoto foi actualizado por algún compañeiro, amigo ou incluso nalgunha rama específica a cantidade de commits feitos.',"","Para acadar esto, introduxemos o ben chamado comando `git fakeTeamwork`! É bastante auto-explicativo: semella traballo dos nosos colegas. Vexamos una demo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O comportamento por defecto de `fakeTeamwork` é simplemente crear un commit en main na rama remota."],afterMarkdowns:["Ahí o tes: a rama remota actualizouse cun novo commit, e aínda non nos baixamos ese commit porque inda non fixemos `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tamén podes especificar a cantidad de commits ou a rama agregándoos ó comando."],afterMarkdowns:["Cun único comando simulamos que un colega do equipo empurrou tres commits á rama `foo` do noso remoto."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Os niveis seguintes van ser un pouco máis complicados, así que imos a esixirte un pouco máis neste nivel.","","Anímate e crea unha rama remota (con `git clone`), e simula algúns cambios no repositorio remoto, logo desto, fai commit do teu repo local, e logo descarga os cambios. ¡É coma varias leccións nunha soa!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 模擬合作","","接下來的課程有一個很難的事情,我們需要讓你學會如何 pull remote 上的更新。","",'這就表示我們必須要 "假裝" remote 被你其中一個同事/ 朋友/ 合作的人在某個特定的 branch 上面送了一些特定的 commit。',"","為了要做到這件事情,我們要介紹一個自己設計的指令 `git fakeTeamwork`! 從字面上就可以很容易地看出來它在幹嘛,讓我們來看一個範例..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork` 的預設行為是在送一個 commit 給 main 分支"],afterMarkdowns:["我就說吧!remote 已經藉由一個新的 commit 而更新了,而且因為我們還沒有用 `git fetch`,所以表示我們還沒有下載該 commit。"],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你可以在命令的後面指定你要送幾個 commit 或是要送給哪個 branch。"],afterMarkdowns:["我們利用一個指令將三個 commit 送給在 remote 上面的 `foo` branch。"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["接下來的關卡會很困難,所以我們在這個關卡中會問你更多問題。","","現在先把 remote 下載下來(利用 `git clone`),假裝送幾個 commit 給 remote 做更新,然後 pull 這些 commit 下來 。這就好像是幾個教學中的指令的總結!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 模拟团队合作","","这里有一件棘手的事 —— 为了接下来的课程, 我们需要先教你如何制造远程仓库的变更。","","这意味着,我们需要“假装”你的同事、朋友、合作伙伴更新了远程仓库,有可能是某个特定的分支,或是几个提交记录。","","为了做到这点,我们引入一个自造命令 `git fakeTeamwork`!它的名称已经说明了一切,先看演示.."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork` 默认操作就是在远程仓库的 main 分支上做一次提交。"],afterMarkdowns:["完成了 —— 远程仓库增加了一个新提交,我们还没有下载它,因为我们还没有执行 `git fetch`。"],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你还可以指定提交的分支或是数量,只需要在命令后加上它们就可以了。"],afterMarkdowns:["通过一个命令,我们就模拟队友推送了 3 个提交记录到远程仓库的 foo 分支。"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["接下来的关卡会相当的困难,所以在本关会让你做许多事情,先来热热身。","","克隆一个远程仓库(用 `git clone`),再在刚创建的远程仓库中模拟一些修改,然后在你自己的本地分支上做一些提交,再拉取远程仓库的变更。这看起来像是包含了好几节的课程。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zusammenarbeit simulieren","","Hier ist das Problem -- für einige der folgenden Level müssen wir lernen, wie man Änderungen vom entfernten Server holt.","",'Das heißt wir müssen im Grunde "so tun", als ob der Server von einem Kollegen / Freund / Mitarbeiter aktualisiert worden wäre, manchmal ein bestimmter Branch oder eine bestimmte Anzahl von Commits.',"","Um das zu tun führen wir den passend benannten Befehl `git fakeTeamwork` ein! Er ist ziemlich selbsterklärend, schauen wir uns ihn an ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Das normale Verhalten von `fakeTeamwork` ist es, einen Commit auf den entfernten `main` zu machen."],afterMarkdowns:["Da haben wir's -- der Server ist mit einem neuen Commit aktualisiert worden und wir haben ihn noch nicht lokal, weil wir weder `git fetch` noch `git pull` ausgeführt haben."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Du kannst auch angeben wie viele Commits oder auf welchem Branch sie gemacht werden sollen, indem du das an den Befehl anhängst."],afterMarkdowns:["Mit einem Befehlt haben wir simuliert, dass ein Kollege drei Commits auf den Branch `foo` gepackt hat."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Die kommenden Level werden recht anspruchsvoll, daher verlangen wir auch in diesem Level schon etwas mehr.","","Leg los und erstelle ein Remote (mit `git clone`), simuliere ein paar Änderungen auf dem Server, committe lokal und dann zieh dir die Änderungen vom Server. Das ist wie mehrere Level in einem!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Симуляция совместной работы","","В данном уроке мы находимся в немного затруднительном положении - для выполнения ряда упражнений нам нужно обучить вас скачивать наработки и изменения, которые были сделаны в удалённом репозитории.","",'Это означает, что нам следует "сделать вид", как будто мы знаем о том, что наш удалённый репозиторий, с которым мы работаем, был изменён одним из ваших коллег / друзей / единомышленников. Это может быть какая-то ветка, либо же какой-то конкретный коммит.',"","Для того, чтобы добиться своих целей, нам предоставляется команда со звучным именем `git fakeTeamwork`! Имя команды однозначно даёт понять, что она выполняет. Давайте ознакомимся с демо..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Поведение команды `fakeTeamwork` по умолчанию заключается в том, чтобы просто "инициировать" коммит на main-е'],afterMarkdowns:["Ну вот - удалённый репозиторий был изменён при помощи добавления нового коммита, и мы ещё не скачали этот коммит, потому что не запустили команду `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["В данной команде вам доступна возможность указать ветку и количество добавляемых коммитов"],afterMarkdowns:["С помощью одной лишь команды мы симулируем добавление трёх коммитов в ветку `foo` на удалённом репозитории"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Последующие уровни будут довольно сложными, поэтому в этом упражнении от вас больше ничего не требуется.","",'Вперёд! Склонируйте удалённый репозиторий (с помощью `git clone`), симулируйте любые изменения на этом удалённом репозитории, сделайте какие-нибудь свои коммиты и затем скачайте "чужие" изменения. Это выглядит как несколько уроков в одном!']}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 連携のシミュレーション","","ここでは少し奇怪なものを取り扱います -- これは次回以降の幾つかのレッスンのためのもので、リモートセクションで変更点の反映方法を教えるのに必要なものです。","","つまり、私たちには時にはリモートの特定のブランチや特定の数のコミットを、同僚/友人/共同開発者の一人が更新した「ふりをする」ことが必要だというわけです。","","これを行うために、私たちは適切に選んだ名前のコマンド`git fakeTeamwork`を導入しました!とても明白でしょう?では、デモを見てみましょう。","","*注:もちろん、本当のgit上にこのようなコマンドは存在しません!変更は、「実在する」同僚や友人が行ってくれるでしょうから!ここではレッスンのために「擬似的に」導入しているにすぎません!*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork`のデフォルトの動作は、単にmainの上にコミットを乗っけるだけです"],afterMarkdowns:["ではいってみましょう -- リモートには新しいコミットが更新され、それはまだ私たちの手元にはダウンロードされていません。なぜなら、`git fetch`を走らせていませんからね。"],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["さらに特定の数のコミット、または追加するブランチをコマンドで指定することもできます。"],afterMarkdowns:["一つのコマンドで、チームメイトが3個のコミットをリモートの`foo`ブランチにプッシュするという動作を再現することができました。"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["今後のレベルはどんどん難しくなっていくでしょうから、このレベルでも私たちはあなたに少々多くのことを求めます。","","先に行くには、リモートを作り(`git clone`で)、リモートに幾つかの変更を再現して、自身のリポジトリにコミットし、変更を取り込む必要があります。これは、このリモートのセクションでやった幾つかのレッスンの内容と似ていますね!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Симулюємо співпрацю","","Зараз ми знаходимося в незручному становищі -- в деяких із наступних уроків нам потрібно буде пояснити як витягнути зміни з віддаленого репозиторію, що були туди додані іншим учасником.","",'Це означає, що нам треба "вдавати", що віддалений репозиторій був модифікований твоїм колегою / друзями / небайдужими, іноді на специфічній гілці чи коміті.',"","Щоб зробити це, ми додали влучно названу команду `git fakeTeamwork` (симуляціяКолективноїРоботи)! Насправді, з симуляцією колективної роботи стикався мабуть кожен, хто працював в колективі, тож перейдімо до прикладів..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["За замовчуванням `fakeTeamwork` просто додасть коміт в гілку `main`."],afterMarkdowns:["Є -- до віддаленого репозиторію додався ще один коміт, проте ми ще його не звантажили, оскільки ще не виконали `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ти також можеш вказати кількість комітів чи гілку, в яку потрібно додати коміти."],afterMarkdowns:["Виконавши одну команду ми симулювали колегу, що запушив три коміти в гілку `foo` на віддаленому репозиторії."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Наступні рівні будуть доволі складними, тому, щоб підготуватись, на цьому рівні теж доведеться не солодко.","","Створи віддалений репозиторій (за допомогою `git clone`), зроби кілька фіктивних змін, зроби кілька комітів локально, й підвантаж віддалені зміни. Це як кілька уроків в одному!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 협동 가장하기","","조금 곤란한일이 생겨버렸습니다 -- 앞으로 배울 레슨들에서 원격 저장소에서 일어난 변경들을 어떻게 로컬로 가져올것인지에 대해 배워 볼것입입니다.","",'그런데 여기서 우리는 불가피하게 그 _변경_들을 만들어야 되는데, 원격 저장소가 동료 / 친구 / 협력자등에 의해 특정 브랜치나 여러개의 커밋이 갱신되는 경우를 표현할 필요가 있습니다. 즉 우리는 팀워크를 "가장"할 필요가 있는것 입니다.',"","이런 문제를 해결하기 위해서 `git fakeTeamwork` 명령을 만들었습니다! 이름이 참 적절하죠? 예시를 통해 확인해봅시다..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork`의 기본 행동은 원격 main에 간단히 하나의 커밋을 하는것 입니다."],afterMarkdowns:["자, 됐습니다 -- 원격 저장소에 새로운 커밋이 갱신되었습니다. 아직 `git fetch`를 하지 않았기 때문에 로컬로 내려받아지지는 않았습니다."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["명령어에 추가할 커밋의 갯수나 어떤 브랜치에 추가할지 지정하는것도 가능합니다. 다음과 같이 명령어 뒤에 추가하면 됩니다."],afterMarkdowns:["하나의 명령어로 팀원이 원격저장소의 `foo` 브랜치에 세개의 커밋을 push한것처럼 가장했습니다."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["뒤의 레벨들이 조금 어렵기 때문에, 이번 레벨에서 여러분에게 조금 많은것을 요구하려고 합니다.","","원격 저장소를 하나 만들고(`git clone`), 원격 저장소에 몇가지 가짜 변경을 만들고 로컬에서 커밋하고 원격의 변경들을 가져오세요. Goal과 같은 결과가 나오면 됩니다. 몇개의 레슨이 하나에 있다고 보면 되겠네요! 도전해봅시다."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mô phỏng hợp tác","","Bây giờ khó đây -- để chuẩn bị cho những bài học tới, chúng tôi cần chỉ bạn cách kéo về những cập nhật có trên kho chứa từ xa.","",'Có nghĩa là ta cần "giả vờ" kho chứa từ xa được cập nhật bởi đồng nghiệp / bạn / cộng tác viên của bạn, có khi là một nhánh xác định hoặc là một số commit.',"","Để làm điều này, chúng tôi sẽ giới thiệu cho bạn một lệnh tự tạo `git fakeTeamwork`! Cái tên nói lên tất cả, cùng xem thử bản giới thiệu..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hành xử mặc định của `fakeTeamwork` đơn giản là tạo ra một commit ở trên nhánh main từ xa."],afterMarkdowns:["Đó -- kho chứa từ xa đã được cập nhật thêm một commit, và ta chưa tải commit đó xuống vì ta chưa hề chạy lệnh `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bạn cũng có thể chỉ định số lượng commit bằng cách thêm con số đằng sau câu lệnh."],afterMarkdowns:["Chỉ với một câu lệnh ta có thể giả lập tạo ra 3 commit trên nhánh `foo` từ xa của ta."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Các cấp độ tới sẽ khá là khó, nên ở cấp độ này chúng tôi sẽ yêu cầu bạn thêm một chút.","","Sao chép một kho chứa từ xa (sử dụng `git clone`), sau đó mô phỏng một số thay đổi trong kho chứa từ xa mà bạn vừa tạo, sau đó thực hiện một số commit trên nhánh cục bộ của riêng bạn, sau đó kéo các thay đổi từ kho chứa từ xa. Nhiều bài học trong một bài."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulacija sodelovanja","","Tule imamo izziv -- za nekaj naslednjih lekcij te moramo naučiti, kako potegniti dol spremembe, ki so bile narejene na oddaljenem repozitoriju.","",'To pomeni, da se moramo pravzaprav "pretvarjati", da je oddaljen branch posodobil kak sodelavec, včasih na določenem branchu ali določeno število commitov.',"","Da bi to lahko naredili, smo uvedli ukaz `git fakeTeamwork`! Poglejmo prikaz ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Privzeto delovanje `fakeTeamwork` je, da samo doda commit na main:"],afterMarkdowns:["Tako -- oddaljen repo je bil posodobljen z novim commitom, katerega še nismo potegnili k sebi, ker še nismo pognali ukaza `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prav tako lahko določimo tudi število commitov ali ime brancha tako, da jih dodamo na koncu:"],afterMarkdowns:["Z enim ukazom smo simulirali sodelavca, ki je dodal tri commite na `foo` branch na našem oddaljnem repotu."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Naslednje stopnje bodo precej težke, zato od tebe v tej stopnji zahtevamo še več.","","Naredi oddaljen repo (z `git clone`), simuliraj nekaj sprememb na tem repotu, sam commitaj, nato pa potegni dol spremembe. Kot da bi bilo več lekcij v eni!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Symulacja pracy zespołowej","","Pora na małe oszustwo -- na potrzeby niektórych z nadchodzących lekcji musimy nauczyć cię, jak ściągać (pull) zmiany, które zostały wprowadzone na zdalnej gałęzi przez innych.","",'W zasadzie oznacza to, że musimy "udawać", że zdalne repozytorium zostało zaktualizowane przez jednego z twoich współpracowników / przyjaciół / współtwórców na jakiejś gałęzi lub kilku commitach.',"","Aby to zrobić, wprowadziliśmy polecenie `git fakeTeamwork`! Po polsku byłoby to symulujPracę :D -- zobaczmy, jak to działa..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Domyślnym zachowaniem `fakeTeamwork` jest po prostu wrzucenie commita na gałąź main."],afterMarkdowns:["Proszę bardzo - zdalny serwer został zaktualizowany o nowy commit, a my jeszcze go nie pobraliśmy, ponieważ nie uruchomiliśmy `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Możesz również określić liczbę commitów lub gałąź poprzez dołączenie ich do polecenia."],afterMarkdowns:["Jednym poleceniem symulujemy, że kolega z zespołu wypycha trzy commity do gałęzi `foo` na zdalnym repozytorium."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Kolejne poziomy będą dość trudne, więc tym razem twoje zadanie też jest bardziej wymagające.","","Nie bój się, stwórz zdalne repozytorium (używając `git clone`), zasymuluj na nim kilka zmian i zatwierdź je, a następnie ściągnij (pull) je. To jak kilka lekcji w jednej!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulare la cooperazione","","La questione è la seguente -- per alcune delle prossime lezioni, dovremo insegnarti come recuperare delle modifiche effettuate al repository remoto.","",'Questo significa che dobbiamo essenzialmente "far finta" che quest\'ultimo sia stato aggiornato da uno dei nostri colleghi / amici / collaboratori, a volte in un certo ramo o per un certo numero di commit.',"","Per fare ciò, abbiamo introdotto un comando ad hoc: `git fakeTeamwork`. È abbastanza autoesplicativo, vediamo una demo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Il comportamento predefinito di `fakeTeamwork` consiste semplicemente nell'effettuare un commit sul main."],afterMarkdowns:["Ecco qua -- il repository remoto è stato aggiornato con un nuovo commit, e non lo abbiamo ancora scaricato in quanto non abbiamo eseguito `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Puoi anche specificare il numero di commit o il ramo su cui effettuali specificandolo nel comando."],afterMarkdowns:["Con un comando abbiamo simulato un nostro collega che invia tre commit al ramo `foo` del repository remoto."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["I prossimi livelli saranno abbastanza tosti, quindi ti chiediamo un po' di più già da ora.","","Crea un repository remoto (con `git clone`), simula alcune modifiche su quel repository, effettua tu un commit, e poi recupera quelle modifiche. È come più lezioni in una!"]}}]}}}},{}],141:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"o/main":{"target":"C5","id":"o/main"},"o/bugFix":{"target":"C7","id":"o/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":["C2"],"id":"C4"},"C6":{"parents":["C3"],"id":"C6"},"C5":{"parents":["C4"],"id":"C5"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"bugFix","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C5","id":"main"},"bugFix":{"target":"C7","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":["C2"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C3"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"bugFix","id":"HEAD"}}}',solutionCommand:"git fetch",startTree:'{"branches":{"main":{"target":"C2","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"o/main":{"target":"C2","id":"o/main"},"o/bugFix":{"target":"C3","id":"o/bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"bugFix","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C5","id":"main"},"bugFix":{"target":"C7","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":["C2"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C3"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"bugFix","id":"HEAD"}}}',name:{en_US:"Git Fetchin'",fr_FR:"Git fetch",de_DE:"Git Fetch",ja:"Git Fetch",es_AR:"git fetch",es_MX:"Git fetch",es_ES:"git fetch",pt_BR:"Git Fetch",gl:"Git Fetch",zh_CN:"Git Fetch",zh_TW:"git fetch",ru_RU:"Git fetch",uk:"Git fetch",ko:"Git Fetch",vi:"Git Fetch",sl_SI:"Git Fetch",pl:"Git fetch",it_IT:"Git Fetch"},hint:{en_US:"just run git fetch!",fr_FR:"Exécuter juste git fetch",de_DE:"Einfach git fetch ausführen!",ja:"単にgit fetchを実行!",es_AR:"Simplemente ¡hacé git fetch!",es_MX:"Simplemente ¡escribe git fetch!",es_ES:"Simplemente ¡escribe git fetch!",pt_BR:"Simplesmente chame git fetch!",gl:"¡Sinxelamente fai git fetch!",zh_CN:"只需要运行 git fetch 命令!",zh_TW:"只要下 git fetch 指令",ru_RU:"Просто выполните git fetch!",uk:"Просто виконай git fetch!",ko:"그냥 git fetch를 하세요!",vi:"Gõ git fetch là được!",sl_SI:"Le izvedi git fetch!",pl:"Po prostu uruchom git fetch!",it_IT:"Semplicemente git fetch!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Working with git remotes really just boils down to transferring data _to_ and _from_ other repositories. As long as we can send commits back and forth, we can share any type of update that is tracked by git (and thus share work, new files, new ideas, love letters, etc.).","","In this lesson we will learn how to fetch data _from_ a remote repository -- the command for this is conveniently named `git fetch`.","","You'll notice that as we update our representation of the remote repository, our _remote_ branches will update to reflect that new representation. This ties into the previous lesson on remote branches."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Before getting into the details of `git fetch`, let's see it in action! Here we have a remote repository that contains two commits that our local repository does not have."],afterMarkdowns:["There we go! Commits `C2` and `C3` were downloaded to our local repository, and our remote branch `o/main` was updated to reflect this."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### What fetch does","","`git fetch` performs two main steps, and two main steps only. It:","","* downloads the commits that the remote has but are missing from our local repository, and...","* updates where our remote branches point (for instance, `o/main`)","","`git fetch` essentially brings our _local_ representation of the remote repository into synchronization with what the _actual_ remote repository looks like (right now).","","If you remember from the previous lesson, we said that remote branches reflect the state of the remote repositories _since_ you last talked to those remotes. `git fetch` is the way you talk to these remotes! Hopefully the connection between remote branches and `git fetch` is apparent now.","","`git fetch` usually talks to the remote repository through the Internet (via a protocol like `http://` or `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### What fetch doesn't do","","`git fetch`, however, does not change anything about _your_ local state. It will not update your `main` branch or change anything about how your file system looks right now.","","This is important to understand because a lot of developers think that running `git fetch` will make their local work reflect the state of the remote. It may download all the necessary data to do that, but it does _not_ actually change any of your local files. We will learn commands in later lessons to do just that :D","","So at the end of the day, you can think of running `git fetch` as a download step."]}},{type:"ModalAlert",options:{markdowns:["To finish the level, simply `git fetch` and download all the commits!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Travailler avec les dépôts Git distants se résume en pratique à transférer nos données _depuis_ et _vers_ ces autres dépôts. Etant donné que nous pouvons envoyer des commits en avance et en retard, nous pouvons partager tous les types de mises à jour qui sont gérés par Git (et donc partager notre travail, de nouveaux fichiers, de nouvelles idées, des lettres d'amour, etc.).","","Dans cette leçon nous allons apprendre comment rapporter (fetch) des données _depuis_ un dépôt distant vers le nôtre : la commande pour cela est astucieusement dénommée `git fetch`.","","Vous allez remarquer qu'au moment où nous mettons à jour notre version du dépôt distant, nos branches _distantes_ vont se mettre à jour pour refléter cette nouvelle représentation. Cela est lié à la leçon précédente sur les branches distantes."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Avant d'entrer dans les détails de `git fetch`, voyons-le en action ! Ici nous avons un dépôt distant qui contient deux commits que notre dépôt local n'a pas."],afterMarkdowns:["Voilà ! Les commits `C2` et `C3` ont été téléchargés dans notre dépôt local, et notre branche distante `o/main` a été mise à jour pour refléter cela."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Ce que fetch fait","","`git fetch` procède en deux étapes principales, ni plus ni moins. Cela :","","* télécharge les commits que le dépôt distant possède mais qui ne sont pas dans le nôtre, puis...","* met à jour nos branches distantes (par exemple, `o/main`).","","`git fetch` prend en fait notre représentation _locale_ du dépôt distant pour la synchroniser avec ce à quoi le dépôt distant ressemble _réellement_ (à ce moment-là).","","Si vous vous rappelez de la précédente leçon, nous avons dit que les branches distantes reflètent l'état du dépôt distant _depuis_ la dernière fois où vous avez parlé à ces branches distantes. `git fetch` est le moyen de parler à ces branches distantes ! La relation entre `git fetch` et les branches distantes devrait vous sembler claire maintenant.","","`git fetch` contacte le dépôt distant par Internet (via un protocole comme `http://` ou `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Ce que fetch ne fait pas","","`git fetch`, cependant, ne change rien à _votre_ état local. Il ne met pas à jour votre branche `main` et ne va pas changer quelque chose aux fichiers qui se trouvent actuellement dans votre répertoire de travail.","","C'est important à comprendre car beaucoup de développeurs pensent qu'exécuter `git fetch` va mettre leur dépôt local dans le même état que le distant. Cela peut télécharger toutes les données nécessaires pour le faire, mais cela ne change en réalité _rien_ sur vos fichiers locaux. Les prochains niveaux seront justement dédiés aux commandes qui permettent de le faire :D","","Finalement, vous pouvez vous représenter `git fetch` comme une étape de téléchargement."]}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, exécuter simplement `git fetch` et téléchargez tous les commits !"]}}]},es_AR:{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. Acá tenemos un repositorio remoto que contiene dos commits que nuestro repositorio local no tiene."],afterMarkdowns:["¡Ahí vamos! Bajamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/main` 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/main`)","","`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`.","","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 `main` 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, podés pensar a `git fetch` como un paso de descarga."]}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente corré `git fetch` y bajate todos los commits."]}}]},es_MX:{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 a otro, podemos compartir cualquier tipo de actualización monitoreada por git (y, por lo tanto, compartir trabajo, archivos nuevos, ideas nuevas, cartas de amor, etc.).","","En esta lección vamos a aprender cómo traer datos _desde_ un repositorio remoto - el comando para esto se llama, `git fetch`.","","Vas a notar que a medida que actualicemos nuestra representación del repositorio remoto, nuestras ramas _remotas_ van a actualizarse para reflejar esa nueva representación. Esto va 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:["¡Ahí está! Descargamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/main` 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 principalmente dos pasos, y sólo esos dos pasos:","","* descarga 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/main`)","","`git fetch` escencialmente pone nuestra representación _local_ del repositorio remoto en sincronía con el _verdadero_ estado del repositorio remoto (en ese momento).","","Si recuerdas la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que te comunicaste con ellos. ¡`git fetch` es la manera con la que te comunicas con esos remotos! Espero que la relación entre las ramas remotas y `git fetch` sea evidente ahora.","","`git fetch` usualmente habla con el repositorio remoto a través de internet (mediante un protocolo como `http://` o `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### ¿Qué *no* hace fetch?","","Sin embargo, `git fetch` no modifica en nada _tu_ estado local. No va a actualizar tu rama `main` ni va a cambiar nada sobre cómo se ve tu sistema de archivos en ese momento.","","Es importante entender esto, porque un montón de desarrolladores piensan que correr `git fetch` hará que su trabajo local refleje el estado del remoto. Puede que `git fetch` descargue los datos necesarios para hacerlo, pero realmente *no* cambia ninguno de tus archivos locales. Vamos a aprender otros comandos para hacer eso más adelante. :D","","Así que, a fin de cuentas, puedes imaginar a `git fetch` como un proceso de descarga."]}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente ejecuta `git fetch` y descarga todos los commits."]}}]},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/main` 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/main`)","","`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 `main` 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:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Trabalhar com remotos no Git, no final das contas, se resume a transferir dados _de_ e _para_ outros repositórios. Desde que possamos enviar commits para um lado e para o outro, poderemos compartilhar qualquer tipo de atualização que seja gerenciada pelo Git (e portanto compartilhar trabalho, novos arquivos, novas ideias, cartas de amor, etc).","","Nesta lição vamos aprender como baixar dados _de_ um repositório remoto -- o comando para isso é convenientemente chamado de `git fetch`.","","Você perceberá que conforme atualizarmos a representação do repositório remoto, nossos ramos _remotos_ atualizar-se-ão para refletir essa nova representação. Isso tem a ver com o que vimos na lição anterior sobre ramos remotos."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Antes de entrar nos detalhes do `git fetch`, vejamo-no em ação! Aqui temos um repositório remoto que contém dois commits que nosso repositório local não possui."],afterMarkdowns:["Lá vamos nós! Os commits `C2` e `C3` foram baixados para o nosso repositório local, e nosso ramo remoto `o/main` foi atualizado para refletir esse fato."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### O que o fetch faz","","O `git fetch` realiza dois passos principais, e somente estes dois passos principais. Ele:","","* Baixa os commits que o repositório remoto possui mas que estão faltando no repositório local, e...","* Atualiza a referência para a qual os ramos remotos (por exemplo, `o/main`) estão apontando","","O `git fetch` essencialmente faz com que nossa representação _local_ do repositório remoto fique sincronizada com a forma com que o repositório remoto _de fato_ se parece (naquele momento).","","Se você lembrar da lição anterior, nós dissemos que os ramos remotos refletem o estado dos repositórios remotos _desde a última vez_ na qual você falou com esses repositórios. O `git fetch` é a única forma de falar com esses repositórios remotos! Espero que a conexão entre os ramos remotos e o `git fetch` esteja clara agora.","","O `git fetch` geralmente conversa com o repositório remoto por meio da Internet (usando um protocolo como `http://` ou `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### O que o fetch NÃO faz","","O `git fetch`, no entanto, não muda nada do estado _local_ do repositório. Ele não atualiza o seu ramo `main` nem muda nada na forma como o seu sistema de arquivos está no momento.","","É importante entender isso, pois muitos desenvolvedores pensam que executar `git fetch` fará com que o trabalho local reflita o estado do repositório remoto. Ele pode até baixar todos os dados necessários para fazê-lo, mas ele _não_ muda de fato nenhum dos arquivos locais. Vamos aprender comandos para fazê-lo nas lições a seguir :D","","No final das contas, você pode pensar no `git fetch` como um passo de download."]}},{type:"ModalAlert",options:{markdowns:["Para terminar este nível, simplesmente execute `git fetch` e baixe todos os commits!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Traballar con respositorios remotos en Git, a fin de contas, resúmese en transferir datos _dun_ repositorio _cara_ outros repositorios. Dende que podemos enviar commits dun lado cara o outro, poderemos compartir calquera tipo de actualización que sexa xerada por git (e polo tanto compartir o traballo, novos arquivos, novas ideas, cartas de amor, etc).","","Nesta lección imos aprender como baixar os cambios _dun_ repositorio remoto -- o comando para iso é `git fetch`.","","Percibirás que conforme atualizamos a representación do repositorio remoto, as nosas ramas _remotas_ actualizaranse para reflexar a nova representación. Iso ten que ver co que vimos na lección anterior sobre as ramas remotas."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ántes de entrar nos detalles de `git fetch`, vexámolo en acción! Aquí temos un repositorio remoto que contén dous commits que o noso repositorio local non ten."],afterMarkdowns:["Alá imos! Os commits `C2` e `C3` baixáronse ó noso repositorio local, e a nosa rama `o/main` actualizouse para reflexar ese cambio."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### O que fai o fetch","","`git fetch` fai dous pasos pasos principais, e soamente estes dous pasos princpipais. Son:","","* Baixa os commits que o repositório remoto contén pero non temos nos no noso repositoiro local, e...","* Actualiza a referencia nas ramas remotas (por exemplo, `o/main`) nas que se está apuntando","","`git fetch` esencialmente fai que a nosa representación _local_ do repositorio remoto se sincronice ca forma que posúe o repositorio remoto, _de feito_ parecese (nese momento).","","Se ti lembras a lección anterior, nos dixemos que as ramas remotas reflexan o estado dos repositorios remotos _dende a última vez_ na que ti fixeches un commit dese repositorio. O `git fetch` é a única forma de falar con eses repositorios remotos! Agardo que a conexión entre as ramas remotas e o `git fetch` esté clara dabondo agora.","","`git fetch` xeralmente fala co repositorio remoto por medio da rede (usando un protocolo como `http://`, `git://` ou `ssh`).",""]}},{type:"ModalAlert",options:{markdowns:["### O que fetch NON fai","","`git fetch`, por agora, non cambia nada no estado _local_ do repositorio. El solo actualiza a rama `main` sen facer cambios na forma de cómo está o teu sistema de arquivos nese momento.","","É importante entender iso, xa que moitos desenvolvedores pensan que executar `git fetch` fará que o traballo local se vexa modificado polo repositorio remoto. El pode que baixara todos os cambios necesarios para facelo, pero, o comando _non_ cambia cómo están os teus arquivos locais. Imos aprender comandos para facer esas conexións :D","","A fin de contas, ti podes pensar en `git fetch` como unha descarga."]}},{type:"ModalAlert",options:{markdowns:["Para rematar este nivel, so executa `git fetch` e baixa todos os commits!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git fetch","","透過 git remote 其實就是把資料接收或傳送到其它的 repository,只要我們可以將資料傳進及傳出,我們就可以分享任何被 git 所追蹤的 repository 的更新(例如分享工作進度,新的檔案,新的想法,以及情書等等...)。","","在這個教學中,我們會學習到如何從 remote repository 來 fetch (抓取)資料,這個指令叫作 `git fetch`。","","你將會注意到當我們的 remote repository 更新的時候,相對應的 _remote_ branch 也會反映該更新,這個跟我們之前所提到的 remote branch 的特性是吻合的。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在講到 `git fetch` 的細節之前,我們要先來看一下例子!在這裡我們有一個新增了兩個 commit 的 remote repository,而且我們的 local repository 並沒有包含這兩個 commit。"],afterMarkdowns:["看吧!commit `C2` 以及 `C3` 已經被下載到我們的 local repository,而且我們的 remote branch `o/main` 也更新了。"],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### fetch 做了什麼","","`git fetch` 只有執行了兩個主要步驟,包含:","","* 下載 remote 有的 commit,但是在我們的 local repository 是沒有該 commit。還有...","* 更新我們 remote branch 所指向的地方(例如, `o/main`)","","基本上,`git fetch` 同步了我們的 local repository 以及 remote repository 的最新狀態。","","假如你還記得之前的教學的話,我們說過 remote branch 反映了 remote repository 的狀態,原因在於說你最後接觸的是這些 remote repository,而你就是利用 `git fetch` 來接觸這些 remote repository!現在 remote branch 跟 `git fetch` 的關係已經很明顯了。","","`git fetch` 通常是透過網路來跟 remote 溝通(透過一個 protocol (協定),例如 `http://` 或者是 `git://`)。",""]}},{type:"ModalAlert",options:{markdowns:["### fetch 沒有做的事情","","然而,`git fetch` 並不會影響到在你的 local repository 中的 `main` branch,他並不會將你的 `main` branch 更新到最新的狀態。","","這個觀念很重要,因為很多程式設計師以為 `git fetch` 可以讓他們在 local repository 上面的工作跟 remote repository 的工作可以同步。它是會下載同步所需的資料,但是不會更新任何的檔案,我們會在後面的教學中提到如何做到這件事情。:D","","因此,你可以把 `git fetch` 想成是在下載資料。"]}},{type:"ModalAlert",options:{markdowns:["要完成這一關,只要透過 `git fetch` 並且下載全部的 commit 即可!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Git 远程仓库相当的操作实际可以归纳为两点:向远程仓库传输数据以及从远程仓库获取数据。既然我们能与远程仓库同步,那么就可以分享任何能被 Git 管理的更新(因此可以分享代码、文件、想法、情书等等)。","","本节课我们将学习如何从远程仓库获取数据 —— 命令如其名,它就是 `git fetch`。","","你会看到当我们从远程仓库获取数据时, 远程分支也会更新以反映最新的远程仓库。在上一节课程中我们已经提及过这一点了。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在解释 `git fetch` 前,我们先看看实例。这里我们有一个远程仓库, 它有两个我们本地仓库中没有的提交。"],afterMarkdowns:["就是这样了! `C2`,`C3` 被下载到了本地仓库,同时远程分支 `o/main` 也被更新,反映到了这一变化"],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### git fetch 做了些什么","","`git fetch` 完成了仅有的但是很重要的两步:","","* 从远程仓库下载本地仓库中缺失的提交记录","* 更新远程分支指针(如 `o/main`)","","`git fetch` 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。","","如果你还记得上一节课程中我们说过的,远程分支反映了远程仓库在你**最后一次与它通信时**的状态,`git fetch` 就是你与远程仓库通信的方式了!希望我说的够明白了,你已经了解 `git fetch` 与远程分支之间的关系了吧。","","`git fetch` 通常通过互联网(使用 `http://` 或 `git://` 协议) 与远程仓库通信。",""]}},{type:"ModalAlert",options:{markdowns:["### git fetch 不会做的事","","`git fetch` 并不会改变你本地仓库的状态。它不会更新你的 `main` 分支,也不会修改你磁盘上的文件。","","理解这一点很重要,因为许多开发人员误以为执行了 `git fetch` 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是**并没有**修改你本地的文件。我们在后面的课程中将会讲解能完成该操作的命令 :D","","所以, 你可以将 `git fetch` 的理解为单纯的下载操作。"]}},{type:"ModalAlert",options:{markdowns:["要完成本关,只需用 `git fetch` 下载所有的提交!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","In Git mit entfernten Repositorys zu arbeiten lässt sich wirklich auf das Hin- und Zurückübertragen von Daten reduzieren. Solange wir Commits hin und her schicken können, können wir jede Art Update teilen, das von Git getrackt wird (und somit Arbeit, neue Dateien, neue Ideen, Liebesbriefe etc. teilen).","","In diesem Level werden wir lernen, wie man Daten _von_ einem entfernten Repository holt -- der entsprechende Befehl heißt `git fetch`.","","Dir wird auffallen, dass mit der Aktualisierung unserer Darstellung des entfernten Repositorys die _Remote_ Branches auf den neuesten Stand gebracht werden. Das passt zum vorherigen Level über Remote Branches."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bevor wir uns die Einzelheiten von `git fetch` ansehen wollen wir es mal in Aktion sehen. Wir haben hier ein entferntes Repository, das zwei Commits hat, die in unserem lokalen Repository fehlen."],afterMarkdowns:["Das war's! Die Commits `C2` und `C3` wurden zu unserem Repository heruntergeladen und unser Remote Branch `o/main` wurde aktualisiert."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Was Fetch tut","","`git fetch` führt genau zwei Schritte aus:","","* Es lädt die Commits herunter, die im lokalen Repository fehlen, und ...","* aktualisiert die Remote Branches wo nötig (zum Beispiel `o/main`).","","`git fetch` synchronisiert im Prinzip unsere _lokale_ Abbildung des entfernten Repositorys mit dem, wie das entfernte Repository _tatsächlich_ aussieht (in diesem Moment).","","Wie du dich vielleicht erinnerst, haben wir im letzten Level gesagt, dass die Remote Branches den Zustand der Branches auf dem entfernten Repository darstellen _seit_ du das letzte Mal dieses Repository angesprochen hast. `git fetch` ist die Methode mit der du das Repository ansprichst! Der Zusammenhang zwischen Remote Branches und `git fetch` ist damit hoffentlich klar.","","`git fetch` kommuniziert mit dem entfernten Repository in der Regel über das Internet (über ein Protokoll wie `http://` oder `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Was Fetch nicht tut","","`git fetch` ändert allerdings überhaupt nichts an _deinen_ lokalen Branches. Es aktualisiert nicht deinen `main` oder ändert irgendetwas an deinem Checkout.","","Das ist wichtig zu wissen, denn eine Menge Entwickler glauben, wenn sie `git fetch` ausführen, würden ihre lokalen Branches auf den Stand des entfernten Repositorys gebracht. Es lädt zwar alle Daten herunter, damit man diese Aktualisierung durchführen kann, aber es ändert _nichts_ an deinen lokalen Branches. Wir werden in späteren Level Befehle genau dafür kennenlernen. :D","","Am Ende des Tages kannst du dir `git fetch` also als den Download-Schritt vorstellen."]}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu schaffen musst du einfach nur `git fetch` ausführen, um alle Commits herunterzuladen!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","リモートGitを用いた作業は、本当にただ単なる他のリポジトリ_への_、または他のリポジトリ_からの_データの転送に集約されます。コミットを転送できる限り、Gitで管理されている全ての種類の更新が共有できます(例えば作業や、新しいファイル、新しいアイデア、ラブレターなどです)。","","このレベルでは、リモートリポジトリ_から_データを取ってくる方法を学びます -- このコマンドは`git fetch`と名付けられています。","","リモートリポジトリの情報を私たちが更新するように、_リモート_ブランチも情報を更新することができることが分かるでしょう。これは前のレッスンでのリモートブランチの働きに結びつきます。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`git fetch`の説明に入る前に、その動作を見てみましょう。ここに、ローカルリポジトリにない二個のコミットを含んでいるリモートブランチがあります。"],afterMarkdowns:["やりました!`C2`、`C3`コミットがローカルリポジトリにダウンロードされ、`o/main`リモートブランチに反映されました。"],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### fetchとはどのようなものか","","`git fetch`は、主に二つのステップだけで動作します。それは以下のようなものです:","","* リモートにあってローカルリポジトリにないコミットをダウンロードする","* リモートブランチの位置を更新する(例えば、`o/main`)","","`git fetch`は本質的には、_実際_のリモートリポジトリと同じように見えるような形でリモートリポジトリの_ローカル_の情報に同期します(ちょうど今のように)。","","前のレッスンでのことを覚えていると思いますが、リモートブランチはリモートと最後に同期した時点での状態を保持しているという話をしました。`git fetch`はそのリモートと同期する方法なのです!これでリモートブランチと`git fetch`の関係性は明らかになったでしょう?","","`git fetch`は、通常インターネットを通してリモートリポジトリと対話します(`http://`または`git://`プロトコル経由で)。",""]}},{type:"ModalAlert",options:{markdowns:["### fetchがしてくれないもの","","`git fetch`は、しかしながら、_あなたの_ローカルの状態は変更しません。あなたの`main`ブランチや他のもの、今現在のあなたのファイルシステムが見せているものを更新しないのです。","","これは理解する上で重要なことです。なぜなら、多くの技術者は`git fetch`がリモートの状態をローカルの作業場に反映してくれると思っているからです。必要なデータはダウンロードされるかもしれませんが、ローカルのファイルを実際に変更するというようなことは_してくれない_のです。私たちは、この後のレッスンでもこのようなコマンドを学びます :D","","なので、この1日が終わる頃には、あなたは`git fetch`のダウンロードステップの動作が分かるようになるでしょう。"]}},{type:"ModalAlert",options:{markdowns:["このレベルを終えるには、単に`git fetch`を実行し、全てのコミットをダウンロードしてください。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Работа с удалёнными git репозиториями сводится к передаче данных _в_ и _из_ других репозиториев. До тех пор, пока мы можем отправлять коммиты туда-обратно, мы можем делиться любыми изменениями, которые отслеживает git (следовательно, делиться новыми файлами, свежими идеями, любовными письмами и т.д.).","","В этом уроке вы научитесь тому, как извлекать данные _из_ удалённого репозитория - и для этого у нас есть соответствующая команда `git fetch`.","","Вы увидите, что как только мы изменим представление нашего удалённого репозитория, наши _удалённые_ ветки обновятся соответствующим образом и отобразят это представление. Это связывает воедино предыдущий урок про удалённые репозитории."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Прежде чем углубляться в детали команды `git fetch`, давайте взглянем на её визуализацию в действии! Здесь у нас имеется удалённый репозиторий, который содержит в себе два коммита, отсутствующих в нашем локальном репозитории."],afterMarkdowns:["Вот и всё! Коммиты `C2` и `C3` были успешно скачаны в наш локальный репозиторий, и наша удалённая ветка `o/main` отобразила эти изменения соответствующим образом."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Что делает fetch","","`git fetch` выполняет две и только две основные операции. А именно:","","* связывается с указанным удалённым репозиторием и забирает все те данные проекта, которых у вас ещё нет, при этом...","* у вас должны появиться ссылки на все ветки из этого удалённого репозитория (например, `o/main`)","","Фактически, `git fetch` синхронизирует _локальное_ представление удалённых репозиториев с тем, что является _актуальным_ на текущий момент времени.","","Насколько вы помните, в предыдущем уроке мы сказали, что удалённые ветки отображают состояние удалённых репозиториев _на тот момент_ когда вы 'общались' с ними в последний раз. `git fetch` является тем механизмом, который даёт вам возможность общаться с удалёнными репозиториями! Надеюсь, что связь между удалёнными ветками и командой `git fetch` теперь прояснилась.","","`git fetch` обычно 'общается' с удалёнными репозиториями посредством Интернета (через такие протоколы, как `http://` или `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Чего fetch не делает","","Важно отметить, что команда `git fetch` забирает данные в ваш _локальный_ репозиторий, но не сливает их с какими-либо вашими наработками и не модифицирует то, над чем вы работаете в данный момент.","","Важно это помнить и понимать, потому что многие разработчики думают, что, запустив команду `git fetch`, они приведут всю свою локальную работу к такому же виду, как и на удалённом репозитории. Команда всего лишь скачивает все необходимые данные, но вам потребуется вручную слить эти данные с вашими, когда вы будете готовы. В следующих уроках мы научимся это делать :D","","Одним словом, вы можете относиться к `git fetch` как к процедуре скачивания."]}},{type:"ModalAlert",options:{markdowns:["Чтобы выполнить уровень, просто запустите `git fetch` и скачайте все коммиты!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Робота з віддаленими git-репозиторіями зводиться до передачі данних _до_ та _з_ інших репозиторіїв. Можливість передавати коміти дозволяє нам ділитися будь-якою інформацією, що відслідковується gitом (а отже, виконаною роботою, новими файлами, ідеями, листами, тощо).","","На цьому уроці ми навчимося витягати дані _з_ віддаленого репозиторію -- команда, що відповідає за це, зручно називається `git fetch` (fetch - англ. витягнути чи дістати).","","Зауваж, що коли ми оновлюємо наш віддалений репозиторій, наші _віддалені_ гілки теж оновляться. Про це ми говорили на попередньому уроці."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Перед тим, як почати розбиратися з `git fetch`, спробуймо його в дії! Тут ми маємо віддалений репозиторій, що містить два коміти, яких немає в нашому локальному сховищі."],afterMarkdowns:["Ось, маєш! Коміти `C2` та `C3` було завантажено до нашого локального сховища й наша віддалена гілка `o/main` була відповідно оновлена."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Що робить fetch","","`git fetch` виконує дві основні дії, і тільки дві дії. Він:","","* звантажує коміти, які містить віддалене сховище, але яких немає в локальному сховищі, та...","* оновлює посилання віддаленого бранчу (наприклад, `o/main`)","","Якщо коротко, `git fetch` приводить репрезентацію віддаленого репозиторію в локальному сховищі до _актуального_ стану справжнього віддаленого репозиторію.","","Якщо ти пам’ятаєш з попереднього уроку, ми тоді зауважили, що віддалені гілки відображають стан віддаленого репозиторію _від_ останнього разу, коли ми синхронізувались з віддаленим репозиторієм. `git fetch` якраз і відповідає за синхронізацію з віддаленим сховищем! Сподіваюсь, що зв’язок між віддаленими гілками `git fetch` тепер є очевидним.","","Як правило, `git fetch` працює з віддаленими сховищами через інтернет (через протоколи `http://` чи `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Чого не робить fetch","","Тим не менш, `git fetch` нічого не змінює в _твоєму_ локальному стані. Він не оновить твою гілку `main` і не змінить того, як наразі виглядає локальна файлова система.","","Це важливо зрозуміти, тому що багато розробників думають, що `git fetch` оновить їхні локальні данні до стану віддаленого репозиторію. Він дійсно звантажить всі потрібні дані, щоб це зробити, але він _не змінить_ автоматично жодних локальних файлів. Ми вивчимо команди, які це роблять, в наступних уроках :D","","Отже, зрештою, ти можеш вважати що `git fetch` просто звантажує нову інформацію з віддаленого сховища."]}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень просто виконай `git fetch` і звантаж всі коміти!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","git 원격 작업들은 결국 서로다른 저장소에서 데이터를 _주고_ _받는_것에 불과하다는것을 알 수 있습니다. 우리가 커밋들을 주고 받을수 있는 한, git을 바탕으로하는 모든 종류의 업데이트를 공유할 수 있습니다(작업, 새로운 파일들, 새로운 아이디어, 러브레터 등...).","","이번 레슨에서는 원격 저장소_에서_ 데이터를 가져오는 방법을 배워볼 것입니다 -- 이를 위한 명령어는 `git fetch`라고 불립니다.","","먼저 알아두고 넘어갈것이 있는데 우리가 원격 저장소와 작업을 해서 상태가 변하면 _원격_브랜치들 또한 그 변경들을 반영합니다. 원격 브랜치에대한 이전 레슨을 참고하세요."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`git fetch`의 세부사항을 알아보기 전에 일단 눈으로 먼저 확인해 봅시다! 여기 로컬 저장소에는 없는 두개의 커밋이 있는 원격 저장소가 있습니다."],afterMarkdowns:["됐습니다! 커밋 `C2` 와 `C3`가 우리의 로컬 저장소로 다운로드 되었고, 원격 브랜치 `o/main`가 이것을 반영하기 위해 업데이트 되었습니다."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### fetch는 무엇을 하는가","","`git fetch`는 두가지의 중요한 단계를 수행합니다. 사실 이 두 단계만을 진행합니다. 그것은 :","","* 원격 저장소에는 있지만 로컬에는 없는 커밋들을 다운로드 받습니다. 그리고... ","* 우리의 원격 브랜치가 가리키는곳을 업데이트합니다 (예를들어, `o/main`)","","`git fetch`는 본질적으로 _로컬_에서 나타내는 원격 저장소의 상태를 _실제_ 원격 저장소의 (지금)상태와 동기화합니다.","","이전 레슨을 기억한다면, 원격 브랜치는 가장 최근 원격 원격저장소와 작업을 했을때를 기준으로 원격 저장소의 상태를 반영한다고 했습니다. `git fetch`가 그러한 작업중에 하나입니다!(역: 원문에서는 talk with remote라고 표현합니다. 원격 저장소와 대화한다고 번역하기 어색해서 의역했습니다.) 원격 브랜치와 `git fetch`의 관계를 분명하게 알게되셨으면 좋겠습니다.","","`git fetch`는 일반적으로 원격 저장소와 인터넷을 통해 접근합니다(`http://` 또는 `git://`와같은 프로토콜로).",""]}},{type:"ModalAlert",options:{markdowns:["### fetch는 무엇을 하지 않는가","","`git fetch`는 그러나, _여러분의_ 로컬 상태는 전혀 바꾸지 않습니다. 여러분의 `main` 브랜치도 업데이트하지 않고 파일 시스템의 모습이던 그 어떤것도 바꾸지 않습니다.","","이것을 이해하는게 아주 중요한데, 왜냐하면 수 많은 개발자들이 `git fetch`를 하면 자신의 로컬 작업이 변경되어 원격 저장소의 모습을 반영해 업데이트 될것이라고 생각하기 때문입니다. 앞의 과정에 필요한 데이터를 다운로드는 하지만, 실제로 로컬 파일들이나 브랜치를 변경하지는 않습니다. 이것을 하기위한 명령어들은 뒤에서 배우겠습니다 :D","","간단하게 `git fetch`를 다운로드 단계로 생각할 수 있습니다."]}},{type:"ModalAlert",options:{markdowns:["레벨을 마치기 위해, `git fetch`를 수행하고 모든 커밋들을 내려 받으세요!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Làm việc với git remote về căn bản là chuyển giao dữ liệu qua và lại giữa các kho chứa. Miễn là ta có thể chia sẻ qua lại các commit, ta có thể chia sẻ bất kỳ cập nhật gì được theo dõi bở Git (và từ đó chia sẻ thành quả, tập tin mới, ý tưởng mới, thư tình, các kiểu con đà điểu.).","","Ở bài học này ta sẽ học cách lấy dữ liệu về từ một kho chứa từ xa -- lệnh đó là `git fetch`.","","Bạn sẽ nhận thấy rằng khi ta cập nhật đại điện kho chứa từ xa, nhánh _từ xa_ của ta cũng được cập nhật để phản ánh đại diện đó. Điều này liên quan đến bài học trước về nhánh từ xa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Trước khi đi vào chi tiết về `git fetch`, hãy xem cách nó hoạt động! Ở đây ta có một kho chứa từ xa trong đó chứa 2 commit mà kho chứa cục bộ của ta không có."],afterMarkdowns:["Đó! Commit `C2` và `C3` đã được tải xuống kho chứa cục bộ của ta, và nhánh từ xa `o/main` của ta đã được cập nhật để phản ánh điều này."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Fetch làm gì","","`git fetch` thực hiện 2 bước chính, và chỉ 2 bước chính. Nó:","","* tải xuống commit có trên kho chứa từ xa mà kho chứa cục bộ của ta không có, và...","* cập nhật nơi mà nhánh từ xa của ta trỏ tới (ví dụ nhánh `o/main`)","","Về căn bản thì `git fetch` đưa đại diện _cục bộ_ của kho chứa từ xa của ta về trạng thái đồng bộ với trạng thái _thực tế_ của kho chứa từ xa (ngay lúc này).","","Nếu bạn còn nhớ thì trong bài học trước, chúng tôi có đề cập rằng nhánh từ xa phản ánh trạng thái của kho chứa từ xa kể từ lần cuối bạn tương tác với các nhánh từ xa đó. `git fetch` chính là cách để tương tác với các nhánh từ xa! Hy vọng chúng tôi đã làm sáng tỏ sự liên kết giữa nhánh từ xa và `git fetch`.","","`git fetch` thường tương tác với kho chứa từ xa bằng Internet (thông qua các giao thức như `http://` hoặc `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Fetch không làm gì","","Tuy nhiên, `git fetch` không hề thay đổi trạng thái kho chứa _cục bộ_ của bạn. Nó sẽ không cập nhật nhánh `main` hay thay đổi bất kỳ điều gì trong hệ thống tập tin hiện tại của bạn.","","Điều này rất quan trọng, vì nhiều nhà phát triển nghĩ rằng `git fetch` sẽ làm kho chứa cục bộ của họ phản ánh trạng thái của kho chứa từ xa. Nó có thể tải xuống tất cả dữ liệu cần thiết, nhưng nó thực tế không thay đổi bất cứ thứ gì trên tập tin cục bộ của bạn. Ta sẽ học lệnh để làm điều đó sau :D","","Nói tóm lại, bạn có thể coi `git fetch` thuần túy như một bước tải xuống."]}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, đơn giản hãy gõ `git fetch` để tải xuống tất cả commit!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Delanje z git oddaljnemi repoti je v bistvu le premikanje podatkov na in z drugih repozitorijev. Dokler lahko pošiljamo commite naprej in nazaj, lahko delimo bilokakšno posodobitev, kateri git sledi (in posledično delimo delo, nove datoteke, nove ideje, ljubezenska pisma, itd.).","","V tej lekciji se bomo naučili kako fetchat (prenesti) podatke iz oddaljenega repozitorija -- ukaz za to je poimenovan `git fetch`.","","Opazil boš, da ko posodobimo našo predstavitev oddaljenega repota, se bo naš oddaljen branch posodobil in imel nove spremembe. To se navezuje na prejšnjo lekcijo o oddaljenih repozitorijih."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Preden se spustimo v podrobnosti `git fetch` ga poglejmo v akciji! Tu imamo oddaljen repozitorij, ki vsebuje dva commita, ki jih naš lokalen repozitorij nima."],afterMarkdowns:["Tako! Commita `C2` in `C3` sta bila prenesena v naš lokalen repozitorij in naš oddaljen branch `o/main` je bil posodobljen, da to odraža."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Kaj fetch naredi","","`git fetch` naredi dve stvari. In sicer:","","* prenese commite, ki jih ima oddaljeni repo ampak manjkajo v našem lokalnem in ...","* posodobi, kam kaže naš oddaljeni branch (naprimer `o/main`)","","`git fetch` v bistvu našo lokalno predstavitev oddaljenega repozitorija uskladi z dejanskim stanjem na oddaljenem repozitoriju.","","Če se spomneš še iz prejšnje lekcije smo rekli, da oddaljeni branchi odsevajo stanje na oddaljenih repozitorijih, odkar si komuniciral z njimi. `git fetch` je način, da komuniciraš z njimi! Upam, da je sedaj povezava med oddaljenimi repozitoriji in `git fetch` jasna.","","`git fetch` ponavadi komunicira z oddaljenimi repozitoriji preko interneta (s protokolom kot sta `http://` ali `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Kaj fetch ne naredi","","`git fetch` ne spremeni ničesar glede tvojega lokalnega stanja. Ne bo posodobil tvojega `main` brancha ali spremenil česarkoli v tvojih datotekah.","","To je pomembno razumeti, ker veliko razvijalcev misli, da bo `git fetch` posodobil njihovo lokalno stanje s stanjem na oddaljenem repozitoriju. Lahko bo prenesel vse potrebne podatke, da to izvede, ampak v bistvu _ne_ spremeni tvojih datotek. V kasnejših lekcijah se bomo naučili ukaze, ki pa naredijo točno to. :D","","Torej na koncu dneva, izvajanje `git fetch` si lahko predstavljate kot korak za prenašanje."]}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje uporabi `git fetch` in prenesi vse commite!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch","","Praca ze zdalnymi Gitami tak naprawdę sprowadza się do przesyłania danych _do_ i _z_ innych repozytoriów. Tak długo jak możemy przesyłać zatwierdzenia tam i z powrotem, możemy udostępniać wszelkiego rodzaju aktualizacje śledzone przez Git (a tym samym dzielić się pracą, nowymi plikami, pomysłami, listami miłosnymi itp.).","","W tej lekcji nauczymy się, jak pobierać dane _ze_ zdalnego repozytorium -- polecenie to nosi nazwę `git fetch`.","","Zauważysz, że gdy aktualizujemy reprezentację zdalnego repozytorium, nasze _zdalne_ gałęzie zostaną zaktualizowane, aby odzwierciedlić tę nową reprezentację. Wiąże się to z poprzednią lekcją dotyczącą zdalnych gałęzi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zanim przejdziemy do szczegółów polecenia `git fetch`, zobaczmy, jak działa! Mamy tu zdalne repozytorium, zawierające dwa commity, których nie ma w naszym lokalnym repozytorium."],afterMarkdowns:["No to jedziemy! Commity `C2` i `C3` zostały pobrane do naszego lokalnego repozytorium, a zdalna gałąź `o/main` została zaktualizowana, aby to odzwierciedlić."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Co robi fetch","","`git fetch` wykonuje dwie rzeczy:","","* pobiera commity, które są w zdalnym repozytorium, ale których brakuje w naszym lokalnym repozytorium i...","* aktualizuje miejsca, które wskazują nasze zdalne gałęzie (na przykład `o/main`)","","`git fetch` zasadniczo synchronizuje _lokalną_ reprezentację zdalnego repozytorium z tym, jak w _rzeczywistości_ zdalne repozytorium wygląda (w danej chwili).","","Jak pamiętasz z poprzedniej lekcji, powiedzieliśmy, że zdalne gałęzie odzwierciedlają stan zdalnych repozytoriów od czasu ostatniej komunikacji nimi. `git fetch` to sposób, w jaki rozmiawiasz z tymi repozytoriami! Mamy nadzieję, że związek między zdalnymi gałęziami a `git fetch` jest teraz jasny.","","`git fetch` zwykle komunikuje się ze zdalnym repozytorium przez internet (za pośrednictwem protokołu takiego jak `http://` lub `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Czego fetch nie robi","","Zauważ, że `git fetch` nie zmienia nic w _twoim_ stanie lokalnym. Nie zaktualizuje twojej gałęzi `main` ani nie zmieni niczego w wyglądzie twojego systemu plików.","","Zrozumienie tego to ważna sprawa! Wielu programistów uważa, że uruchomienie `git fetch` spowoduje, że ich lokalna praca będzie odzwierciedlać stan zdalny. Mimo że `git fetch` pobiera wszystkie niezbędne do tego dane, _nie zmienia_ żadnego z plików lokalnych. Poleceń, które służą właśnie do tego celu, nauczymy się później. :D","","Dlatego, podsumowując to wszystko, możesz myśleć o `git fetch` jako pobieraniu."]}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, po prostu użyj polecenia `git fetch` i pobierz wszystkie commity!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Lavorare con git remoto consiste essenzialmente nel trasferimento di dati _verso_ e _da_ altri repository. Fino a che possiamo inviare commit avanti e indietro, possiamo condividere qualsiasi tipo di aggiornamento tracciabile da git (e quindi condividere lavoro, nuovi file, nuove idee, letterine d'amore, etc.).","","In questa lezione vedremo come recuperare dati _da_ un repository remoto -- il comando per fare ciò è `git fetch`.","","Man mano che aggiorneremo la nostra rappresentazione del repository remoto, noterai che i nostri rami _remoti_ si aggiorneranno per riflettere quella nuova rappresentazione. Questo si collega alla lezione precedente sui rami remoti."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prima di addentrarci nei dettagli di `git fetch`, vediamolo in azione! Qui abbiamo un repository remoto contenente due commit che il nostro repository locale non ha."],afterMarkdowns:["Ecco fatto! I commit `C2` e `C3` sono stati scaricati nel nostro repository locale, e il nostro ramo remoto `o/main` è stato aggiornato per riflettere questo cambiamento."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Cosa fa git fetch","","`git fetch` compie unicamente queste due azioni:","","* scarica i commit presenti in remoto ma assenti dal nostro repository locale, e...","* aggiorna dove puntano i nostri rami remoti (ad esempio, `o/main`)","","`git fetch` essenzialmente porta la nostra rappresentazione _locale_ del repository remoto al pari con lo stato _attuale_ dello stesso (in questo momento).","","Se ti ricordi, nella lezione precedente abbiamo visto che i rami remoti riflettono lo stato del repository remoto dall'_ultima volta_ in cui hai comunicato con esso. `git fetch` è il modo per comunicare con i repository remoti! Ora il legame tra i rami remoti e `git fetch` dovrebbe essere più chiaro.","","`git fetch` generalmente comunica con il repository remoto attraverso Internet (tramite un protocollo come `http://` o `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Cosa non fa git fetch","","`git fetch`, però, non effettua modifiche a ciò che è già presente in locale sul _tuo_ sistema. Non aggiornerà il tuo ramo `main` e non apporterà modifiche ai tuoi file.","","Questo è importante da comprendere in quanto molti sviluppatori pensano che eseguire `git fetch` porterà il loro lavoro a riflettere lo stato del repository remoto. Va a scaricare tutti i dati necessari per farlo, ma _non_ va a modificare effettivamente alcun file locale. Impareremo nelle prossime lezioni i comandi per fare proprio questo :D","","In fin dei conti, puoi considerare `git fetch` come una fase di download di dati."]}},{type:"ModalAlert",options:{markdowns:["Per completare il livello, digita `git fetch` per scaricare tutti i commit!"]}}]}}}},{}],142:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C7","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C3","C6"],"id":"C7"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C6","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"foo","id":"HEAD"}}}',solutionCommand:"git fetch origin main~1:foo;git fetch origin foo:main;git checkout foo;git merge main",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"C1","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C6","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"foo","id":"HEAD"}}}',name:{en_US:"Fetch arguments",fr_FR:"Arguments de fetch",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",ja:"Fetchの引数",ru_RU:"Аргументы для fetch",ko:"Fetch의 인자들",uk:"Аргументи для fetch",vi:"Tham số fetch",sl_SI:"Fetch argumenti",pl:"Argumenty fetch",it_IT:"Parametri di git fetch"},hint:{en_US:'Pay attention how the commit ids may have swapped! You can read slides again with "help level"',fr_FR:'Faites attention à la façon dont les ids des commits ont été intervertis ! Vous pouvez relire les slides avec "help 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',ja:"コミットIDの入れ替わりに注意!スライドを復習するには`help level`を実行",ru_RU:'Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой "help level"',ko:'커밋 ID가 바뀔수도있으니 주의하세요! "help level"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.',uk:'Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою "help level"',vi:'Lưu ý id của các commit bị tráo đổi, bạn có thể dùng "help level" để đọc lại hộp thoại',sl_SI:'Bodi pozoren kako so se commit id-ji morda zamenjali! Ponovno lahko prebereš navodila z "help level".',pl:'Zauważ, że identyfikatory commitów mogły zostać zamienione! Slajdy możesz przeczytać jeszcze raz po wpisaniu: "help level"',it_IT:'Fai attenzione, alcuni ID dei commit potrebbero essere invertiti! Puoi leggere nuovamente le slide con "help level"'},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch arguments","","So we've just learned all about git push arguments, this cool `` parameter, and even colon refspecs (`:`). Can we use all this knowledge for `git fetch` as well?","","You betcha! The arguments for `git fetch` are actually *very, very* similar to those for `git push`. It's the same type of concepts but just applied in the opposite direction (since now you are downloading commits rather than uploading).","","Let's go over the concepts one at a time..."]}},{type:"ModalAlert",options:{markdowns:["### The `` parameter","","If you specify a place with git fetch like in the following command:","","`git fetch origin foo`","","Git will go to the `foo` branch on the remote, grab all the commits that aren't present locally, and then plop them down onto the `o/foo` branch locally.","","Let's see this in action (just as a refresher)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["By specifying a place..."],afterMarkdowns:["We download only the commits from `foo` and place them on `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["You might be wondering -- why did git plop those commits onto the `o/foo` remote branch rather than just plopping them onto my local `foo` branch? I thought the `` parameter is a place that exists both locally and on the remote?","","Well git makes a special exception in this case because you might have work on the `foo` branch that you don't want to mess up!! This ties into the earlier lesson on `git fetch` -- it doesn't update your local non-remote branches, it only downloads the commits (so you can inspect / merge them later).",""]}},{type:"ModalAlert",options:{markdowns:['"Well in that case, what happens if I explicitly define both the source and destination with `:`?"',"","If you feel passionate enough to fetch commits *directly* onto a local branch, then yes you can specify that with a colon refspec. You can't fetch commits onto a branch that is checked out, but otherwise git will allow this.","","Here is the only catch though -- `` is now a place on the *remote* and `` is a *local* place to put those commits. It's the exact opposite of git push, and that makes sense since we are transferring data in the opposite direction!","","That being said, developers rarely do this in practice. I'm introducing it mainly as a way to conceptualize how `fetch` and `push` are quite similar, just in opposite directions."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see this craziness in action:"],afterMarkdowns:["Wow! See, git resolved `foo~1` as a place on the origin and then downloaded those commits to `bar` (which was a local branch). Notice how `foo` and `o/foo` were not updated since we specified a destination."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What if the destination doesn't exist before I run the command? Let's see the last slide but without `bar` existing beforehand."],afterMarkdowns:["See, it's JUST like git push. Git made the destination locally before fetching, just like git will make the destination on remote before pushing (if it doesn't exist)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["No args?","","If `git fetch` receives no arguments, it just downloads all the commits from the remote onto all the remote branches..."],afterMarkdowns:["Pretty simple, but worth going over just once."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, enough talking! To finish this level, fetch just the specified commits in the goal visualization. Get fancy with those commands!","","You will have to specify the source and destination for both fetch commands. Pay attention to the goal visualization since the IDs may be switched around!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les arguments de git fetch","","Nous savons maintenant tout ce qu'il y a à savoir sur les arguments de git push, y compris le paramètre `` et la ponctuation pour refspecs (`:`). Pouvons-nous utiliser ces connaissances avec `git fetch` également ?","","Bien sûr ! Les arguments de `git fetch` sont en fait *très, très* similaires à ceux de `git push`. Il s'agit des mêmes concepts mais simplement appliqués dans le sens opposé (puisque maintenant vous récupérez des commits plutôt que de les envoyer).","","Voyons ces concepts un par un..."]}},{type:"ModalAlert",options:{markdowns:["### Le paramètre ``","","Si vous spécifiez un emplacement à git fetch, comme dans la commande suivante :","","`git fetch origin foo`","","Git va aller à la branche distante `foo`, récupérer tous les commits qui ne sont pas présents localement, puis les rapatrier dans la branche locale `o/foo`.","","Voyons cela en action (juste pour réviser)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["En spécifiant un emplacement..."],afterMarkdowns:["Nous téléchargeons uniquement les commits de `foo` et les plaçons dans `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Vous vous posez peut-être la question : pourquoi Git a-t-il fait apparaître ces commits dans la branche distante `o/foo` plutôt que les placer directement dans ma branche locale `foo` ? Je croyais que le paramètre `` était un emplacement qui existait à la fois localement et sur le dépôt distant ?","","En fait Git fait une exception dans ce cas parce que vous pourriez avoir du travail en cours dans la branche `foo` que vous ne voulez pas écraser !! Cela vient de ce que nous avions vu dans la leçon précédente sur `git fetch` : cette commande ne met pas à jour vos branches locales, elle télécharge uniquement les commits (pour que vous puissiez les inspecter et/ou les fusionner plus tard).",""]}},{type:"ModalAlert",options:{markdowns:['"Bon, mais dans ce cas, que se passe-t-il si je spécifie explicitement la source et la destination avec `:` ?"',"","Si vous êtes déterminé à rapatrier (fetch) des commits *directement* dans votre branche locale, alors oui vous pouvez préciser cela avec la notation refspec. Vous ne pouvez cependant pas rapatrier les commits dans la branche courante.","","Il y a un petit piège cependant : dans ce cas précis `` est l'emplacement sur le dépôt *distant* et `` l'emplacement sur le dépôt *local* où seront placés ces commits. C'est l'exact opposé de git push, et cela se tient puisque nous transférons des données dans le sens opposé !","","Cela dit, les développeurs utilisent rarement cette syntaxe en pratique. Je l'introduis principalement pour concrétiser le fait que `fetch` et `push` sont très similaires, fonctionnant simplement dans des sens opposés."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons ce phénomène en action :"],afterMarkdowns:["Wow ! Vous voyez, Git a résolu `foo~1` comme un emplacement sur origin et a ensuite téléchargé les commits dans `bar` (qui était une branche locale). Remarquez aussi que `foo` et `o/foo` n'ont pas été mises à jour puisque nous avons spécifié une destination."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Que se passe-t-il si l'emplacement n'existe pas avant que j'exécute la commande ? Voyons cela dans ce dernier slide, en nous mettant dans la situation où `bar` n'existe pas encore."],afterMarkdowns:["Vous voyez, c'est COMME un git push. Git a créé la destination localement avant le fetch, exactement comme il fait avec push en créant au préalable la destination sur le dépôt distant (si elle n'existe pas)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pas d'arguments ?","","Si `git fetch` ne reçoit pas d'arguments, cela télécharge simplement tous les commits du dépôt distant au sein de toutes les branches distantes..."],afterMarkdowns:["Assez simple, mais ce n'était pas inutile de le voir en action."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, assez parlé ! Pour finir ce niveau, faites simplement un fetch des commits indiqués dans la fenêtre de visualisation de l'objectif. Faites-vous plaisir !","","Vous devrez préciser la source et la destination pour les deux commandes fetch. Faites attention à l'objectif puisque les IDs peuvent avoir été intervertis !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de git fetch","","Entonces, recién aprendimos todo sobre los parámetros de push, este parámetro `` copado, 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 a la vez..."]}},{type:"ModalAlert",options:{markdowns:["### El parámetro ``","","Si especificás 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 vos podrías tener trabajo en la rama `foo` que no quieras mezclar. Esto refiere 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 sentís lo suficientemente seguro como para traer commits *directamente* a una rama local, entonces, sí, podés especificarlo usando una referencia con dos puntos. No podés traer commits a una rama que tengas checkouteada, pero en cualquier otro caso git te lo va a permitir.","","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, 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:["¡Wow! Mirá: git resolvió `foo~1` como un lugar en el origin y bajó esos commits a `bar` (que era una rama local). Notá 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 que corra este comando? Veamos el último ejemplo pero sin que `bar` exista de antemano."],afterMarkdowns:["Mirá: 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 pushear (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 vale la pena verlo al menos una vez."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Bueno, demasiada charla. Para completar este nivel, fetcheáte sólo los commits especificados en la visualización del objetivo. ¡Amigate con esos comandos!","","Vas a tener que especificar el origen y el destino para ambos comandos fetch. Prestá atención al objetivo dado que ¡los IDs pueden estar invertidos!"]}}]},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 main"}},{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:[{type:"ModalAlert",options:{markdowns:["## Parâmetros do git fetch","","Então acabamos de aprender tudo sobre os parâmetros do git push, inclusive sobre esse parâmetro bacana chamado ``, e até mesmo sobre colon refspecs (`:`). Será que poderíamos aplicar todo esse conhecimento também ao `git fetch`?","","Você adivinhou! Os parâmetros do `git fetch` são na verdade *muito, muito* similares aos do `git push`. Trata-se do mesmo tipo de conceito, só que aplicado na direção oposta (já que agora é um download em vez de um upload).","","Vamos aos conceitos um por vez..."]}},{type:"ModalAlert",options:{markdowns:["### O parâmetro ``","","Se você passar um lugar ao git fetch, como no seguinte comando:","","`git fetch origin foo`","","O Git vai ao ramo remoto `foo` e pega todos os commits que não estão presentes localmente, jogando-os no ramo local `o/foo`.","","Vejamo-lo em ação (só para refrescar a memória)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especificando um lugar..."],afterMarkdowns:["Baixamos só os commits de `foo` e colocamos em `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Você pode estar se perguntando -- por que o Git colocou os commits no ramo remoto `o/foo` em vez de simplesmente jogá-los no meu ramo local `foo`? Eu pensei que o parâmetro fosse um `` que existisse tanto no repositório local como no remoto?","","Bem, o Git tem uma exceção especial neste caso, porque pode ser que exista trabalho seu no ramo local `foo` que você não queira bagunçar!! Esse fato é relacionado com o abordado na lição anterior sobre o `git fetch` -- ele não atualiza ramos locais não-remotos, ele apenas baixa os commits (de forma que você possa inspecioná-los e/ou realizar um merge posteriormente).",""]}},{type:"ModalAlert",options:{markdowns:['"Bem, neste caso, o que acontece se eu definir explicitamente tanto a origem como o destino, com `:`?"',"","Se você estiver apaixonado o suficiente para baixar commits *diretamente* em um ramo local, então sim, você pode especificar esse comportamento com um colon refspec. Você só não pode baixar commits em um ramo que esteja atualmente em checkout, mas se não estiver, o Git permitirá o fetch.","","Aqui está o único detalhe -- `` agora é uma referência *remota* e `` é uma referência *local* de onde colocar esses commits. É exatamente o oposto do git push, e realmente faz sentido, já que estamos transferindo os dados na direção oposta!","","Tendo dito isto, desenvolvedores raramente fazem isso na prática. Estou introduzindo essa informação mais como uma forma de conceitualizar a forma como `fetch` e `push` são tão similares, apenas em direções opostas."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos essa loucura em ação:"],afterMarkdowns:["Wow! Viu, o Git entendeu o `foo~1` como um lugar de origin e baixou os commits para o ramo local `bar`. Veja como `foo` e `o/foo` não foram atualizados, já que especificamos outro 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:["E se o destino não existir antes de eu executar o comando? Vamos rever o último slide, mas em uma situação na qual o `bar` não existe de antemão."],afterMarkdowns:["Viu? Funciona EXATAMENTE como o git push. O Git criou o destino localmente antes do fetch, da mesma forma como o Git cria o destino (se ele não existir) no repositório remoto durante um push."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sem parâmetros?","","Se o `git fetch` não receber argumentos, ele simplesmente baixa todos os commits do repositório remoto em todos os ramos remotos..."],afterMarkdowns:["Bastante simples, mas importante de rever ao menos uma vez."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, chega de conversa! Para completar este nível, faça fetch apenas dos commits especificados na visualização do objetivo. Capriche nos comandos!","","Você terá de especificar tanto a origem como o destino em ambos os comandos de fetch. Preste atenção na janela de visualização, já que os identificadores podem trocar!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de fetch","","Entonces, aprendido todo sobre os parámetros de push, este parámetro `` molón, e incluso as referencias separadas por dous puntos (`:`). ¿Poderemos empregar todo este coñecemento para `git fetch` tamén?","","¡Home claro! Os parámetros para `git fetch` son realmente *moi, moi* semellantes os de `git push`. É o mesmo tipo de conceptos, pero aplicados na dirección contraria (xa que agora estás baixando os commits en lugar de subilos).","","Vexamos os conceptos dunha puntada..."]}},{type:"ModalAlert",options:{markdowns:["### O parámetro ``","","Se especificar o lugar co git fetch como no comando seguinte:","","`git fetch origin foo`","","Git vai ir á rama `foo` no remoto, vai traer tódolos commits que non estén presentes localmente, e logo aplicaráos sobre a rama `o/foo` localmente.","","Vexámolo en acción (refresquemos o concepto)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especificando un lugar..."],afterMarkdowns:["Sólo baixamos os commits de `foo` e os poñemos en `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:['Poderás preguntarte "¿Por qué git aplicou eses commits sobre a rama `origin/foo` e non os aplicou sobre a rama `foo` local? Lembra que o parámetro `` era un lugar que existía tanto no local como no remoto."',"","Bueno, git fai unha excepción especial neste caso, xa que poderías ter traballo na rama `foo` que non quixeras mesturar. Esto refírese á lección anterior sobre `git fetch` - non actualiza as túas ramas locais non-remotas, só descarga os commits (para que poidas velos ou mesturalos despois).",""]}},{type:"ModalAlert",options:{markdowns:['"Bueno, e, neste caso, ¿qué pasa se explícitamente definimos o orixe e destino con `:`?"',"","Se te sentes o suficientemente seguro como para traer os commits *directamente* da rama local, entón, sí, podes especificalo empregando a referencia con dous puntos. Non podes traer commits a unha rama que non teñas, pero en calquera outro caso, git vaino facer.","","Este é o único problema, igual: `` é agora un lugar no *remoto*, e `` é un lugar *local* onde poñer esos commits. É exactamente o oposto a git push, e eso ten sentido xa que ¡estamos enviando os datos no sentido contrario!","","Dito esto, difícilmente alguén use esto na práctica. Estouno presentando principalmente como un modo de traballar no que `fetch` e `push` son moi semellantes, só que en direccións opostas."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos esta locura en acción"],afterMarkdowns:["¡Wow! Mira: git resolveu `foo~1` como un lugar no que a orixe descargou eses commits a `bar` (que era unha rama local). Nota como `foo` e `o/foo` non foron actualizados, xa que especificamos o 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 o destino non existe antes de lanzar este comando? Vexamos o último exemplo pero sin que `bar` exista de antemán."],afterMarkdowns:["Mira: é IGUAL que git push. Git creou o destino localmente antes de facer o fetch, tal e como git creará o destino no remoto antes de empurrar (se non existiran)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Sen argumentos?","","Se `git fetch` non recibe ningún argumento, simplemente descarga tódolos commits do remoto a tódalas ramas remotas..."],afterMarkdowns:["Moi sinxelo, pero vale a pena velo ó menos unha vez."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Bueno, moitas verbas. Para rematar o nivel, descarga só os commits especificados na visualización do obxectivo. ¡Faite colega destes comandos!","","Vas ter que especificar a orixe e o destino para ámbolos dous comandos fetch. Presta atención ó objetivo dado que ¡os IDs poden estar invertidos!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git fetch 的參數","","我們剛學到了所有關於 git push 的參數,有非常棒的 `` 參數,甚至是 colon refspecs(`:`),我們可不可以也同樣套用到 `git fetch` 上面?","","你猜對了!`git fetch` 的參數*非常非常*類似 `git push`,一樣的概念,但方向不同(因為你在下載 commit,而不是在上傳 commit)。","","讓我們一次講一個概念..."]}},{type:"ModalAlert",options:{markdowns:["###`` 參數","","對於 `git fetch`,如果你特別指定了一個 ``:","","`git fetch origin foo`","","git 會到 remote 上的 `foo` branch,抓下所有不在 local 上的 commit,然後將它們放到 local 的 `o/foo` branch。","","讓我們實際看一下(就只是一個*更新*的方法)。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["指定一個 ``..."],afterMarkdowns:["我們只下載了 `foo` 上的 commit,並且把它們放到 `o/foo`。"],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["你也許會感到奇怪,為什麼 git 是把這些 commit 放到 `o/foo` branch 而不是放到我的 local 的 `foo` branch? 我認為,`` 參數是表示一個位置,這個位置同時存在 local 跟 remote 上?","","因為你可能已經 checkout 到 `foo` branch 上,而且你不想要打亂上面的 commit,因此 git 才會特別這樣做!!這就又回到之前的 `git fetch` 的課程,它並不會放到你的 local 上的 branch (該 branch 沒有對應到任何的 remote branch),它只會下載 commit 到 local 上且表示 remote 的 branch(所以你之後可以觀察或者 merge 它們)。",""]}},{type:"ModalAlert",options:{markdowns:['"在該例子當中,如果我特別透過 `:` 來指定 source 以及 destination,會發生什麼事情?"',"","如果你很想要把 fetch 回來的 commit *直接*放到 local branch,那麼你就可以利用一個 colon refspec 來做到。你不能夠把 fetch 回來的 commit 放到你目前正 checkout 的 branch,如果不是的話,git 就會允許你這麼做。","","這裡只有一個重點,`` 現在是一個在 *remote* 上的 branch,而且 `` 是一個放置這些 commit 的 *local* 的位置。它剛好就是 `git push` 的相反,而且因為我們在相反方向傳遞資料,所以這也很合理!","","其實,程式設計師很少會想要做這個,我主要是強調 `fetch` 以及 `push` 的概念是很類似的,就只是方向相反而已。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來實際看一下這個瘋狂的事情:"],afterMarkdowns:["哇!看到了吧,git 把 `foo~1` 解讀成一個在 origin 上的位置,而且把該位置上面的 commit 下載到 `bar`(這是一個 local branch)上面,注意,因為我們有指定目的地,因此 `foo` 跟 `o/foo` 並沒有被更新。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我在執行這個指令之前,destination 不存在的話會怎樣?我們回到上一個例子,但這一次事前並沒有 `bar` 這個 branch 的存在。"],afterMarkdowns:["看到了吧,這就像是 `git push`,在 fetch 之前,git 會自己建立 destination,就好像是在 push 之前, git 會建立 remote 上的 destination 一樣(如果它不存在的話)。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["沒有參數的情況?","","如果使用 `git fetch` 的時候,沒有指定任何的參數,那就相當於它會下載 remote 上面的所有的 commit,並且把這些 commit 放到 local 上面所有對應到 remote 的 branch..."],afterMarkdowns:["超簡單,但是所有的更新只做一次,很值得。"],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["好的,講了好多!要完成這一關,fetch 視覺化的目標所指定的 commit,好好玩這些指令吧!","","對於兩個 fetch 的指令,你必須要指定 source 以及 destination,注意一下視覺化的目標,因為 commit 的 id 可以被交換!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch 的参数","","我们刚学习了 git push 的参数,很酷的 `` 参数,还有用冒号分隔的 refspecs(`:`)。 这些参数可以用于 `git fetch` 吗?","","你猜中了!`git fetch` 的参数和 `git push` 极其相似。他们的概念是相同的,只是方向相反罢了(因为现在你是下载,而非上传)","","让我们逐个讨论下这些概念……"]}},{type:"ModalAlert",options:{markdowns:["### `` 参数","","如果你像如下命令这样为 git fetch 设置 的话:","","`git fetch origin foo`","","Git 会到远程仓库的 `foo` 分支上,然后获取所有本地不存在的提交,放到本地的 `o/foo` 上。","","来看个例子(还是前面的例子,只是命令不同了)"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["通过指定 place..."],afterMarkdowns:["我们只下载了远程仓库中 `foo` 分支中的最新提交记录,并更新了 o/foo"],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["你可能会好奇 —— 为何 Git 会将新提交放到 `o/foo` 而不是放到我本地的 foo 分支呢?之前不是说这样的 参数就是同时应用于本地和远程的位置吗?","","好吧, 本例中 Git 做了一些特殊处理,因为你可能在 foo 分支上的工作还未完成,你也不想弄乱它。还记得在 `git fetch` 课程里我们讲到的吗 —— 它不会更新你的本地的非远程分支, 只是下载提交记录(这样, 你就可以对远程分支进行检查或者合并了)。",""]}},{type:"ModalAlert",options:{markdowns:["“如果我们指定 `:` 会发生什么呢?”","","如果你觉得直接更新本地分支很爽,那你就用冒号分隔的 refspec 吧。不过,你不能在当前切换的分支上干这个事,但是其它分支是可以的。","","这里有一点是需要注意的 —— `source` 现在指的是远程仓库中的位置,而 `` 才是要放置提交的本地仓库的位置。它与 git push 刚好相反,这是可以讲的通的,因为我们在往相反的方向传送数据。","","理论上虽然行的通,但开发人员很少这么做。我在这里介绍它主要是为了从概念上说明 `fetch` 和 `push` 的相似性,只是方向相反罢了。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["来看个疯狂的例子:"],afterMarkdowns:["哇! 看见了吧, Git 将 `foo~1` 解析成一个 origin 仓库的位置,然后将那些提交记录下载到了本地的 `bar` 分支(一个本地分支)上。注意由于我们指定了目标分支,`foo` 和 `o/foo` 都没有被更新。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果执行命令前目标分支不存在会怎样呢?我们看一下上个对话框中没有 bar 分支的情况。"],afterMarkdowns:["看见了吧,跟 git push 一样,Git 会在 fetch 前自己创建立本地分支, 就像是 Git 在 push 时,如果远程仓库中不存在目标分支,会自己在建立一样。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["没有参数呢?","","如果 `git fetch` 没有参数,它会下载所有的提交记录到各个远程分支……"],afterMarkdowns:["相当简单,但是仅需更新一次,值得你去做!"],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["好, 说得太多了!要完成本关,抓取目标窗口中指定的提交记录,使用这些魔幻的命令吧!","","使用 fetch 时, 你必须指定 source 和 destination。 注意一下目标窗口, 因为提交对象的 ID 可能会变哦!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch Optionen","","Nun haben wir also alles gelernt über `git push` Optionen, diesen coolen ``-Parameter und sogar mit Doppelpunkt getrennte Ref-Spezifikationen (`:`). Können wir all dieses neu erworbene Wissen auch auf `git fetch` anwenden?","","Jede Wette! Die Optionen für `git fetch` sind wirklich *sehr, sehr* ähnlich denen von `git push`. Es sind dieselben Verfahren, nur in die andere Richtung angewendet (da man bei `fetch` herunterlädt anstatt hochzuladen).","","Gehen wir die verschiedenen Verfahrensweisen mal eine nach der anderen durch ..."]}},{type:"ModalAlert",options:{markdowns:["### Der Parameter ``","",'Wenn du, wie folgt, einen "Ort" bei `git fetch` angibst:',"","`git fetch origin foo`","","wird Git zum Branch `foo` auf dem Remote gehen, dort alle Änderungen holen, die es lokal noch nicht gibt, und sie an den lokalen Branch `o/foo` anhängen.","","Schauen wir uns das mal live an (nur zur Wiederholung)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Durch Angabe eines Ortes ..."],afterMarkdowns:["... laden wir die fehlenden Commits von `foo` und packen sie auf `o/foo` drauf."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Du wunderst dich vielleicht, warum Git diese Commits auf den `o/foo` Branch gepackt hat, anstatt einfach direkt auf den lokalen Branch `foo`? Zeigt der Parameter `` nicht einen Ort an, der sowohl lokal als auch entfernt existiert?","","Nun ja, Git geht diesen Schritt, weil du auf `foo` ja noch Commits haben könntest, die nicht auf dem Server sind, und da will es nichts durcheinander bringen. Ähnlich wie beim früheren Level zu `git fetch` -- es aktualisiert nicht deine lokalen Arbeits-Branches, es lädt die Commits nur in die `o` (bzw. `origin`) Branches, damit du sie dir in Ruhe anschauen und integrieren kannst.",""]}},{type:"ModalAlert",options:{markdowns:["Wenn das so ist, was passiert dann wenn ich explizit Quelle und Ziel im Ort angebe?","","Wenn du Commits wirklich per `fetch` *direkt* auf einen lokalen Branch holen willst, dann kannst du das mit einer Ref-Spezifikation erreichen. Das funktioniert nicht mit deinem gerade ausgecheckten Branch, aber davon abgesehen lässt Git es zu.","","Nur ein Haken -- `` bezeichnet jetzt einen Ort auf dem *entfernten* Server und `` ist ein *lokaler* Ort, wo die Commits hin sollen. Es ist genau umgekehrt wie bei `git push` und das ist logisch, denn wir übertragen die Daten ja auch in die umgekehrte Richtung!","","Davon abgesehen benutzt man das in der Praxis kaum. Ich zeige das vor allem um zu verdeutlichen, wie `fetch` und `push` sehr ähnlich sind, nur in entgegengesetzten Richtungen."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns den Quatsch mal in Aktion an:"],afterMarkdowns:["Wow! Siehst du, Git löst `foo~1` als Ort auf dem Server `origin` auf und lädt dessen Commits herunter in `bar` hinein. Beachte wie `foo` und `o/foo` *nicht* aktualisiert wurden, da wir ein Ziel angegeben haben."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was ist denn, wenn das Ziel nicht existiert, für das ich den Befehl ausführe? Schauen wir uns das letzte Beispiel noch mal an, nur dass `bar` jetzt noch nicht existiert."],afterMarkdowns:["Siehst du, es ist *genau* wie `git push`. Git erstellt das Ziel lokal bevor es den `fetch` ausführt, genauso wie Git erst das Ziel auf dem Remote erstellt, bevor es pusht (falls das Ziel nicht existiert)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Keine Optionen?","","Wenn bei `git fetch` keine Optionen angegeben werden, lädt es einfach alle Commits vom Remote auf die lokalen Abbildungen aller Remote Branches ..."],afterMarkdowns:["Ziemlich einfach, aber man sollte es mal gesehen haben."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, genug gelabert! Um den Level zu schaffen musst du nur die im Zielbild angegebenen Commits per `fetch` holen. Sei kreativ mit den Befehlen!","","Du wirst Quelle und Ziel bei beiden `fetch` Befehlen angeben müssen. Schau dir das Zielbild gut an, da die IDs vertauscht sein könnten!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch の引数","","ここまでで、git pushの引数やとても便利な``引数、コロンでの参照指定(:)などについて学んできました。","","これらの知識は`git fetch`コマンドにも応用できるのでしょうか?","","その通り!`git fetch`の引数はとても、と〜っても`git push`の引数と似ています。実はfetchとpushは同種の概念ですが、適用される方向が逆なだけです。(今は、コミットをアップロードするのではなく、ダウンロードしています)","","ひとつずつしっかりと確認していきましょう..."]}},{type:"ModalAlert",options:{markdowns:["### ``引数","","次のように`git fetch`で場所を指定すると、","","`git fetch origin foo`","","Gitはリモートの`foo`ブランチに移動して、ローカル上に存在しないコミットを全てローカルの`o/foo`ブランチにダウンロードしてきます。","","実際に確認してみましょう(おさらいとして)"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["場所を指定することで..."],afterMarkdowns:["`foo`ブランチ上のコミットだけをダウンロードしてきて、","","`o/foo`ブランチに置きます。"],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["しかし、なぜGitはダウンロードしてきたコミットをローカルの`foo`ブランチではなく`o/foo`ブランチに置いたのでしょうか?","","``引数に指定したブランチはローカルとリモートの両方に存在しているはずなのに...","","なぜなら、Gitは`foo`ブランチでの作業を台無しにしたくないからです!これは先ほどの`git fetch`のレッスンと関連しています。","","`git fetch`はローカルのブランチを更新するのではなく、リモートからコミットをダウンロードするだけです!",""]}},{type:"ModalAlert",options:{markdowns:["では、ダウンロード元とダウンロード先を`:`で明示的に指定してあげるとどうなるのでしょうか?","","コミットをローカルブランチ上に「直接」取り込みたいという強い理由があるのでしたら、コロンを使ったRefspecで指定することができます。今チェックアウトしているブランチでない限り、直接取り込むことができます。","","``がリモート上の場所になり、``がそのコミットを置くローカル上の場所になるということです。","","これは`git push`と真逆で、データを逆方向に転送するということになります!","","とはいえ、開発者が実際にこの操作を行うことはありません。","ここでは、`fetch`と`push`がいかに似ていて、方向性が逆であるかを概念的に説明するために紹介しています。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["このクレイジーさを実際に確認してみましょう。"],afterMarkdowns:["うわぁ〜!gitは`foo~1`をorigin上の場所として解決し、そのコミットをローカルの`bar`ブランチに直接ダウンロードしました。","","保存先を指定したので`foo`と`o/foo`ブランチが更新されていないことに注目しましょう。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["コマンドを実行する際にダウンロード先のブランチが存在しない場合はどうなるでしょう?"],afterMarkdowns:["ご覧ください!`git push`と同じです。Gitはfetchする前にローカルへダウンロード先を作成しています。これはpushする際に、リモートにアップロード先が存在しない時、リモート上にアップロード先を作るのと同じです。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["引数がなかったらどうなるでしょう?","","`git fetch`に引数を渡さなかった時は、リモート上に存在する全てのブランチのコミットをダウンロードしてきます・"],afterMarkdowns:["とてもシンプルですね。確認してみましょう。"],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["よし、話はここまでにしましょう!このレベルをクリアするにはゴールで示されている指定されたコミットだけを`fetch`します。","","コマンドを駆使してみましょう!","","両方の`fetch`コマンドにsourceとdestinationを指定する必要があります。IDが入れ替わる可能性があるのでゴールをよく確認してください。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументы git fetch","","Итак, мы только что изучили всё, что касается аргументов git push, мы узнали о параметре `<пункт назначения>`, и даже об аргументе, задающем отдельно источник и получатель коммитов (`<источник>:<получатель>`). Можем ли мы применить все эти полученные знания для команды `git fetch` ?","","Ещё бы! Аргументы для команды `git fetch` на самом деле *очень, очень* похожи на те, что мы использовали в `git push`. В данном случае применяется тот же подход, только в противоположном направлении (так как теперь вы скачиваете коммиты, а не закачиваете их).","","Давайте ознакомимся с принципами один за одним..."]}},{type:"ModalAlert",options:{markdowns:["### Параметр `<пункт назначения>`","","Если вы указываете пункт назначения в команде git fetch, например так, как в следующем примере:","","`git fetch origin foo`","","Git отправится в ветку `foo` на удалённом репозитории, соберёт с собой все коммиты, которые не присутствуют локально, и затем поместит их в локальную ветку под названием `o/foo`.","","Давайте взглянем на всё это в действии (чтобы освежить в памяти)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Указывая пункт назначения..."],afterMarkdowns:["мы скачиваем только коммиты с ветки `foo` и помещаем их в `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Вы, должно быть, спрашиваете себя — зачем git поместил эти коммиты в ветку `o/foo` вместо того, чтобы разместить их в локальной ветке `foo` ? Ведь я думал о параметре `<пункт назначения>`, как о месте, ветке, которая существует в обоих - локальном и удалённом репозитории. Верно?","","На самом деле, в данном случае git делает исключение, потому что вы, возможно, работаете над веткой `foo`, которую не хотите привести в беспорядок!! Об этом упоминалось в ранних уроках по `git fetch` - эта команда не обновляет ваши локальные 'не удалённые', она лишь скачивает коммиты (соответственно, вы можете инспектировать / объединять их позже).",""]}},{type:"ModalAlert",options:{markdowns:['"Что же тогда произойдёт, если я явно укажу оба параметра: и источник и получатель, пользуясь синтаксисом `<источник>:<получатель>` ?"',"","Если вы уверены в том, что хотите закачать коммиты *прямиком* в вашу локальную ветку, тогда да, вы можете явно указать источник и получатель через двоеточние. Вы можете воспользоваться таким приёмом лишь для ветки, на которой вы не находитесь в настоящий момент `checkout`.","","Теперь у нас `<источник>` - это место на *удалённом репозитории*, а `<получатель>` - место в *локальном* репозитории, в который следует помещать коммиты. Аргументы в точности до наоборот повторяют git push, и немудрено, ведь теперь мы переносим данные в обратном направлении!","","Как уже было сказано, разработчики редко используют такой подход на практике. Целью демонстрации этой возможности было показать, насколько схожи концептуально `fetch` и `push`. Их отличие лишь в направлении переноса данных."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте взглянем на всё это в действии:"],afterMarkdowns:["Ого! Видите, git распознал `foo~1` как место в origin и затем скачал эти коммиты в `bar`, которая является локальной веткой. Обратите внимание, что ветки `foo` и `o/foo` не изменились, так как в аргументах мы явно указали получателя."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А что, если ветка-получатель не существует на момент запуска команды? Давайте ещё раз взглянем на предыдущий слайд, но на этот раз ветки `bar` ещё не существует."],afterMarkdowns:["Видите, поведение совсем такое же, как и у git push. Git создал ветку-получатель локально прежде чем скачивать данные. Всё как и в случае, когда git создаёт получателя в удалённом репозитории, когда мы закачиваем изменения (если получатель не существует)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А если вообще без аргументов ?","","Если команда `git fetch` выполняется без аргументов, она скачивает все-все коммиты с удалённого репозитория и помещает их в соответствующие удалённо-локальные ветки в локальном репозитории..."],afterMarkdowns:["Достаточно просто, после того как мы пережили все эти технические тонкости."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ладно, достаточно болтовни! Чтобы выполнить этот уровень, скачайте лишь определённые коммиты так, как представлено в визуализации цели. Пофантазируйте с этими командами!","","Вам следует явно указывать источник и получателя для обеих команд fetch. Обратите внимание на визуализацию цели, так как ID-шники могут меняться!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch 인자들","","여태까지 우리는 git push 인자들에 대해 배워봤습니다. 이 멋진 `` 인자 그리고 콜론 참조스펙도 말이죠(`:`). 우리가 알아낸 이 지식을 `git fetch`에도 적용 할 수 있으려나요?","","당연하죠! `git fetch`에 넘기는 인자들은 사실 `git push`의 그것들과 *아주 아주* 비슷합니다. 같은 컨셉으로 적용되지만 방향이 반대일 뿐이죠(커밋을 업로드하는게 아니라 다운받는것이니까요).","","하나씩 차근차근 알아봅시다..."]}},{type:"ModalAlert",options:{markdowns:["### `` 인자","","git fetch에 다음 명령어와 같이 place를 지정해주면:","","`git fetch origin foo`","","Git은 원격 저장소의 `foo` 브랜치로 가서 현재 로컬에 없는 커밋들을 가져와 로컬의 'o/foo' 브랜치 아래에 추가 할 것입니다.","","직접 확인해봅시다(상기해보죠)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["place를 지정해주면..."],afterMarkdowns:["커밋들을 `foo`브랜치에서만 내려받은 후 로컬의 `o/foo`브랜치에만 적용합니다."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["여러분은 분명 궁금할거에요 -- 왜 로컬의 `foo`에 그냥 커밋을 추가하지 않고 로컬의 원격 브랜치 `o/foo`에 커밋들을 추가한거지? 인자는 로컬하고 원격 저장소 모두에 똑같이 있는 곳을 의미한게 아니였나?","","음, git이 이번 상황은 특별히 예외적으로 처리하기 때문입니다. 여러분이 `foo`브랜치에 작업을 했을지도 모르는데 이 명령으로 망쳐서 건드릴지도 모르니까요! 이전에 했던 강의 `git fetch`를 떠올려보면 왜 그런지 느낌이 올겁니다 -- `git fetch`는 로컬의 원격 브랜치가 아닌 브랜치는 갱신하지 않습니다, 커밋들을 내려받기만 합니다(여러분이 확인해보고 나중에 병합할 수 있도록 말이죠).",""]}},{type:"ModalAlert",options:{markdowns:['"그렇다면, 이전 강의처럼 source와 destination를 모두 직접 지정해주면 어떻게될까요? 이 명령어로 말이죠 `:`"',"","여러분이 커밋을 *직접* 로컬 브랜치로 fetch할 열의가 있다면, 네 콜론 참조스펙으로 지정해서 할 수 있습니다. 하지만 체크아웃된 브랜치에 fetch할 수 는 없고 체크아웃되지 않은 브랜치만 가능합니다.","","주의 할점이 하나 있는데 -- ``는 이제 받아올 커밋이 있는 *원격*에 있는 place를 넣어줘야하고 ``은 그 커밋들을 받아올 *local*의 place를 인자로 넣어줘야 합니다. git push와 정반대로 하는거죠, 데이터를 반대의 방향으로 옮기는 작업이니 이게 더 납득이 갑니다.","","언급한 것 처럼, 실제로 이것을 하는 개발자들은 많지 않습니다. 이것을 소개하는것은 `fetch`와 `push`가 방향이 반대일뿐 컨셉이 비슷하다는것을 표현하기 위해서입니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["자 이 해괴한 작업을 직접 확인해봅시다:"],afterMarkdowns:["이야! 보셨습니까, git이 `foo~1`을 origin의 place로 지정하고 커밋들을 내려받아 `bar`(로컬 브랜치)에 추가했습니다. `foo`와 `o/foo`는 갱신되지 않는게 확인되나요? destination을 지정해줬기 때문입니다."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["만약 destination이 될 브랜치가 없는 없는 상태에서 명령을 수행하면 어떻게 될까요? 방금의 슬라이드에서 `bar`브랜치가 없는 상태에서 수행해봅시다."],afterMarkdowns:["보이나요, git push 와 똑같습니다. Git이 fetch를 수행하기전에 destination을 로컬에 만들었습니다. git이 push를 수행하기 전에 원격저장소에 destination을 만드는것과 똑같습니다(없을경우에)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["인자 없이는?","","만약 `git fetch`를 인자없이 수행하면 원격저장소에서 모든 원격 브랜치들로 커밋들을 내려받습니다..."],afterMarkdowns:["간단하지만, 짚고 넘어갑시다."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["좋습니다, 설명은 이정도로 하고! 이번 레벨을 끝내기위해서는 시각화된 골처럼 커밋들을 fetch하면 됩니다. 명령어로 멋지게 해내봅시다!","","fetch 명령에 source와 destination을 모두 지정해줘야 할겁니다. 골 시각화를 잘 보세요 fetch를 하다보면 커밋들의 ID가 바뀔수도있어요!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументи git fetch","","Отже, ми вже вивчили все про аргументи git push, про корисний параметр `` і про формат запису з двокрапкою (`:`). Чи знадобляться нам ці зання при вивченні `git fetch`?","","Ще б пак! Аргументи для `git fetch` насправді *дуже, дуже* схожі на `git push`. Принцип той самий, з точністю до напрямку (бо ми звантважуємо коміти, а не завантажуємо).","","Розгляньмо це крок за кроком..."]}},{type:"ModalAlert",options:{markdowns:["### Параметр ``","","Якщо вказати параметр `` для команди git fetch, наприклад, так:","","`git fetch origin foo`","","git піде у віддалену гілку `foo`, візьме всі коміти, яких немає локально і закине в локальну гілку `o/foo`.","","Подивімось на це в дії (просто щоб пригадати)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вказуючи ``..."],afterMarkdowns:["Ми звантажуємо коміти лише з `foo` і кладемо їх в `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Ти можеш спитати, чому git закинув ці коміти в гілку `o/foo` замість того, щоб покласти їх відразу в локальну гілку `foo`? Я думав, що параметр `` одночасно вказує місце звідки взяти і куди поставити?","","Ну, git робить невеликий виняток в цьому випадку, оскільки ти, ймовірно, маєш якусь роботу в `foo`, і не хочеш там нічого зіпсувати! Пригадай з попереднього уроку про `git fetch` -- він не оновлює твої локальні (не віддалені -- без `o/`) гілки, він тільки звантажує коміти (так, щоб їх можна було переглянути/змерджити пізніше).",""]}},{type:"ModalAlert",options:{markdowns:['"Ну, в такому разі, що буде, якщо явно вказати і джерело і призначення `:`?"',"","Якщо ти почуваєшся достатньо впевненим і хочеш звантажити віддалені коміти *прямо* в свою локальну гілку, тоді -- справді, ти можеш так написати, використавши синтаксис з двокрапкою. Єдиний виняток -- таким способом не можна витягувати зміни в поточну локальну гілку, в будь-яку іншу -- без проблем.","","Тепер в нас `` вказує на *віддалений репозиторій*, а `` -- на *локальне* місце, куди звантажаться коміти. Це повна протилежність тому, як було в git push, що, зрештою, має сенс, адже ми передаємо дані у протилежному напрямку!","","Насправді, розробники рідко використовують такий спосіб на практиці. І він показаний тут лише для повноти описання наскільки `fetch` і `push` схожі, відрізняючись лише напрямом дії."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Подивімось на це божевілля в дії:"],afterMarkdowns:["Ого! Дивись, git прийняв `foo~1` за джерело, і звантажив коміти в `bar` (локальна гілка). Зауваж, що `foo` і `o/foo` не оновлювались, оскільки ми явно вказали звідки і куди передавати коміти."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А якщо вказаного місця призначення не існує на момент виконання команди? Погляньмо на попередній слайд, але без гілки `bar`."],afterMarkdowns:["Бачиш, все як і в випадку з git push. Git створив локальну гілку-призначення перед звантаженням, так само як створить гілку-призначення на віддаленій стороні перед пушем (якщо її не існувало, звичайно)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Без аргументів?","","Якщо `git fetch` запущено без аргументів, він просто звантажить всі коміти з віддаленого репозиторія в віддалені (`o/`) гілки..."],afterMarkdowns:["Все дуже просто, але варто було згадати ще раз."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Гаразд, годі балакати! Щоб пройти цей рівень, звантаж лише вказані на візуалізації коміти. Прояви фантазію, підбираючи команди!","","Тобі потрібно вказати і джерело і призначення для обидвох fetch-команд. Слідкуй за змінами на візуалізації, ID комітів можуть змінюватися!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham số Git fetch","","Chúng ta vừa tìm hiểu về tham số của git push, sự tuyệt vời của tham số ``, và thậm chí cả refspecs (`:<đích>`). Liệu ta có thể áp dụng điều này vào `git fetch` không nhỉ?","","Đoán chuẩn rồi đấy! Tham số cho lệnh `git fetch` thực ra *rất, rất* giống với `git push`. Chúng có chung khái niệm nhưng được áp dụng cho hướng ngược lại (vì bây giờ ta tải xuống commit chứ không phải tải lên).","","Hãy lần lượt đi qua từng khái niệm một..."]}},{type:"ModalAlert",options:{markdowns:["### Tham số ``","","Nếu bạn chỉ định vị trí cho `git fetch` như câu lệnh dưới:","","`git fetch origin foo`","","Git sẽ lênh nhánh `foo` trên kho chứa từ xa, lấy toàn bộ các commit chưa có trên kho chứa cục bộ và thả chúng xuống nhánh `o/foo` ở kho chứa cục bộ.","","Hãy xem một ví dụ (vẫn là câu lệnh trên nhưng mà trực quan hơn)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Thông qua chỉ định vị trí..."],afterMarkdowns:["Ta chỉ tải xuống commit ở trên nhánh `foo` và đặt chúng ở nhánh `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Có thể bạn sẽ thắc mắc -- tại sao Git lại thả các commit xuống nhánh `o/foo` thay vì nhánh `foo` ở kho chứa cục bộ? Tôi tưởng tham số `` tồn tại ở cả kho chứa cục bộ và kho chứa từ xa mà?","","Chà trong trường hợp này Git ứng xử có một chút ngoại lệ đặc biệt, vì có thể bạn đang làm việc trên nhánh `foo` ở kho chứa cục bộ mà bạn không muốn nó bị làm rối!! Điều này liên kết đến bài học trước về `git fetch` -- nó không cập nhật nhánh cục bộ không liên kết nhánh từ xa của bạn (nhánh không có tiền tố `origin/`), nó chỉ tải xuống các commit (mà bạn có thể xem xét hoặc hợp nhất sau).",""]}},{type:"ModalAlert",options:{markdowns:['"Nếu vậy, thì điều gì sẽ xảy ra nếu tôi chỉ định cả nguồn và đích với `:<đích>`?"',"","Nếu bạn nhất quyết muốn tải commit *trực tiếp* xuống nhánh cục bộ, thì bạn có thể chỉ định điều này bằng cách dùng refspec hai chấm. Bạn không thể nạp commit vào nhánh mà bạn đang đứng, nhưng Git sẽ cho phép bạn làm điều này:","","Đây là cách duy nhất -- `` là vị trí trên kho chứa *từ xa* và `<đích>` là vị trí *cục bộ* để đặt các commit. Điều này hoàn toàn ngược lại với `git push`, và đó là tất nhiên thôi vì ta đang chuyển giao dữ liệu theo hướng ngược lại!","","Thực tế là, các nhà phát triển rất hiếm khi làm điều này. Tôi giới thiệu về nó chủ yếu là vì muốn giải thích rõ hơn việc `fetch` và `push` là khá tương đồng, chỉ là theo hướng ngược lại."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lấy một ví dụ điên rồ..."],afterMarkdowns:["Wao! Thấy chứ, Git diễn giải `foo~1` thành một vị trí trên kho chứa từ xa sau đó tải xuống các commit lên nhánh `bar` ở kho chứa cục bộ. Để ý rằng nhánh `foo` và `o/foo` không hề được cập nhật vì ta đã chỉ định đích đến."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu như đích đến chưa hề tồn tại trước khi tôi chạy lệnh thì sao? Cùng xem lại ví dụ vừa rồi nhưng lần này nhánh `bar` chưa hề tồn tại."],afterMarkdowns:["Thấy chứ, nó Y HỆT với git push. Git tạo ra đích đến ở kho chứa cục bộ trước khi nạp, cũng giống như Git sẽ tạo ra đích đến trên kho chứa từ xa trước khi đẩy (trong trường hợp nó không tồn tại)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Không có tham số?","","Nếu lệnh `git fetch` không nhận được bất kỳ tham số nào, nó sẽ tải xuống tất cả các commit có trên kho chứa từ xa lên tất cả các nhánh từ xa ở kho chứa cục bộ..."],afterMarkdowns:["Khá là đơn giản, nhưng mà cũng nên xem qua thử."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Được rồi, lý thuyết như vậy là đủ rồi! Để hoàn thành cấp độ này, hãy chỉ nạp những commit được chỉ định trong mô tả mục tiêu. Thoải mái ứng biến với những câu lệnh nhé!","","Bạn sẽ phải chỉ định nguồn và đích cho lệnh fetch. Chú ý đến mô tả mục tiêu vì các ID có thể bị xáo trộn!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch argumenti","","Torej pravkar smo se naučili vse o git push argumentih ter kul `` parameteru in celo dvopični referenci (`:`). Torej uporabimo vse znanje tudi za `git fetch`?","","Itak! Argumenti za `git fetch` so v bistvu *zelo zelo* podobni tistim za `git push`. Gre za enak koncept, ampak uporabljen v nasprotni smeri (ker sedaj prenašamo commite, namesto da jih nalagamo).","","Pojdimo čez koncepte drug za drugim ..."]}},{type:"ModalAlert",options:{markdowns:["### `` parameter","","Če podaš mesto poleg git fetcha kot v naslednjem ukazu:","","`git fetch origin foo`","","Bo Git šel na `foo` branch na oddaljenem repotu, pograbil vse commite, katerih lokalno še nimamo in jih dodal na dno lokalnega `o/foo` brancha.","","Poglejmo to v akciji (samo kot osvežitev)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Z določanjem mesta ..."],afterMarkdowns:["Prenesemo samo commite iz `foo` in jih postavimo na `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Morda se sprašuješ -- zakaj je git dodal te commite na `o/foo` oddaljen branch namesto, da bi jih dodal na moj lokalen `foo` branch? Mislil sem, da je `` parameter mesto, ki obstaja in lokalno in na oddaljenem repozitoriju?","","No, git naredi v tem primeru posebno izjemo, ker imaš morda delo na `foo` branchu, ki ga ne želiš pokvariti!! To se navezuje na prejšnjo lekcijo o `git fetch` -- ne posodobi tvojega lokalnega ne-oddaljenega brancha, samo prenese commite (da jih lahko pregledaš / mergaš kasneje).",""]}},{type:"ModalAlert",options:{markdowns:['"Ampak v tem primeru, kaj se zgodi, če posebaj določim izvor in cilj s `:`?"',"","Če se počutiš dovolj strastno, da bi fetchal commite *direktno* na lokalen branch, potem ja, lahko to definiraš z dvopično referenco. Ne moreš fetchati commitov na branch, ki je checkoutan, ampak v drugih primerih to lahko narediš.","","Tu je edina zanka -- `` je sedaj mesto na *oddaljenem* in `` je *lokalno* mesto za dodati te commite. Je ravno nasprotje od git pusha in to je logično, saj prenašamo podatke v nasprotni smeri!","","Glede na to, razvijalci to redko delajo v praksi, to predstavljam zgolj, da si lahko predstavljaš, kako sta si `fetch` in `push` kar podobna, ampak v nasprotni smeri."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si to zmešnjavo v praksi:"],afterMarkdowns:["Wow! Vidiš, git je naredil `foo~1` kot mesto na originu in nato prenesel commite na `bar` (ki je bil lokalen branch). Opazi, kako `foo` in `o/foo` nista bila posodobljena, ker smo določili destinacijo."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj pa, če destinacija ne obstaja, preden zaženem ukaz? Poglejmo zadnji primer, vendar brez da bi prej `bar` že obstajal."],afterMarkdowns:["Vidiš, je TAKO kot git push. Git je naredil destinacijo lokalno pred fetchem, tako kot bo naredil destinacijo na oddaljneme repotu pred pushem (če ne obstaja)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ni argumentov?","","Če `git fetch` ne prejme argumentov, prenese vse commite iz oddaljenega repota na vse oddaljene branche ..."],afterMarkdowns:["Precej enostavno, ampak vredno, da gremo čez vsaj enkrat."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, dovolj govorjenja! Da zaključiš to stopnjo, fetchaj samo določene commite iz ciljne vizualizacije. Razturaj te ukaze!","","Določiti boš moral izvor in cilj za oba fetch ukaza. Bodi pozoren na ciljno vizualizacijo, saj so lahko IDji obrnjenji okoli!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argumenty git fetch","","No to właśnie nauczyliśmy się o argumentach git push, o tym fajnym parametrze ``, a nawet o refspec z dwukropkiem (`<źródło>:`). Czy możemy tę samą wiedzę zastosować też przy `git fetch`?","","No ba... Argumenty `git fetch` są w gruncie rzeczy *bardzo, bardzo* podobne do tych z `git push`. To ta sama idea, tyle że zastosowana w odwrotną stronę (przecież nie wysyłasz commitów, tylko je pobierasz).","","Powtórzmy krok po kroku, na czym to polega..."]}},{type:"ModalAlert",options:{markdowns:["### Parametr `` (miejsce)","","Jeśli w git fetch określisz miejsce, tak jak w tym poleceniu:","","`git fetch origin foo`","","Git przejdzie do gałęzi `foo` w zdalnym repozytorium, weźmie wszystkie commity, których brakuje lokalnie, i zrzuci je nam na lokalną gałąź `o/foo`.","","Zobaczmy, jak to działa (tylko dla odświeżenia pamięci)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Określając miejsce..."],afterMarkdowns:["pobraliśmy tylko commity z `foo` i umieściliśmy je na `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Może się zastanawiasz, dlaczego Git zrzucił te commity na zdalną gałąź `o/foo`, a nie tylko na lokalną gałąź `foo`? Wydawało się, że parametr `` to miejsce istniejące zarówno lokalnie, jak i na zdalnym repozytorium.","","Cóż... Git robi w tym miejscu bardzo wyjątkowy wyjątek, bo wie, że możesz mieć na gałęzi `foo` pracę, w której nie chcesz namieszać!!! Łączy się to z wcześniejszą lekcją o `git fetch`. To polecenie nie aktualizuje twoich lokalnych gałęzi - ono tylko pobiera commity (a ty możesz je sobie obejrzeć i scalić później).",""]}},{type:"ModalAlert",options:{markdowns:['"No to co się w takim razie stanie, jeśli samodzielnie określę źródło i cel za pomocą `:`?"',"","Jeśli naprawdę czujesz wewnętrzną potrzebę, żeby robić fetch *bezpośrednio* na lokalną gałąź, to proszę bardzo, możesz wykorzystać refspec z dwukropkiem. Nie możesz tylko ściągnąć przy użyciu fetch commitów na aktualnie wybraną za pomocą checkout gałąź. Poza tym Git pozwoli ci zrobić, co chcesz.","","Jest jednak jeden haczyk -- `<źródło>` to teraz *zdalne* miejsce, a `` jest *lokalnym* miejscem, na które trafią commity. To dokładne przeciwieństwo git push, i to ma sens, skoro przenosimy teraz dane w odwrotnym kierunku!","","No ale w praktyce mało kto tak robi. Tłumaczę to głównie po to, żeby uzmysłowić ci, że `fetch` i `push` są dość podobne, tylko działają w odwrotne strony."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak to szaleństwo działa:"],afterMarkdowns:["Nieźle! Spójrz. Git zinterpretował `foo~1` jako miejsce na origin i pobrał z niego commity do `bar` (czyli lokalną gałąź). Zauważ, że ani `foo`, ani `o/foo` nie zostały zaktualizowane, ponieważ określiliśmy cel."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A co, jeśli cel nie istnieje przed wykonaniem polecenia? Spójrzmy jeszcze na ostatni slajd, na którym `bar` na początku nie ma."],afterMarkdowns:["Widzisz, to działa DOKŁADNIE jak git push. Git stworzył lokalnie cel przed wykonaniem fetch, dokładnie tak samo jak zrobiłby to na zdalnym repozytorium przed zrobieniem push (gdyby cel tam nie istniał)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bez argumentów?","","Jeśli `git fetch` nie dostanie żadnych argumentów, to po prostu ściągnie wszystkie commity ze zdalnego repozytorium do wszystkich zdalnych gałęzi..."],afterMarkdowns:["Niby proste, ale warto to zobaczyć chociaż raz."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Dobra, dość gadania! Żeby ukończyć ten poziom, użyj fetch tylko do commitów określonych w wizualizacji celu. Pokombinuj trochę z tymi poleceniami!","","Dla obu poleceń fetch musisz określić źródło i cel. Przyjrzyj się dokładnie wizualizacji celu; identyfikatory mogą być zamienione miejscami!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parametri di git fetch","","Abbiamo imparato un sacco sui parametri di git push, su questo bel ``, e persino sui colon refspec (`:`). Possiamo usare tutta questa conoscenza anche per `git fetch`?","","Ma certo! I parametri di `git fetch` sono *molto, molto* simili a quelli di `git push`. È lo stesso tipo di concetto ma applicato nel verso opposto (in quanto ora stai scaricando commit invece che caricarli in un repository remoto).","","Vediamo i vari concetti uno per volta..."]}},{type:"ModalAlert",options:{markdowns:["### Il parametro ``","","Se specifici un luogo con git fetch come nel comando seguente:","","`git fetch origin foo`","","Git andrà al ramo `foo` sul remoto, prenderà tutti i commit che non sono presenti in locale, e li andrà a mettere nel ramo locale `o/foo`.","","Vediamolo in azione (per rinfrescare le idee)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Specificando un luogo..."],afterMarkdowns:["Scarichiamo solamente i commit da `foo` e li piazziamo su `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Potresti domandarti -- perché git ha messo i commit sul ramo remoto `o/foo` invece che metterli sul mio ramo locale `foo`? Il parametro `` non era un luogo esistente sia localmente che sul remoto?","","Git fa un'eccezione in questo caso dato che potresti avere del lavoro sul ramo `foo` che non vuoi venga messo a rischio!! Questo si collega alla vecchia lezione su `git fetch` -- non aggiorna i tuoi rami locali, non-remoti, va solo a scaricare i commit (così che sia tu ad esaminarli / fonderli più avanti).",""]}},{type:"ModalAlert",options:{markdowns:['"Bene allora, cosa succede se definisco esplicitamente sia la fonte che la destinazione con `:`?"',"","Se ti senti abbastanza ispirato da voler scaricare commit *direttamente* su di un ramo locale, allora sì, puoi farlo con un colon refspec. Non puoi scaricare commit sul ramo nel quale sei attualmente, a parte questo git te lo permetterà.","","Qui c'è la fregatura però -- `` è ora un luogo sul repository *remoto* e `` è un luogo *locale* nel quale piazzare i commit recuperati. È l'esatto opposto di git push, il che ha senso dato che stiamo trasferendo dati nella direzione opposta!","","Detto ciò, gli sviluppatori raramente lo fanno. Lo sto introducendo principalmente come metodo per concettualizzare come `fetch` e `push` siano molto simili, solo in direzioni opposte."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo questa pazzia sul campo:"],afterMarkdowns:["Wow! Vediamo, git ha risolto `foo~1` come un luogo sul repository remoto e ha poi scaricato quei commit su `bar` (nostro ramo locale). Notiamo come `foo` e `o/foo` non sono stati aggiornati in quanto abbiamo specificato una destinazione."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se la destinazione non esistesse nel momento in cui eseguo il comando? Vediamo la slide precedente ma con l'assenza del ramo `bar`."],afterMarkdowns:["Visto, è PROPRIO come git push. Git ha creato la destinazione in locale prima di recuperare i dati, allo stesso modo in cui avrebbe creato la destinazione in remoto prima di caricarli con push (in caso non esista)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Senza parametri?","","Se `git fetch` non riceve parametri, scarica semplicemente tutti i commit dal repository remoto su tutti i rami remoti..."],afterMarkdowns:["Abbastanza semplice, ma vale la pena darci almeno un'occhiata."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Abbiamo parlato abbastanza! Per finire questo livello, scarica solo i commit specificati nella finestra dell'obiettivo. Scatenati con quei comandi!","","Dovrai specificare la fonte e la destinazione per entrambi i comandi di fetch. Presta attenzione alla finestra obiettivo in quanto gli ID dei commit potrebbero essere scambiati!"]}}]}}}},{}],143:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22o/main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22main%22%5D%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D",solutionCommand:"git clone;git fakeTeamwork;git commit;git pull --rebase;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Diverged History",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 Historie",fr_FR:"Historique divergent",ja:"履歴の分岐",ru_RU:"Расхождение в истории",uk:"Розбіжності в історії",ko:"엇갈린 히스토리",vi:"Dị biệt lịch sử",sl_SI:"Razdeljena Zgodovina",pl:"Rozbieżna historia",it_IT:"Storico divergente"},hint:{en_US:"Check out the ordering from the goal visualization",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",ja:"ゴールのツリーの順番を参考にすること",fr_FR:"Regardez l'ordre dans la fenêtre de visualisation d'objectif",ru_RU:"проверьте сортировку в визуализации цели",uk:"перевірте порядок в візуалізації цілі",ko:"순서는 goal을 참고하세요",vi:"Kiểm tra kỹ thứ tự trên mô hình mục tiêu",sl_SI:"Preveri vrstni red iz ciljne vizualizacije.",pl:"Przyjrzyj się kolejności na wizualizacji celu",it_IT:"Controlla l'ordinamento dalla schermata dell'obiettivo"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Diverged Work","","So far we've seen how to `pull` down commits from others and how to `push` up our own changes. It seems pretty simple, so how can people get so confused?","","The difficulty comes in when the history of the repository *diverges*. Before discussing the details of this, let's see an example...",""]}},{type:"ModalAlert",options:{markdowns:["Imagine you clone a repository on Monday and start dabbling on a side feature. By Friday you are ready to publish your feature -- but oh no! Your coworkers have written a bunch of code during the week that's made your feature out of date (and obsolete). They've also published these commits to the shared remote repository, so now *your* work is based on an *old* version of the project that's no longer relevant.","","In this case, the command `git push` is ambiguous. If you run `git push`, should git change the remote repository back to what it was on Monday? Should it try to add your code in while not removing the new code? Or should it totally ignore your changes since they are totally out of date?","","Because there is so much ambiguity in this situation (where history has diverged), git doesn't allow you to `push` your changes. It actually forces you to incorporate the latest state of the remote before being able to share your work."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["So much talking! Let's see this situation in action."],afterMarkdowns:["See? Nothing happened because the command fails. `git push` fails because your most recent commit `C3` is based off of the remote at `C1`. The remote has since been updated to `C2` though, so git rejects your push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["How do you resolve this situation? It's easy, all you need to do is base your work off of the most recent version of the remote branch.","","There are a few ways to do this, but the most straightforward is to move your work via rebasing. Let's go ahead and see what that looks like."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now if we rebase before pushing instead..."],afterMarkdowns:["Boom! We updated our local representation of the remote with `git fetch`, rebased our work to reflect the new changes in the remote, and then pushed them with `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Are there other ways to update my work when the remote repository has been updated? Of course! Let's check out the same thing but with `merge` instead.","","Although `git merge` doesn't move your work (and instead just creates a merge commit), it's a way to tell git that you have incorporated all the changes from the remote. This is because the remote branch is now an *ancestor* of your own branch, meaning your commit reflects all commits in the remote branch.","","Lets see this demonstrated..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now if we merge instead of rebasing..."],afterMarkdowns:["Boom! We updated our local representation of the remote with `git fetch`, *merged* the new work into our work (to reflect the new changes in the remote), and then pushed them with `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Awesome! Is there any way I can do this without typing so many commands?","","Of course -- you already know `git pull` is just shorthand for a fetch and a merge. Conveniently enough, `git pull --rebase` is shorthand for a fetch and a rebase!","","Let's see these shorthand commands at work."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["First with `--rebase`..."],afterMarkdowns:["Same as before! Just a lot shorter."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["And now with regular `pull`."],afterMarkdowns:["Again, exact same as before!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["This workflow of fetching, rebase/merging, and pushing is quite common. In future lessons we will examine more complicated versions of these workflows, but for now let's try this out.","","In order to solve this level, take the following steps:","","* Clone your repo","* Fake some teamwork (1 commit)","* Commit some work yourself (1 commit)","* Publish your work via *rebasing*"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Travail divergent","","Jusqu'à présent nous avons vu comment rapatrier (`pull`) les commits de nos collaborateurs et comment envoyer les nôtres (`push`). Cela a l'air simple, alors comment se fait-il que certains puissent trouver le sujet aussi confus ?","","La difficulté apparaît lorsque l'historique du dépôt *diverge*. Avant d'aborder les détails de cette situation, voyons un exemple...",""]}},{type:"ModalAlert",options:{markdowns:["Imaginez que vous clonez un dépôt le lundi et commencez à bidouiller une nouvelle fonctionnalité. Le vendredi vous êtes prêt à publier votre fonctionnalité -- mais oh non ! Vos collègues ont écrit une floppée de code durant la semaine, ce qui rend votre fonctionnalité désuète (et obsolète). Ils ont aussi publié sur le dépôt distant partagé, donc maintenant *votre* travail est basé sur une *vieille* version du projet qui n'est plus viable.","","Dans ce cas, la commande `git push` est ambiguë. Si vous exécutez `git push`, Git devrait-il remettre le dépôt distant tel qu'il était lundi ? Doit-il essayer d'ajouter votre code sans supprimer le nouveau code ? Ou doit-il totalement ignorer vos changements puisqu'ils ne sont plus à jour ?","","Comme il y a trop d'ambiguïté dans cette situation (où l'historique a divergé), Git ne vous autorise pas à faire un `push` de vos changements. Cela vous force en fait à rapatrier chez vous le dernier état du dépôt distant avant de pouvoir partager votre travail."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Assez parlé ! Observons cette situation en action :"],afterMarkdowns:["Vous voyez ? Rien ne s'est produit car la commande a échoué. `git push` a échoué car votre commit le plus récent `C3` est basé sur `C1` sur le dépôt distant. Le dépôt distant a été mis à jour depuis avec `C2`, donc Git rejette votre push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Comment allez-vous résoudre cette situation ? C'est facile, tout ce que vous avez à faire est de baser votre travail sur la dernière version de la branche distante.","","Il y a plusieurs façons de faire cela, mais la plus directe est de déplacer votre travail avec rebase. Regardons à quoi cela ressemble."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Maintenant si nous rebasons avant de push..."],afterMarkdowns:["Boum ! Nous avons mis à jour notre représentation locale du dépôt avec `git fetch`, rebasé notre travail pour refléter les nouveaux changements, et enfin les avons envoyés avec `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Existe-t-il d'autres façons de mettre à jour notre travail quand le répertoire distant a été mis à jour ? Bien sûr ! Faisons la même chose, mais cette fois avec `merge`.","","Bien que `git merge` ne déplace pas votre travail (et crée à la place un commit de fusion), cette commande est également une façon de dire à Git que vous avez incorporé tous les changements du dépôt distant. En effet la branche distante est maintenant une *ancêtre* de votre propre branche, ce qui signifie que vos commits contiennent tous les changements faits sur la branche distante.","","Voyons une démonstration..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Maintenant si nous mergeons au lieu de rebaser..."],afterMarkdowns:["Boum ! Nous avons mis à jour notre représentation locale du dépôt distant avec `git fetch`, *fusionné* les nouveaux commits dans notre copie de travail (pour refléter les nouveaux changements du dépôt distant), et les avons ensuite envoyés avec `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Impressionnant ! Existe-t-il une façon de faire tout cela sans taper autant de commandes ?","","Bien sûr : vous savez déjà que `git pull` est simplement un raccourci pour un fetch puis un merge. De manière assez pratique, `git pull --rebase` est un raccourci pour un fetch puis un rebase !","","Voyons ce raccourci au travail."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Premièrement avec `--rebase`..."],afterMarkdowns:["Comme avant ! Juste un peu plus court."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Et maintenant avec un `pull` normal :"],afterMarkdowns:["Encore une fois, c'est exactement la même chose qu'auparavant !"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Cette succession de fetch, rebase/merge, et push est assez commune. Dans les leçons suivantes, nous explorerons cette façon d'enchaîner les commandes dans des conditions plus complexes, mais pour le moment appliquons ce principe de façon classique.","","Pour finir ce niveau, réalisez les étapes suivantes :","","* Clonez votre dépôt","* Simulez un travail d'équipe (1 commit)","* Commitez un peu de votre travail (1 commit)","* Publiez votre travail avec *rebase*"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Trabajo divergente","","Hasta acá vimos cómo pullear commits de otros y cómo pushear 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:["Imaginate que clonás un repositorio el lunes y empezás a desarrollar algo. Para el viernes tenés todo listo para publicar tu trabajo, pero, ¡oh, oh! Tus colegas también escribieron código durante la semana, haciendo que tu trabajo quede desactualizado (y obsoleto). Además, 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 corrés `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 que la historia divirgió), git no te permite pushear 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 resolvés esta situación? Es fácil, todo lo que tenés 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 mejor rebaseamos antes de pushear..."],afterMarkdowns:["¡Boom! Actualizamos nuestra representación local del remoto con `git fetch`, rebaseamos nuestro trabajo para reflejar los nuevos cambios del remoto, y después los pusheamos con `git push`."],command:"git fetch; git rebase o/main; 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 rebasear hacemos un merge..."],afterMarkdowns:["¡Boom! 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 pusheamos usando `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¡Asombroso! ¿Hay forma de hacer esto sin tipear tantos comandos?","","¡Claro que sí! Ya sabés 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 esta movida de fetchear, rebasear/mergear y pushear es bastante común. En lecciones futuras vamos a ver formas más complejas de estos flujos de trabajo, pero por ahora probemos esto que vimos.","","Para resolver este nivel, hacé lo siguiente:","","* Cloná tu repositorio","* Simulá algo de trabajo de un colega (1 commit)","* Commiteá algo de trabajo propio (1 commit)","* Publicá tu trabajo *rebaseando*"]}}]},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/main; 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/main; 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:[{type:"ModalAlert",options:{markdowns:["## Histórico Divergente","","Até o momento vimos como fazer `pull` de commits dos outros e como fazer `push` de nossas próprias mudanças. Parece ser tão simples, como será que as pessoas ficam tão confusas?","","A dificuldade aparece quando o histórico do repositório *diverge*. Antes de discutir os detalhes disso, vejamos um exemplo...",""]}},{type:"ModalAlert",options:{markdowns:["Imagine que você clonou um repositório na segunda-feira e começou a trabalhar em uma funcionalidade nova. Na sexta-feira você está pronto para publicar a funcionalidade -- mas, ah não! Seus colegas escreveram um bocado de código durante a semana, tornando a sua funcionalidade obsoleta. Eles também publicaram esses commits no repositório remoto que vocês compartilham, então agora o *seu* trabalho é baseado em uma versão *antiga* do projeto, que não é mais relevante.","","Neste caso, o comando `git push` é ambíguo. Se você executar `git push`, será que o Git deveria tratar o repositório remoto como se ele ainda estivesse no estado da segunda-feira? Será que ele deveria tentar adicionar seu código dentro do repositório sem tentar remover o código novo? Ou será que ele deveria simplesmente ignorar suas mudanças totalmente, já que elas estão obsoletas?","","Devido à grande ambiguidade que surge neste tipo de situação (quando a história divergiu), o Git não permite que você faça `push` das suas mudanças. Ele, de fato, força você a incorporar o último estado do repositório remoto antes de conseguir compartilhar o seu trabalho."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Chega de conversa! Vejamos essa situação na prática."],afterMarkdowns:["Viu? Nada aconteceu porque o comando falhou. O `git push` falha porque o commit mais recente (`C3`) é baseado no remoto em `C1`. Como o remoto foi atualizado no meio tempo, o Git rejeita o push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Como resolver essa situação? É fácil, tudo que você precisa fazer é basear seu trabalho na versão mais recente do ramo remoto.","","Existem algumas maneiras de fazer isso, mas a mais direta é mover o seu trabalho usando rebase. Vamos em frente, ver como isso é feito."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora se nós fizermos um rebase antes do push..."],afterMarkdowns:["Boom! Nós atualizamos a representação local do repositório remoto com `git fetch`, fizemos rebase do nosso trabalho para refletir as novas mudanças no repositório remoto, e então enviamos nossas mudanças com `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Será que existem outras formas de compartilhar meu trabalho quando o repositório remoto tiver sido atualizado? Claro! Vamos fazer a mesma tarefa usando `merge` em vez de `rebase`.","","Embora o `git merge` não mova o seu trabalho (em vez disso, ele cria um commit de merge), ele é uma forma de contar ao Git que você incorporou todas as mudanças do repositório remoto. Isso acontece porque o ramo remoto passa a ser um *ancestral* do seu próprio ramo, significando que o seu commit reflete todos os commits contidos no ramo remoto.","","Vejamos uma demonstração..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora se fizermos merge em vez de rebase ..."],afterMarkdowns:["Boom! Atualizamos nossa representação local do repositório remoto com `git fetch`, fizemos *merge* do novo trabalho com o nosso (para refletir as novas mudanças no repositório remoto), e então fizemos push deles com `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Incrível! Existe alguma forma de fazer isso sem digitar tantos comandos?","","É claro -- você já conhece o `git pull` e ele é simplesmente um atalho para um fetch e um merge. Convenientemente, entretanto, o comando `git pull --rebase` é uma abreviação para um fetch e um rebase!","","Vejamos esses dois comandos em ação."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Primeiro com `--rebase`..."],afterMarkdowns:["Mesma coisa que antes! Porém muito mais curto."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E agora com o `pull` normal."],afterMarkdowns:["De novo, exatamente como antes!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Esse fluxo de trabalho de fazer fetch, rebase/merge, e push é bastante comum. Em lições futuras vamos examinar versões mais complicadas desses fluxos de trabalho, mas por enquanto vamos tentar o seguinte.","","Para resolver este nível, faça o seguinte:","","* Clone o repositório","* Simule trabalho de seus colegas (1 commit)","* Faça um commit seu (1 commit)","* Publique seu trabalho usando *rebase*"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Traballo diverxente","","Ata agora vimos cómo descargar e mesturar os commits de outros e como empurrar os nosos. Parece bastante sinxelo, así que ¿cómo pode confundirse tanto a xente?","","A dificultade ven cando a historia dos repositorios *diverxe*. Antes de entrar nos detalles, vexamos un examplo...",""]}},{type:"ModalAlert",options:{markdowns:["Imaxínate que clonas un repositorio o luns e comezas a desenvolver algo. Para o venres, xa estás listo para publicar o teu traballo, pero, ¡oh, oh! Os teus colegas tamén fixeron código durante a semana, facendo que o teu traballo quede desactualizado (e obsoleto). Ademáis, eles publicaron eses commits no repositorio remoto, así que agora o *teu* traballo está baseado nunha versión *vella* do proxecto, que xa non lle interesa a ninguén.","","Neste caso, o comando `git push` é ambiguo. Se executas `git push`, ¿git debería mudar o repositorio para como estaba o luns? ¿Deberías arranxar o teu código sen eliminar o código novo? ¿Ou debería ignorar completamente os teus cambio porque xa están desactualizados?","","Como hai tanta ambiguedade nesta situación (na que a historia diverxeu), git non che permite empurrar os teus cambios. En cambio, fórzate a integrar o último estado do respositorio remoto antes de poder compartir o teu traballo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¡Demasiada charla, vexámolo en acción!"],afterMarkdowns:["¿Ves? Non pasou nada, porque o comando falla. `git push` falla porque `C3`, o teu commit máis recente, está baseado no remoto sobre `C1`. O remoto foi actualizado a `C2` dende entonces, polo que git rechaza o teu push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¿Cómo resolves esta situación? É sinxelo, todo o que tes que facer é basear o teu traballo na versión máis recente da rama remota.","","Hai un par de formas de facer esto, pero a máis sinxela é mover o teu traballo facendo un rebase. Probémolo a ver cómo se ve."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora, se facemos rebase antes de empurrar..."],afterMarkdowns:["¡Boom! Actualizamos a nosa representación local do remoto con `git fetch`, rebasamos o noso traballo para reflexar os novos cambios do remoto, e despois os empurramos con `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¿Hai outra forma de actualizar o meu traballo se actualizaran o repositorio remoto? ¡Pois claro! Vexamos cómo facer o mesmo pero empregando `merge`.","","Por máis que `git merge` non mova o teu traballo (só crea un commit de merge), é un modo de decirlle a git que integrase tódolos cambios do remoto. Esto é porque agora unha rama remota pasou a ser un *ancestro* da tua propia rama, o que significa que o teu commit reflexa os cambios de tódolos commits da rama remota.","","Vexamos unha mostra..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Si no lugar de rebasar facemos un merge..."],afterMarkdowns:["¡Boom! Actualizamos a nosa representación local do remoto usando `git fetch`, *mesturamos* ou *mergeamos* o novo traballo xunto co noso (para reflexar os novos cambios no remoto), e despois os empurramos empregando `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¡Asombroso! ¿Hai forma de facer esto sen escreber tantos comandos?","","¡Claro que sí! Xa sabes que `git pull` é sinxelamente un atallo para facer fetch e merge. Ademáis, ¡`git pull --rebase` é un atallo para facer fetch e rebase!","","Vexamos estos atallos funcionando."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Primeiro con `--rebase`..."],afterMarkdowns:["¡Igual que antes! Só que máis corto."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E agora un `pull` común"],afterMarkdowns:["Outra vez, ¡exactamente o mesmo que antes!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Toda esta movida de fetchear, rebasear/mergear e pushear é bastante común. Nas seguintes leccións imos ver formas máis complexas de estes fluxos de traballo, pero por agora probemos o que vimos.","","Para resolver este nivel, fai o siguiente:","","* Clona o teu repositorio","* Simula algo de trabajo dun colega (1 commit)","* Commitea algo de traballo propio (1 commit)","* Publica o teu traballo *rebasando*"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Diverged Work","","到目前為止我們已經知道如何 `pull` 其他人所送的 commit,而且也知道如何 `push` 我們自己的 commit,感覺很簡單,但是為什麼有人看起來很困惑?","","當 repo 的歷史紀錄是 *diverge(branch 走向不同)* 的狀態時就會很棘手,在討論這個之前,讓我們先來看一個例子...",""]}},{type:"ModalAlert",options:{markdowns:["想像一下你在星期一的時候 clone 了一個 repo,並且開始在設計一個功能,在星期五的時候你準備好要發佈你的新功能,但是非常不幸地,你的同事已經寫了一連串的程式碼並且已經將 commit 發佈到 remote,所以現在*你的*進度是在一個比較*舊*的版本的後面(如果與 remote 比較的話啦!)。","","在這種情況底下,使用 `git push` 會有問題,如果你使用 `git push`,那麼 git 應該要把 remote 退回到星期一的狀態?它應該要把你所寫好的程式碼一起更新進去,同時不會影響你的同事寫好的程式碼?或者是他應該要因為版本比較舊而完全忽略你的程式碼?","","因為在這種情況下會很麻煩(當 git 歷史紀錄被 diverge 了),所以 git 不會允許你 `push` 你的 commit。在你上傳你的 commit 之前,它實際上會先強迫你先跟 remote 同步。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["講太多了啦!讓我們實際看一下這個情況。"],afterMarkdowns:["看到了沒?因為指令失敗了,所以沒有任何事情發生。 `git push` 失敗的原因是因為你最近的 commit `C3` 是在 `C1` 的後面,但是 remote 那邊是 `C2` 在 `C1` 的後面,所以 git 才會拒絕你的 push。"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["你要如何解決這種情況?很簡單,你只需要把 `C3` 接在 remote 最新的版本 `C2` 的後面就可以了。","","有一些方法可以做到,但是最直接的方式是用 rebase,我們來做看看。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在我們 push 之前,先來做 rebase..."],afterMarkdowns:["看吧!我們利用 `git fetch` 下載了 remote 上面的 commit,並且 rebase 我們的 commit,使得我們的 commit 可以接在 remote 上面最新的版本的後面,接著透過 `git push` 就可以上傳更新了。"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["在 remote 已經率先更新之後,還有沒有其它方法可以上傳我們的 commit?當然有阿!我們這次利用 `merge` 來做看看!","","雖然 `git merge` 並不會去移動你的 commit(反而會產生一個 merge commit),這是一個告訴 git 你已經下載了 remote 上面的 commit 並且在 local repo 中已經做完 merge,而因為 remote branch 上的最新的 commit 現在已經是 merge commit 的一個 *ancestor*,這就表示你的 commit 已經包含了在 remote branch 上的所有 commit。","","讓我們來看一下這種情況..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在假設我們不是用 rebase,而是用 merge..."],afterMarkdowns:["看吧!我們藉由 `git fetch` 把 remote 上的 commit 下載下來,並且 *merged* 該 commit 到我們目前的 branch(這樣就表示我們產生的 merge commit 有包含了 remote 上的 commit),接著再透過 `git push` 上傳到 remote。"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["太棒了! 有沒有其它可以不用打這麼多指令的方法?","","當然有阿!你已經知道 `git pull` 就是表示一個 fetch 跟一個 merge。 有一個指令非常方便,那就是 `git pull --rebase`,它表示的是一個 fetch 以及一個 rebase。","","我們來看如何使用這個簡化後的指令。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["首先 `--rebase`..."],afterMarkdowns:["跟之前一樣!只是少打了很多指令。"],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在用一般的 `pull`"],afterMarkdowns:["又來了,剛好跟之前的一樣!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["fetch,rebase/merge,以及 push 的流程是幾乎一樣的。在之後的教學中我們會看到比這些流程更複雜的版本。但是現在讓我們先牛刀小試一下。","","為了要完成這一關,請按照下面的步驟:","","* clone 你的 repo","* 假裝送一個 commit 給 remote","* 送一個 commit 給 local repo","* 透過 *rebase* 送自己的 commit"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 偏离的工作","","现在我们已经知道了如何从其它地方 `pull` 提交记录,以及如何 `push` 我们自己的变更。看起来似乎没什么难度,但是为何还会让人们如此困惑呢?","","困难来自于远程库提交历史的**偏离**。在讨论这个问题的细节前,我们先来看一个例子……",""]}},{type:"ModalAlert",options:{markdowns:["假设你周一克隆了一个仓库,然后开始研发某个新功能。到周五时,你新功能开发测试完毕,可以发布了。但是 —— 天啊!你的同事这周写了一堆代码,还改了许多你的功能中使用的 API,这些变动会导致你新开发的功能变得不可用。但是他们已经将那些提交推送到远程仓库了,因此你的工作就变成了基于项目**旧版**的代码,与远程仓库最新的代码不匹配了。","","这种情况下, `git push` 就不知道该如何操作了。如果你执行 `git push`,Git 应该让远程仓库回到星期一那天的状态吗?还是直接在新代码的基础上添加你的代码,亦或由于你的提交已经过时而直接忽略你的提交?","","因为这情况(历史偏离)有许多的不确定性,Git 是不会允许你 `push` 变更的。实际上它会强制你先合并远程最新的代码,然后才能分享你的工作。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["说了这么多,咱们还是看看实际案例吧!"],afterMarkdowns:["看见了吧?什么都没有变,因为命令失败了!`git push` 失败是因为你最新提交的 `C3` 基于远程分支中的 `C1`。而远程仓库中该分支已经更新到 `C2` 了,所以 Git 拒绝了你的推送请求。"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["那该如何解决这个问题呢?很简单,你需要做的就是使你的工作基于最新的远程分支。","","有许多方法做到这一点呢,不过最直接的方法就是通过 rebase 调整你的工作。咱们继续,看看怎么 rebase!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我们在 push 之前做 rebase 呢?"],afterMarkdowns:["我们用 `git fetch` 更新了本地仓库中的远程分支,然后用 rebase 将我们的工作移动到最新的提交记录下,最后再用 `git push` 推送到远程仓库。"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["还有其它的方法可以在远程仓库变更了以后更新我的工作吗? 当然有,我们还可以使用 `merge`","","尽管 `git merge` 不会移动你的工作(它会创建新的合并提交),但是它会告诉 Git 你已经合并了远程仓库的所有变更。这是因为远程分支现在是你本地分支的祖先,也就是说你的提交已经包含了远程分支的所有变化。","","看下演示..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们们用 merge 替换 rebase 来试一下……"],afterMarkdowns:["我们用 `git fetch` 更新了本地仓库中的远程分支,然后**合并**了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用 `git push` 把工作推送到远程仓库"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["很好!但是要敲那么多命令,有没有更简单一点的?","","当然 —— 前面已经介绍过 `git pull` 就是 fetch 和 merge 的简写,类似的 `git pull --rebase` 就是 fetch 和 rebase 的简写!","","让我们看看简写命令是如何工作的。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这次用 `--rebase`……"],afterMarkdowns:["跟之前结果一样,但是命令更短了。"],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["换用常规的 `pull`"],afterMarkdowns:["还是跟以前一样! "],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["由 fetch、rebase/merge 和 push 组成的工作流很普遍。后续课程我们会讲解更复杂的工作流,不过现在我们先解决这个关卡吧。","","要完成本关,你需要完成以下几步:","","* 克隆你的仓库","* 模拟一次远程提交(fakeTeamwork)","* 完成一次本地提交","* 用 *rebase* 发布你的工作"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Abweichende Inhalte","","Bisher haben wir gesehen wie man per `pull` Commits von Anderen ins lokale Repository holt und die eigenen Änderungen in ein entferntes `push`t. Ist doch ziemlich einfach, wie kann man da durcheinander kommen?","","Die Schwierigkeiten entstehen, wenn die Historien der beiden Repositorys *divergieren*, also voneinander abweichen. Bevor wir die Einzelheiten besprechen, schauen wir uns ein Beispiel an ...",""]}},{type:"ModalAlert",options:{markdowns:["Stell dir vor du holst dir Montags ein Repository per `clone` und fängst an, an einem Feature zu arbeiten. Bis Freitag soll es fertig und veröffentlicht sein -- doch, oh je! Deine Kollegen haben eine Menge Code während der Woche geschrieben, der dein Feature hat veralten lassen (und überflüssig gemacht hat). Sie haben diesen Code außerdem zum entfernten Repository gepusht, und dadurch basiert *deine* harte Arbeit jetzt auf einer *alten* Version des Projektes, die nicht länger relevant ist.","","In diesem Fall ist ein `git push` problematisch. Wenn du es ausführst, soll Git das entfernte Repository in den Zustand von Montag zurückversetzen? Soll es versuchen deinen Code auf die aktuelle Version zu packen? Oder soll es deine Änderungen einfach ignorieren, weil sie total veraltet sind?","","Da es in dieser Situation so viele Mehrdeutigkeiten gibt (da die Historien divergieren), erlaubt Git dir nicht, deine Änderungen einfach zu `push`en. Es zwingt dich, zuerst die neuesten Änderungen vom Server zu holen und in deine zu integrieren, bevor du deine Arbeit mit anderen teilen kannst."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bla bla bla. Schauen wir uns das lieber in Aktion an:"],afterMarkdowns:["Siehst du? Nichts passiert, weil der Befehl fehlschlägt. `git push` schlägt fehl, weil der neueste Commit `C3` auf dem Commit `C1` des Remotes basiert. Der entfernte Server hat mittlerweile jedoch `C2` gepusht bekommen, also lässt Git deinen Push jetzt nicht mehr zu."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Wie sollen wir das auflösen? Es ist ganz einfach, du musst deinen Commit nur von der aktuellsten Version des Remotes ableiten.","","Es gibt verschiedene Möglichkeiten, wie man das erreichen kann, aber die offensichtlichste ist, deine Commits per Rebase zu verschieben. Schauen wir mal wie das abläuft:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Also wenn wir vor dem Push erst mal einen Rebase machen ..."],afterMarkdowns:["Bämm! Wir haben unsere lokale Abbildung des entfernten Repositorys mit `git fetch` auf den neuesten Stand gebracht, unsere Arbeit auf die neueste Version des Remotes drauf gepackt und dann mit `git push` auf den Server geschoben."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Gibt es noch weitere Möglichkeiten deine Arbeit zu aktualisieren, wenn das entfernte Repository neue Commits bekommen hat? Klar! Schauen wir uns dasselbe an, aber diesmal arbeiten wir mit `merge`.","","Obwohl `git merge` deine Arbeit nicht verschiebt (und stattdessen einen Merge Commit erzeugt) ist es eine Möglichkeit Git dazu zu bringen, alle Änderungen vom Remote in deine Sachen zu integrieren. Denn durch den Merge wird der Remote Branch zu einem *Vorgänger* deines Branches, was bedeutet, dass dein Commit alle Commits des entfernten Branches beinhaltet.","","Zur Demonstration ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wenn wir nun also mergen anstatt einen Rebase zu machen ..."],afterMarkdowns:["Ok. Wir haben die lokale Abbildung des entfernen Repositorys mit `git fetch` aktualisiert, die neuen Änderungen per *Merge* in deine integriert, und letztere dann mit `git push` auf den Server gebracht."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Wahnsinn! Kann ich das auch irgendwie machen ohne soviel zu tippen?","","Na klar -- du kennst ja schon `git pull` als Zusammenfassung von `fetch` und `merge`. Praktischerweise bringt man es mit der Option `--rebase` dazu, anstatt des Merge einen Rebase zu machen.","","Gucken wir uns das mal an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zunächst `git pull --rebase` ..."],afterMarkdowns:["Genau wie vorher! Nur viel kürzer."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Und nun das normale `git pull` ..."],afterMarkdowns:["Und wieder, genau wie zuvor!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Dieser Ablauf von `fetch`, `rebase` / `merge` und `push` ist sehr verbreitet. In zukünftigen Leveln werden wir uns kompliziertere Varianten dieses Workflows ansehen, aber jetzt probieren wir erst mal diesen aus.","","Um diesen Level zu lösen, gehe folgende Schritte durch:","","* Clone dein Repository","* Simuliere einen entfernten Commit mit `git fakeTeamwork`","* Erzeuge einen lokalen Commit","* Benutze *Rebase*, um deine Arbeit schließlich pushen zu können."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Когда наработки расходятся","","Вот мы и познакомились с тем, как забирать (`pull`) чужие коммиты и как закачивать (`push`) свои наработки и изменения. Выглядит всё довольно просто, и не ясно какие же могут возникать у людей трудности со всем этим?","","Сложности возникают тогда, когда история репозитория *расходится*. Прежде чем идти дальше, давайте посмотрим на пример...",""]}},{type:"ModalAlert",options:{markdowns:["Представьте себе, вы склонировали репозиторий в понедельник и начали разрабатывать какую-то новую и уникальную часть приложения (на сленге разработчиков - `фича`). В пятницу вечером вы наконец-то готовы опубликовать вашу фичу. Но, о нет! Ваш коллега в течение недели написал кучу кода, который делает все ваши наработки устарелыми. Этот код был также закоммичен и опубликован на общедоступном удалённом репозитории, поэтому теперь *ваш* код базируется на *устаревшей* версии проекта и более не уместен.","","В этом случае использование команды `git push` является сомнительным. Как поведёт себя команда `git push`, если вы её выполните? Может быть, она изменит удалённый репозиторий и вернёт всё к тому состоянию, которое было в понедельник? А может, команда попробует добавить ваш код, не удаляя при этом новый? Или же она проигнорирует ваши изменения, так как они уже устарели?","","По причине того, что в данной ситуации (когда история расходится) слишком много двусмысленностей и неопределённостей, git не даст вам закачать (`push`) ваши изменения. Он будет принуждать вас включить в состав своей работы все те последние наработки и изменения, которые находятся на удалённом репозитории."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Слишком много болтовни! Давайте посмотрим, как всё работает на живом примере"],afterMarkdowns:["Видите? Ничего не произошло. Всё потому, что команда `git push` не выполнилась успешно. Дело в том, что ваш последний коммит `C3` основан на удалённом коммите `C1`. В свою очередь, удалённый репозиторий уже изменился под воздействием `C2`. Вот почему git отклонил ваш push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Как же разрешить данную ситуацию? Всё очень просто! Всё, что вам нужно - перебазировать свою работу на самую последнюю версию удалённой ветки.","","Существует множество способов сделать это, но наиболее простой способ 'сдвинуть' свои наработки - через перебазировку или rebasing. Давайте посмотрим, как это выглядит."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Теперь, когда мы сперва перебазируемся прежде чем публиковать изменения..."],afterMarkdowns:["Опа! Мы только что обновили наш локальный образ удалённого репозитория средствами `git fetch`. Ещё мы перебазировали наши наработки, чтобы они отражали все изменения с удалённого репозитория, и опубликовали их с помощью `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["А есть ещё какие-либо варианты обновить мои наработки к тому моменту, как удалённый репозиторий был обновлён? Конечно есть! Давайте ознакомимся с парочкой новых штучек, но в этот раз с помощью команды `merge`.","","Несмотря на то, что `git merge` не передвигает ваши наработки (а всего лишь создаёт новый коммит, в котором Ваши и удалённые изменения объединены), этот способ помогает указать git-у на то, что вы собираетесь включить в состав ваших наработок все изменения с удалённого репозитория. Это значит, что ваш коммит отразится на всех коммитах удалённой ветки, поскольку удалённая ветка является *предком* вашей собственной локальной ветки.","","Давайте взглянем на демонстрацию..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Таким образом, если мы объединим (merge) вместо перебазирования (rebase)..."],afterMarkdowns:["Опа! Мы обновили наше локальное представление удалённого репозитория с помощью `git fetch`, *объединили* ваши новые наработки с нашими наработками (чтобы отразить изменения в удалённом репозитории) и затем опубликовали их с помощью `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Здорово! А можно ли как-то сделать всё то же самое, но с меньшим количеством команд?","","Конечно - ведь вы уже знаете команду `git pull`, которая является аналогом и более кратким аналогом для совместных fetch и merge. А команда `git pull --rebase` - аналог для совместно вызванных fetch и rebase!","","Давайте взглянем на эти оба варианта."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Сперва - с флагом `--rebase`..."],afterMarkdowns:["Тот же результат, как и ранее, но намного короче вызов команд."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А теперь с обычным `pull`."],afterMarkdowns:["И снова - результат такой же, как и ранее!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Рабочий процесс получения изменений (fetching), перебазирования/объединения (rebase/merging) и публикации изменений (pushing) используется довольно часто. В последующих уроках мы изучим более сложные варианты этих рабочих процессов, но пока что давайте остановимся на том, что есть.","","Чтобы выполнить задание уровня, сделайте следующее:","","* Склонируйте репозиторий","* Сфабрикуйте командную работу (1 коммит)","* Сделайте свой собственный коммит (1 коммит)","* Опубликуйте свои наработки посредством *перебазировки (rebasing)*"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 分かれた作業","","これまでは、どのようにして`pull`でコミットを取り込み、`push`で自身の変更を反映するかを見てきました。単純なようにみえます。では何故人々は混乱するのでしょうか?","","その難しさは、リポジトリの履歴が*分岐*することに起因します。この詳細について説明する前に、まずは例を見てみましょう。",""]}},{type:"ModalAlert",options:{markdowns:["月曜日にリポジトリをクローンし、ある表面の機能をちょっと弄ることを想像してみてください。金曜日までに、あなたはその機能を公開する準備ができる -- しかし、ああなんということでしょう!あなたの同僚達は、あなたの機能が依存していた(そして、廃れた)コードの束をその週の内に書き換えていました。彼らはリモートリポジトリにコミットを共有して公開し、今や*あなたの*作業は*古い*バージョンのもはや適切でないプロジェクトに基づいていることになります。","","この場合、`git push`コマンドは曖昧になってしまいます。あなたが`git push`を走らせたとき、gitはリモートリポジトリは月曜の状態に変更を戻すべきでしょうか?それとも、新しいコードを取り除かないで追加しようとしてみるべきでしょうか?または、あなたの変更が完全に古いものになってしまったため、全て無視するべきなのでしょうか?","","この状況(履歴が分岐をしているとき)ではまったくもって曖昧なので、gitはあなたの変更を`push`することを許可しません。実際には、あなたの作業を共有する前に最新のリモートの状態を取り込むことを強制します。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["話しすぎましたね!この状況での動作をみてみましょう!"],afterMarkdowns:["見ましたか?コマンドが失敗して、何も起こりませんでした。あなたの最近の`C3`コミットはリモートの`C1`コミットに依存しているため、`git push`は失敗しました。リモートには`C2`が更新されているので、gitはあなたのプッシュを拒否します。"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["ではこの状況を解決するにはどうしたらいいでしょう?簡単です、リモートブランチの最新の状態にあなたの作業が基づくようにすればいいのです。","","いくつか方法はありますが、最も簡単なのはあなたの作業をリベースで移動させることです。それがどのようなものか、さあみてみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["今、プッシュをする前に代わりにリベースをしてみましょう。"],afterMarkdowns:["わお!私たちは`git fetch`でローカルのリモートブランチを更新し、私たちの作業をリベースさせてリモートの新しい変更に適用させ、`git push`でそれをプッシュしました。"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["リモートリポジトリが更新されたとき、他に自身の作業を更新する方法はあるでしょうか?もちろん、あります!今度は同じことを`merge`を代わりに使ってやってみましょう。","","`git merge`はあなたの作業を移動しませんが(代わりにマージコミットを作ります)、リモートの変更を全て取り込みgitに通知する方法なのです。この通知とは、リモートブランチが今やあなた自身のブランチの*親*を指していることになるため、あなたのリモートブランチの全ての変更を反映しているコミットを指します。","","この状況の例を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["リベースの代わりに今度はマージを用います。"],afterMarkdowns:["わお!私たちは`git fetch`でローカルのリモートブランチを更新し、私たちの作業を*マージ*して(リモートの新しい変更を反映するために)、`git push`でそれをプッシュしました。"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["素晴らしい!多くのコマンドを打たないでこれを実現する方法はあるでしょうか?","","もちろん -- あなたが既に知っているコマンドです。`git pull`は、`fetch`して`merge`するためのより短い書き方です。さらに便利なことに、`git pull --rebase`は`fetch`して`rebase`することの省略形です!","","コマンドを省略した場合を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["まずは、`--rebase`から"],afterMarkdowns:["前と一緒です!そしてとても短いです。"],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["そして通常使う`pull`で試してみましょう"],afterMarkdowns:["ここでも、前と同じです!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["この取り込み作業の流れ、リベースとマージ、そしてプッシュはとてもよく行います。次回以降のレッスンではより複雑なパターンの作業を学びますが、今は習ったことをとりあえず試してみましょう。","","このレベルをクリアするには、以下のステップを踏みます:","","* あなたのリポジトリをクローン","* 擬似的に幾つかの同僚の変更を真似る(1コミット)","* あなた自身の作業をコミット(1コミット)","* あなたの作業を*リベース*で公開"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Розбіжності в історії","","Ми розглянули як витягувати (`pull`) коміти інших та як завантажувати (`push`) свої власні коміти. Це виявилось не надто складно, то як же так, що в людей дуже часто виникають з цим труднощі?","","Основна складність полягає в тому, що історія різних репозиторіїв *розбігається*. Перед тим, як вдатися в деталі, подивімося як це виглядає на прикладі...",""]}},{type:"ModalAlert",options:{markdowns:["Уяви, що ти склонував репозиторій в понеділок і почав працювати над якоюсь фічею. В пятницю фіча готова і ти хочеш повернути її назад (в апстрім) -- але що це? Твої колеги, грець їм, вже встигли вкомітити купу коду що робить твою фічу застарілою (і не дуже доречною). Вони вже запушили ці коміти в публічний репозиторій, й тепер *твоя* робота базується на *старій* версії продукту, що вже не актуальна.","","В цьому випадку команда `git push` неоднозначна. Коли ти виконаєш `git push`, гіт повинен змінити віддалений репозиторій до того стану, на якому він знаходився в понеділок? Чи він має додати твій код і залишити код твоїх колег? Чи він має повністю проігнорувати твої зміни, оскільки вони застаріли?","","Через такі неоднозначності в цій ситуації (коли історія розійшлася), git не дозволить тобі запушити твої зміни. Він фактично змушує тебе інтегрувати останні зміни з віддаленого репозиторію перед тим як ти зможеш завантажити на нього свої напрацювання."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Але, забагато розмов! Подивімось на ділі!"],afterMarkdowns:["Бачиш? Нічого не сталося тому що остання команда не виконалася. `git push` не спрацював тому що твій недавній коміт `C3` базується на коміті `C1`. Але віддалений репо вже прейшов на`C2`, тому git відхилив твій push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Як вийти з цієї ситуації? Дуже просто! Все, що треба -- це оновити свої напрацювання так, щоб вони базувалися на останніх змінах з віддаленої гілки.","","Є кілька шляхів як цього досягнути, але найпростіший -- це перемістити свою роботу 'вперед' за допомогою rebase. Спробуймо і погляньмо як це виглядає."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер якщо виконати rebase перед push..."],afterMarkdowns:["Ка-бум! Ми оновили наш локальний образ віддаленого репозиторію за допомогою `git fetch`, заребейсили наші напрацювання відповідно до змін у віддаленому репо, й завантажили їх за допомогою `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Чи є якийсь інший спосіб оновити свої напрацювання, коли віддалений репозиторій пішов вперед? Звісно! Спробуймо зробити те ж саме, але натомість за допомогою `merge` (злиття).","","Хоча `git merge` і не переміщує твою роботу (а просто створює натомість коміт злиття чи merge commit), це -- ще один спосіб сказати git, що ти інтегрував останній стан віддаленого репозиторію в свої зміни. Це працює тому, що тепер віддалена гілка є *предком* твоєї гілки, а отже твої останні коміти інтегрують в собі всі коміти з віддаленої гілки.","","Невелика демонстрація..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер ми зробимо merge замість rebase..."],afterMarkdowns:["Ка-бум! Ми оновили наш локальний образ віддаленої гілки за допомогою `git fetch`, *змерджили* нові напрацювання з власними (щоб відобразити останні зміни у віддаленій гілці), й відіслали їх за допомогою `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Чудово! Чи можу я це зробити, використовуючи меншу кількість команд?","","Звісно -- ти ж знаєш, що `git pull` це просто коротша форма для git fetch а потім git merge. Натомість, `git pull --rebase` це коротка форма для git fetch а потім git rebase!","","Спробуймо використати ці коротші команди."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Спочатку з `--rebase`..."],afterMarkdowns:["Те саме, що й раніше! Просто трохи коротше."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А тепер просто з `pull`."],afterMarkdowns:["Знову, так як і було!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Робочий процес, що складається з fetch, rebase/merge і push є дуже широковживаним. В наступних уроках ми розглянемо складніші версії цього процесу, а наразі спробуймо його виконати.","","Щоб пройти цей рівень, виконай наступні кроки:","","* Склонуй свій репозиторій","* Зроби симуляцію командної роботи (1 коміт)","* Зроби власний коміт (1 коміт)","* Опублікуй свої напрацювання за допомогою *rebasе*"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 엇갈린 작업","","지금까지 우리는 다른곳에서 커밋을 `pull`해서 내려받고 우리가 만든 변경들을 `push`하는 방법을 배웠습니다. 간단해보이는데, 왜 사람들이 이것 때문에 곤란해 할까요?","","어려움은 저장소의 히스토리가 *엇갈릴 때* 찾아옵니다. 자세히 살펴보기 전에 예제를 확인해봅시다...",""]}},{type:"ModalAlert",options:{markdowns:["상상을 해봅시다. 여러분은 월요일에 저장소를 clone해서 부가기능을 만들기 시작했습니다. 금요일쯤 기능을 공개할 준비가 되었습니다 -- 그런데 오 이런! 동료들이 주중에 코딩을 잔뜩해서 여러분이 만든 기능은 프로젝트에 뒤떨어져서 무용지물이 되었습니다. 이 사람들이 그 커밋들을 공유하고있는 원격 저장소에도 공개했습니다, 이제 *여러분의* 작업은 이제 의미가 없는 *구*버전의 프로젝트를 기반으로한 작업이 되어버렸습니다.","","이런 경우, 명령어 `git push`가 할 일이 애매해집니다. `git push`를 수행했을때, git은 원격 저장소를 여러분이 작업했던 월요일의 상태로 되돌려야 할까요? 아니면 새 코드를 건들지 않고 여러분의 코드만 추가해야 되나요? 아니면 여러분의 작업은 뒤 떨어졌기 때문에 완전히 무시해야되나요?","","이렇게 상황이 애매모호하기 때문에(히스토리가 엇갈렸기 때문이죠), git은 여러분이 `push`하지 못하게 합니다. 사실 여러분이 작업을 공유하기전에 원격 저장소의 최신 상태를 합치도록 강제합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["너무 떠든거같습니다! 이 상황을 직접 눈으로 확인해봅시다"],afterMarkdowns:["보이죠? 명령어가 실행되지 않아서 아무것도 잃어나지 않습니다. 여러분의 최근 커밋 `C3`가 원격저장소의 `C1`을 기반으로 하기 때문에 `git push`가 실패합니다. 원격 저장소는 `C2`까지 갱신된 상태기때문에 git은 여러분의 push를 거부하게됩니다."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["그러면 이 상황을 어떻게 해결할까요? 쉽습니다, 여러분의 작업을 원격 브랜치의 최신상태를 기반으로 하게 만들면 됩니다.","","이렇게 하기위한 방법이 여러가지가 있는데, 가장 간결한 방법은 리베이스를 통해 작업을 옮기는 방법입니다. 예제를 통해 눈으로 확인해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["push를 하기전에 리베이스를 하면..."],afterMarkdowns:["Boom! `git fetch`로 원격 저장소의 변경정보를 가져오고, 새 변경들로 우리 작업을 리베이스 했습니다, 이제 `git push`하면 끝!"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["다른 방법은 없냐고요? 당연히 있습니다! 같은것을 `merge`로 대신 해봅시다.","","`git merge`가 여러분의 작업을 옮기지는 않지만(merge 커밋을 생성합니다). git에게 원격 저장소의 변경을 합쳤다고 알려주는 방법중에 하나입니다. 이제 원격 브랜치가 여러분 브랜치의 *부모*가 되었기때문입니다, 여러분의 커밋이 원격 브랜치의 모든 커밋을 반영했다는 뜻이죠.","","눈으로 확인해봅시다..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["리베이스대신 병합을하면..."],afterMarkdowns:["Boom! `git fetch`로 원격 저장소의 변경정보를 가져오고, 새 작업을 우리 작업으로 *병합*했습니다 (원격 저장소의 변경을 반영하기 위해서죠), 이제 `git push`하면 끝!"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["멋집니다! 명령어를 좀더 적게써서 하는 방법은 없나요?","","물론 있습니다 -- 여러분은 `git pull`이 fetch와 merge의 줄임 명령어라는 것은 이미 알고 있을 것입니다. 아주 간단하게, `git pull --rebase`를 하면 fetch와 리베이스를 하는 작업의 줄임 명령어 입니다","","이 줄임 명령어가 잘 작동하는지 확인해 봅시다"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["먼저 `--rebase`와 함께하면..."],afterMarkdowns:["이전과 같습니다! 간결하고요."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["일반의 `pull`과 사용했을 때는"],afterMarkdowns:["또다시, 이전과 같습니다!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["fetch를 하고 리베이스/병합을 하고 push를 하는 이런 작업흐름은 꽤 흔합니다. 앞으로의 레슨에서는 이런 작업흐름의 복잡한 버전들을 확인해볼 것입니다. 일단은 이것부터 연습해 보죠.","","이번 레벨을 통과하려면, 다음의 단계를 거쳐야 합니다:","","* 여러분의 저장소를 clone 하세요","* 가짜 팀워크를 만드세요 (1개의 커밋)","* 여러분의 작업도 커밋하세요 (1개의 커밋)","* 여러분의 작업을 *리베이스*를 통해 공유하세요"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Diverged Work","","Cho đến giờ ta đã biết cách `kéo` (`pull`) commit từ nơi khác về và cách `đẩy` (`push`) lên những thay đổi của ta. Chúng nhìn có vẻ khá đơn giản, vậy tại sao người ta lại thấy lúng túng về chúng?","","Khó khăn đến từ sự *dị biệt* của cây lịch sử trên kho chứa từ xa. Trước khi đi vào thảo luận chi tiết vấn đề này, hãy xem qua một ví dụ...",""]}},{type:"ModalAlert",options:{markdowns:["Tưởng tượng bạn sao chép một kho chứa vào thứ Hai và bắt đầu phát triển một tính năng mới. Đến thứ Sáu thì bạn đã sẵn sàng để xuất bản thành quả của mình -- nhưng không! Đồng nghiệp của bạn đã viết thêm hàng loạt mã trong một tuần vừa rồi và điều này làm cho chức năng của bạn trở nên lỗi thời. Và họ cũng đã xuất bản những commit này lên kho chứa từ xa chung, vậy giờ thành quả của *bạn* lại dựa trên phiên bản *cũ* của dự án mà nó không còn thích đáng nữa.","","Trong trường hợp này, lệnh `git push` trở lên khá nhập nhằng. Nếu bạn dùng `git push`, liệu git nên thay đổi kho chứa từ xa trở về trạng thái ngày thứ Hai? Hay nó nên cố gắng thêm mã của bạn vào trong khi không xóa mã mới? Hay là nó sẽ bỏ qua hoàn toàn mã của bạn vì nó đã lỗi thời?","","Vì có quá nhiều tình huống mơ hồ (dị biệt lịch sử), Git sẽ không cho phép bạn `đẩy` (`push`) thay đổi của mình. Nó sẽ ép bạn phải sát nhập trạng thái mới nhất của kho chứa từ xa vào thành phẩm của mình trước khi chia sẻ chúng."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nói quá nhiều rồi! Đi vào hành động thôi"],afterMarkdowns:["Thấy chứ? Không có gì xảy ra cả vì lệnh bị thất bại. `git push` thất bại vì commit mới nhất của bạn: `C3` dựa trên commit `C1` ở nhánh từ xa. Nhánh đó đã được cập nhật lên commit `C2`, nên Git từ chối lệnh đẩy của bạn"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Vậy thì giải quyết tình huống này sao giờ? Đơn giản thôi, tất cả những gì bạn cần làm là khiến cho thành quả của mình dựa trên phiên bản mới nhất của nhánh từ xa.","","Có vài cách để làm điều này, nhưng cách trực tiếp nhất là bố trí lại (dùng rebase) để di chuyển thành quả của bạn. Cùng xem cách nó hoạt động nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào bây giờ trước push ta dùng rebase thì..."],afterMarkdowns:["Bùùm! Ta đã cập nhật nhánh từ xa trong kho chứa cục bộ với `git fetch`, dịch chuyển thành quả của mình để phản ánh thay đổi mới của kho chứa từ xa, sau đó đẩy chúng lên với `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Có cách nào khác để cập nhật thành quả của mình khi kho chứa từ xa được cập nhật không? Tất nhiên rồi! Hãy xem xét điều tương tự với `merge`.","","Mặc dù `git merge` không dịch chuyển commit của bạn (thay vì đó nó tạo ra một commit hợp nhất), đó là cách để nói với Git rằng bạn đã kết hợp tất cả thay đổi từ nhánh từ xa. Đó là bởi vì bây giờ nhánh từ xa đã trở thành một *tổ tiên* của nhánh cục bộ của bạn, nghĩa là commit của bạn có thể tham chiếu đến tất cả commit có ở nhánh từ xa.","","Hãy xem qua bản biểu diễn sau..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giờ nếu ta dùng merge thay vày rebase thì..."],afterMarkdowns:["Bùùm! Ta đã cập nhật đại diện nhánh từ xa tại kho chứa cục bộ với `git fetch`, *hợp nhất* (*merge*) thành quả mới vào thành quả của ta (để phản ánh thay đổi ở nhánh từ xa), sau đó đẩy chúng lên với `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Tuyệt vời! Có cách nào để làm việc này mà không phải gõ nhiều lệnh thế không nhỉ?","","Tất nhiên rồi -- bạn đã biết rằng `git pull` là lệnh tắt của fetch và merge. Tương tự như vậy, `git pull --rebase` là lệnh tắt của fetch và rebase!","","Hãy xem thử cách lệnh tắt này hoạt động ra sao."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Trước tiên với `--rebase`..."],afterMarkdowns:["Giống hệt như trước! Chỉ là lệnh ngắn hơn."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Và giờ với lệnh `pull` thông thường."],afterMarkdowns:["Lại một lần nữa, chính xác y hệt như trước!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Quy trình tìm nạp (fetch), bố trí lại/hợp nhất (rebase/merge), và đẩy (push) là khá phổ biết. Ta sẽ xem xét các phiên bản phức tạp hơn của những quy trình này ở các bài học sau, còn bây giờ thì hãy tập trung vào bài này đã.","","Để giải quyết cấp độ này, hãy làm các bước sau:","","* Nhân bản kho chứa của bạn","* Giả lập làm việc nhóm (1 commit)","* Tạo ra 1 commit cục bộ","* Xuất bản thành quả của bạn dùng *rebase*"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Razdeljeno Delo","","Zaenkrat smo videli kako `pullat` dol commite od ostalih in kako `pushat` naše spremembe. Izgleda dokaj preprosto, vendar kako lahko vseeno to mede ljudi?","","Težave nastopijo, ko se zgodovina repozitorijev *razdeli*. Preden se lotimo podrobnosti si poglejmo primer ...",""]}},{type:"ModalAlert",options:{markdowns:["Predstavljaj si, da skloniraš repozitorij v ponedeljek in začneš delati na novi funkcionalnosti. V petek si pripravljen, da objaviš svoje spremembe -- ampak o ne! Tvoji sodelavci so napisali goro kode med tednom in tvoja funkcionalnost je postala zastarela. Prav tako so objavili te commite v skupen repozitorij, tako da sedaj *tvoje* delo izhaja iz *stare* verzije projekta, ki ni več taprava.","","V tem primeru je ukaz `git push` dvoumen. Če bi pognal `git push`, bi git moral spremeniti oddaljeni repozitorij nazaj na stanje iz ponedeljka? Bi moral poizkusiti dodati tvoje delo, brez da odstarani novo kodo? Ali bi moral povsem ignorirati tvoje spremembe, ker so zastarele?","","Ker je toliko dvomov v tej situaciji (kjer se je zgodovina razdelila), ti git ne pusti, da bi `pushal` svoje spremembe. V bistvu te prisili, da vključiš zadnje stanje oddaljenega repozitorija, preden lahko deliš svoje delo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Toliko govorjenja! Poglejmo stvar v praksi."],afterMarkdowns:["Vidiš? Nič se ni spremenilo, ker je ukaz spodeletel. `git push` spodleti, ker tvoj zadnji commit `C3` izhaja iz oddaljenega `C1`. Oddaljen repozitorij se je med tem posodobil na `C2`, zato git zavrne tvoj push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Kako rešiti to zagato? Enostavno je, vse kar moraš narediti je, da spremeniš, da tvoje delo izhaja iz zadnje verzije oddaljenega brancha.","","Obstaja nekaj načinov, da to narediš, ampak najnaravnejši način je, da to narediš z rebaseom. Poglejmo, kako to izgleda."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Če sedaj rebaseamo, namesto da pushamo ..."],afterMarkdowns:["Boom! Posodobili smo našo lokalno reprezentacijo oddaljenega repozitorija z `git fetch`, rebaseali naše delo, da vsebuje nove spremembe iz oddaljenega repota, nato pa naložili svoje delo z `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["So še drugi načini, da posodobim svoj delo, ko je bil oddaljen repozitorij posodobljen? Seveda! Poglejmo isto stvar, vendar tokrat z `mergeom`.","","Čeprav `git merge` ne premakne tvojega dela (ampak naredi samo merge commit), je to način da sporočiš gitu, da si vključil vse spremembe iz oddaljenega repota. To je zato, ker je oddaljen branch sedaj *prednik* tvojega brancha, kar pomeni, da tvoj commit sedaj vsebuje vse commite iz oddaljenega brancha.","","Poglejmo predstavitev tega ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Če sedaj uporabimo merge namesto rebasea ..."],afterMarkdowns:["Boom! Posodobili smo našo lokalno sliko oddaljenega repozitorija z `git fetch`, *zmergali* novo delo v naše delo (kot odraz novih sprememb na oddaljenem branchu) in jih nato naložili z `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Super! A obstaja način, da naredim vse to brez tipkanja toliko ukazov?","","Seveda -- `git pull` že poznaš in je bližnjica za fetch ter merge. Prikladno je tudi `git pull --rebase` bližnjica za fetch in rebase!","","Poglejmo te kratke ukaze na delu."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Najprej z `--rebase` ..."],afterMarkdowns:["Enako kot prej! Le dosti krajše."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["In sedaj z navadnim `pullom` ..."],afterMarkdowns:["Zopet enako kot prej!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Vse to fetchanje, rebasanje/merganje in pushanje je kar pogosto. V prihodnjih lekcijah bomo preučili težje različice teh postopkov, ampak najprej preizkusimo tega.","","Da rešiš to stopnjo, izvedi sledeče korake:","","* Kloniraj svoj repozitorij","* Naredi lažni commit ostale ekipe (1 commit)","* Commitaj nekaj svojega dela (1 commit)","* Objavi svoje delo z *rebaseom*"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rozbieżna praca","","Widzieliśmy wcześniej, jak `pull` pobiera commity od innych i jak `push` wysyła nasze własne zmiany. Wydaje się to całkiem proste, więc jak ludzie mogą być tak zdezorientowani?","","Trudności pojawiają się, gdy historia repozytorium zaczyna się *rozbiegać*. Zanim omówimy szczegóły tego rozwiązania, zobaczmy przykład...",""]}},{type:"ModalAlert",options:{markdowns:["Wyobraźmy sobie, że klonujesz repozytorium w poniedziałek i zaczynasz pracować nad dodatkową funkcjonalnością. W piątek chcesz opublikować swoje zmiany -- ale, o nie! Współpracownicy napisali w ciągu tygodnia mnóstwo kodu, który sprawił, że twoja praca stała się nieaktualna (przestarzała). Opublikowali również te poprawki we wspólnym zdalnym repozytorium, więc teraz *twoja* praca jest oparta na *starej* wersji projektu, która nie jest już aktualna.","","W tym przypadku komenda `git push` jest niejednoznaczna. Jeśli uruchomisz `git push`, to czy Git powinien zmienić zdalne repozytorium z powrotem na takie, jakie było w poniedziałek? Czy może powinien próbować dodać twój kod, nie usuwając jednocześnie nowego kodu? Czy może też ma całkowicie zignorować twoje zmiany, ponieważ są one zupełnie przestarzałe?","","Ponieważ w tej sytuacji (gdzie historia się rozbiegła) jest tak wiele niejasności, Git nie pozwala ci na `push` twoich zmian. W rzeczywistości zmusza cię do połączenia najnowszego stanu remote'a, zanim pozwoli ci udostępnić swoją pracę."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dość gadania! Zobaczmy tę sytuację w działaniu."],afterMarkdowns:["Spójrz, nic się nie zmieniło, ponieważ wykonanie polecenia nie powiodło się. Polecenie `git push` nie powiedzie się, ponieważ twój najnowszy commit `C3` jest oparty na zdalnym `C1`. Zdalny został jednak zaktualizowany do `C2`, więc Git odrzuca twojego pusha."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Jak rozwiążesz tę sytuację? To proste. Wszystko, co musisz zrobić, to oprzeć swoją pracę na najnowszej wersji remote'a.","","Jest kilka sposobów, aby to zrobić, ale najprostszym jest przeniesienie pracy poprzez rebase. Zobaczmy, jak to wygląda."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zróbmy teraz inaczej: rebase przed wypchnięciem..."],afterMarkdowns:["Tadam! Zaktualizowaliśmy naszą lokalną reprezentację remote'a za pomocą `git fetch`, przebazowaliśmy naszą pracę, aby odzwierciedlić nowe zmiany na zdalnej gałęzi, a następnie wypchnęliśmy je za pomocą `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Czy istnieją inne sposoby na aktualizację naszej pracy, gdy zdalne repozytorium zostało zaktualizowane? Oczywiście! Spróbujmy rozwiązać to również z użyciem `merge`.","","Chociaż `git merge` nie przenosi twojej pracy (a zamiast tego po prostu tworzy commit scalający), jest to sposób na powiedzenie Gitowi, że dołączasz wszystkie zmiany z remote'a. Dzieje się tak dlatego, że zdalna gałąź jest teraz *przodkiem* twojej własnej gałęzi, co oznacza, że twój commit odzwierciedla wszystkie commity w zdalnej gałęzi.","","Zobaczmy, jak to wygląda..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A jeśli użyjemy `merge` zamiast `rebase`..."],afterMarkdowns:["Tadam! Zaktualizowaliśmy naszą lokalną reprezentację remote'a za pomocą `git fetch`, git dołączył (*merge*) nową pracę do naszej pracy (aby odzwierciedlić nowe zmiany na zdalnej gałęzi), a następnie wypchnął je za pomocą `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Wspaniale! Czy jest jakiś sposób, żeby zrobić to bez wpisywania tylu komend?","","Oczywiście -- znasz już `git pull ` - jest po prostu skrótem dla fetch i merge. `git pull --rebase` jest bardzo wygodnym skrótem dla fetch i rebase!","","Zobaczmy, jak działają te skrócone polecenia."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Na początku z `--rebase`..."],afterMarkdowns:["Tak samo jak wcześniej! Tylko o wiele krócej."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A teraz z klasycznym `pull`."],afterMarkdowns:["Jeszcze raz, dokładnie tak samo jak wcześniej!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Ta kolejność fetchowania, rebase/merge i push jest dość powszechna. W kolejnych lekcjach zajmiemy się bardziej skomplikowanymi możliwościami . Na razie wypróbujmy to, czego się nauczyliśmy.","","Aby ukończyć ten poziom, wykonaj następujące kroki:","","* Sklonuj swoje repozytorium","* Zasymuluj pracę zespołową (1 commit)","* Scommituj własną pracę (1 commit)","* Opublikuj swoją pracę, korzystając z *rebase*"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Storico divergente","","Fin'ora abbiamo visto come usare `pull` per scaricare commit di altri e come usare `push` per caricare le nostre modifiche. Sembra abbastanza semplice, come fanno le persone a confondersi?","","La difficoltà si presenta quando lo storico dei repository *diverge*. Prima di discuterne nel dettaglio, vediamo un esempio...",""]}},{type:"ModalAlert",options:{markdowns:["Immagina di clonare un repository di lunedì e di iniziare a lavorare su una nuova funzionalità. È arrivato venerdì e sei pronto a pubblicare la tua nuova feature -- ma oh no! I tuoi colleghi hanno scritto del codice durante la settimana che ha resto la tua feature obsoleta. Inoltre, hanno pubblicato questi commit sul repository remoto, quindi ora il *tuo* lavoro è basato su una versione *vecchia* del progetto che non è più rilevante.","","In questo caso, il comando `git push` è ambiguo. Eseguendo `git push`, git dovrebbe far tornare il repository remoto a come si trovava di lunedì? Dovrebbe cercare di aggiungere le tue modifiche senza rimuovere quelle dei colleghi? O dovrebbe ignorare totalmente le tue modifiche in quanto obsolete?","","Per via di questa ambiguità (dove gli storici divergono), git non ti permette di usare `push` per caricare le tue modifiche. Ti obbliga a scaricare la versione più recente del repository remoto prima di permetterti di condividere il tuo lavoro."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutto questo parlare! Vediamo questa situazione dal vivo."],afterMarkdowns:["Visto? Non è successo nulla in quanto il comando fallisce. `git push` fallisce in quanto il tuo commit più recente, `C3`, è basato sullo stato del repository remoto a `C1`. Nel mentre però il remoto è stato aggiornato a `C2`, quindi git non accetta il tuo push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Come puoi risolvere questa situazione? È facile, tutto ciò che devi fare è far sì che il tuo lavoro sia basato sulla versione più recente del ramo remoto.","","Ci sono più modi per fare ciò, il più diretto dei quali è lo spostare il tuo lavoro tramite rebase. Diamo un'occhiata a come si fa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora se ribasiamo prima di caricare il nostro lavoro..."],afterMarkdowns:["Boom! Abbiamo aggiornato la nostra rappresentazione del remoto tramite `git fetch`, ribasato il nostro lavoro affinché rifletta i nuovi cambiamenti del remoto, e poi li abbiamo caricati con `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Ci sono altri modi per aggiornare il mio lavoro quando il repository remoto è stato modificato? Certamente! Diamo un'occhiata alla stessa situazione sfruttando invece il `merge`.","","Nonostante `git merge` non sposti il tuo lavoro (in quanto va a creare un commit di merge), è un modo per far vedere a git che tutte le modifiche del repository remoto sono state incorporate. Questo in quanto il ramo remoto è ora un *antenato* del tuo ramo locale, per cui il tuo commit comprende tutti i cambiamenti presenti nel ramo remoto.","","Vediamolo in azione..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora se usiamo merge invece di ribasare..."],afterMarkdowns:["Boom! Abbiamo aggiornato la nostra rappresentazione del remoto con `git fetch`, *fuso* le nuove modifiche al nostro lavoro (per riflettere i cambiamenti del remoto), e caricato quest'ultimo con `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Fantastico! C'è per caso un modo per farlo senza dover digitare tutti questi comandi?","","Certamente -- sai già che `git pull` è una scorciatoria per fetch e merge. Possiamo digitare `git pull --rebase` come scorciatoia per un fetch e un rebase, molto comodo!","","Vediamo questi comandi al lavoro."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prima con `--rebase`..."],afterMarkdowns:["Identico a prima! Solo molto più breve."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E ora con un normale `pull`."],afterMarkdowns:["Di nuovo, esattamente uguale a prima!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Questo flusso di lavoro di recuperare cambiamenti, ribasare/fondere, e caricare il proprio lavoro è molto comune. Nelle lezioni future esamineremo delle versioni più complicate di questi flussi di lavoro, ma per ora proviamo a fare questo.","","Per risolvere il livello, compi i seguenti passi:","","* Clona il tuo repository","* Simula del lavoro da parte di altri (1 commit)","* Effettua tu delle modifiche (1 commit)","* Pubblica il tuo lavoro tramite *rebase*"]}}]}}}},{}],144:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"feature":{"target":"C2","id":"feature","remoteTrackingBranchID":"o/feature"},"o/feature":{"target":"C2","id":"o/feature","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"feature","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"feature":{"target":"C2","id":"feature","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git reset --hard o/main;git checkout -b feature C2; git push origin feature",startTree:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}}',hint:{en_US:"Make the feature branch from the local main before resetting it back to be the same as origin's main",de_DE:"Erstelle einen Feature-Branch ausgehend vom lokalen Main-Branch, bevor du den Main-Branch auf den origin/main zurücksetzt.",ru_RU:"Создайте новую feature ветвь от main перед тем, как откатить изменения в main до состояния o/main.",uk:"Створіть нову feature гілку від локального main перед тим, як відкотити зміни в main до стану o/main.",zh_CN:"从本地的main创建一个feature分支, 然后重置main和origin main保持一致。",zh_TW:"從本地的 main 分支建一個 feature 分支, 且記得要重置(同步sync)本地 main 分支和 origin/main, 讓他們保持一致。",es_ES:"Crea la rama feature desde la rama main en local antes de restablecerlo para que sea el mismo que la rama main de origen",pt_BR:"Crie o ramo feature a partir do ramo main no local antes de reestabelecê-lo para que seja o mesmo que o ramo main de origem",fr_FR:"Créer la branche feature à partir du main local, avant de la restaurer dans le même état que o/main",ko:"로컬 저장소의 main 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/main과 같아질 수 있도록 로컬 저장소의 main 브랜치를 reset 하세요.",sl_SI:"Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin main.",es_AR:"Crea la rama feature desde la rama main en local antes de restablecerlo para que sea el mismo que la rama main de origen.",ja:"mainブランチをoriginのmainと同じ状態になるようにリセットする前に、ローカルのmainからfeatureブランチを作成します。",pl:"Stwórz boczną gałąź tematyczną (feature) z lokalnego main, a późnej zsynchronizuj ją z main na origin",vi:"Tạo những nhánh tính năng từ nhánh cục bộ trước khi trả chúng về lại giống như o/main",it_IT:"Crea il ramo per la feature a partire dal main locale prima di resettarlo al pari del main remoto"},name:{en_US:"Locked Main",de_DE:"Gesperrter Main-Branch",ru_RU:"Заблокированная ветвь main",uk:"Заблокована гілка main",zh_CN:"锁定的Main(Locked Main)",zh_TW:"被鎖定的 Main(Locked Main)",es_ES:"Main bloqueado",pt_BR:"Main bloqueado",fr_FR:"Main verrouillé",ko:"잠겨버린 main 브랜치",sl_SI:"Zaklenjen Main",es_AR:"Main bloqueado",ja:"ロックされたmain",pl:"Zablokowany main",vi:"Nhánh chính bị khóa (Locked Main)",it_IT:"Main bloccato"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","If you work on a large collaborative team it's likely that main is locked and requires some Pull Request process to merge changes. If you commit directly to main locally and try pushing you will be greeted with a message similar to this:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Why was it rejected?","","The remote rejected the push of commits directly to main because of the policy on main requiring pull requests to instead be used.","","You meant to follow the process creating a branch then pushing that branch and doing a pull request, but you forgot and committed directly to main. Now you are stuck and cannot push your changes."]}},{type:"ModalAlert",options:{markdowns:["## The solution","","Create another branch called feature and push that to the remote. Also reset your main back to be in sync with the remote otherwise you may have issues next time you do a pull and someone else's commit conflicts with yours."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gesperrter Main-Branch","","Wenn du in einem großen Team zusammen arbeitest, ist der Main-Branch mit hoher Wahrscheinlichkeit für direkte Änderungen gesperrt. Um Änderungen am Remote-Branch einpflegen zu können, ist ein Pull-Request-Prozess notwendig. Wenn du lokal in deinem Main-Branch einen Commit durchführst und diesen versuchst auf den serverseitigen Main-Branch zu pushen, wirst du folgende Fehlermeldung bekommen:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Wieso wurde diese Aktion zurückgewiesen?","","Auf Grund der serverseitig voreingestellten Richtlinien sind direkte Änderungen am Main-Branch nicht erlaubt und erfordern einen Pull-Request.","","Um die eigenen lokalen Änderungen in den Main-Branch einbringen zu können, ist es erforderlich einen lokalen Feature-Branch zu erstellen. Dieser Feature-Branch muss dann auf den Server hochgeladen werden, damit dann ein Pull-Request eingeleitet werden kann. Dies wurde vorher durch den direkten Push des Main-Branch nicht berücksichtigt, weswegen man die Änderungen nicht hochladen konnte."]}},{type:"ModalAlert",options:{markdowns:["## Die Lösung","","Erstelle einen Branch der feature heißt und pushe diesen auf den Server. Setze den lokalen Main-Branch zurück, dass er mit dem Origin-Main-Branch synchron ist. Dies könnte sonst später zu Komplikationen führen, wenn weitere `pull`s durchgeführt und Commits von anderen mit deinen in Konflikt stehen."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 远程服务器拒绝!(Remote Rejected)","","如果你是在一个大的合作团队中工作, 很可能是main被锁定了, 需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地main, 然后试图推送(push)修改, 你将会收到这样类似的信息:","","```"," ! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)","```"]}},{type:"ModalAlert",options:{markdowns:["## 为什么会被拒绝?","","远程服务器拒绝直接推送(push)提交到main, 因为策略配置要求 pull requests 来提交更新.","","你应该按照流程,新建一个分支, 推送(push)这个分支并申请pull request,但是你忘记并直接提交给了main.现在你卡住并且无法推送你的更新."]}},{type:"ModalAlert",options:{markdowns:["## 解决办法","","新建一个分支feature, 推送到远程服务器. 然后reset你的main分支和远程服务器保持一致, 否则下次你pull并且他人的提交和你冲突的时候就会有问题."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Когда вы работаете в составе большой команды разработчиков над проектом, то, вероятнее всего, ветвь `main` будет _заблокирована_. Для внесения изменений в неё в git существует понятие запроса на слияние `Pull Request`. В такой ситуации если вы закоммитите свои наработки непосредственно в `main` ветвь, а после выполните `git push`, то будет сгенерировано сообщение об ошибке:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```","","```"," ! [удалённо отклонено] main -> main (TF402455: Изменение этой ветви запрещены; вы можете использовать pull request для обновления этой ветви.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Почему произошло отклонение моих изменений?","","Удалённый репозиторий отклонил загруженные коммиты непосредственно в `main` ветку потому, что на `main` _настроена политика_, которая требует использование `Pull request` вместо обычного `git push`.","","Эта политика подразумевает процесс создания новой ветви разработки, внесение в неё всех необходимых коммитов, загрузка изменений в удалённый репозиторий и _открытие нового_ `Pull request`. Однако вы забыли про это и закоммитили наработки непосредственно в `main` ветвь. Теперь вы застряли и не можете запушить свои изменения :(. "]}},{type:"ModalAlert",options:{markdowns:["## Решение:","","Создайте ещё одну ветвь под названием `feature` и отправьте изменения на удалённый репозиторий. Также не забудьте вернуть вашу локальную `main` ветвь в исходное состояние (чтобы она была синхронизирована с удалённой). В противном случае у вас могут возникнуть проблемы при следующем выполнении `git pull`."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Коли ви працюєте над проектом в складі великої команди розробників, то, швидше за все, гілка `main` буде _заблокована_. Для внесення до неї змін в git існує поняття запиту на злиття `Pull Request`. В такій ситуації, якщо ви закомітите свої зміни безпосередньо в гілку `main`, а потім виконаєте `git push`, то буде згенероване повідомлення про помилку:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```","","```"," ! [віддалено відхилено] main -> main (TF402455: Зміни (push-запити) цієї гілки заборонені; ви повинні використовувати pull-запит для оновлення цієї гілки.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Чому мої зміни були відхилені?","","Віддалений репозиторій відхилив коміти завантажені безпосередньо в гілку `main` через те, що на `main` _налаштована політика_, яка вимагає використання `Pull request` замість звичайного `git push`.","","Ця політика має на увазі процес створення нової гілки розробки, внесення до неї всіх потрібних комітів, завантаження змін в віддалений репозиторій і _відкриття нового_ `Pull request`. Але ви про це забули (чи не знали) і закомітили свої доробки безпосередньо в гілку `main`. Тепер ви застрягли і не можене запушити свої зміни :(. "]}},{type:"ModalAlert",options:{markdowns:["## Рішення:","","Створіть ще одну гілку з назвою `feature` і відправте зміни у віддалений репозиторій. Також не забудьте повернути вашу локальну гілку `main` в вихідне положення (щоб вона була синхронізована з віддаленою). Інакше у вас можуть виникнути складнощі при наступному виконанні запиту `git pull`, коли коміти інших розробників конфліктуватимуть з вашими."]}}]},es_ES:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Si trabajas en un equipo colaborativo, es probable que la rama `main` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `main` e intentas realizar `push`, recibirás un mensaje similar a este:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## ¿Por qué fue rechazado?","","Se rechazó el `push` del `commit` a la rama `main` debido a la política en la rama `main` que requiere el uso de `Pull Requests`.","","Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `main`. Ahora estás atascado y no puedes hacer `push` de tus cambios."]}},{type:"ModalAlert",options:{markdowns:["## La solución","","Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `main` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Se você trabalha em uma grande equipe colaborativa é provável que o main seja bloqueado e precise de alguns processos de Pull Request para unir mudanças. Se você commitar diretamente para o main localmente e tentar fazer um push você visualizará uma mensagem similar a essa:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Por que foi rejeitado?","","O repositório remoto rejeitou o push dos commits diretamente para o main por causa da política do main necessitando do uso dos pull requests.","","Você pretendia seguir o processo de criação de uma ramificação, fazendo um push dessa ramificação e fazendo um pull request, mas você esqueceu e commitou diretamente para o main. Agora você está preso e não consegue publicar suas mudanças."]}},{type:"ModalAlert",options:{markdowns:["## A solução","","Crie outro branch chamado feature e faça um push dele para o repositório remoto. Além disso, resete o main de volta a estar sincronizado com o repositório remoto para não ter problemas da próxima vez que fizer um pull e os commits de alguém mais conflitarem com o seu."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Si vous travaillez dans une équipe de grande taille, il est probable que `main` soit verrouillée, et que le mécanisme de `Pull Request` soit nécessaire pour `merge` des changements. Si vous faites un `commit` directement sur le main local, et essayez de `push`, vous serez reçu avec un message de la sorte :","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Pourquoi est-ce rejeté?","","Le dépôt distant a rejeté le `push` de `commit` directement sur `main`, à cause de la stratégie mise en place sur `main`, imposant plutôt l'usage des `pull requests`.","","Vous étiez censé suivre le processus suivant : créer une branche, `push`, et faire une `pull request`. Mais vous avez oublié et avez fait un `commit` directement sur `main`. Maintenant vous êtes coincé et ne pouvez pas faire un `push` de vos modifications."]}},{type:"ModalAlert",options:{markdowns:["## La solution","","Créer une autre branche appelée feature, et poussez la sur le serveur distant. Réinitialisez (`reset`) également votre `main` pour être en cohérence avec l'état du serveur distant, sinon vous pourriez avoir des problèmes la prochaine fois que vous faites un `pull`, et que quelqu'un d'autre `commit` des choses en conflit avec vos modifications."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 원격저장소 거부! (Remote Rejected!)","","규모가 큰 개발팀에서 일하는 경우, 보통 원격저장소의 `main` 브랜치는 잠겨있습니다(locked). 그래서 변경사항을 적용하려면 pull request 과정을 거쳐야하죠. 만약에 여러분이 로컬 저장소의 `main`브랜치에서 커밋을 한 후 `push`하려고 시도한다면, 다음과 같은 오류를 받게 될겁니다. :","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## 왜 거부됐나요?","","원격 저장소는 자신의 `main` 브랜치에 대한 직접적인 커밋을 제한합니다. 왜냐하면 `push` 대신에 pull request가 쓰여야 한다는 규칙이 원격 저장소의 `main` 브랜치에는 적용되어 있기 때문이죠.","","여러분은 브랜치를 따로 만들어 작업한 다음, 그것을 `push`하고 pull request를 하려 했습니다. 하지만 그걸 잊고 실수로 `main` 브랜치에서 직접 커밋을 해버렸네요! 이제 변경 사항을 `push` 하지도 못하고 옴짝달싹 못하는 상황이 되어버렸습니다."]}},{type:"ModalAlert",options:{markdowns:["## 해결책","","`feature` 라는 이름의 다른 브랜치를 만들어 원격 저장소에 `push` 하세요. 그리고 원격 저장소와 동기화될 수 있도록 로컬 저장소의 `main` 브랜치를 `reset`하세요. 그렇지 않으면 여러분이 다음에 `pull`을 시도할 때 문제가 발생하거나, 다른 협업자들의 커밋이 여러분의 커밋과 충돌할 수도 있습니다."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Si trabajas en un equipo colaborativo, es probable que la rama `main` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `main` e intentas realizar `push`, recibirás un mensaje similar a este:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## ¿Por qué fue rechazado?","","Se rechazó el `push` del `commit` a la rama `main` debido a la política en la rama `main` que requiere el uso de `Pull Requests`.","","Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `main`. Ahora estás atascado y no puedes hacer `push` de tus cambios."]}},{type:"ModalAlert",options:{markdowns:["## La solución","","Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `main` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Oddaljena Zavrnitev!","","Če delaš v veliki ekipi je verjetno, da je main zaklenjen in zahteva Pull Request postopek za merganje sprememb. Če commitaš direktno na main lokalno, poizkusi pushati in dobil boš sporočilo podobno temu:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Zakaj je bil zavrnjen?","","Oddaljen repo je zavrnil pushanje commitov direktno na main zaradi politike, da se uporabljajo le pull requesti.","","Mišljeno je, da slediš temu procesu, da narediš branch, ga pushaš, nato pa narediš pull request, ampak si pozabil in commital direktno na main. Sedaj si zataknjen in ne moreš pushati svojih sprememb."]}},{type:"ModalAlert",options:{markdowns:["## Rešitev","","Naredi še en branch imenovan feature in ga pushaj na remote. Prav tako resetiraj main nazaj, da bo v enakem stanju kot na oddaljenem repozitoriju, drugače imaš lahko težave naslednjič, ko boš pullal spremembe in bo konflikt s commitom nekoga drugega."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## リモートが拒否した!","","もしあなたが大規模な共同作業チームで働いている場合、mainがロックされていて、変更をマージするために何らかのプルリクエストの処理が必要になるかもしれません。ローカルで直接mainにコミットしてプッシュしようとすると、以下のようなメッセージに遭遇するでしょう:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## なぜ拒否されたのか?","","mainに対しては直接でのコミットの代わりにプルリクエストを要求するポリシーによって、リモートはmainに直接コミットしようとするプッシュを拒否しました。","","あなたはブランチを作成し、そのブランチをプッシュしてプルリクエストを行うという手順を踏むつもりでしたが、それを忘れてしまい直接mainにコミットしてしまったのです。あなたは行き詰まってしまい、変更をプッシュすることが出来なくなってしまいました。"]}},{type:"ModalAlert",options:{markdowns:["## 解決策","","featureという名前の別のブランチを作成し、リモートにプッシュしてください。またmainをresetしてリモートと同じ状態になるようにしてください。そうしないとあなたが次にプルを実行したときに問題が発生し、他の誰かのコミットがあなたのコミットと競合する恐れがあります。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 遠端伺服器拒絕!(Remote Rejected!)","","如果今天你在一個較大型的多人合作專案,那很有可能 main 是被鎖住的,不允許你直接更動 main,你必須藉由 Pull Request(發PR) 來處理更動。如果你嘗試在本地 main 做提交(commit)然後推送(push),你可能會收到這個訊息:","","```"," ! [遠端伺服器拒絕] main -> main (TF402455: 推送(push)到這個分支是不允許的; 你必須使用 pull request(發PR) 來更新這個分支.)","```"]}},{type:"ModalAlert",options:{markdowns:["## 為什麼會被拒絕推送?(Why was it rejected?)","","因為這時候 main 的政策(規則)是必須透過 pull request(發PR) 才能對 main 做更動,遠端伺服器會拒絕直接 push 到 main 這件事。","","你應該按照流程,首先建一個分支(自己的 branch),然後推送(push)這個分支並發起 pull request(發PR),但是你忘記了,並直接提交給了 main,所以現在你的行動停住了,而且你不能推送(push)此次更動。"]}},{type:"ModalAlert",options:{markdowns:["## 解決辦法:","","新建一個叫 feature 的分支,然後推送到遠端伺服器。記得重置(同步一下) 你的 main 分支和遠端伺服器保持一致,不然有可能下一次你拉的時候(pull)會跟別人的提交(commit)產生衝突。"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote odrzuca!","","Jeśli pracujesz w dużym zespole, to może się zdarzyć, że main będzie zablokowany i przed scaleniem zmian trzeba będzie zrobić pull request. Jeśli commitujesz bezpośrednio do lokalnego main i spróbujesz zrobić push, to możesz dostać wiadomość podobną do tej:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Skąd to odrzucenie?","","Remote odrzuca pushowanie twoich commitów bezpośrednio do main ze względu na regułę wymagającą korzystania z pull requestów.","","Twoim zamiarem było najpierw stworzyć gałąź, a potem wypchnąć ją do zdalnego repozytorium i zrobić pull request, ale zamiast tego commitujesz bezpośrednio do main. Dlatego masz problem i nie możesz wypchnąć swoich zmian."]}},{type:"ModalAlert",options:{markdowns:["## Rozwiązanie","","Stwórz inną gałąź, nazywaną często boczną albo tematyczną, a po angielsku: feature (funkcyjną), i wypchnij ją do remote. Zresetuj również swój main, tak aby był zsynchronizowany ze zdalnym repozytorium. Jeśli tego nie zrobisz, to możesz mieć problem następnym razem, kiedy zrobisz pull, a czyjś commit będzie miał konflikt z twoim."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Kết nối remote bị từ chối!","","Nếu bạn làm việc trong một nhóm cộng tác lớn, có khả năng nhánh main bị khóa và yêu cầu một số quy trình Pull Request để hợp nhất các thay đổi. Nếu bạn commit trực tiếp với nhánh cục bộ và thử push, bạn sẽ được chào đón bằng một thông báo tương tự như sau:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Tại sao bị từ chối?","","Remote từ chối push các commit trực tiếp đến main vì chính sách của main yêu cầu các pull request được sử dụng thay thế.","","Bạn định tạo một nhánh sau đó đẩy nhánh lên rồi thực hiện pull request theo đúng quy trình, tuy nhiên bạn lại lỡ tay commit trực tiếp vào nhánh main. Bây giờ bạn bị mắc kẹt và không thể đẩy các thay đổi của mình lên."]}},{type:"ModalAlert",options:{markdowns:["## Giải pháp","","Tạo một nhánh khác được gọi là feature và push nhánh đó đến remote. Đồng thời đặt lại nhánh main của bạn để đồng bộ với remote, nếu không bạn có thể gặp sự cố vào lần tiếp theo khi bạn thực hiện pull và commit của người khác xung đột với của bạn."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rifiuto remoto!","","Se fari parte di un team di grandi dimensioni è probabile che il main sia bloccato e che richieda un processo di Pull Request per fondere il proprio lavoro. Se effettui localmente un commit al main e provi a caricare le modifiche al repository remoto troverai come risposta un messaggio di questo tipo:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Perché è stato rifiutato?","","Il repository remoto ha rifiutato l'invio di commit direttamente al main in quanto per questo ramo è richiesto di effettuare una pull request: una richiesta di includere le nostre modifiche personali nel repository remoto.","","Avresti dovuto seguire il processo di creare un nuovo ramo, fare il push di quel ramo ed effettuare una pull request, ma ti sei scordato e hai effettuato il commit direttamente sul main. Ora sei bloccato e non puoi caricare le tue modifiche."]}},{type:"ModalAlert",options:{markdowns:["## La soluzione","","Crea un nuovo ramo chiamato feature e carica quest'ultimo sul repository remoto. Inoltre reimposta il tuo ramo main affinché sia al pari con il remoto altrimenti potresti andare in contro a dei problemi la prossima volta che proverai ad effettuare un pull e i commit di qualcun'altro andranno in conflitto con i tuoi."]}}]}}}},{}],145:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C11","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C11","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]},"side1":{"target":"C2","id":"side1","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side2":{"target":"C4","id":"side2","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side3":{"target":"C7","id":"side3","remoteTrackingBranchID":null,"localBranchesThatTrackThis":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":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C1"],"id":"C8"},"C9":{"parents":["C2","C8"],"id":"C9"},"C10":{"parents":["C4","C9"],"id":"C10"},"C11":{"parents":["C10","C7"],"id":"C11"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C11","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C8":{"parents":["C1"],"id":"C8"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C6":{"parents":["C5"],"id":"C6"},"C4":{"parents":["C3"],"id":"C4"},"C9":{"parents":["C2","C8"],"id":"C9"},"C7":{"parents":["C6"],"id":"C7"},"C10":{"parents":["C4","C9"],"id":"C10"},"C11":{"parents":["C10","C7"],"id":"C11"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git checkout main;git pull;git merge side1;git merge side2;git merge side3;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]},"side1":{"target":"C2","id":"side1","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side2":{"target":"C4","id":"side2","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side3":{"target":"C7","id":"side3","remoteTrackingBranchID":null,"localBranchesThatTrackThis":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":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"side3","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C8","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C8":{"parents":["C1"],"id":"C8"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Merging with remotes",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",ja:"リモートとのmerge",fr_FR:"Fusionner avec les branches distantes",ru_RU:"Слияние с удалённым репозиторием",ko:"원격 작업과 merge하기",uk:"Мердж з віддаленим репозиторієм",vi:"Hợp nhất nhánh từ xa",sl_SI:"Merganje z oddaljenim repozitorijem",pl:"Scalanie z remote",it_IT:"Fondere in remoto"},hint:{en_US:"Pay attention to the goal tree!",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!",ja:"ゴールツリーをよく見てください!",fr_FR:"Respectez l'arbre représentant l'objectif !",ru_RU:"Внимательно посмотрите на цель уровня!",ko:"goal을 잘 살펴보세요!",uk:"Уважно подивись як має виглядати результат!",vi:"Hãy để ý đến cây mục tiêu!",sl_SI:"Poglej si ciljno drevo!",pl:"Zwróć uwagę, jak wygląda docelowe drzewo!",it_IT:"Fai attenzione all'albero nell'obiettivo"},compareOnlyMain:!0,startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Why not merge?","","In order to push new updates to the remote, all you need to do is *incorporate* the latest changes from the remote. That means you can either rebase *or* merge in the remote branch (e.g. `o/main`).","","So if you can do either method, why have the lessons focused on rebasing so far? Why is there no love for `merge` when working with remotes?",""]}},{type:"ModalAlert",options:{markdowns:["There's a lot of debate about the tradeoffs between merging and rebasing in the development community. Here are the general pros / cons of rebasing:","","Pros:","","* Rebasing makes your commit tree look very clean since everything is in a straight line","","Cons:","","* Rebasing modifies the (apparent) history of the commit tree.","","For example, commit `C1` can be rebased *past* `C3`. It then appears that the work for `C1'` came after `C3` when in reality it was completed beforehand.","","Some developers love to preserve history and thus prefer merging. Others (like myself) prefer having a clean commit tree and prefer rebasing. It all comes down to preferences :D"]}},{type:"ModalAlert",options:{markdowns:["For this level, let's try to solve the previous level but with *merging* instead. It may get a bit hairy but it illustrates the point well."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Pourquoi pas merge ?","","Dans le but d'envoyer de nouvelles modifications sur le dépôt distant, la seule étape préliminaire est *d'incorporer* les derniers changements de ce dépôt dans le nôtre. Concrètement, vous pouvez faire un rebase *ou* un merge de la branche distante (c'est à dire de `o/main`).","","Donc si l'on peut faire les deux méthodes, pourquoi les leçons se sont-elles concentrées sur rebase jusqu'à présent ? Pourquoi préfère-t-on souvent éviter `merge` lorsque l'on travaille avec les branches distantes ?",""]}},{type:"ModalAlert",options:{markdowns:["Au sein de la communauté des développeurs, il y a beaucoup de débats à propos des avantages et inconvénients de l'utilisation de merge ou de rebase. Voici les principaux arguments pour et contre rebase:","","Pour :","","* Rebase rend votre arbre de commits très propre puisqu'il ressemble à une ligne droite.","","Contre :","","* Rebase modifie l'historique (apparent) de l'arbre des commits.","","Par exemple, le commit `C1` peut être rebasé *après* `C3`. Cela fait croire que le travail de `C1'` est arrivé après `C3` alors qu'en réalité il était achevé et commité avant.","","Certains développeurs aiment préserver l'historique et préfèrent donc merge. Les autres (comme moi) préfèrent avoir un arbre des commits propre et préfèrent rebase. C'est une question de goûts :D"]}},{type:"ModalAlert",options:{markdowns:["Pour ce niveau, essayons de résoudre la même situation qu'au niveau précédent, mais cette fois en utilisant *merge*. Cela peut être un peu périlleux mais cela illustre bien le problème."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## ¿Por qué no mergear?","","Para pushear tus novedades al remoto, todo lo que tenés que hacer es *integrar* los últimos cambios del remoto con los tuyos. Eso significa que podés hacer tanto rebase como merge con la rama remota (por ejemplo, `o/main`).","","Así que si podés hacer cualquiera de las dos, ¿por qué las lecciones sólo se centraron 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. Acá tenemos 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 realidad se había hecho antes.","","Algunos desarrolladores aman preservar la historia, por lo que prefieren 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 ponerse un poco oscuro, pero ilustra la idea bastante bien."]}}]},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/main`).","","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:[{type:"ModalAlert",options:{markdowns:["## Por que não um merge?","","Para enviar novas atualizações ao repositório remoto, tudo que você precisa é *incorporar* as últimas mudanças ali presentes. Isso significa que você pode tanto fazer um rebase *quanto* um merge no ramo remoto (ex. `o/main`).","","Então, se você pode escolher qualquer um desses métodos, por que as lições focaram no rebase até o momento? Por que não demos nenhum amor ao `merge` quando trabalhamos com repositórios remotos?",""]}},{type:"ModalAlert",options:{markdowns:["Há muito debate na comunidade de desenvolvedores sobre as vantagens e desvantagens do merge e do rebase. Aqui estão os prós e contras gerais do rebase:","","Prós:","","* O rebase faz a sua árvore de commits parecer bastante limpa, já que tudo fica em uma linha reta","","Contras:","","* O rebase modifica o histórico *aparente* da sua árvore de commits.","","Por exemplo, o commit `C1` pode aparecer *depois do* `C3` após sofrer rebase. Então, fica parecendo que alguém trabalhou em `C1` apenas depois de `C3` estar completo, quando na realidade o que ocorreu foi o contrário.","","Alguns desenvolvedores adoram preservar o histórico e, portanto, preferem o merge. Outros (como eu) preferem ter uma árvore de commits limpa, obtida usando rebase. Tudo se resume ao gosto pessoal :D"]}},{type:"ModalAlert",options:{markdowns:["Para este nível, tente resolver o mesmo problema do nível anterior, mas usando *merge* em vez de rebase. A árvore pode ficar um pouco cabeluda, mas isso ilustra bem o nosso ponto."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## ¿Por qué non mesturar?","","Para empurrar as túas novidades ó remoto, todo o que tes que facer é *integrar* os últimos cambios do remoto cos teus. Eso significa que podes facer tanto rebase como merge ca rama remota (por exemplo, `o/main`).","","Así que podes facer calquera das dúas, ¿por qué as leccións só se centraron en rebasar ata agora? ¿Por qué non adicarlle algo de amor ó `merge` cando traballamos con remotos?",""]}},{type:"ModalAlert",options:{markdowns:["Hai moito debate entre os desenvolvedores sobre os pros e contras de mesturar vs rebasar. Aquí temos os pros e os contras de rebasar:","","Pros:","","* Rebasar fai que a túa árbore de commits sexa bastante limpa, xa que tódolos commits seguen unha única línea.","","Contras:","","* Rebasar modifica a historia (aparente) da túa árbore de commits.","","Por exemplo, o commit `C1` pode rebasarse para que apareza *despois* de `C3`. Entón, parece que o traballo de `C1'` fíxose despois de `C3`, inda que na realidade fixérase antes.","","Algúns desenvolvedores aman preservar a historia, polo que prefiren mesturar. Outros (coma min) preferimos ter unha árbore de commits limpos, e preferimos rebasar. Todo é unha cuestión de preferencias :D"]}},{type:"ModalAlert",options:{markdowns:["Para este nivel, tratemos de resolvelo nivel anterior, pero *mesturando*. Pode poñerse un pouco oscuro, pero ilustra a idea bastante ben."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 為何不要 merge?","","為了要 push 新的 commit 給 remote,你只需要做的是先同步 remote 的更新,那就表示你可以使用 rebase *或者*是 merge remote branch (例如,`o/main`)。","","所以假如你已經學會使用其中一個方式了,那為什麼我們到目前為止還在強調 `rebase`?為什麼當提到 remote 的時候,反而 `merge` 比較沒有受到關注?",""]}},{type:"ModalAlert",options:{markdowns:["在程式發展的社群中,關於 `merge` 以及 `rebase` 的孰優孰劣有很多的爭論。這裡我們會提到關於 `rebase` 的優點及缺點:","","優點:","","* `rebase` 使得你的 commit tree 看起來更為簡潔,因為任何的 commit 都在一條直線上面。","","缺點:","","* `rebase` 修改了 commit tree 的歷史紀錄。","","舉例來說,我們可以 rebase commit `C1`,將 `C1` 接在*過去的* `C3` 上面,那麼就可以表現出 `C1` 是出現在 `C3` 的後面。","","有一些程式設計師喜歡保留歷史紀錄,因此他們會比較喜歡 `merge`; 其他人(例如我自己)比較喜歡一個簡潔的 commit tree,因此他們比較喜歡 `rebase`。這些都是擇你所愛。:D"]}},{type:"ModalAlert",options:{markdowns:["在這個關卡中,我們面對的是之前關卡的題目,但是我們採用的是 `merge`,這可能會讓你感覺到有點困難,但是確實有講到重點。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Warum nicht Merge?","","Um neue Dinge auf das Remote zu schieben musst du erst alle Änderungen vom Remote holen und bei dir integrieren. Das bedeutet du kannst den entfernten Branch (z.B. `o/main`) entweder Rebasen *oder* Mergen.","","Wenn du also beide Methoden benutzen kannst, warum haben sich die Level bisher auf Rebase konzentriert? Warum mag keiner `merge` wenn es um Remotes geht?",""]}},{type:"ModalAlert",options:{markdowns:["Es gibt eine Menge Diskussionen unter Entwicklern über die Vor- und Nachteile beim Mergen und Rebasen. Hier ein paar Vor- und Nachteile zum Rebasen:","","Vorteile:","","* Rebasen macht den Commit-Baum sehr übersichtlich, weil alles linear aufeinander aufbaut.","","Nachteile:","","* Rebasen verändert die History eines Branches.","","Zum Beispiel kann durch Rebasen Commit `C1` an Commit `C3` *vorbei* bewegt werden, bzw. eine Kopie von `C1`. Es sieht dann so aus als wären die Änderungen in `C1` nach denen in `C3` gemacht worden, obwohl das nicht stimmt.","","Manche Entwickler möchten lieber die Historie lassen, wie sie ist und ziehen daher das Mergen vor. Andere (wie ich) haben lieber einen sauberen Commit-Baum und ziehen Rebase vor. Am Ende ist es eine Geschmacksfrage. :D"]}},{type:"ModalAlert",options:{markdowns:["In diesem Level wollen wir versuchen die Aufgabe vom letzten Level erneut zu lösen, aber diesmal mit einem *Merge*. Das wird vielleicht etwas haariger, stellt aber gut die Implikationen dar."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 为什么不用 merge 呢?","","为了 push 新变更到远程仓库,你要做的就是**包含**远程仓库中最新变更。意思就是只要你的本地分支包含了远程分支(如 `o/main`)中的最新变更就可以了,至于具体是用 rebase 还是 merge,并没有限制。","","那么既然没有规定限制,为何前面几节都在着重于 rebase 呢?为什么在操作远程分支时不喜欢用 `merge` 呢?",""]}},{type:"ModalAlert",options:{markdowns:["在开发社区里,有许多关于 merge 与 rebase 的讨论。以下是关于 rebase 的优缺点:","","优点:","","* Rebase 使你的提交树变得很干净, 所有的提交都在一条线上","","缺点:","","* Rebase 修改了提交树的历史","","比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。","","一些开发人员喜欢保留提交历史,因此更偏爱 merge。而其他人(比如我自己)可能更喜欢干净的提交树,于是偏爱 rebase。仁者见仁,智者见智。 :D"]}},{type:"ModalAlert",options:{markdowns:["本关,我们还是解决上一关卡中的问题,但是要用 merge 替换 rebase。这显然有点画蛇添足,但这只是为了更好的说明上面的观点。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## なぜマージではいけないのか?","","新しい更新をリモートにプッシュするため、あなたがする必要があるのはリモートからの最近の変更の*組み込み*です。それは、リモートブランチ(例えば、`o/main`)にリベース*か*マージのどちらかをあなたがする必要があるということを意味します。","","もしどっちの方法でも行うことができるなら、なぜこれまでのレッスンでは、リベースに焦点を当ててきたのでしょう?リモートへの作業で、なぜ`merge`を推してこなかったのでしょうか?",""]}},{type:"ModalAlert",options:{markdowns:["開発コミュニティで、マージとリベースの間でのトレードオフについては多くの議論がなされています。ここでは一般的なリベースのメリット/デメリットを紹介しましょう:","","メリット:","","* リベースは全てが直線上にあるので、あなたのコミットツリーをとても綺麗にみせます。","","デメリット:","","* リベースは、コミットツリーの(見ため上の)履歴を改変してしまいます。","","例えば、`C1`コミットは`C3`コミットの後ににリベースすることができます。現実とは逆に、`C1'`の作業がまるで`C3`の後に行われたものであるかのように見えるようになります。","","開発者によっては、履歴をそのまま保持するのを好むので、マージを選びます。他の人は(例えば私は)きれいなコミットツリーを好むのでリベースを選びます。つまるところ、好みの問題というわけですね :D"]}},{type:"ModalAlert",options:{markdowns:["このレベルでは、前回のレベルを*マージ*を代わりに使って解いてみてください。ちょっと難しいかもしれませんが、このレッスンのポイントを把握するのに十分な知見を得られるはずです。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Merge? Нет, нет, спасибо.","","Чтобы закачать (push) новые изменения в удалённый репозиторий, всё, что вам нужно сделать - это *смешать* последние изменения из удалённого репозитория. Это значит, что вы можете выполнить rebase *или* merge на удалённом репозитории (например, `o/main`).","","Если мы можем воспользоваться одним из двух методов, то почему же эти упражнения сфокусированы в основном на rebase? К чему такая нелюбовь к `merge`, когда речь идёт о работе с удалёнными репозиториями?",""]}},{type:"ModalAlert",options:{markdowns:["В среде разработчиков существует огромное количество дебатов около merging и rebasing. Ниже приведены основные за / против метода rebasing:","","За:","","* Rebasing делает дерево коммитов более чистым и читабельным, потому что всё представляется единой прямой линией.","","Против:","","* Метод rebasing явно изменяет историю коммитов в дереве.","","Например, коммит `C1` может быть перебазирован *после* `C3`. Соответственно, в дереве работа над `C1'` будет отображаться как идущая после `C3`, хотя на самом деле она была выполнена раньше.","","Некоторые разработчики любят сохранять историю и предпочитают слияние (merging). Другие (такие как я) предпочитают иметь чистое дерево коммитов, и пользуются перебазировкой (rebasing). Всё зависит от ваших предпочтений и вкусов :D"]}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, решите предыдущие задачи, но с помощью *слияния (merging)*. Может быть, получится слегка неказисто, однако такое упражнение хорошо отразит суть различий."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 왜 merge하지 않는거죠?","","새로운 작업들을 원격 저장소로 push하기위해서 여러분은 원격 저장소의 최근 변경들을 *합치기*만 하면 됩니다. 이 말은 즉 원격 브랜치로(예:`o/main`) rebase를 할 수도 merge를 할 수도 있다는 것입니다.","","두가지를 다 할 수 있다면, 왜 지금까지 배운 레슨들은 rebase를 하는것에 집중한거죠? 원격 저장소와 작업을 할때는 왜 `merge`에게 관심을 가져주지 않는건가요?",""]}},{type:"ModalAlert",options:{markdowns:["개발 커뮤니티에서 merge를 하는것과 rebase 사이의 트레이드 오프에 대해 많은 논의가 이루어지고 있습니다. 여기 rebase의 일반적인 장 / 단점을 소개하겠습니다:","","장점:","","* rebase는 여러분의 커밋 트리를 깔끔하게 정리해서 보기가 좋습니다 모든게 한 줄에 있기때문이죠.","","단점:","","* rebase를 하게 되면 커밋 트리의 (보이는)히스토리를 수정합니다.","","예를 들어, 커밋 `C1`는 *과거*의`C3`로 rebase 될 수 있습니다. `C1'`의 작업이 `C3`의 다음에 있는것으로 보이게 되는겁니다. 실제로는 `C1`이 먼저 완료된거인데 말이죠.","","어떤 개발자들은 이력이 보존되는것을 좋아하기 때문에 merge를 선호합니다. 그 이외는(저 처럼) 커밋 트리가 깔끔한것을 선호해서 rebase를 선호합니다. 자기 입맛에 맞추면 되겠습니다 :D"]}},{type:"ModalAlert",options:{markdowns:["이번 레벨에서는 이전의 레벨을 해결 해봅시다. 대신 이번에는 *merge*를 사용하겠습니다. 조금 복잡할 수 있지만 지금 배운 내용의 포인트를 파악하기 좋을것 입니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Чому б не змерджити?","","Для того, щоб віддалений сервер прийняв твої зміни, треба *об'єднати* їх з останніми змінами на сервері. Це означає ребейс *або* мердж з віддаленою гілкою (напр. `o/main`).","","Хмм, якщо можна використати один із цих методів, для чого нам додаткові уроки про ребейс? Чому ніхто не любить `merge`, працюючи з віддаленим сервером?",""]}},{type:"ModalAlert",options:{markdowns:["В спільноті розробників давно ведуться суперечки щодо переваг і недоліків мерджингу і ребейсу. Ось головні з них для ребейсу:","","За:","","* Ребейс дозволяє тримати дерево комітів чистим, оскільки все вибудовується в пряму лінію;","","Проти:","","* Ребейс змінює історію в дереві комітів.","","Наприклад, коміт `C1` можна ребейснути *на* `C3`. Як результат `C1'` буде йти після `C3`, хоча насправді його зробили раніше.","","Деякі розробники люблять зберігати історії і тому вибирають мерджинг. Інші (як і я) воліють мати чисте дерево комітів і віддають перевагу ребейсу. Це питання смаку :D"]}},{type:"ModalAlert",options:{markdowns:["На цьому рівні спробуймо вирішити попереднє завдання з використанням *мерджу*. Можливо вийде не так охайно, але добре покаже різницю в підходах."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tại sao không hợp nhất?","","Để có thể đẩy cập nhật của bạn lên kho nhánh từ xa, tất cả những gì bạn cần làm là *kết nạp* thay đổi mới nhất từ nhánh từ xa. Nghĩa là bạn có thể dùng rebase *hoặc* merge với nhánh từ xa (ví dụ `o/main`).","","Vậy ta có thể sử dụng một trong 2 cách, thì tại sao đến giờ ta chỉ tập trung vào rebase trong các bài học? Tại sao khi làm việc với nhánh từ xa lại ta lại không thích `hợp nhất` (`merge`)?",""]}},{type:"ModalAlert",options:{markdowns:["Trong cộng đồng phát triển phần mềm có rất nhiều tranh luận về ưu, nhược, khuyết của việc sử dụng tái bố trí (`rebase`) hay hợp nhất (`merge`). Dưới đây là một vài ưu / nhược cơ bản của rebase:","","Ưu điểm:","","* Rebase làm cây commit của bạn trông gọn gàng hơn nhiều vì mọi thứ được xếp theo đường thẳng","","Nhược điểm:","","* Rebase sửa đổi lịch sử của cây commit.","","Ví dụ, commit `C1` có thể bố trí lên *sau* `C3`. Thế là `C1'` biểu hiện như là nó xuất hiện sau `C3` trong khi thực tế nó được hoàn thành trước đó.","","Một số nhà phát triển thích lưu giữ lịch sử nên họ ưa thích merge hơn. Những người khác (như tôi chẳng hạn) thì thiên về rebase hơn vì muốn có cây commit gọn gàng. Rốt cuộc cũng chỉ phụ thuộc vào sở thích cá nhân thôi :D"]}},{type:"ModalAlert",options:{markdowns:["Ở cấp độ này, hãy thử giải bài tập trước đó nhưng dùng *hợp nhất*. Có lẽ bài này hơi thừa nhưng mà nó minh họa quan điểm trên rõ ràng hơn."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zakaj ne merganje?","","Da bi poslal nove spremembe na oddaljen repo, je vse kar moraš narediti, da *vključiš* zadnje spremembe iz oddaljenega repota. To pomeni, da lahko rebaseaš *ali* mergeaš v oddaljeni branch (npr. `o/main`).","","Torej če lahko narediš katero izmed metod, zakaj imeti lekcijo, ki se zaenkrat osredotoča na rebaseanje? Zakaj ni nobene ljubezni do `mergea` pri delanju z oddaljenimi repoti?",""]}},{type:"ModalAlert",options:{markdowns:["Veliko govora je o kompromisih med merganjem in rebasanjem med razvijalci. Tu so splošne prednosti / slabosti rebaseanja:","","Prednosti:","","* Rebasanje naredi tvoje drevo lepo in pregledno, ker je vse v ravni črti","","Slabosti:","","* Rebasanje spremeni (navidezno) zgodovino drevesa commitov.","","Naprimer, commit `C1` je lahko rebasean *mimo* `C3`. Potem izgleda, kot da je delo za `C1'` prišlo za `C3`, čeprav je v resnici bilo končano prej.","","Nekateri razvijalci imajo radi ohranjanje zgodovine in imajo posledično rajši merganje. Drugi (kot jaz) imajo rajši čisto drevo commitov in posledično rebasanje. Na koncu prevlada osebna preferenca. :D"]}},{type:"ModalAlert",options:{markdowns:["Za to stopnjo, poizkusimo rešiti prešnjo stopnjo z *merganjem*. Mogoče bo malo zakomplicirano, vendar bo lepo ponazorilo poanto."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Dlaczego nie merge?","","Aby wypchnąć nowe wersje, musisz tylko *nanieść* najnowsze zmiany ze zdalnego repozytorium. A to znaczy, że możesz zrobić albo rebase, *albo* merge gałęzi w zdalnym repozytorium (np. `o/main`).","","Skoro można to zrobić na oba sposoby, to dlaczego lekcje skupiały się do tej pory na przebazowaniu? Dlaczego `merge` nie jest lubianym poleceniem przy pracy na zdalnych repo?",""]}},{type:"ModalAlert",options:{markdowns:["Wśród osób zajmujących się programowaniem toczą się spory, co jest lepsze: merge czy rebase. Oto ogólne za i przeciw rebase'owania:","","Za:","","* Przebazowanie sprawi, że twoje drzewo commitów będzie wyglądać bardzo czysto, ponieważ wszystko znajdzie się w jednej linii","","Przeciw:","","* Rebase zmienia (pozornie) historię drzewa commitów.","","Na przykład: commit `C1` można przebazować *za* `C3`. Pozornie będzie to wyglądać tak, jakby praca na `C1'` została wykonana później niż na `C3`, a w rzeczywistości było zupełnie odwrotnie.","","Część osób ceni sobie oryginalną historię i dlatego woli merdżować. Inni (w tym ja) wolą mieć czyste drzewo commitów i dlatego używają rebase. To po prostu kwestia osobistych preferencji :D"]}},{type:"ModalAlert",options:{markdowns:["Na tym poziomie spróbujemy rozwiązać zadanie z poprzedniego, ale tym razem użyjemy *merge*. Może się to wydawać lekko pogmatwane, ale dobrze pokazuje tę metodę."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Perché non fondere?","","Per riuscire a caricare nuovi aggiornamenti al repository remoto, serve solamente *incorporare* le modifiche più recenti avvenute sul remoto. Ciò significa che puoi ribasare *oppure* fondere le nuove modifiche al ramo remoto (e.g. `o/main`).","","Quindi, se entrambi i metodi sono validi, perché le lezioni si sono concentrate sul ribasare? Perché non c'è amore per il `merge` quando si lavora con i repository remoti?",""]}},{type:"ModalAlert",options:{markdowns:["C'è abbastanza dibattito sui compromessi tra il fondere e il ribasare nell'ambiente degli sviluppatori. Qui presentiamo in generale i pro e contro del ribasare:","","Pro:","","* Ribasare rende il tuo albero dei commit più semplice da leggere in quanto tutto rientra in una linea dritta","","Cons:","","* Ribasare modifica lo storico (apparente) dell'albero dei commit.","","Ad esempio, il commit `C1` può essere ribasato *dopo* di `C3`. Apparirà che il lavoro per `C1` è avvenuto dopo `C3` quando in realtà era stato completato in precedenza.","","Alcuni sviluppatori amano preservare lo storico e perciò prediligono la fusione di commit. Altri (come il sottoscritto) preferiscono avere un albero dei commit più pulito, e perciò preferiscono ribasare. È una questione di gusti :D"]}},{type:"ModalAlert",options:{markdowns:["Per questo livello, prova a risolvere il livello precedente ma usando il *merge* invece che il *rebase*. L'albero apparirà più \"ingarbugliato\", ma dovrebbe riuscire a rendere bene l'idea."]}}]}}}},{}],146:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C3","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git pull",startTree:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Git Pullin'",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",ja:"Git Pull",fr_FR:"Git pull",ru_RU:"Git pull",uk:"Git pull",ko:"Git pull",vi:"Git pull",sl_SI:"Git Pull",pl:"Git pull",it_IT:"Git Pull"},hint:{en_US:"Just run git pull!",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.",ja:"単にgit pullを実行!",fr_FR:"Utilisez facilement git pull !",ru_RU:"Запустите комманду git pull !",uk:"Просто виконай git pull !",ko:"그냥 git pull을 하세요!",vi:"Đơn giản là gõ git pull!",sl_SI:"Samo izvedi git pull!",pl:"Po prostu uruchom git pull!",it_IT:"Semplicemente git pull!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Now that we've seen how to fetch data from a remote repository with `git fetch`, let's update our work to reflect those changes!","","There are actually many ways to do this -- once you have new commits available locally, you can incorporate them as if they were just normal commits on other branches. This means you could execute commands like:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","In fact, the workflow of *fetching* remote changes and then *merging* them is so common that git actually provides a command that does both at once! That command is `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's first see a `fetch` and a `merge` executed sequentially."],afterMarkdowns:["Boom -- we downloaded `C3` with a `fetch` and then merged in that work with `git merge o/main`. Now our `main` branch reflects the new work from the remote (in this case, named `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What would happen if we used `git pull` instead?"],afterMarkdowns:["The same thing! That should make it very clear that `git pull` is essentially shorthand for a `git fetch` followed by a merge of whatever branch was just fetched."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["We will explore the details of `git pull` later (including options and arguments), but for now let's try it out in the level.","","Remember -- you can actually solve this level with just `fetch` and `merge`, but it will cost you an extra command :P"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Maintenant que vous avez vu comment rapatrier des données depuis un dépôt distant avec `git fetch`, mettons à jour notre copie de travail pour refléter ces changements !","","Il existe en fait beaucoup de façons de faire cela -- une fois que vous avez de nouveaux commits disponibles localement, vous pouvez les incorporer dans votre branche de travail comme s'ils étaient des commits normaux d'autres branches. Cela signifie que pourriez simplement exécuter des commandes comme :","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","En fait, le principe de *rapatrier* (fetch) les branches distantes puis les *fusionner* (merge) est si commun que Git a en réalité une commande pour faire les deux à la fois ! Cette commande est `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons d'abord un `fetch` puis un `merge` exécutés séquentiellement."],afterMarkdowns:["Boum -- nous avons téléchargé `C3` avec un `fetch` et ensuite nous avons fusionné ce travail dans notre copie avec `git merge o/main`. Maintenant notre branche `main` reflète le nouveau travail du dépôt distant (dans ce cas, nommé `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Que se passerait-il si nous utilisions plutôt `git pull` ?"],afterMarkdowns:["La même chose ! Cela devrait maintenant être clair que `git pull` est surtout un raccourci pour `git fetch` suivi d'un merge de toutes les branches qui viennent d'avoir un fetch."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Nous allons explorer les détails de `git pull` plus tard (y compris options et arguments), mais pour ce niveau pratiquons d'abord la technique de base.","","Rappelez-vous : vous pouvez aussi résoudre ce niveau avec `fetch` et `merge`, mais cela vous coûtera une commande supplémentaire :P"]}}]},es_AR:{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 tenés los commits disponibles localmente, podés integrarlos como si fueran commits comunes de otras ramas. Esto significa que podrías ejecutar comandos como:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 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:["Boom: descargamos `C3` con un `fetch` y luego lo mergeamos con `git merge o/main`. Ahora nuestra rama `main` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Qué pasaría si usáramos `git pull` en cambio?"],afterMarkdowns:["¡Lo mismo! Eso debería dejar bien en claro que `git pull` es básicamente un atajo para hacer `git fetch` seguido por un merge con la rama que sea que hayamos bajado."],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.","","Acordate: podés resolver este comando simplemente con `fetch` y `merge`, pero eso te costaría un comando extra :P"]}}]},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/main`","* `git rebase o/main`","* `git merge o/main`","* 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/main`. Ahora nuestra rama `main` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)"],command:"git fetch; git merge o/main",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:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Agora que vimos como baixar dados de um repositório remoto com `git fetch`, vamos atualizar nosso trabalho para refletir essas mudanças!","","Há, na verdade, muitas formas de fazê-lo -- uma vez que você tenha os novos commits disponíveis localmente, você pode incorporá-los como se eles fossem commits normais em outros ramos. Isso significa que você pode executar comandos como estes a seguir:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","O fluxo de trabalho de executar *fetch* para baixar as mudanças remotas e depois fazer um *merge* delas é tão comum que o Git na verdade fornece um comando que faz ambas as coisas de uma vez só! Esse comando é o `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos primeiro ver um `fetch` e um `merge` executados sequencialmente."],afterMarkdowns:["Boom -- nós baixamos o `C3` com um `fetch` e então fizemos um merge desse trabalho usando `git merge o/main`. Agora o nosso ramo `main` reflete o trabalho realizado no repositório remoto (neste caso, chamado de `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O que iria acontecer se, em vez disso, usássemos `git pull`?"],afterMarkdowns:["Exatamente o mesmo! Isso deve tornar bem claro que `git pull` é essencialmente um caminho mais curto para executar um `git fetch` seguido de um merge de seja já qual ramo tiver sido baixado."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Vamos explorar os detalhes do `git pull` mais tarde (incluindo opções e parâmetros), mas por enquanto, experimente usá-lo em sua forma mais básica.","","Lembre-se -- você também poderia resolver este nível com um `fetch` e um `merge`, mas isso lhe custaria um comando a mais :P"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Agora que vimos cómo traer os datos dun repositorio remoto con `git fetch`, ¡actualicemos o noso traballo local para reflexar eses cambios!","","Realmente hai varias formas de facer esto: unha vez que teñas os commits dispoñibles localmente, podes integralos coma se foran commits comúns de outras ramas. Esto significa que poderías executar comandos como:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","De feito, o fluxo de traballo de *fetchear* os cambios remotos e depois *mesturalos* é tan común que git inclúe un comando que fai as dúas operacións nunha sola: ¡`giti pull`!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos primeiro un `fetch` e un `merge` executados secuencialmente."],afterMarkdowns:["Boom: descargamos `C3` cun `fetch` e logo mesturámolos con `git merge o/main`. Agora a nosa rama `main` reflexa o novo traballo do remoto (neste caso, chamado `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Qué pasaría se usáramos `git pull` en cambio?"],afterMarkdowns:["¡O mesmo! Eso debía deixar ben claro que `git pull` é básicamente un atallo para facer `git fetch` seguido pola mestura ca rama que houbésemos descargado."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Exploraremos os detalles de `git pull` despois (incluíndo as súas operacións e parámetros), pero por agora probarémolo neste nivel.","","Lémbrate: podes resolver este comando sinxelamente con `fetch` e `merge`, pero eso costaríache un comando extra :P"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git pull","","現在我們已經知道如何利用 `git fetch` 從 remote 抓取 commit,讓我們來看一下如何將這些 commit 更新到我們的檔案!","","只要在你的 local 有 fetch 到新的 commit,便有很多方法可以做到這件事情,你可以把它們視為在其它 branch 上面的一般的 commit,這表示你可以執行像這樣子的指令:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 等等‧‧‧","","事實上,一次*下載 (fetch)* remote 的更新並且*合併(merge)* 這些更新在 git 裡面是很常見的事情!這個命令叫作 `git pull`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來看循序執行一個 `fetch` 和一個 `merge` 的樣子"],afterMarkdowns:["看吧! 我們利用 `fetch` 下載了 `C3` 並且利用 `git merge o/main` 來更新資料,現在我們的 `main` branch 跟 remote 同步了(在這個例子中,remote repository 叫作 `origin`)。"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果用 `git pull` 會發生什麼事情?"],afterMarkdowns:["一樣!很明顯地,`git pull` 其實就是 git fetch 跟 git merge 的循序執行的結果,而且 merge 的 branch 就是 fetch 所更新的 branch。"],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["我們會解釋 `git pull` 的細節(包括可選擇的參數), 但現在先讓我們在這個關卡試試看!","","記住喔,你可以利用循序執行的方式來執行 `fetch` 以及 `merge` 來完成這個關卡,但是相對於 `git pull`,你就得多打一個指令。:P"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","既然我们已经知道了如何用 `git fetch` 获取远程的数据, 现在我们学习如何将这些变化更新到我们的工作当中。","","其实有很多方法的 —— 当远程分支中有新的提交时,你可以像合并本地分支那样来合并远程分支。也就是说就是你可以执行以下命令: ","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 等等","","实际上,由于先抓取更新再合并到本地分支这个流程很常用,因此 Git 提供了一个专门的命令来完成这两个操作。它就是我们要讲的 `git pull`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我们先来看看 `fetch`、`merge` 依次执行的效果"],afterMarkdowns:["我们用 `fetch` 下载了 `C3`, 然后通过 `git merge o/main` 合并了这一提交记录。现在我们的 `main` 分支包含了远程仓库中的更新(在本例中远程仓库名为 `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果使用 `git pull` 呢?"],afterMarkdowns:["同样的结果!这清楚地说明了 `git pull` 就是 git fetch 和 git merge 的缩写!"],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["稍后我们会探索一下 `git pull` 的细节(包括选项和参数),现在咱们先解决这个关卡。","","实际上你完全可以用 `fetch` 和 `merge` 通过本关,但是这会增加你的命令数。 :P"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Jetzt, wo wir wissen, wie wir mit `git fetch` Daten von einem entfernten Repository holen können, wollen wir unsere lokalen Daten aktualisieren, damit sie die Änderungen vom Server beinhalten.","","Tatsächlich gibt es eine Menge Wege dies zu erreichen -- sobald du die neuen Commits lokal verfügbar hast, kannst du sie integrieren wie Commits von ganz normalen anderen Branches. Du kannst also:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* usw. usf. ausführen.","","Änderungen vom Server zu holen und dann in die eigene Arbeit zu mergen wird so häufig benötigt, dass Git einen Befehl kennt, der beides auf einmal erledigt! Das ist `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns erst mal ein `fetch` gefolgt von `merge` an:"],afterMarkdowns:["Bämm -- wir haben `C3` mit `fetch` heruntergeladen und dann in unseren Branch mit `git merge o/main` integriert. Nun bildet unser `main` dieselben Inhalte ab, wie sie auf dem entfernten Server (`origin`) liegen."],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was passiert wohl, wenn wir stattdessen `git pull` benutzen?"],afterMarkdowns:["Dasselbe in Pink. Das sollte recht deutlich machen, dass `git pull` nur eine Abkürzung für `git fetch` gefolgt von einem Merge des gerade aktualisierten Branches ist."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Die Feinheiten von `git pull` werden wir uns später ansehen, für's Erste lass es uns in diesem Level ausprobieren.","","Vergiss nicht -- du kannst diesen Level auch mit `fetch` und `merge` lösen, aber das kostet dich einen Befehl extra. :P"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Теперь, когда мы познакомились с тем, как извлекать данные из удалённого репозитория с помощью `git fetch`, давайте обновим нашу работу, чтобы отобразить все эти изменения!","","Существует множество вариантов решений - как только у вас имеется локальный коммит, вы можете соединить его с другой веткой. Это значит, вы можете выполнить одну из команд:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* и т.д.","","Процедура *скачивания (fetching)* изменений с удалённой ветки и *объединения (merging)* настолько частая и распространённая, что git предоставляет вместо двух команд - одну! Эта команда - `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте рассмотрим, как `fetch` и `merge` выполняются последовательно"],afterMarkdowns:["Опа - мы скачали `C3` с помощью команды `fetch` и затем объединяем эти наработки с помощью `git merge o/main`. Теперь наша ветка `main` отображает изменения с удалённого репозитория (в данном случае — с репозитория `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Что же произойдёт, если вместо этих команд мы воспользуемся `git pull`?"],afterMarkdowns:["Абсолютно то же самое! Нужно чётко понимать, что `git pull` существенно уменьшает вашу рутинную работу, если бы вы использовали `git fetch` и последующее слияние (merging) скаченной ветки."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Мы изучим детали команды `git pull` чуть позже (включая опции и аргументы вызова команды), а пока что давайте просто попробуем эту команду.","","Помните, вы также можете выполнить этот уровень с помощью команд `fetch` и `merge`, но нужно ли делать так, когда можно воспользоваться всего лишь одной командой ? :P"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","今や私たちはリモートリポジトリから`git fetch`でデータを取ってくる方法を知っているので、今度は私たちの作業にその変更を反映することを学びましょう!","","実際には多くの方法があり、ローカルに利用可能なリモートの新しいコミットがある場合、あなたはそのコミットを他のブランチの通常のコミットと同じように、自分の作業に組み込むことができます。これは、あなたが次のようなコマンドを実行することで行えます:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* その他","","実は、リモートの変更を取ってきてマージするという作業の流れはとてもよく行われるので、gitは実際にはその二つを同時に行うコマンドを提供しているのです!それは、`git pull`というコマンドです。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["まずは、連続して`fetch`して`merge`する流れの方を見てみましょう。"],afterMarkdowns:["わーお。私たちは`C3`を`fetch`でダウンロードして、`git merge o/main`でこれをマージしました。今や私たちの`main`ブランチに(この場合、`origin`という名前の)リモートの新しい作業内容が反映されています。"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["では、`git pull`では何が起こるのでしょうか?"],afterMarkdowns:["同じことが起こります!明確に`git pull`は`git fetch`して取ってきたブランチの内容をマージするという流れの短縮系であることが確認できます。"],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["`git pull`の(オプションや引数を含む)詳細はこの後にやりますが、今、このレベルではただ試してみるだけにしておきましょう。","","覚えておいてください。あなたは実際にはこのレベルを`fetch`と`merge`だけでこのレベルを解決することができますが、余計なコマンドのコストがかかるだけです :P"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Тепер, коли ми знаємо як витягувати дані з віддаленого репозиторію за допомогою `git fetch`, спробуймо оновити нашу робочу копію відповідно до цих данних!","","Насправді, є кілька шляхів як цого досягнути -- щойно нові коміти з’явилися локально, ти можеш додавати їх в бранчі так само, як звичайні коміти. Це означає що ти можеш виконувати команди:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* тощо.","","Насправді, процес *витягування* віддалених змін й подальший *мерджинг* їх є настільки популярним, що гіт пропонує спеціальну команду, що виконує ці дві дії за один раз! Ця команда називається `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Спершу виконаймо по черзі `fetch`, а потім `merge`."],afterMarkdowns:["Ка-бум -- ми звантажили `C3` за допомогою `fetch` і потім змерджили їх, використавши `git merge o/main`. Тепер наша гілка `main` відповідає гілці з віддаленого сховища (в цьому випадку, з назвою `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Що трапиться, якщо натомість використати `git pull`?"],afterMarkdowns:["Те саме! Тепер очевидно що `git pull` -- це просто швидкий спосіб зробити `git fetch`, а потім змерджити завантажену гілку."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ми розглянемо `git pull` більш детально пізніше (включаючи різні опції та аргументи), наразі просто спробуймо цю команду.","","Не забувай -- щоб пройти цей рівень, достатньо використати `fetch`, а потім `merge`, але це буде тобі коштувати одну зайву команду :P"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","자 우리는 원격 저장소에서 `git fetch`로 어떻게 데이터를 내려 받는지 보았습니다. 이제 우리의 작업을 업데이트해서 변경들을 반영해 봅시다!","","사실 이걸 하는 방법은 여러가지 있습니다 -- 새 커밋들을 로컬에 내려받은 이후에는 그냥 다른 브랜치에있는 일반 커밋처럼 활용할 수 있습니다. 이런 명령들을 실행할 수 있다는 뜻 입니다 :","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 기타 등등","","사실 원격 저장소의 변경을 *fetch*하고 그이후에 *merge*하는 작업의 과정이 워낙 자주있는 일이라서 git은 이 두가지를 한번에 하는 명령을 제공합니다! 이 명령어는 `git pull` 입니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["먼저 `fetch` 와 `merge`가 차례로 실행되는것을 확인해 봅시다"],afterMarkdowns:["Boom -- 우리는 `C3`를 `fetch`로 내려 받고 `git merge o/main`로 우리의 작업으로 병합했습니다. 이제 우리의 `main` 브랜치는 원격 저장소의 새 작업들을 반영하게 됩니다(지금 사례에서 `origin`입니다)."],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["대신에 `git pull`을 사용하면 어떻게 될까요?"],afterMarkdowns:["똑같은 일이 일이납니다! 이렇게 `git pull`은 본질적으로 `git fetch`후에 내려받은 브랜치를 병합하는 과정의 단축입니다. 확실하게 느껴지죠?."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["`git pull`의 세부적인 사항들은 나중에 알아보겠습니다 (옵션과 매개변수등) 지금은 이 레벨에서 일단 시도부터 해 봅시다.","","알고 넘어갑시다 -- 이 레벨을 그냥 `fetch`와 `merge`의 조합으로 해결할 수 있습니다. 하지만 명령어가 추가되겠지요 :P"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Ta đã biết cách dùng `git fetch` để nạp các commit từ kho chứa từ xa, giờ hãy cập nhật công việc của chúng ta để phản ánh những thay đổi đó!","","Thực ra thì có nhiều cách đề làm điều này -- một khi bạn đã có các commit này ở kho chứa cục bộ, bạn có thể hợp nhất chúng như với các commit ở các nhánh khác. Nghĩa là bạn có thể sử dụng các câu lệnh sau:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* vân vân và mây mây","","Thực tế thì, quá trình *nạp* commit từ kho chứa từ xa và *hợp nhất* chúng phổ biết đến nỗi Git cung cấp một câu lệnh để làm cả 2 điều này một lúc! Đó là `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Trước tiên hãy xem quá trình `nạp` và `hợp nhất` được thực hiện một cách tuần tự."],afterMarkdowns:["Bùùm -- ta tải xuống commit `C3` với lệnh `git fetch` rồi sau đó hợp nhất nó với lệnh `git merge o/main`. Giờ thì nhánh `main` đã phản ánh trạng thái mới từ kho chứa từ xa (trong trường hợp này là `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu thay vì dó ta dùng `git pull` thì điều gì xảy ra?"],afterMarkdowns:["Cũng như nhau! Điều đó có nghĩa là `git pull` về cơ bản là cách làm tắt cho việc thực hiện tuần tự `git fetch` sau đó là hợp nhất các nhánh từ xa được nạp."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ta sẽ tìm hiểu chi tiết về `git pull` sau (bao gồm các tùy chọn và tham số), còn bây giờ thì cứ dùng thử nó ở cấp độ này đã.","","Nhớ rằng -- bạn có thể giải quyết cấp độ này với `fetch` và sau đó `merge`, nhưng mà như thế thì lại tốn thêm một câu lệnh :P"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Sedaj, ko smo videli kako pridobiti podatke iz oddaljenega repozitorija z `git fetch`, posodobimo naše delo, da bo odsevalo te sprememebe!","","V bistvu je več načinov za izvedbo tega -- ko imaš enkrat lokalno na voljo nove commite, jih lahko vključiš, kot da so normalni commiti na drugem branchu. To pomeni, da lahko izvedeš ukaze, kot so:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* itd., itd.","","Pravzaprav je *fetchanje* oddaljenih sprememb in kasneje *merganje* le-teh tako pogosto, da ima git dejansko ukaz, ki naredi oboje! Ukaz je `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo najprej `fetch` in `merge` izvedena zaporedno:"],afterMarkdowns:["Boom -- prenesli smo `C3` s `fetch` in nato mergali delo z `git merge o/main`. Sedaj naš `main` branch odseva spremembe novega dela iz oddaljenega repoztorija (v tem primeru poimenovan `origin`)."],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj bi se zgodilo, če bi namesto tega uporabili `git pull`?"],afterMarkdowns:["Ista stvar! To bi moralo pokazati, da je `git pull` v bistvu bližnjica za `git fetch`, ki mu sledi merge brancha, ki smo ga ravno fetchali."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Kasneje bomo raziskali podrobnosti ukaza `git pull` (vključno z opcijami in argumenti), ampak zaenkrat poizkusimo brez v tej stopnji.","","Pomni -- to stopnjo lahko rešiš s `fetch` in `merge`, ampak boš rabil en dodaten ukaz :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Teraz, gdy zobaczyliśmy, jak pobierać dane ze zdalnego repozytorium za pomocą `git fetch`, zaktualizujmy naszą pracę, aby odzwierciedlić te zmiany!","","Istnieje wiele sposobów, aby to zrobić - kiedy masz już nowe commity dostępne lokalnie, możesz je dołączyć tak, jakby były zwykłymi commitami na innych gałęziach. Oznacza to, że możesz wykonywać polecenia takie jak:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* itd., itd.","","W rzeczywistości kolejność działań polegająca na *pobieraniu* zdalnych zmian (fetch), a następnie *łączeniu* ich (merge), jest tak powszechna, że sam Git zapewnia polecenie, które robi obie te rzeczy naraz! Jest to `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy najpierw `fetch` i `merge` wykonywane jedno po drugim."],afterMarkdowns:["Tadam -- pobraliśmy `C3` za pomocą `fetch`, a następnie połączyliśmy tę pracę za pomocą `git merge o/main`. Teraz nasza gałąź `main` odzwierciedla nową pracę z remote (w tym przypadku o nazwie `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Co by się stało, gdybyśmy zamiast tego użyli `git pull`?"],afterMarkdowns:["Dokładnie to samo! Chyba bardzo wyraźnie widać, że `git pull` to w zasadzie dwa w jednym: `git fetch`, po którym następuje scalenie przed chwilą pobranej gałęzi."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["W szczegóły `git pull` zagłębimy się później (również w opcje i argumenty), ale na tym poziomie po prostu wypróbujmy, jak działa.","","Pamiętaj -- możesz rozwiązać ten poziom, używając tylko `fetch` i `merge`, ale będzie cię to kosztowało dodatkowe polecenie :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Ora che abbiamo visto come recuperare dati da un repository remoto con `git fetch`, vediamo di aggiornare il nostro repository affinché rifletta questi cambiamenti!","","Ci sono più modi per fare ciò -- una volta che i nuovi commit sono disponibili localmente, si possono incorporare come se fossero normali commit da altri rami. Questo significa che possiamo eseguire comandi come:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","Infatti, il metodo del *recuperare* cambiamenti remoti e poi *fonderli* nel nostro repository è talmente comune che git fornisce un comando che compie entrambi i passi in uno! Quel comando è `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diamo prima un'occhiata a `fetch` e `merge` eseguiti uno dopo l'altro."],afterMarkdowns:["Boom -- abbiamo scaricato `C3` con un `fetch` e poi fuso assieme il lavoro con `git merge o/main`. Ora il nostro ramo `main` riflette le nuove modifiche dal ramo remoto (in questo caso, chiamato `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cosa succederebbe se invece usassimo `git pull`?"],afterMarkdowns:["La stessa cosa! Ciò dovrebbe chiarire che `git pull` è essenzialmente una scorciatoia allo scrivere `git fetch` seguito dalla fusione del ramo appena recuperato."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Esploreremo i dettagli di `git pull` più tardi (incluse le opzioni e i parametri), ma per ora proviamo ad usarlo nel livello.","","Ricorda -- potresti risolvere questo livello eseguendo `fetch` seguito da `merge`, ma ti costerà un comando in più :P"]}}]}}}},{}],147:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/bar":{"target":"C1","id":"o/bar","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C4":{"parents":["C1"],"id":"C4"},"C3":{"parents":["C1"],"id":"C3"},"C5":{"parents":["C3","C4"],"id":"C5"},"C2":{"parents":["C1"],"id":"C2"},"C6":{"parents":["C2","C5"],"id":"C6"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null},"bar":{"target":"C3","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"bar","id":"HEAD"}}}',solutionCommand:"git pull origin bar:foo;git pull origin main:side",startTree:'{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/bar":{"target":"C1","id":"o/bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C4":{"parents":["C1"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null},"bar":{"target":"C3","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"bar","id":"HEAD"}}}',name:{en_US:"Pull arguments",zh_CN:"Git pull 的参数",zh_TW:"pull 的參數",es_AR:"Parámetros de pull",es_MX:"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",ja:"Pullの引数",fr_FR:"Arguments de pull",ru_RU:"Аргументы для pull",ko:"pull 인자들",uk:"Аргументи pull",vi:"Tham số pull",sl_SI:"Pull argumenti",pl:"Argumenty pull",it_IT:"Parametri di git pull"},hint:{en_US:"Remember that you can create new local branches with fetch/pull arguments",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_MX:"Recuerda que puedes 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",ja:"Fetchとpullの引数を利用してローカルで新規ブランチを作成できるのをお忘れなく",fr_FR:"Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull",ru_RU:"Напоминаю, что новые ветки можно создавать и с помощью команд fetch/pull",ko:"fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.",uk:"Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами",vi:"Nhớ rằng, bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull",sl_SI:"Zapomni si, da lahko ustvariš nove lokalne branche s fetch/pull argumenti.",pl:"Pamiętaj, że za pomocą argumentów fetch/pull możesz tworzyć nowe lokalne gałęzie",it_IT:"Ricorda che puoi creare nuovi rami locali sfruttando fetch/pull + parametri"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull arguments","","Now that you know pretty much *everything* there is to know about arguments for `git fetch` and `git push`, there's almost really nothing left to cover for git pull :)","","That's because git pull at the end of the day is *really* just shorthand for a fetch followed by merging in whatever was just fetched. You can think of it as running git fetch with the *same* arguments specified and then merging in *where* those commits ended up.","","This applies even when you use crazy-complicated arguments as well. Let's see some examples:"]}},{type:"ModalAlert",options:{markdowns:["Here are some equivalent commands in git:","","`git pull origin foo` is equal to:","","`git fetch origin foo; git merge o/foo`","","And...","","`git pull origin bar~1:bugFix` is equal to:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","See? git pull is really just shorthand for fetch + merge, and all git pull cares about is where the commits ended up (the `destination` argument that it figures out during fetch).","","Lets see a demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["If we specify the place to fetch, everything happens as before with fetch but we merge in whatever was just fetched."],afterMarkdowns:["See! by specifying `main` we downloaded commits onto `o/main` just as normal. Then we merged `o/main` to our currently checked out location which is *not* the local branch `main`. For this reason it can actually make sense to run git pull multiple times (with the same args) from different locations in order to update multiple branches."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Does it work with source and destination too? You bet! Let's see that:"],afterMarkdowns:["Wow, that's a TON in one command. We created a new branch locally named `foo`, downloaded commits from remote's main onto that branch `foo`, and then merged that branch into our currently checked out branch `bar`. It's over 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok to finish up, attain the state of the goal visualization. You'll need to download some commits, make some new branches, and merge those branches into other branches, but it shouldn't take many commands :P"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les arguments de git pull","","Maintenant que vous savez presque *tout* ce qu'il y a à savoir sur les arguments de `git fetch` et `git push`, il n'y a presque plus rien à vous apprendre sur git pull :)","","C'est parce que git pull est en fait *juste* un raccourci pour un fetch suivi d'un merge de tout ce qui vient d'être rapatrié. Vous pouvez vous représenter git pull comme un git fetch avec les *mêmes* arguments, suivi d'un merge qui aura lieu à l'endroit *exact* où ces commits seront arrivés.","","Cela fonctionne même quand vous utilisez des arguments très compliqués. Voyons quelques exemples :"]}},{type:"ModalAlert",options:{markdowns:["Voici quelques commandes équivalentes dans Git :","","`git pull origin foo` est équivalent à :","","`git fetch origin foo; git merge o/foo`","","Et :","","`git pull origin bar~1:bugFix` est équivalent à :","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Vous voyez ? git pull est au fond un simple un raccourci pour fetch + merge, et tout ce qui lui importe est la destination des commits (l'argument `destination` qu'il utilise durant le fetch).","","Voyons une démonstration :"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Si nous précisons l'emplacement à rapatrier tout se passe comme précédemment, avec fetch, mais en sus nous fusionnons tout ce qui a été rapatrié."],afterMarkdowns:["Vu ? En précisant `main` nous avons téléchargé les commits dans `o/main` comme d'habitude. Puis nous avons fusionné `o/main` avec là où nous sommes, *sans nous soucier* de la branche courante."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cela fonctionne-t-il aussi bien avec une source et une destination ? Et oui ! Voyons cela :"],afterMarkdowns:["Wow, INCROYABLE tout ce que nous avons fait en une commande. Nous avons créé une branche locale nommée `foo`, téléchargé les commits depuis la branche main distante dans `foo`, et ensuite fusionné cette branche dans notre branche actuelle de travail (checkoutée) `bar` !!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, pour finir ce niveau reproduisez l'état de la fenêtre Objectif. Vous aurez besoin de télécharger quelques commits, de créer des branches et de les fusionner dans d'autres branches, mais cela ne devrait pas utiliser trop de commandes :P"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de git pull","","Ahora que sabés prácticamente *todo* lo que hay que saber sobre los parámetros de `git fetch` y `git push`, casi que no queda nada para cubrir de git pull :)","","Eso es porque git pull es simplemente un atajo para hacer un fetch seguido de un merge. Podés pensarlo como correr git fetch con los *mismos* parámetros, y después mergear aquello a donde esos commits hayan ido a parar.","","Esto aplica incluso cuando usás parámetros hiper-rebuscados. 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 del que hacer fetch, todo ocurre como antes, pero sólo mergeamos lo que se fetcheó."],afterMarkdowns:["¡Ves! Especificando `main` bajamos los commits a `o/main` como siempre. Después mergeamos `o/main` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo."],command:"git pull origin main",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:["Wow, eso es un MONTÓN en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del main del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["OK: para terminar, alcanzá 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"]}}]},es_MX:{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 revisar del comando git pull :)","","Eso es porque, al final, 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 hacia donde esos commits hayan quedado.","","Esto aplica incluso cuando utilizas parámetros absurdamente complicados. 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 hacemos merge con lo que se obtuvo de fetch."],afterMarkdowns:["¡Ves! Especificando `main` descargamos los commits a `o/main` como siempre. Después hacemos merge de `o/main` a nuestra rama actual, la cual *no* es la rama local `main`. Por este motivo puede hacer sentido ejecutar git pull múltiples ocasiones (con los mismos argumentos) desde diferentes ubicaciones con el fin de actualizar múltiples ramas."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Esto también funciona especificando origen y destino? ¡Puedes apostarlo! Veámoslo:"],afterMarkdowns:["Increible, eso es MUCHISIMO en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del main remoto a la rama `foo`, y después hicimos merge esa rama a nuestra rama actual `bar`. ¡¡¡Su poder es de más de 8000!!!"],command:"git pull origin main: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 hacer merge de esas ramas junto con otras, pero no debería llevarte demasiados comandos :P"]}}]},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 `main` descargamos los commits a `o/main` como siempre. Después mergeamos `o/main` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo."],command:"git pull origin main",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 main del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!"],command:"git pull origin main: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:[{type:"ModalAlert",options:{markdowns:["## Parâmetros do git pull","","Agora que você sabe praticamente *tudo* que há para saber sobre parâmetros do `git fetch` e `git push`, não há praticamente nada a se abordar a respeito do git pull :)","","Isso é porque o git pull no final das contas é *realmente* apenas um atalho para um fetch seguido de um merge em seja lá o que acabou de ser baixado. Você pode pensar nele como rodar o git fetch recebendo os *mesmos* argumentos, seguido de um merge no lugar *onde* esses commits foram parar.","","Isso se aplica mesmo no caso de argumentos loucamente complicados. Vejamos alguns exemplos:"]}},{type:"ModalAlert",options:{markdowns:["Aqui estão alguns comandos que são equivalente para o Git:","","`git pull origin foo` é igual a:","","`git fetch origin foo; git merge o/foo`","","E...","","`git pull origin bar~1:bugFix` é igual a:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Viu? O git pull é realmente um atalho para fetch + merge, e tudo com o que o git pull se importa é com onde os commits foram parar (o parâmetro de `destino` que ele descobre durante o fetch).","","Vejamos uma demonstração:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Se especificarmos o lugar onde fazer o fetch, tudo acontece como antes com o fetch, mas fazemos o merge naquilo que acabou de ser baixado."],afterMarkdowns:["Veja! Especificando `main` nós baixamos commits em `o/main` como sempre. Então fizemos um merge de `o/main` com o lugar onde estamos, *independente* daquilo que está atualmente em checkout."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Isso também funciona com origem e destino especificados? Sim, você acertou! Vejamos:"],afterMarkdowns:["Wow, isso é MUITA coisa em um comando só. Nós criamos um novo ramo local chamado `foo`, baixamos commits do main remoto nesse ramo `foo`, e então fizemos um merge dele com o ramo atualmente em checkout, `bar`."],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, para terminar, obtenha o estado da visualização do objetivo. Você vai precisar baixar alguns commits, criar novos ramos, e fazer merge de ramos em outros ramos, mas não deve precisar de muitos comandos para isso :P"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de git pull","","Agora que sabes prácticamente *todo* o que hai que saber sobre os parámetros de `git fetch` e `git push`, casi que non queda nada para cubrir os de git pull :D","","Eso é porque git pull é sinxelamente un atallo para facer un fetch seguido dun merge. Podes pensalo como executar git fetch cos *mesmos* parámetros, e logo mesturar aquelo onde esos commits houberan ido ficar.","","Esto aplica incluso cando usas parámetros hiper-complexos. Vexamos algúns exemplos:"]}},{type:"ModalAlert",options:{markdowns:["Estos son algúns comandos equivalentes de git:","","`git pull origin foo` equivale a:","","`git fetch origin foo; git merge o/foo`","","E...","","`git pull origin bar~1:bugFix` equivale a:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","¿Ves? git pull é sinxelamente un atallo para un fetch + merge, e todo o que lle importa a git pull é ónde terminaron eses commits (o parámetro `destino` que indícase durante o fetch).","","Vexamos unha demostración:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Se especificamos o lugar do que facer o fetch, todo ocorre coma antes, pero só mesturamos o que se descargou."],afterMarkdowns:["¡Ves! Indicando `main` baixamos os commits á `o/main` coma sempre. Despois mesturamos `o/main` á nosa rama actual, *sen importar* qué tiñamos na nos copia de traballo."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Esto funciona co orixe e o destino, tamén? ¡Máis lle vale! Vexámolo:"],afterMarkdowns:["Wow, eso es unha CHEA nun único comando. Creamos unha nova rama local chamada `foo`, descargamos os commits do main do remoto a esta rama `foo`, e logo mesturamos esa rama á nosa rama actual `bar`. ¡¡¡Supera os 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["OK: para rematar, alcanza o estado do obxectivo. Vase necesitar descargar algúns commits, crear algunhas ramas novas, e mesturar esas ramas xunto con outras, pero non debería levar demasiados domandos :P"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git pull 的參數","","現在你已經知道關於 `git fetch` 以及 `git push` 的*任何參數*,但是我們還可以再聊聊 `git pull`:)","","那是因為 `git pull` 到目前為止*的確*只是表示 fetch 之後再 merge 所 fetch 的 commit,你可以把它想成,當使用 `git fetch` 時使用*一樣*的參數,之後再從 fetch 下來的 commit *所放置*的位置做 merge。","","這同樣也適用於當你指定相當複雜的參數,讓我們來看一些例子:"]}},{type:"ModalAlert",options:{markdowns:["對於 git 來說,有一些意義一樣的指令:","","`git pull origin foo` 相當於:","","`git fetch origin foo; git merge o/foo`","","而且...","","`git pull origin bar~1:bugFix` 相當於:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","看吧?`git pull` 真的就只是表示 fetch 跟 merge 的一個簡化後的指令,而且 `git pull` 所根據的是這些 commit 要放置的位置(在 fetch 的時候所指定的`destination`)。","","讓我們來看一個例子:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我們在 fetch 的時候有指定`位置`的話,跟之前一樣,fetch 所做的事情沒有變,但是我們會 merge 我們剛剛所 fetch 的該`位置`的commit。"],afterMarkdowns:["看吧!指定位置為 `main`,跟平常一樣,我們下載了 commit 並且放到 `o/main` 上,接著,我們會 merge `o/main` 到我們現在的位置,*不管*我們現在所 checkout 的位置在哪裡。"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["他是不是也可以同時指定 source 以及 destination?你說對了啦!讓我們來看一下:"],afterMarkdowns:["哇!這個指令強而有力,我們在 local 建立了一個新的 `foo` branch,下載了 remote 的 `main` 的 commit,並且放到 local 的 `foo` branch,之後 merge `foo` branch 到我們目前所 checkout 的 `bar` branch。這實在是太超過了!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,達到視覺化目標的要求,你需要下載一些 commit,建立一些新的 branch,並且 merge 這些 branch 到其他的 branch 上面,這個關卡不需要打太多的指令:P"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull 参数","","既然你已经掌握关于 `git fetch` 和 `git push` 参数的方方面面了,关于 git pull 几乎没有什么可以讲的了 :)","","因为 git pull 到头来就是 fetch 后跟 merge 的缩写。你可以理解为用同样的参数执行 git fetch,然后再 merge 你所抓取到的提交记录。","","还可以和其它更复杂的参数一起使用, 来看一些例子:"]}},{type:"ModalAlert",options:{markdowns:["以下命令在 Git 中是等效的:","","`git pull origin foo` 相当于:","","`git fetch origin foo; git merge o/foo`","","还有...","","`git pull origin bar~1:bugFix` 相当于:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","看到了? git pull 实际上就是 fetch + merge 的缩写, git pull 唯一关注的是提交最终合并到哪里(也就是为 git fetch 所提供的 destination 参数)","","一起来看个例子吧:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我们指定要抓取的 place,所有的事情都会跟之前一样发生,只是增加了 merge 操作"],afterMarkdowns:["看到了吧! 通过指定 `main` 我们更新了 `o/main`。然后将 `o/main` merge 到我们的所在的分支,**无论**我们当前所在的位置是哪。"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["pull 也可以用 source:destination 吗? 当然喽, 看看吧:"],afterMarkdowns:[" 哇, 这个命令做的事情真多。它先在本地创建了一个叫 `foo` 的分支,从远程仓库中的 main 分支中下载提交记录,并合并到 `foo`,然后再 merge 到我们的当前所在的分支 `bar` 上。操作够多的吧?!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["好啦, 该结束了!请按照目标窗口中的状态进行操作。你需要下载一些提交,然后创建一些新分支,再合并这些分支到其它分支, 但这用不了几个命令 :P "]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Optionen für Git Pull","","Da du jetzt so ziemlich *alles* kennst, was es an Optionen für `git fetch` und `git push` gibt, ist kaum noch etwas zu Optionen für `git pull` zu sagen. :)","","Das liegt daran, dass `git pull` letztendlich *wirklich* nur eine Abkürzung für `fetch` gefolgt von einem `merge` von dem, was auch immer gerade heruntergeladen wurde, ist. Denk es dir als ein `git fetch` mit denselben Optionen und einem anschließenden Merge.","","Das trifft sogar zu, wenn du völlig abgedrehte Optionen verwendest. Ein paar Beispiele:"]}},{type:"ModalAlert",options:{markdowns:["Hier sind einige gleichwertige Befehle in Git:","","`git pull origin foo` ist dasselbe wie:","","`git fetch origin foo; git merge o/foo`","","Und ...","","`git pull origin bar~1:bugFix` ist dasselbe wie:","","`git fetch origin bar~1:bugFix; git merge bugFix`","",'Siehst du? `git pull` ist wirklich nur eine Abkürzung von `fetch` + `merge` und es interessiert sich nur dafür, wo die Commits hin sollen (die "Ziel"-Option, die es beim `fetch` auswertet).',"","Schauen wir uns eine Demonstration an:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wenn wir den Ort, auf den das `fetch` ausgeführt werden soll, angeben, passiert alles so wie beim `git fetch`, aber es wird direkt danach auch ein Merge ausgeführt."],afterMarkdowns:["Siehst du? Da wir `main` angegeben haben, sind die Commits in `o/main` heruntergeladen worden. Danach wurde `o/main` gemerged, egal was gerade ausgecheckt war."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Funktioniert das auch wenn man Quelle und Ziel angibt? Aber sicher! Das sehen wir hier:"],afterMarkdowns:["Wow, das ist eine Menge in einem einzelnen Befehl. Wir haben lokal einen neuen Branch namens `foo` erstellt, die Commits vom `main` des Servers dorthin heruntergeladen und ihn danach in unseren aktuell ausgecheckten Branch `bar` gemerged."],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, um's zu Ende zu bringen versuch das Ziel aus der Zielgrafik zu erreichen. Du wirst einige Commits herunterladen, einige neue Branches anlegen und diese in andere mergen müssen, aber das sollte nicht allzu viele Befehle benötigen. :P"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Pullの引数","","`git fetch`と`git pull`の引数について学んできたので、`git pull`について新しく学ばないといけないことは殆ど残っていません!","","なぜなら、実は`git pull`はfetchした後に、fetchしたコミットをマージするための省略形だからです!","","これはとても複雑な引数を与えた場合でも変わりません。いくつか、例を見てみましょう!"]}},{type:"ModalAlert",options:{markdowns:["ここでは同等の働きをするコマンドを紹介します。","","`git pull origin foo` は次のコマンドと同じ働きをします。","","`git fetch origin foo; git merge o/foo`","","他にも...","","`git pull origin bar~1:bugFix` は次のコマンドと同じ働きをします。","","`git fetch origin bar~1:bugFix; git merge bugFix`","","ご覧の通り、`git pull`は単なるfetch + mergeの略語であり、git pullが必要とするのはコミットがどこへ行くのか(fetchにおける``)だけなのです。","","デモを見ていきましょう!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["fetchする場所を指定すると"],afterMarkdowns:["ご覧ください!`main`を指定することで、`o/main`にコミットをダウンロードしてきました。そして`o/main`を現在チェックアウトしている場所にマージしましたが、これはローカルの`main`ブランチではありません。","","このような挙動をするので、複数のブランチを更新するためには異なる場所(かつ同じ引数)で`git pull`を実行しなければいけません。"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["``と``にも対応しているかですって?","","その通りです。実際に見ていきましょう!"],afterMarkdowns:["ひとつのコマンドで実に大量の操作を行っていますね!","ローカルに`foo`ブランチを作成し、リモート上の`main`から`foo`ブランチにコミットをダウンロードして、そのブランチを今、チェックアウトしている`bar`ブランチにmergeしました!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["示されているゴールの状態になるように頑張ってください!","","コミットをいくつかfetchして新しいブランチを作成し、それらのブランチを他のブランチにmergeする必要があります。","","しかし、それほど多くのコマンドは必要ありません!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументы для pull","","Аргументы для `git pull` не покажутся вам чем-то новым, учитывая, что вы уже знакомы с аргументами для `git fetch` и `git push` :)","","Как мы помним, `git pull` сначала выполняет `git fetch`, а следом сразу `git merge` с той веткой, в которую притянулись обновления командой fetch. Другими словами, это все равно, что выполнить git fetch с теми же аргументами, которые вы указали для pull, а затем выполнить git merge с веткой, указанной в аргументе <приемник> команды pull.","","Рассмотрим на примерах:"]}},{type:"ModalAlert",options:{markdowns:["Вот примеры абсолютно эквивалентных команд в git:","","`git pull origin foo` это то же самое, что сделать:","","`git fetch origin foo; git merge o/foo`","","И еще...","","`git pull origin bar~1:bugFix` то же, что:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Как видно, git pull используется, чтобы за одну команду выполнить fetch + merge.","","Посмотрим демонстрацию:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Здесь сначала выполнится fetch с аргументом указанным к pull, а merge выполняется с теми изменениями, которые будут скачаны командой fetch."],afterMarkdowns:["Как видно, мы указали `main`, поэтому как обычно все обновления притянулись на ветку `o/main`. Затем мы слили (merge) обновленную ветку `o/main` с веткой, на которой мы находимся."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Будет ли это работать, если указать `<источник>` и `<приемник>`? Проверим:"],afterMarkdowns:["Ого, сколько всего выполнено всего одной командой!. Мы создали новую ветку `foo` в локальном репозитории, скачали на неё изменения с ветки `main` удаленного репозитория, а затем слили эту ветку с веткой `bar`, на которой мы находились!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["В последнем упражнении необходимо привести дерево к аналогичному в примере. Нужно скачать несколько изменений, создать несколько новых веток, слить одни ветки в другие, но постарайтесь использовать как можно меньше команд. Удачи! :P"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull의 인자들","","`git fetch`와 `git push`의 인자들을 다 알았기 때문에, git pull에서 더 설명할게 사실 없습니다 :)","","git pull은 결국 merge가 따라오는 fetch 그 자체이기 때문이죠. git fetch와 *같은* 인자를 사용하며 커밋들을 *어디*로 merge되는지 알면 됩니다.","","정신나간것마냥-복잡한 인자들도 기본적으로는 똑같다고 보면 됩니다. 예시를 살펴봅시다:"]}},{type:"ModalAlert",options:{markdowns:["git에서 다음 명령어들은 같습니다:","","`git pull origin foo` 는 다음과 같습니다:","","`git fetch origin foo; git merge o/foo`","","그리고...","","`git pull origin bar~1:bugFix` 는 다음과 같습니다:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","보이죠? git pull은 그저 fetch + merge의 축약형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).","","직접 확인해봅시다:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["place를 지정하면, 이전에 fetch를 하던때와 완전히 똑같이 진행되고 fetch한것을 병합합니다."],afterMarkdowns:["보이죠! `main`를 지정해서 우리는 `o/main`에 평소처럼 커밋들을 내려받았습니다. 그다음 우리가 있는 곳으로 `o/main`를 병합했습니다 현재 체크아웃된 브랜치와 *상관없이* 말이죠"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["source 와 destination 모두 적용될까요? 추측해보세요! 확인해봅시다:"],afterMarkdowns:["이야, 명령어 하나에 많은게 일어나고있습니다. 로컬에 이름이 `foo`인 새 브랜치를 만들고, 원격 저장소의 main에서 이 브랜치 `foo`에 커밋들을 내려받습니다, 그후 그 브랜치를 우리가 현재 체크아웃한 브랜치 `bar`로 병합했습니다. 오오오!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["좋습니다 마무리하기 위해, 골 시각화와 같은 상태로 만들어 주세요. 커밋을 내려받고, 새 브랜치를 만들고, 그 브랜치들을 다른 브랜치로 병합해야 될겁니다, 하지만 명령어는 그렇게 많이 안써도 되죠 :P"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументи git pull","","Зараз, коли ти знаєш майже *все*, що можна знати про аргументи для `git fetch` і `git push`, дійсно майже нема чого розповідати про git pull :)","","Це тому, що git pull, зрештою, *просто* зручне об'єднання fetch і merge. Його можна собі уявляти як git fetch і git merge виконані з *однаковими* аргументами.","","Це працює незалежно від складності переданих аргументів. Розгляньмо:"]}},{type:"ModalAlert",options:{markdowns:["Ось декілька еквівалентних команд git:","","`git pull origin foo` це те саме, що й:","","`git fetch origin foo; git merge o/foo`","","А...","","`git pull origin bar~1:bugFix` -- це аналог:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Бачиш? git pull -- це просто зручне скорочення для fetch + merge. А все, про що дбає git pull -- це те, куди в результаті підуть коміти (а про це йому говорить аргумент `destination`).","","Розгляньмо демонстрацію:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Якщо ми вказуємо місце призначення для fetch, fetch виконується як звичайно, але мердж відбудеться з тим, що ми щойно стягнули"],afterMarkdowns:["От бачиш, вказавши `main`, ми звантажили коміти в `o/main`, як завжди. Потім змерджили `o/main` в поточну гілку."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Чи це працює також при вказанні `source` і `destination`? І не сумнівайся! Ось приклад:"],afterMarkdowns:["Ого, стільки роботи однією командою. Ми створили локальну гілку з назвою `foo`, звантажили в неї коміти з віддаленого main, а потім змерджили `foo` в поточну гілку `bar`!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Добре, для завершення спробуй досягти стану репозиторію, показаного на візуалізації. Треба буде звантажити відсутні коміти, створити нові гілки і змерджити їх в інші гілки, але не надто великою кількістю команд! :P"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham số git pull","","Giờ thì bạn đã biết gần như là *tất cả* về tham số của `git fetch` và `git push`, thế thì hầu như chẳng còn gì mới cho git pull cả :)","","Đó và vì nói cho cùng thì git pull *về thực tế* cũng chỉ là lệnh tắt cho tìm nạp và sau đó là hợp nhất những gì vừa mới được nạp. Bạn có thể coi nó như là chạy lệnh git fetch với *cùng* tham số được chỉ định và sau đó hợp nhất các commit vào *nơi* được chỉ định.","","Điều này được áp dụng kể cả khi bạn sử dụng những tham số phức tạp đến độ điên rồ. Hãy xem qua một vài ví dụ:"]}},{type:"ModalAlert",options:{markdowns:["Dưới đây là một vài câu lệnh tương đồng nhau trong Git:","","`git pull origin foo` tương đương với:","","`git fetch origin foo; git merge o/foo`","","Và...","","`git pull origin bar~1:bugFix` tương đương với:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Thấy chứ? git pull thực ra chỉ là lệnh tắt cho fetch + merge, và tất cả những gì git pull quan tâm là nơi mà các commit sẽ tới (tham số `đích` mà nó diễn giải được trong quá trình nạp).","","Hãy xem qua một bản giới thiệu:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu ta chỉ định vị trí để nạp, mọi thứ diễn ra như với git fetch nhưng giờ đây có thêm một bước đó là ta hợp nhất những gì mà ta đã nạp"],afterMarkdowns:["Thấy chứ! Bằng cách chỉ định nhánh `main` ta tải các commit xuống nhánh `o/main` như thường lệ. Sau đó hợp nhất nhánh `o/main` vào nhánh cục bộ mà ta đang đứng, nhánh mà *không phải* nhánh cục bộ `main`. Nhờ vậy mà ta có thể chạy cùng một lệnh git pull (với cùng tham số) nhiều lần ở những vị trí khác nhau để áp dụng cùng cập nhật lên các nhánh khác nhau."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Điều này có hoạt động với đích và nguồn không? Đoán đúng rồi đấy! Cùng xem thử nào:"],afterMarkdowns:["Wao, quá NHIỀU trong một câu lệnh. Ta tạo ra một nhánh cục bộ là `foo`, tải commit xuống từ nhánh từ xa main xuống nhánh `foo` đó, và sau đó hợp nhất commit vào nhánh `bar` mà ta đang đứng. Đủ thứ luôn!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Được rồi, để kết thúc khóa học, hãy đạt đến mục tiêu được mô tả. Bạn sẽ cần tải xuống vài commit, tạo ra vài nhánh mới, và hợp nhất những nhánh đó sang những nhánh khác, nhưng mà đừng dùng nhiều lệnh quá nhé :P"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull argumenti","","Sedaj, ko veš praktično *vse*, kar je za vedeti o argumentih za `git fetch` in `git push`, ni skoraj ničesar za dodati za `git pull` :)","","To je zato, ker je git pull konec koncev *res* samo bližnjica za fetch, ki mu sledi merge tega, kar smo fetchali. Predstavljaš si ga lahko kot ukaz git fetch z *istimi* podanimi argumenti in merganjem, *kjer* bodo tisti commiti končali.","","To velja tudi takrat, ko uporabiš noro komplicirane argumente. Poglejmo nekaj primerov:"]}},{type:"ModalAlert",options:{markdowns:["Tu je nekaj ukazov v gitu:","","`git pull origin foo` je enak:","","`git fetch origin foo; git merge o/foo`","","In ...","","`git pull origin bar~1:bugFix` je enak:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Vidiš? Git pull je res bližnjica za fetch + merge. Vse kar zanima git pull je, kje bodo commiti končali (`ciljni` argument, ki ga ugotovi med fetchem).","","Poglejmo primer:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Če določimo mesto za fetchanje, se zgodi vse kot prej s fetchem, ampak tudi zmergamo, kar smo pravkar fetchali."],afterMarkdowns:["Vidiš! Z določitvijo `main` smo prenesli commite na `o/main` kot ponavadi. Potem smo zmergali `o/main` v našo trenutno checkoutano lokacijo, ki *ni* lokalni branch `main`. Zaradi tega razloga je morda celo logično, da izvedemo git pull večkrat (z istimi argumenti) iz drugi lokacij, da posodobimo več branchev."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ali deluje tudi z izvorom in ciljem? Itak! Poglejmo to:"],afterMarkdowns:["Wow, to je pa RES veliko v enem ukazu. Naredili smo nov lokalen branch imenovan `foo`, prenesli commite iz oddaljenega masterja na ta branch `foo` in potem zmergali ta branch v naš trenutno checkoutan branch `bar`. Je več kot 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, da zaključiš, pridi v stanje iz ciljne vizualizacije. Prenesti boš moral nekaj commitov, narediti nekaj novih branchev in zmergati te branche v druge branche, ampak ne bi smelo zahtevati veliko ukazov. :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argumenty git pull","","Teraz, kiedy wiesz już właściwie *wszystko*, co można wiedzieć o argumentach `git fetch` oraz `git push`, naprawdę nie zostało już prawie nic do omówienia przy `git pull` :)","","To dlatego, że w zasadzie `git pull` to *naprawdę* tylko skrót polecenia fetch i scalania wszystkiego, co zostało nim pobrane. Możesz to sobie wyobrazić jako uruchomienie `git fetch` z określonymi *tymi samymi* argumentami, a potem scalenie pobranych commitów *tam*, dokąd trafiły.","","I działa to w ten sposób, nawet jeśli określisz kompletnie szalone argumenty. Zobaczmy kilka przykładów:"]}},{type:"ModalAlert",options:{markdowns:["Oto kilka równoważnych poleceń w Gicie:","","`git pull origin foo` nie różni się od:","","`git fetch origin foo; git merge o/foo`","","A...","","`git pull origin bar~1:bugFix` daje taki sam efekt jak:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Widzisz? Polecenie `git pull` to naprawdę tylko skrót dla fetch + merge i jedyne, co się liczy dla `git pull`, to gdzie trafią commity (argument `celu`, który Git zinterpretuje sobie, wykonując fetch).","","Zobaczmy demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jeśli określimy dla fetch miejsce, to wszystko potoczy się tak jak wcześniej, ale scalimy wszystko, co zostało pobrane przez fetch."],afterMarkdowns:["Zobacz! Określając `main`, pobraliśmy commity do `o/main` tak jak zawsze. Potem scaliliśmy `o/main` z aktualnie wybranym miejscem, którym *nie* jest lokalna gałąź `main`. Właśnie z tego powodu może mieć sens wykonanie git pull wiele razy (z tymi samymi argumentami) z różnych lokalizacji, aby zaktualizować wiele gałęzi."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Czy w przypadku źródła i celu będzie tak samo? Jasne, że tak! Zobaczmy:"],afterMarkdowns:["No nieźle, jedno polecenie, a tyle się dzieje. Stworzyliśmy nową lokalną gałąź `foo`, pobraliśmy commity ze zdalnej gałęzi `main` do `foo`, a potem jeszcze scaliliśmy ją z aktualnie wybraną gałęzią `bar`. Grubo ponad osiem tysięcy!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Oki, żeby ukończyć poziom, doprowadź drzewo do takiego stanu jak na wizualizacji. Musisz pobrać parę commitów, stworzyć kilka gałęzi i scalić je z innymi, ale nie powinno to wymagać zbyt wielu poleceń :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parametri di git pull","","Ora che conosci praticamente *tutto* quello che c'è da sapere sui parametri per `git fetch` e `git push`, non è rimasto quasi nulla di cui parlare per git pull :)","","Questo perché git pull alla fine non è altro che una scorciatoia per un fetch seguito dalla fusione verso ciò che è stato appena recuperato. Puoi vederlo come eseguire git fetch con gli *stessi* parametri specificati e poi eseguire una fusione *dove* i commit reucperati sono finiti.","","Ciò è valido anche quando vengono usati dei parametri incredibilmente complessi. Vediamo qualche esempio:"]}},{type:"ModalAlert",options:{markdowns:["Ecco alcuni comandi equivalenti in git:","","`git pull origin foo` è equivalente a:","","`git fetch origin foo; git merge o/foo`","","E...","","`git pull origin bar~1:bugFix` è equivalente a:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Visto? git pull non è altro che una scorciatoia per fetch + merge, e l'unica cosa che interessa a quel comando è la posizione d'arrivo dei commit (il parametro `destination` specificato durante il fetch).","","Vediamo una demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Se specifichiamo il luogo da cui vogliamo recuperare i dati, l'unico cambiamento rispetto alla lezione precedente consiste nella fusione con ciò che è stato appena recuperato."],afterMarkdowns:["Visto! specificando `main` abbiamo scaricato i commit sul ramo `o/main` come sempre. Poi abbiamo fuso `o/main` con il ramo sul quale stavamo lavorando attualmente, il quale *non* è il ramo `main` locale. Per questo motivo può avere effettivamente senso eseguire più volte git pull (con gli stessi parametri) da posizioni differenti per aggiornare così più rami."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Funziona anche con source e destination? Ci puoi scommettere! Vediamolo all'opera:"],afterMarkdowns:["Wow, è tantissimo per un comando solo! Abbiamo creato un nuovo ramo locale chiamato `foo`, scaricato i commit dal main remoto sul nuovo ramo `foo`, e poi fuso quel ramo con `bar`, quello sul quale stavamo lavorando attualmente. È oltre gli 8000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok per concludere, raggiungi lo stato mostrato nella finestra dell'obiettivo. Dovrai scaricare alcuni commit, creare alcuni rami, e fondere quei rami in altri rami, ma senza usare troppi comandi :P"]}}]}}}},{}],148:[function(e,t,o){o.level={disabledMap:{"git fakeTeamwork":!0},goalTreeString:'{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C3","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git commit;git commit;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Git Pushin'",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",ja:"Git Push",fr_FR:"Git push",ru_RU:"Git push",uk:"Git push",ko:"Git push",vi:"Git push",sl_SI:"Git Push",pl:"Git push",it_IT:"Git Push",tr_TR:"Git Push"},hint:{en_US:"Remember you have to clone before you can push!",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する必要があるのをお忘れなく",fr_FR:"Rappelez-vous que vous devez cloner avant de pouvoir faire un push !",ru_RU:"Помните, что прежде чем push-ить вам нужно склонировать репозиторий!",uk:"Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!",ko:"push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!",vi:"Nhớ rằng bạn phải clone trước khi push!",sl_SI:"Najprej moraš klonirati, preden lahko pushaš!",pl:"Najpierw sklonuj, potem pushuj!",it_IT:"Ricorda di clonare il repository prima di usare push!",tr_TR:"Unutmayın push işlemini yapmadan önce clone işlemini yapmanız gerekiyor!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, so I've fetched changes from remote and incorporated them into my work locally. That's great and all... but how do I share _my_ awesome work with everyone else?","","Well, the way to upload shared work is the opposite of downloading shared work. And what's the opposite of `git pull`? `git push`!","","`git push` is responsible for uploading _your_ changes to a specified remote and updating that remote to incorporate your new commits. Once `git push` completes, all your friends can then download your work from the remote.","",'You can think of `git push` as a command to "publish" your work. It has a bunch of subtleties that we will get into shortly, but let\'s start with baby steps...',"","*note -- the behavior of `git push` with no arguments varies depending on one of git's settings called `push.default`. The default value for this setting depends on the version of git you're using, but we are going to use the `upstream` value in our lessons. This isn't a huge deal, but it's worth checking your settings before pushing in your own projects.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have some changes that the remote does not have. Let's upload them!"],afterMarkdowns:["There we go -- the remote received commit `C2`, the branch `main` on the remote was updated to point at `C2`, and our *own* reflection of the remote (`o/main`) was updated as well. Everything is in sync!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["To finish this level, simply share two new commits with the remote. Strap in though, because these lessons are about to get a lot harder!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, donc j'ai rapatrié les changements du dépôt distant et je les ai incorporés dans mon travail local. C'est super... mais comment je partage _mon_ travail génial avec tous les autres ?","","En fait, la manière d'envoyer du travail à partager fonctionne à l'opposé du téléchargement de travail partagé. Et quel est l'opposé de `git pull` (tire) ? `git push` (pousse) !","","`git push` est responsable de l'envoi de _vos_ changements vers un dépôt distant et de la mise à jour de ce dépôt pour incorporer vos commits. Une fois `git push` terminé, tous vos amis peuvent télécharger votre travail depuis le dépôt distant.","",'Vous pouvez voir `git push` comme une commande qui "publie" votre travail. Elle présente quelques subtilités que nous allons voir rapidement, mais commençons par le B.A.-BA...',"","*Note : le comportement de `git push` avec aucun argument varie selon l'un des réglages de configuration de Git nommé `push.default`. La valeur par défaut de ce réglage dépend de la version de Git utilisée, mais nous allons utiliser la valeur `upstream` dans nos leçons. Cela ne change pas grand chose pour ces exercices, mais vérifiez tout de même vos réglages avant de pusher vos propres projets.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous avons fait ici quelques changements que le dépôt distant n'a pas. Envoyons-les !"],afterMarkdowns:["Et voilà : le dépôt distant a reçu le commit `C2`, la branche `main` a été mise à jour sur `C2`, et votre *propre* représentation de la branche distante (`o/main`) a aussi été mise à jour. Tout est synchronisé !"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, partagez simplement deux nouveaux commits avec le dépôt distant. Accrochez-vous, parce que ces leçons vont devenir beaucoup plus difficiles !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## git push","","Ok, entonces ya bajé los cambios de un repositorio remoto y los integré en mi trabajo localmente. Esto es genial y todo... 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, cualquiera puede descargar tu trabajo del remoto.","",'Podés pensar en `git push` como un comando para "publicar" tu trabajo. Tiene un par de sutilezas con las que vamos a meternos pronto, pero empecemos de a poco.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Acá tenemos algunos cambios que nuestro remoto no tiene. ¡Subámoslos!"],afterMarkdowns:["Ahí está: el remoto recibió el commit `C2`, la rama `main` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/main`) 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 compartí dos nuevos commits con el remoto. Igual, no te confíes, ¡ya se van a complicar las lecciones!"]}}]},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 `main` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/main`) 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:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, então vimos como baixar mudanças do repositório remoto e incorporá-las à árvore local. Isso é ótimo e tal... mas como eu faço para compartilhar o _meu_ trabalho sensacional com as outras pessoas?","","Bem, a forma de subir trabalho a ser compartilhado é a oposta daquela de baixar trabalho que foi compartilhado. E qual o oposto de `git pull` (puxar)? É `git push` (empurrar)!","","O `git push` é responsável por subir as _suas_ mudanças para um repositório remoto especificado, e atualizar esse remoto para incorporar seus novos commits. Uma vez que o `git push` se completa, todos os seus amigos podem baixar o seu trabalho do repositório remoto.","",'Você pode pensar no `git push` como um comando para "publicar" o seu trabalho. Ele tem uma série de nuances que vamos abordar em breve, mas comecemos com passos curtos...',"","*Nota -- o comportamento de `git push` sem argumentos varia dependendo da configuração `push.default` do Git. O valor padrão para essa configuração depende da versão do Git que você estiver usando, mas vamos assumir o valor `upstream` nestas lições. Isso não é um grande problema, mas vale a pena verificar suas configurações antes de fazer push nos seus próprios projetos.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui temos algumas mudanças que o repositório remoto não contém. Vamos subi-las!"],afterMarkdowns:["Aqui vamos nós -- o repositório remoto recebeu o commit `C2`, o ramo `main` no repositório remoto foi atualizado para apontar para `C2`, e a *nossa* reflexão do remoto (`o/main`) foi atualizada também. Está tudo sincronizado!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, simplesmente compartilhe dois novos commits com o repositório remoto. No entanto, segure-se no seu assento, pois estas lições estão prestes a ficar mais difíceis!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, entón xa baixamos os cambios dun repositorio remoto e integrámolos na árbore local. Esto está xenial... pero ¿cómo comparto o _meu_ sensacional traballo cas outras persoas?","","Ben, a forma de subir traballo para ser compartido é a oposta daquela de baixar o traballo que foi compartido. E ¿qué é o oposto a `git pull` (tirar)? ¡É `git push` (empuxar)!","","`git push` é o responsable de subilos _teus_ cambios para un repositorio remoto especificado, e atualizar ese repositorio remoto para incorporar os seus novos commits. Unha vez que `git push` complétase, todos os teus amigos poderán baixar o teu traballo do repositorio remoto.","",'Podes pensar en `git push` como un comando para "publicar" o teu traballo. O comando ten unha serie de detalles cos que imos xogar logo, pero comezemos con pasos curtos...',"","*Nota -- o comportamento de `git push` sen argumentos varía dependendo da configuración `push.default` de Git. O valor para esa configuración depende da versión de Git que esteas empregando, pero imos asumir o valor `upstream` nestas leccións. Eso non é un gran problema, pero paga a pena verificalas súas configuracións antes de facer push nos teus propios proxectos.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí temos algúns cambios que o repositorio remoto non contén. ¡Imos subilas!"],afterMarkdowns:["Ahí imos -- o repositorio remoto recibiu o commit `C2`, a rama `main` do repositorio remoto foi actualizado para apuntar para `C2`, e o *noso* reflexo do remoto (`o/main`) foi atualizado tamén. ¡Está todo sincronizado!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, comparte dous novos commits co repositorio remoto. Igual, non te confíes, ¡xa se complicará nas seguintes leccións!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","ok,現在我已經從 remote 下載了一些更新,並且把它們 merge 到我的 local 上面的 branch,這聽起來實在太讚了...,但是我要如何分享 _我_ 所做的更新給其它人呢?","","喔,其實上傳並且分享更新跟下載更新並且 merge 是相反的兩件事情,那什麼是 `git pull` 的相反呢? 那就是 `git push`!","","`git push` 負責上傳 _你的_ commit 到特定 remote 上面並且做出相對應的更新,只要做完了 `git push`,所有你的朋友都可以從 remote 上面下載你所送出去的 commit。","",'你可以把 `git push` 當作是一個"發佈"你的工作進度的指令,還有一些我們即將要講到的細節,但是先讓我們從一些簡單的步驟開始。']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡我們有了一些 remote 所沒有的 commit。讓我們來上傳它們吧!"],afterMarkdowns:["我說的沒錯吧!remote 收到了 commit `C2`,同時在 remote 上的 `main` branch 也一起更新並且指向 `C2`,同時我們*自己的* `o/main` 也一併更新了!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,只要上傳兩個新的 commit 給 remote,不要太得意忘形喔!因為這些課程將會愈來愈難!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","OK,我们已经学过了如何从远程仓库获取更新并合并到本地的分支当中。这非常棒……但是我如何与大家分享**我的**成果呢?","","嗯,上传自己分享内容与下载他人的分享刚好相反,那与 `git pull` 相反的命令是什么呢?`git push`!","","`git push` 负责将**你的**变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。一旦 `git push` 完成, 你的朋友们就可以从这个远程仓库下载你分享的成果了!","","你可以将 `git push` 想象成发布你成果的命令。它有许多应用技巧,稍后我们会了解到,但是咱们还是先从基础的开始吧……","","*注意 —— `git push` 不带任何参数时的行为与 Git 的一个名为 `push.default` 的配置有关。它的默认值取决于你正使用的 Git 的版本,但是在教程中我们使用的是 `upstream`。","这没什么太大的影响,但是在你的项目中进行推送之前,最好检查一下这个配置。*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这里我们准备了一些远程仓库中没有的提交记录, 咱们开始先上传吧!"],afterMarkdowns:["过去了, 远程仓库接收了 `C2`,远程仓库中的 `main` 分支也被更新到指向 `C2` 了,我们的远程分支 (o/main) 也同样被更新了。所有的分支都同步了!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成本关,需要向远程仓库分享两个提交记录。拿出十二分精神吧,后面的课程还会更难哦!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Nun hab ich also Änderungen vom entfernten Server geholt und in meine lokale Arbeit integriert. Das ist schön und gut ... aber wie teile ich _meine_ Wahnsinns-Entwicklungen mit allen anderen?","","Naja, das Hochladen von Zeug ist das Gegenteil zum Herunterladen von Zeug. Und was ist das Gegenteil von `git pull`? Genau, `git push`!","","`git push` ist dafür verantwortlich _deine_ Änderungen zu einem bestimmten entfernten Server hochzuladen und dort zu integrieren. Sobald das `git push` durch ist, können alle deine Freunde diese Änderungen zu sich herunterladen.","",'Du kannst dir `git push` als einen Befehl zum "Veröffentlichen" deiner Arbeit vorstellen. Es gibt da noch ein paar Feinheiten, aber lass uns mal mit kleinen Schritten anfangen.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir ein paar Änderungen, die auf dem Remote noch fehlen. Und hoch damit!"],afterMarkdowns:["Na bitte -- das Remote hat den Commit `C2` bekommen, der `main` auf dem Remote ist entsprechend aktualisiert worden und unsere *eigene* Abbildung des `main` auf dem Remote namens `o/main` wurde auch aktualisiert. Alles im Lot!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu schaffen musst du einfach nur zwei neue Commits auf das Remote bringen. Aber stell dich schon mal darauf ein, dass die nächsten Level anspruchsvoller werden!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Хорошо, мы скачали изменения с удалённого репозитория и включили их в наши локальные наработки. Всё это замечательно, но как нам поделиться _своими_ наработками и изменениями с другими участниками проекта?","","Способ, которым мы воспользуемся, является противоположным тому способу, которым мы пользовались ранее для скачивания наработок (`git pull`). Этот способ - использование команды `git push`!","","Команда `git push` отвечает за загрузку _ваших_ изменений в указанный удалённый репозиторий, а также включение ваших коммитов в состав удалённого репозитория. По окончании работы команды `git push` все ваши друзья смогут скачать себе все сделанные вами наработки.","",'Вы можете рассматривать команду `git push` как "публикацию" своей работы. Эта команда скрывает в себе множество тонкостей и нюансов, с которыми мы познакомимся в ближайшее время, а пока что давайте начнём с малого...',"","*замечание - поведение команды `git push` без аргументов варьируется в зависимости от значения `push.default`, указанной в настройках git-а. Значение по умолчанию зависит от версии git, которую вы используете, однако в наших уроках мы будем использовать значение `upstream`. Лучше всегда проверять эту опцию прежде чем push-ить ваши настоящие проекты.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Здесь у нас имеются изменения, которых нет в удалённом репозитории. Давайте же закачаем их туда!"],afterMarkdowns:["Вот так - удалённый репозиторий получил новый коммит `C2`, ветка `main` на удалённом репозитории теперь указывает на `C2`, и наше *собственное* локальное отображение удалённого репозитория (`o/main`) изменилось соответственно. Всё синхронизировалось!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы выполнить задачу этого упражнения, просто поделитесь своими двумя новыми коммитами с удалённым репозиторием. Соберитесь, потому что все последующие уроки будут намного сложнее предыдущих!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","さて、私たちは変更をリモートからダウンロードしてきて、ローカルの自分の作業に取り込むことができるようになりました。それは素晴らしいことですが、例えば他の誰かに_自分の_作業を共有する場合はどうすればいいでしょう?","","そうですね、共有する作業をアップロードする方法は作業をダウンロードするものと対照的です。`git pull`の反対はなんでしょう? `git push`です!","","`git push`は_あなたの_変更をリモートに対話的にアップロードし、リモートにあなたの新しい変更を取り込みます。`git push`が完了すれば、全ての友人たちがあなたの作業をリモートからダウンロードすることができます。","","`git push`は、あなたの作業を「公開する」コマンドと考えることができます。このコマンドは微妙な点をいくつか持っていますが、とりあえずは初歩から始めてみましょう。。。","","*注:引数なしの`git push`の挙動は、`push.default`と呼ばれるgitの設定値によって異なります。この設定のデフォルト値は、使用しているgitのバージョンに依存しますが、私たちのレッスンでは`upstream`という値を使用します。これはあまり大きな問題ではありませんが、あなたのプロジェクトにプッシュする前にあなたのgitの設定を確認する価値はあるでしょう。*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["ここにリモートにはないいくつかの変更点があります。これをアップロードしてみましょう!"],afterMarkdowns:["さて、いってみましょう -- リモートはコミット`C2`を受け取り、リモート上の`main`ブランチは`C2`の位置に更新され、私たち*自身*のリモートブランチ(`o/main`)も良い具合に更新されました。全てが同期されました!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルを終えるには、単純に二つの新しいコミットをリモートに共有してください。けれども覚悟しておいてください。なぜなら、レッスンは少々難しいことを取り扱っているからです。"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Гаразд, я витягнув останні зміни та інтегрував їх до своїх локальних напрацювань. Все добре... але як мені поділится _своїми_ змінами з рештою учасників?","","Отже, надсилання данних є, по-суті, протилежним звантажуванню данних. А який антонім до `git pull` (притягнути)? `git push` (відштовхнути)!","","`git push` використовується для надсилання _локальних_ змін на вказаний віддалений репозиторій; ця команда оновлює віддалений репозиторій, інтегруючи нові коміти. Після виконання `git push` всі твої друзі зможуть звантажити твої напрацювання з віддаленого сховища.","",'Ти можеш вважати, що `git push` "публікує" твої напрацювання. В цієї команди є кілька особливостей, які ми скоро розглянемо, але почнімо з початку...',"","*Зауваження: поведінка `git push` без параметрів різниться в залежності від налаштування git з назвою `push.default`. Значення за замовчуванням цього налаштування залежить від версії твого git, але в наших уроках ми будемо вважати що воно дорівнює `upstream`. Це не вкрай важливо, але буде корисно перевірити це налаштування перед тим як пушити свій проект.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ось ми маємо деякі зміни яких нема в віддаленому сховищі. Надішлімо їх!"],afterMarkdowns:["Ось, маєш -- віддалене сховище отримало `C2`, гілку `main` на ньому було оновлено й тепер вона посилається на `C2`, а наше *власне* відображення віддаленого репо (`o/main`) було також оновлено. Все синхронізовано!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, просто надішли два коміти у віддалений репозиторій. Але прищібнись, скоро наші уроки стануть значно важчими!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","좋아요, 원격 저장소에서의 변화들을 가져오는 방법도 알고 로컬의 내 작업과 합칠줄도 알게되었습니다. 아주 좋아요.. 좋은데 이제 _나의_ 훌륭한 작업을 다른 사람들과 공유하려면 어떻게 해야되는거죠?","","공유된 작업을 내려받는것의 반대는 작업을 업로드해 공유하는것입니다. 그렇다면 `git pull` 당기기의 반대는? `git push` 미는겁니다!","","`git push`는 _여러분의_변경을 정한 원격저장소에 업로드하고 그 원격 저장소가 여러분의 새 커밋들을 합치고 갱신하게 합니다. `git push`가 끝나고 나면, 여러분의 친구들은 원격저장소에서 여러분의 작업을 내려받을수 있게됩니다.","",'여러분은 `git push`를 작업을 "공개"하는 과정이라고 생각해도 될것입니다. 곧 알아볼 중요한 세부 요소들이 잔뜩 있지만, 일단은 아기 걸음으로 시작해봅시다...',"","*노트 -- `git push`를 매개변수 없이 사용하는 디폴트 행동은 `push.default`라 불리는 git의 설정에 따라 결정 됩니다. 이 설정의 기본값은 여러분이 사용하는 git 버전에 따라 다릅니다만, 우리 강의에서는 `upstream`을 값으로 사용합니다. 대단한것은 아니지만, 여러분이 프로젝트를 push하기전에 한번쯤 확인해볼 가치가 있습니다.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 원격저장소에는 없는 변경이 있습니다. 이것들을 업로드 해 봅시다!"],afterMarkdowns:["자, 됐습니다 -- 원격 저장소가 커밋 `C2`를 받았고, 원격 저장소의 브랜치 `main`가 `C2`라는 지점까지 갱신 되었습니다. 그리고 원격 저장소의 반영인 *우리의* 원격 브랜치 (`o/main`)또한 잘 갱신 되었습니다. 모든게 동기화되어 있습니다!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨을 마치기 위해, 두개의 새 커밋을 원격 저장소에 공유해봅시다. 마음의 준비를 단단히 하세요, 이제부터 강의들이 훨씬 어려워질거니까요!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Được rồi, ta đã biết cách nạp thay đổi từ kho chứa từ xa và kết hợp chúng vào các nhánh cục bộ. Khá là tuyệt rồi... nhưng nếu tôi muốn chia sẻ tác phẩm tuyệt vời _của tôi_ với mọi người thì sao?","","Chà, cách tải lên thì phải ngược với tải xuống rồi. Vậy thì đối nghịch của `git pull` (kéo) là gì? `git push` (đẩy)!","","`git push` có trách nhiệm tải lên thay đổi _của bạn_ vào nhánh từ xa được chỉ định và cập nhật nhánh đó để kết hợp với commit đẩy lên của bạn. Một khi lệnh `git push` hoàn thành, tất cả bạn bè của bạn có thể tải xuống thay đổi của nhánh từ xa đó đó.","",'Bạn có thể xem `git push` là câu lệnh để "xuất bản" thành quả công việc của bạn. Lệnh này có nhiều tính năng tinh tế mà ta sẽ tìm hiểu nhanh thôi, nhưng giờ hãy cứ bắt đầu với từng bước nhỏ đã...',"","*lưu ý --`git push` mà không có tham số hành xử tùy biến phụ thuộc vào cài đặt của Git là `push.default`. Giá trị mặc định cho cài đặt này phụ thuộc vào phiên bản Git mà bạn đang sử dụng, còn ở bài học của chúng ta thì ta sẽ sử dụng giá trị `upstream` (ngược dòng). Bây giờ thì đó chưa phải là vấn đề gì lớn, nhưng chúng tôi khuyến nghị bạn kiểm tra cài đặt của mình trước khi đẩy lên dự án của bạn.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ở đây ta có một vài thay đổi mà kho chứa từ xa không có. Hãy tải chúng lên!"],afterMarkdowns:["Đó -- kho chứa từ xa đã nhận được commit `C2`, nhánh `main` ở kho chứa từ xa đã được cập nhật lên `C2`, và phản chiếu nhánh từ xa *của ta* (`o/main`) cũng được cập nhật luôn. Mọi thứ đã đồng bộ!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, đơn giản là hãy chia sẻ 2 commit mới với kho chứa từ xa. Chuẩn bị tinh thần nhé, vì các bài học sẽ khó dần lên nhiều đấy!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, sedaj sem fetchal spremembe iz oddaljenega repota in jih vključil v moje lokalno delo. To je že super ... toda kako delim _moje_ super delo z vsemi ostalimi?","","No, način da naložiš deljeno delo, je ravno nasproten, kot da ga preneseš. In kaj je nasprotje `git pull`? `git push`!","","`git push` je odgovoren za nalaganje _tvojih_ sprememb na določen oddaljen repozitorij in posodobitev tega repozitorija, da vključi tvoje nove commite. Ko se `git push` izvede, lahko vsi tvoji prijatelji prenesejo tvoje delo iz repozitorija.","",'`git push` si lahko predstavljaš kot ukaz, ki "objavi" tvoje delo. Ima kopico majhnih stvari, katere bomo raziskali v kratkem, ampak začnimo z majhnimi koraki ...',"","*Opomba -- obnašanje `git push` brez argumentov je odvisno od nastavitev gita imenovanih `push.default`. Privzeta vrednost za to nastavitev je odvisna od različice gita, ki jo uporabljaš, ampak mi bomo uporabljali `upstream` vrednost v naši lekciji. To ni neka velika stvar, ampak jo je vredno preveriti, preden pushamo na svojem projektu.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tu imamo nekaj sprememb, ki jih oddaljen repo nima. Dajmo jih naložiti!"],afterMarkdowns:["Tako je -- oddaljen repo je prejel commit `C2`, branch `main` na oddaljenem repotu je bil posodobljen, da kaže na `C2` in naš *lasten* prikaz oddaljenega repota (`o/main`) je bil prav tako posodobljen. Vse je usklajeno!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, preprosto deli dva nova commita z oddaljenim repotom. Nato pa se pripni, ker bodo lekcije postale dosti težje!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git push","","Ok, pobraliśmy zmiany ze zdalnego repozytorium i włączyliśmy je do naszej pracy lokalnie. Wszystko fajnie, ale... jak mamy się podzielić _naszą_ wspaniałą pracą ze wszystkimi innymi?","","Cóż, wysyłanie współdzielonej pracy jest przeciwieństwem pobierania współdzielonej pracy. A co jest przeciwieństwem `git pull`? `git push`!","","Polecenie `git push` odpowiada za przesłanie i aktualizację _naszych_ zmian na wybranego remote'a, aby zawierał nowe commity. Gdy `git push` zostanie ukończony, wszyscy twoi przyjaciele będą mogli pobrać twoją pracę z serwera zdalnego.","",'Możesz myśleć o `git push` jak o poleceniu do "publikowania" swojej pracy. Ma ono wiele szczegółów, które wkrótce omówimy, ale zacznijmy od małych kroczków...',"","*Uwaga 1 -- zachowanie `git push` bez argumentów różni się w zależności od jednego z ustawień Git o nazwie `push.default`. Domyślna wartość tego ustawienia zależy od wersji Git, której używasz. W naszych lekcjach będziemy używać wartości `upstream`. Nie jest to wielka sprawa, ale warto sprawdzić swoje ustawienia przed użyciem `push` we własnych projektach.*","","*Uwaga 2 -- odpowiednik gałęzi na zdalnym repozytorium będziemy nazywać remote'em. Nazwa ta jest wykorzystywana w Polsce, dlatego będziemy jej używać, aby nie wprowadzać zawiłego nazewnictwa.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutaj mamy kilka zmian, których nie ma remote. Załadujmy je!"],afterMarkdowns:["No i proszę -- remote otrzymał commit `C2`, gałąź `main` na zdalnym repozytorium została zaktualizowana do `C2`. Nasze *własne* odzwierciedlenie zdalnego (`o/main`) również zostało zaktualizowane. Wszystko jest zsynchronizowane!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Aby zakończyć ten poziom, wystarczy, że podzielisz się dwoma nowymi commitami z innymi użytkownikami repozytorium. Ale zapnij pasy i przygotuj się na ostrą jazdę na kolejnych lekcjach!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, ho recuperato tutti gli aggiornamenti dal repository remoto e li ho incorporati al mio repository locale. Fin qui tutto apposto ma... come faccio a condividere il _mio_ fantastico lavoro con gli altri?","","Bene, per caricare il lavoro da condividere si deve fare l'opposto dello scaricarlo. E qual è l'opposto di `git pull`? `git push`!","","`git push` è responsabile dell'inviare le _tue_ modifiche ad uno specifico repository remoto e di aggiornarlo per far sì che incorpori i tuoi nuovi commit. Una volta eseguito `git push`, tutti i tuoi amici possono scaricare il tuo lavoro dal repository remoto.","",'Puoi considerare `git push` come un comando per "pubblicare" il tuo lavoro. Ha una serie di sottigliezze che vedremo più avanti, per ora iniziamo dalle basi...',"","*nota -- il comportamento di `git push` senza argomenti dipende da un'impostazione di git chiamata `push.default`. Il valore predefinito di quest'impostazione dipende dalla versione di git in uso; noi andremo ad usare il valore `upstream` nelle lezioni. Non è un problema, ma vale la pena controllare le impostazioni prima di usare push nei tuoi progetti.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Qui abbiamo alcuni cambiamenti che non sono presenti nel repository remoto. Andiamo a caricarli!"],afterMarkdowns:["Ecco qui -- il repository remoto ha ricevuto il commit `C2`, il ramo `main` sul remoto è stato aggiornato a puntare a `C2`, ed anche il *nostro* riflesso del repository remoto (`o/main`) è stato aggiornato. Tutto è stato sincronizzato!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Per terminare questo livello, condividi due nuovi commit con il repository remoto. Preparati però, perché le prossime lezioni saranno belle toste!"]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, so I've fetched changes from remote and incorporated them into my work locally. That's great and all... but how do I share _my_ awesome work with everyone else?","","Well, the way to upload shared work is the opposite of downloading shared work. And what's the opposite of `git pull`? `git push`!","","`git push` is responsible for uploading _your_ changes to a specified remote and updating that remote to incorporate your new commits. Once `git push` completes, all your friends can then download your work from the remote.","",'You can think of `git push` as a command to "publish" your work. It has a bunch of subtleties that we will get into shortly, but let\'s start with baby steps...',"","*note -- the behavior of `git push` with no arguments varies depending on one of git's settings called `push.default`. The default value for this setting depends on the version of git you're using, but we are going to use the `upstream` value in our lessons. This isn't a huge deal, but it's worth checking your settings before pushing in your own projects.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have some changes that the remote does not have. Let's upload them!"],afterMarkdowns:["There we go -- the remote received commit `C2`, the branch `main` on the remote was updated to point at `C2`, and our *own* reflection of the remote (`o/main`) was updated as well. Everything is in sync!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["To finish this level, simply share two new commits with the remote. Strap in though, because these lessons are about to get a lot harder!"]}}]}}}},{}],149:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C2","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C3","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"C0","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git push origin main;git push origin foo",startTree:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"C0","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',disabledMap:{"git checkout":!0,"git switch":!0},name:{en_US:"Git push arguments",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",ja:"Git pushの引数",fr_FR:"Arguments de git push",ru_RU:"Аргументы git push",ko:"git push의 인자들",uk:"Аргументи git push",vi:"Tham số git push",sl_SI:"Git push argumenti",pl:"Argumenty git push",it_IT:"Parametri di git push"},hint:{en_US:'You can always look at the last slide of the dialog with "objective"',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',ja:'ダイアログの最後のスライドを参照するには"objective"を実行',fr_FR:'Vous pouvez toujours regarder le dernier slide des dialogues en tapant "objective".',ru_RU:'Вы всегда можете ознакомиться с последним слайдом, воспользовавшись "objective".',ko:'대화창의 마지막 슬라이드를 "objective"로 다시 볼 수 있습니다.',uk:'Завжди можна подивитися останній слайд діалогу за допомогою "objective"',vi:'Bạn có thể sử dụng "objective" để đọc trang cuối của cửa sổ hộp thoại',sl_SI:'Vedno lahko pogledaš zadnji dialog z "objective".',pl:'Możesz wpisać "objective", żeby zobaczyć ostatni slajd z każdego poziomu',it_IT:'Puoi sempre guardare l\'ultima slide del dialogo con "objective"'},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push arguments","","Great! Now that you know about remote tracking branches we can start to uncover some of the mystery behind how git push, fetch, and pull work. We're going to tackle one command at a time but the concepts between them are very similar.","",'First we\'ll look at `git push`. You learned in the remote tracking lesson that git figured out the remote *and* the branch to push to by looking at the properties of the currently checked out branch (the remote that it "tracks"). This is the behavior with no arguments specified, but git push can optionally take arguments in the form of:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["What is a `` parameter you say? We'll dive into the specifics soon, but first an example. Issuing the command:","","`git push origin main`","","translates to this in English:","",'*Go to the branch named "main" in my repository, grab all the commits, and then go to the branch "main" on the remote named "origin". Place whatever commits are missing on that branch and then tell me when you\'re done.*',"",'By specifying `main` as the "place" argument, we told git where the commits will *come from* and where the commits *will go*. It\'s essentially the "place" or "location" to synchronize between the two repositories.',"","Keep in mind that since we told git everything it needs to know (by specifying both arguments), it totally ignores where we are checked out!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see an example of specifying the arguments. Note the location where we are checked out in this example."],afterMarkdowns:["There we go! `main` got updated on the remote since we specified those arguments."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What if we hadn't specified the arguments? What would happen?"],afterMarkdowns:["The command fails (as you can see), since `HEAD` is not checked out on a remote-tracking branch."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, for this level let's update both `foo` and `main` on the remote. The twist is that `git checkout` is disabled for this level!","","*Note: The remote branches are labeled with `o/` prefixes because the full `origin/` label does not fit in our UI. Don't worry ","about this... simply use `origin` as the name of the remote like normal.*"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les arguments de push","","Bien ! Maintenant que vous connaissez le suivi des branches, nous pouvons fouiller ce qui se cache derrière le fonctionnement de push, fetch, et pull. Nous allons aborder une commande à la fois, mais elles sont très similaires.","","En premier lieu regardons `git push`. Vous avez appris dans la leçon sur le suivi des branches distantes que Git détermine le dépôt distant *et* la branche à envoyer en regardant les propriétés de la branche courante (c'est à dire la branche distante que cette dernière \"suit\" -- track). C'est le comportement rencontré quand aucun argument n'est spécifié, mais git push accepte aussi des arguments de la forme :","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Qu'est ce que ce paramètre `` ? Avant de passer à l'explication, voyons d'abord un exemple. La commande suivante :","","`git push origin main`","","peut se traduire en français par :","",'*Va dans la branche "main" de mon dépôt, récupère tous les commits, et ensuite va dans la branche distante "main" sur le dépôt nommé "origin". Envoie tous les commits qui lui manquent sur cette branche distante puis préviens-moi quand c\'est terminé.*',"","En spécifiant `main` comme argument ``, nous avons dit à Git *d'où* les commits venaient et où ils *allaient*. C'est en fait \"l'emplacement\" à synchroniser entre les deux dépôts.","","Gardez à l'esprit que nous avons dit à Git tout ce dont il a besoin pour opérer (en précisant les deux arguments), il n'a donc absolument pas besoin de savoir quelle est la branche courante !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons un exemple d'arguments. Notez bien où se trouve `HEAD` dans cet exemple."],afterMarkdowns:["Voilà ! `main` a été mise à jour puisque nous avons spécifié ces arguments."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Et si nous n'avions pas mis d'arguments ? Que ce serait-il passé ?"],afterMarkdowns:["La commande échoue (comme vous pouvez le voir), car `HEAD` ne se trouve pas sur une branche configurée pour suivre une branche distante."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, pour ce niveau mettez à jour `foo` et `main` sur le dépôt distant. La difficulté est que `git checkout` est désactivée pour ce niveau !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de push","","¡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:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["¿Qué será este parámetro ``, te preguntarás? Ya vamos a entrar en detalle, pero primero un ejemplo. Correr el comando:","","`git push origin main`","","se traduce así al español:","",'*Andá a la rama llamada "main" en mi repositorio, agarrá todos los commits, y después andá a la rama "main" del remoto llamado "origin". Aplicá ahí todos los commits que falten, y avisame cuando termines.*',"",'Especificando `main` 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. Notá en dónde estamos parados en este ejemplo."],afterMarkdowns:["¡Ahí está! Se actualizó `main` en el remoto, porque especificamos esos parámetros."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Y si no especificábamos los parámetros? ¿Qué hubiera pasado?"],afterMarkdowns:["El comando falla (como podés ver), porque `HEAD` no está sobre ninguna rama que trackee algún remoto."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok. Para este nivel, actualicemos tanto `foo` como `main` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!"]}}]},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 main`","","se traduce así al español:","",'*Vete a la rama llamada "main" en mi repositorio, coge todos los commits, y después vete a la rama "main" del remoto llamado "origin". Copia ahí todos los commits que falten, y avísame cuando termines.*',"",'Especificando `main` 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ó `main` en el remoto, porque especificamos esos parámetros."],command:"git checkout C0; git push origin main",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 `main` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parâmetros do push","","Ótimo! Agora que você sabe sobre remote tracking de ramos, podemos começar a revelar um pouco do mistério por trás de como o push, o fetch e o pull funcionam. Vamos lidar com um comando por vez, mas os conceitos são bastante similares.","",'Primeiro, vamos abordar o `git push`. Você aprendeu na lição sobre remote tracking que o Git descobria o repositório remoto *e* o ramo correspondente onde fazer o push olhando nas propriedades do ramo que está atualmente em checkout (verificando o ramo remoto que ele "segue"). Este é o comportamento quando nenhum parâmetro é especificado, mas o git push pode opcionalmente receber parâmetros na seguinte forma:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Você deve estar se perguntando: o que é esse parâmetro ``? Vamos discutir as especifidades em breve, mas vejamos primeiro um exemplo. Executar o comando:","","`git push origin main`","","pode ser traduzido para o seguinte em Português:","",'*Vá ao ramo chamado "main" no meu repositório local, pegue todos os commits, então vá ao ramo "main" no repositório remoto chamado "origin". Coloque quaisquer commits que estiverem faltando nesse ramo, e então me diga quando estiver pronto.*',"",'Especificando `main` como parâmetro "lugar", dizemos ao Git de onde os commits *vão vir* e para onde os commits *irão*. É essencialmente o "lugar" onde sincronizar entre os dois repositórios.',"","Tenha em mente que já que contamos ao Git tudo que ele precisa saber (especificando ambos os parâmetros), ele ignora totalmente o checkout atual!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos um exemplo especificando os argumentos. Preste atenção no commit que sofreu checkout neste exemplo."],afterMarkdowns:["Aqui vamos nós! O `main` foi atualizado no repositório remoto, já que especificamos os parâmetros."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se eu não especificasse parâmetros? O que aconteceria?"],afterMarkdowns:["O comando falha (como você pode ver), já que o `HEAD` não havia sofrido checkout para um ramo com propriedade de remote-tracking definida."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, neste nível vamos atualizar tanto o `foo` como o `main` no repositório remoto. Porém desabilitamos o comando `git checkout` para dificultar um pouco a tarefa!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de push","","¡Xenial! Agora que sabes acerca das ramas que seguen remotos, podemos empezas a desvelar algo do misterio detrás do git push, fetch e pull. Imos atacar cun só comando dunha vez, pero os conceptos entre eles son moi semellantes.","","Vexamos primeiro `git push`. Xa aprendiches na lección sobre as ramas remotas que git determina o remoto *e* a rama á que empurrar mirando as propiedades da rama actual (o remoto ó que seguir). Este é o comportamento por defecto para cando non se especifican parámetros, pero git push toma, opcionalmente, parámetros da forma:","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["¿Qué será este parámetro ``, fixécheste esa pregunta? Xa imos entrar en detalle, pero primeiro un exemplo. Executa o comando:","","`git push origin main`","","tradúcese así ó galego:","",'*Vai á rama chamada "main" no meu repositorio, colle tódolos commits, e despois vai á rama "main" do remoto chamado "origin". Aplica ahí tódolos commits que falten, e avísame cando remates.*',"",'Indicando `main` como o parámetro "lugar", dixémoslle a git ónde traer os commits, e ónde mandalos. É básicamente, o "lugar" ou "ubicación" que sincroniza entre ámbolos dous repositorios.',"","Ten en conta que, como lle dixemos a git todo o que precisaba saber (indicando ambos parámetros), ¡ignora totalmente ónde andabamos neste momento!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos un exemplo especificando os parámetros. Nota ónde ficamos parados neste exemplo."],afterMarkdowns:["¡Ahí o tes! Actualizouse `main` no remoto, porque especificamos eses parámetros."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿E se non especificáramos os parámetros? ¿Que ocorrería?"],afterMarkdowns:["O comando falla (como podes ver), xa que `HEAD` non está sobre ningunha rama que siga algún remoto."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok. Para este nivel, actualiza tanto `foo` como `main` no remoto. O tema está en que ¡temos deshabilitado `git checkout` neste nivel!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## push 的參數","","太好了!現在你已經明白了 remote tracking,我們可以開始聊 git push、fetch 以及 pull 的一些有趣的地方,我們一次會講解一個指令,但是它們之間的概念是很類似的。","","首先我們來看一下 `git push`,你已經在 remote tracking 的課程中學習到 git 是根據目前 checkout 的 branch 所 track 的 remote branch 來做 push,這是在沒有任何的參數的情況下的預設動作,但是 git push 允許我們可以加上一些參數:","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["`` 這個參數表示什麼? 我們等一下會提到細節,但是先來看一個例子,執行以下的指令:","","`git push origin main`","","將這段解釋成中文:","",'*先到我的 repo 中的 "main" branch,抓下所有的 commit,然後到叫作 "origin" 的 remote 的 "main" branch,檢查 remote 的 commit 有沒有跟我的 repo 一致,如果沒有,就更新。*',"",'將 `main` 當作 "place" 這個參數,我們告訴 git 這些 commit 是*從哪裡來的*,而且它們要*往哪裡去*。對於要同步兩個 repo, "place" 或者是 "location" 是非常重要的。',"","要記住喔,因為我們告訴 git 它所要知道的(有兩個參數),因此它才不會管你現在所 checkout 的 branch!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來看一個有加上參數的例子,在這個例子中,要特別注意到我們所 checkout 的位置。"],afterMarkdowns:["我說的沒錯吧!因為我們加上了參數,所以在 remote 上的 `main` branch 更新了。"],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["假如我們沒有特別指令參數會發生什麼事情?"],afterMarkdowns:["指令會失敗(就像你看到的),因為 `HEAD` 並沒有指向一個有 track remote branch 的 branch 上面阿。"],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["好的,在這個關卡中,我們要更新在 remote 上的 `foo` 以及 `main` branch,比較遺憾的是 `git checkout` 在這個關卡中是不被允許的喔!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push 的参数","","很好! 既然你知道了远程跟踪分支,我们可以开始揭开 git push、fetch 和 pull 的神秘面纱了。我们会逐个介绍这几个命令,它们在理念上是非常相似的。","","首先来看 `git push`。在远程跟踪课程中,你已经学到了 Git 是通过当前所在分支的属性来确定远程仓库以及要 push 的目的地的。这是未指定参数时的行为,我们可以为 push 指定参数,语法是:","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["`` 参数是什么意思呢?我们稍后会深入其中的细节, 先看看例子, 这个命令是:","","`git push origin main`","","把这个命令翻译过来就是:","","*切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。*","","我们通过“place”参数来告诉 Git 提交记录来自于 main, 要推送到远程仓库中的 main。它实际就是要同步的两个仓库的位置。","","需要注意的是,因为我们通过指定参数告诉了 Git 所有它需要的信息, 所以它就忽略了我们所切换分支的属性!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我们看看指定参数的例子。注意下我们当前分支的位置。"],afterMarkdowns:["好了! 通过指定参数, 远程仓库中的 `main` 分支得到了更新。"],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果不指定参数会发生什么呢?"],afterMarkdowns:["命令失败了(正如你看到的,什么也没有发生)! 因为我们所切换的 HEAD 没有跟踪任何分支。"],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["本关我们要更新远程仓库中的 `foo` 和 `main`, 但是 `git checkout` 被禁用了!","","*注意:远程分支使用 `o/` 开头是因为 `origin/` 对于 UI 来说太长了。不用太在意这个,直接用 `origin` 作为远程仓库的名称就可以了。*",""]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push-Optionen","","Großartig! Da du dich jetzt mit Remote Tracking Branches auskennst, können wir anfangen, die Geheimnisse hinter `git push`, `fetch` und `pull` zu ergründen. Wir werden uns einen Befehl nach dem anderen vornehmen, aber die Funktionsweisen sind sich sehr ähnlich.","",'Zunächst schauen wir uns `git push` an. Du hast im Level über Remote Tracking schon mitbekommen, dass Git den Remote Server *und* den Branch herausbekommt, indem es sich die Eigenschaften des aktuell ausgecheckten Branches ansieht (in denen das Remote steht, das der Branch "trackt"). Das ist das Verhalten bei keiner Angabe weiterer Optionen -- du kannst bei `git push` aber auch folgende setzen:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:['Was "Ort" sein soll, fragst du? Das klären wir später genau, schauen wir uns zunächst ein Beispiel an:',"","`git push origin main`","","Das bedeutet im Klartext:","",'"Geh zum Branch namens `main` in meinem Repository, nimm all seine Commits, dann geh zum Branch `main` auf dem Remote namens `origin`. Lege da alle Commits ab, die fehlen und sage mir, wenn du fertig bist."',"",'Da wir `main` als "Ort" angegeben haben, weiß Git, *woher* die Commits kommen und *wohin* sie sollen. Es ist im Grunde der Name der Orte, die zwischen zwei Repositorys synchronisiert werden sollen.',"","Da wir Git alles explizit gesagt haben, was es für die Operation wissen muss (durch Angabe von Remote und Ort), ist es vollkommen egal, was gerade ausgecheckt ist."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns noch ein Beispiel an. Beachte, was in diesem Fall gerade ausgecheckt ist."],afterMarkdowns:["Da haben wir's! `main` wurde auf dem Remote aktualisiert, weil wir beide Optionen angegeben haben."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was wäre passiert, wenn wir keine Optionen benutzt hätten?"],afterMarkdowns:["Der Befehl schlägt fehlt, da `HEAD` nicht auf einem Branch steht, der ein Remote trackt."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, in diesem Level lass uns sowohl `foo` als auch `main` auf dem Remote aktualisieren. Um's spannender zu machen ist `git checkout` in diesem Level deaktiviert."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументы команды Push","","Отлично! Теперь, когда вы знаете, как следить за удалёнными ветками, мы можем начать изучение того, что скрыто под занавесом работы команд git push, fetch и pull. Мы будем рассматривать одну команду за другой, однако принципы у них очень схожи.","","Сперва взглянем на `git push`. В уроке, посвящённом слежению за удалённым репозиторием, вы узнали о том, что git находит удалённый репозиторий *и* ветку, в которую необходимо push-ить, благодаря свойствам текущей ветки, на которой мы находимся. Это так называемое поведение без аргументов, однако команда git push может быть также использована и с аргументами. Вид команды в данном случае:","","`git push <удалённый_репозиторий> <целевая_ветка>`","",""]}},{type:"ModalAlert",options:{markdowns:["Что за такой параметр `<целевая_ветка>`? Мы узнаем об этом через секунду, а пока что рассмотрим пример. Допустим, что мы выполняем такую команду:","","`git push origin main`","","дословный перевод с английского будет таким:","",'*Перейди в ветку с именем "main" в моём локальном репозитории, возьми все коммиты и затем перейди на ветку "main" на удалённом репозитории "origin.". На эту удалённую ветку скопируй все отсутствующие коммиты, которые есть у меня, и скажи, когда ты закончишь.*',"",'Указывая `main` в качестве аргумента "целевая_ветка", мы тем самым говорим git-у откуда будут *приходить* и *уходить* наши коммиты. Аргумент "целевая_ветка" или "местонахождение" - это синхронизация между двумя репозиториями.',"","Имейте в виду, что с тех пор, как мы сказали git-у всё, что ему необходимо (указав оба аргумента), ему - git-у - абсолютно всё равно, что вы зачекаутили до этого!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте взглянем на пример, в котором указаны оба этих аргумента. Обратите внимание на местоположение, в котором мы находимся после чекаута."],afterMarkdowns:["Вот так! Мы обновили `main` на удалённом репозитории, принудительно указав аргументы в push."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А что бы было, ели бы мы не указывали эти аргументы, при этом используя тот же алгоритм?"],afterMarkdowns:["Как вы видите, команда не выполнилась, так как `HEAD` потерялся и не находится на удалённо-отслеживаемой ветке."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Хорошо, для выполнения этого уровня давайте обновим обе ветки `foo` и `main` на удалённом репозитории. Фишка в том, что команда `git checkout` не доступна на этом уровне!","","*Замечание: Удалённые ветки помечены как `o/`, а не `origin/`. Дело в том, что полная метка не помещается на экране. Не волнуйтесь ","по этому поводу... просто используйте знакомый нам `origin` для обращения к удалённому репозиторию.*"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pushの引数","","すばらしい!リモートトラッキングブランチについて理解したので、次は git push、fetch、pull 動作の謎を追っていきましょう。一つずつ見ていきますが、各コマンドのコンセプトは非常に似ています。","","まずは、`git push`からです。リモートトラッキングブランチのレッスンでは、gitは現在チェックアウトされているブランチのプロパティを参照して、pushするリモートとブランチを決めるということを学びました(そのリモートは、ブランチの追跡対象でもあります)。これは git push の引数が指定されていない場合の動作ですが、git push は次の引数も取ることができます。","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["``パラメータとは何でしょうか?説明の前に、まずは例をみてみましょう。","","`git push origin main`","","これを日本語訳すると、次のようになります。","",'*リポジトリの "main" ブランチに移動し、すべてのコミットを取得してから、リモートの "origin" にある "main" ブランチへ移動します。存在していないコミットをリモートのリポジトリに反映させて、完了したら私に教えて下さい。*',"",'"place"引数に`main`を指定することで、コミットがどこから来てどこへ行くのかをgitに伝えました。この"place"引数は基本的に、2つのリポジトリ間で同期する場所の名前です。',"","なお、git に(2つの引数を指定して)必要なことを伝えたので、現在チェックアウトされているブランチを無視することに注意してください。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["引数を指定した例を見てみましょう。この例ではチェックアウトされている場所に注意してください。"],afterMarkdowns:["やったね!これらの引数を指定していたので、リモートの`main`が更新されました。"],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["引数を指定しなかった場合、何が起こるでしょうか?"],afterMarkdowns:["(ご覧の通り)コマンドは失敗しました。`HEAD`がリモートトラッキング設定のあるブランチにチェックアウトされていないためです。"],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルでは`foo`と`main`の両方をリモートに更新してみましょう。ここでは`git checkout`が無効になっているので注意してください。","","*注:`origin/`ラベルがUIに収まらないため、リモートブランチには`o/`が付いていますが心配しないでください。","これについては... 通常のようにリモートの名前に`origin`を使用してくださいね。*"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push의 인자들","","좋습니다! 여러분은 이제 원격 추적 브랜치도 알고 있기 때문에 이제 git push, fetch, pull이 어떻게 작동하는지에 관한 숨겨져있는 미스테리를 풀어나갈 준비가 되었습니다. 한번에 하나의 명령어를 알아보도록하겠는데 이것들이 가지고있는 컨셉은 아주 비슷해요.","",'먼저 `git push`입니다. 여러분은 push를 하면 git이 push를 할 대상으로 원격저장소, 브랜치를 현재 작업중인 브랜치에 설정된 속성("추적" 대상)을 통해 알아낸다는것을 이전 추적 레슨에서 배웠습니다. 이것은 인자를 넣지않고 실행할 때 일어나는것 입니다, 그런데 git push에 다음과 같은 형식으로 선택적으로 인자를 사용할수도 있습니다:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["``인자가 무엇을 의미할것 같나요? 세부사항은 알아보기 전에 예시부터 봅시다. 다음 명령어를 보세요:","","`git push origin main`","","해석해 보면:","",'*내 저장소에 있는 "main"라는 이름의 브랜치로 가서 모든 커밋들을 수집합니다, 그다음 "origin"의 "main"브랜치로 가서 이 브랜치에 부족한 커밋들을 채워 넣고 완료 되면 알려줍니다.*',"",'`main`를 "place"인자로 지정해서 우리가 git에게 *어디서부터* 커밋이 오는지, 그리고 *어디로* 커밋이 가야하는지 알려줍니다. 두 저장소간에 동기화 작업을 할 "장소"를 지정해 주는것이라고 볼 수 있습니다.',"","git이 알아야 할 것은 다 알려줬기 때문에(두 인자를 모두 지정했죠), git은 현재 우리가 체크아웃한 브랜치는 무시하고 명령을 수행합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["인자를 지정해주는 예제를 눈으로 직접 확인해 봅시다. 이 예제에서 우리가 체크아웃한 곳이 어디인지를 주의하며 봅시다."],afterMarkdowns:["됐네요! 지정해준 인자들에 의해 원격 저장소의 `main`가 갱신 되었습니다."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["인자를 지정하지 않으면 어떻게 될까요?"],afterMarkdowns:["명령이 실패하며(보시다시피), `HEAD`가 원격저장소를 추적하는 브랜치에 체크아웃 되있지 않기 때문이죠."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["좋습니다, 이번 레벨에서는 원격저장소의 `foo`, `main`브랜치 모두 갱신해봅시다. 이번 문제는 `git checkout`이 비활성화 되있다는 점이 특징이죠!","","*노트: 원격 브랜치들은 `o/`접두어로 분류되어 있습니다. `origin/`으로 생략없이 표현하면 UI에 안맞아서 이렇게 표현했어요. ","그래서... 원격저장소 이름은 원래처럼 `origin`으로 써주세요.*"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргумeнти git push","",'Чудово! А зараз, коли ти знаєш все про відслідковування віддалених гілок, ми можемо розглянути "магію", що відбувається при git push, fetch, і pull. Ми розглянемо лише окремі команди для розуміння загального принципу.',"",'Спочатку розгляньмо `git push`. З уроку про відслідковування віддалених гілок ми знаємо, що git визначає куди і в *яку* гілку робити push, дивлячись на локальну поточну гілку (і віддалену, за якою вона "слідкує"). Це поведінка `push` без аргументів, але git push може приймати необов\'язкові аргументи в форматі:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Ви спитаєте, що таке аргумент ``? Ми скоро вдамося в детальні пояснення, але спочатку -- приклад. Виконання команди:","","`git push origin main`","","буквально перекладається як:","",'*Піди в гілку, що називається "main" в моєму репозиторії, візьми всі коміти, піди у віддалений "main", що називається "origin". Додай ті коміти, яких немає в цій гілці і надрукуй, що саме ти зробив.*',"",'Вказуючи `main` в якості аргумента "place", ми сказали git-у, *звідки* взяти коміти і *куди* їх додати. ("Place") - фактично точка синхронізації двох репозиторіїв.',"","Пам'ятайте, що оскільки ми надали git-у всю необхідну інформацію (вказавши обидва аргументи), не має значення яка гілка є зараз поточною!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Розгляньмо приклад використання аргументів. Зверніть увагу на поточну гілку в цьому прикладі."],afterMarkdowns:["Ось так! `main` у віддаленому репозиторії оновився, оскільки ми вказали його в аргументах."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А якщо не вказувати аргументів? Що станеться?"],afterMarkdowns:["Команда поверне помилку (як можна побачити), оскільки локальний `HEAD` не співпадає з відповідною віддаленою гілкою."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Гаразд, на цьому рівні оновімо віддалені гілки `foo` і `main`. Для ускладнення ми заборонимо використовувати `git checkout`!","","*Пам'ятай, віддалені гілки позначені префіксом `o/`, оскільки повний префікс `origin/` не влазить в наш UI. Але не хвилюйся ","про це... ти можеш використовувати `origin` посилаючись на віддалений репозиторій.*"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham số đẩy","","Tuyệt! Bạn đã biết đến theo dõi từ xa, giờ thì ta có thể tìm hiểu sâu hơn về cách hoạt động của đẩy (`git push`), tìm nạp (`git fetch`) và kéo (`git pull`). Ta sẽ giải quyết từng câu lệnh một nhưng về căn bản chúng khá là giống nhau.","",'Trước hết hãy xem qua `git push`. Trong bài học về theo dõi từ xa bạn đã biết rằng Git sử dụng thuộc tính (nhánh từ xa mà nó "theo dõi") của nhánh hiện tại để xác định kho và nhánh từ xa để đẩy. Git làm việc này mà không cần tham số chỉ định, nhưng lệnh git push có thể thêm tham số dưới dạng sau:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Tham số `` là gì vậy? Chúng ta sẽ đi sâu vào chi tiết sau, hãy xem ví dụ trước. Câu lệnh:","","`git push origin main`","","được dịch lại là:","",'*Chuyển sang nhánh "main" trong kho lưu trữ cục bộ, nhận tất cả các commit và tìm nhánh "main" trong kho chứa từ xa tên là "origin". Thêm tất cả các commit không có trong nhánh đó và báo cho tôi biết khi nào hoàn tất.*',"",'Bằng cách chỉ định `main` trong tham số "vị trí", ta báo với Git nơi mà commit *xuất phát* và nơi chúng *sẽ đến*. Về căn bản nó là "địa điểm" để đồng bộ hóa 2 kho chứa.',"","Lưu ý rằng ta đã thông báo cho Git tất cả thông tin cần thiết (thông qua chỉ định 2 tham số), nó sẽ không quan tâm nhánh mà ta đang đứng!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy xem xét một ví dụ về việc xác định tham số. Lưu ý vị trí nhánh mà ta đang đứng."],afterMarkdowns:["Được rồi! Bằng cách chỉ định các tham số, nhánh `main` trong kho lưu trữ từ xa đã được cập nhật."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giả sử ta không chỉ định các tham số thì sao? Điều gì sẽ xảy ra?"],afterMarkdowns:["Lệnh thất bại (như bạn có thể thấy, không có gì xảy ra)! Bởi vì `HEAD` không trỏ đến nhánh nào có theo dõi từ xa."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Được rồi, trong cấp độ này hãy cập nhánh `foo` và `main` trên kho lưu trữ từ xa. Cái khó là ở cấp độ này lệnh `git checkout` đã bị vô hiệu hóa!","","*Chú ý: Các nhánh từ xa được đánh dấu bằng tiền tố `o/` bời vì UI của chúng tôi không chứa được hết `origin/`. Đừng lo ","về vấn đề này... đơn giản cứ dùng `origin` như bình thường thôi.*"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push argumenti","","Super! Sedaj, ko poznaš oddaljeno sledenje branchev lahko začnemo odkrivati skrivnosti za git pushem, fetchem in pullom. Napadli bomo en ukaz za drugim, ampak koncepti za njimi so si podobni.","",'Najprej bomo pogledali `git push`. V lekciji o oddaljenem sledenju si spoznal, da je git ugotovil oddaljen repo *in* branch za pushat s tem da je pogledal lastnosti trenutno checkoutanega brancha (oddaljen branch, ki ga "sledi"). To je obnašanje brez argumentov, ampak git push lahko sprejme tudi argumente v sledeči obliki:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Kaj je `` parameter praviš? Kmalu bomo zaplavali v podrobnosti, ampak najprej primer. Izvedba ukaza:","","`git push origin main`","","se v slovenščini prevede v:","",'*Pojdi na branch poimenovan "main" na mojem repozitoriju, zgrabi vse commite in nato pojdi na branch "main" na oddaljenem repotu poimenovanem "origin". Postavi vse commite, ki manjkajo na branch in me obvesti, ko končaš.*',"",'Z določanjem `masterja` kot "place" argument, smo povedali gitu iz kje bodo commiti *prišli* in kam bodo commiti *šli*. V bistvu je to "mesto" oziroma "lokacija" za uskladitev med dvema repozitorijema.',"","Imej v mislih, da ker smo gitu povedali vse kar mora vedeti (s podajanjem obeh argumentov), git povsem ignorira mesto, kjer smo checkoutani!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si primer podajanja argumentov. Bodi pozoren na mesto, kjer smo checkoutani v tem primeru."],afterMarkdowns:["Evo ga! `main` je bil posodobljen na oddaljenem repotu, ker smo podali te argumente."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj če ne bi podali argumentov? Kaj bi se zgodilo?"],afterMarkdowns:["Ukaz ne uspe (kot lahko vidiš), ker `HEAD` ni checkoutan na branchu, ki ga oddaljeno sledimo."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, za to stopnjo posodobimo oba `foo` in `main` na oddaljenem repotu. Trik je, da je `git checkout` onemogočen za to stopnjo!","","*Opomba: Oddaljeni branchi so označeni z `o/` predpono, ker celotna `origin/` oznaka ne paše v naš prikaz. Ne skrbi ","glede tega ... preprosto uporabi `origin` kot ime oddaljenega repota kot ponavadi.*"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argumenty push","","Świetnie! Teraz, kiedy wiesz już, jak działa śledzenie zdalnych gałęzi, możemy zacząć zgłębiać tajemnice pracy z git push, fetch i pull. Zmierzymy się z tymi poleceniami po kolei, ale idea działania każdego z nich jest bardzo podobna.","",'Najpierw spójrzmy na `git push`. Z lekcji o remote tracking wiesz, że Git określa zdalne repozytorium *oraz* gałąź docelową dzięki właściwościom aktualnie wybranej gałęzi ("śledzącej" zdalną). Tak to działa, jeśli nie określisz żadnych argumentów, ale git push może też przyjąć opcjonalnie następujące argumenty:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Pytasz, czego dotyczy parametr ``? Zaraz zajmiemy się tym konkretnie, ale najpierw przykład. Polecenie Gita:","","`git push origin main`","","to, mówiąc po ludzku:","",'*Przejdź do gałęzi o nazwie "main" w moim repozytorium, weź wszystkie commity, a potem idź do gałęzi "main" na zdalnym repozytorium, które nazywa się "origin". Umieść na tej gałęzi wszystkie commity, których tam jeszcze nie ma, i daj znać, jak skończysz.*',"",'Wpisując `main` w miejscu argumentu "place" (miejsce), powiedzieliśmy Gitowi, *skąd ma wziąć* commity i *gdzie je umieścić*. To w zasadzie właśnie "miejsce", czyli "lokalizacja" do zsynchronizowania na obu repozytoriach.',"","Pamiętaj, że skoro powiedzieliśmy Gitowi wszystko, co musi wiedzieć (podając oba argumenty), będzie kompletnie ignorować, jakie miejsce mamy aktualnie wybrane!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spójrzmy na przykład określający argumenty. Zwróć uwagę na wybrany commit (checkout)."],afterMarkdowns:["No i proszę! Zaktualizowaliśmy `main` na zdalnym repozytorium, ponieważ określiliśmy argumenty."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A gdybyśmy nie określili argumentów? Co by się stało?"],afterMarkdowns:["Polecenie (jak widzisz) nie działa, ponieważ `HEAD` nie jest wybrany na gałęzi śledzącej."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Oki, na tym poziomie uaktualnijmy zarówno `foo`, jak i `main` na zdalnym repozytorium. Haczyk polega na tym, że zablokowaliśmy na tym poziomie `git checkout`!","","*Uwaga: Zdalne gałęzie mają przedrostek `o/`, ponieważ pełna nazwa `origin/` nie mieści się w naszym interfejsie. Nie przejmuj się tym... ","po prostu użyj `origin` jako nazwy zdalnego repozytorium.*"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parametri di git push","","Ottimo! Ora che hai presente cos'è il tracciamento remoto dei rami possiamo dare un'occhiata ad alcuni dei misteri dietro al funzionamento di git push, fetch e pull. Affronteremo un comando alla volta ma i concetti tra questi saranno molto simili.","",'Come prima cosa daremo un\'occhiata a `git push`. Hai imparato nella lezione sul tracciamento remoto che git decide il ramo remoto *e* il ramo su cui caricare i dati osservando le proprietà del ramo su cui stiamo lavorando attualmente (il remoto che sta "tracciando"). Questo è il comportamento senza parametri aggiunti, ma git push può prendere dei parametri aggiuntivi nella forma di:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["E cosa indica il parametro ``? Vedremo presto le specifiche, ma prima un esempio. Il comando:","","`git push origin main`","","equivale a questo in italiano:","",'*Vai al ramo chiamato "main" nel mio repository locale, prendi tutti i commit, poi vai nel ramo "main" sul repository remoto chiamato "origin". Mettici tutti i commit che mancano e poi dimmi quando hai finito.*',"",'Specificando `main` come parametro "place", abbiamo detto a git da dove tutti i commit *proverranno* e dove i commit *dovranno andare*. Si tratta essenzialmente del "luogo" o "posizione" da sincronizzare tra i due repository.',"","Tieni a mente che poiché abbiamo detto a git tutto ciò che gli serve sapere (specificando entrambi i parametri), non tiene conto del ramo sul quale ci troviamo attualmente!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo un esempio dove specifichiamo i parametri. Da notare la posizione su cui ci troviamo attualmente in questo esempio."],afterMarkdowns:["Ecco qui! `main` è stato aggiornato sul repository remoto come specificato dai parametri."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se non avessimo specificato i parametri? Cosa succederebbe?"],afterMarkdowns:["Il comando fallisce (come puoi vedere), in quanto `HEAD` non si trova su un ramo che traccia il remoto."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, per questo livello aggiorniamo sia il ramo `foo` che `main` sul remoto. Attenzione perché git checkout è disabilitato per questo livello!","","*Nota: I rami remoti hanno i prefissi `o/` perché `origin/` non si adattava bene alla nostra interfaccia. Non preoccuparti ","... usa pure `origin` come nome del repository remoto come sempre.*"]}}]}}}},{}],150:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C4","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C4","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C5","id":"o/foo","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":["C2","C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C5","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C2"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git push origin main^:foo;git push origin foo:main",startTree:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C4","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","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":["C2","C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Git push arguments -- Expanded!",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!",ja:"Git pushの引数 -- 拡張編!",fr_FR:"Arguments de git push -- toujours plus !",ru_RU:"Аргументы для push -- расширенная версия!",ko:"git push 인자 -- 확장판!",uk:"Розширені аргументи git push!",vi:"Tham số git push -- bản mở rộng!",sl_SI:"Git push argumenti -- Razširjeni!",pl:"Argumenty git push -- Głębiej!",it_IT:"Parametri di git push - Espansione!"},hint:{en_US:'Remember you can admit defeat and type in "show solution" :P',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',ja:'降参して解説を見るには"show solution"を実行できるのをお忘れなく',fr_FR:'N\'oubliez pas que vous pouvez toujours déclarer forfait avec "show solution" :P',ru_RU:'Помните, Вы всегда можете признать своё поражение, набрав команду "show solution" (показать решение) :P',ko:'혹시 아세요? 패배를 인정하고 "show solution"을 입력할 수 있다는 걸요 :P',uk:'Пам\'ятай, ти завжди можеш визнати поразку і підглянути рішення командою "show solution" :P',vi:'Nhớ rằng, bạn có thể thừa nhận thất bại và gõ "show solution" :P',sl_SI:'Vedno se lahko predaš in napišeš "show solution". :P',pl:'Pamiętaj, że możesz się poddać i zobaczyć gotowe rozwiązanie, wpisując "show solution" :P',it_IT:'Puoi sempre ammettere la tua sconfitta e digitare "show solution" :P'},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` argument details","","Remember from the previous lesson that when we specified `main` as the place argument for git push, we specified both the *source* of where the commits would come from and the *destination* of where the commits would go.","","You might then be wondering -- what if we wanted the source and destination to be different? What if you wanted to push commits from the `foo` branch locally onto the `bar` branch on remote?","","Well unfortunately that's impossible in git... just kidding! Of course it's possible :)... git has tons and tons of flexibility (almost too much).","","Let's see how in the next slide..."]}},{type:"ModalAlert",options:{markdowns:["In order to specify both the source and the destination of ``, simply join the two together with a colon:","","`git push origin :`","","This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`).","","Once you are specifying both the source and destination independently, you can get quite fancy and precise with remote commands. Let's see a demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember, `source` is any location that git will understand:"],afterMarkdowns:["Woah! That's a pretty trippy command but it makes sense -- git resolved `foo^` into a location, uploaded whatever commits that weren't present yet on the remote, and then updated destination."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What if the destination you want to push doesn't exist? No problem! Just give a branch name and git will create the branch on the remote for you."],afterMarkdowns:["Sweet, that's pretty slick :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["For this level, try to get to the end goal state shown in the visualization, and remember the format of:","","`:`"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## L'argument `` dans le détail","","Rappelez-vous de notre dernière leçon : quand vous passiez `main` comme argument `` à git push, cela spécifiait à la fois la *source* de provenance des commits et leur *destination*.","","Vous vous demandez peut-être donc : et si nous voulions avoir une source et une destination différentes ? Et si vous voulez envoyez des commits de la branche locale `foo` dans la branche distante `bar` ?","","Malheureusement ce n'est pas possible avec Git... Mais non, je plaisante ! Bien sûr que c'est possible :)... Git a des tonnes de flexibilité (presque trop).","","Voyons cela au prochain slide..."]}},{type:"ModalAlert",options:{markdowns:["Pour spécifier la source et la destination dans ``, on les joint simplement par deux points :","","`git push origin :`","",'On en parle souvent comme d\'un "refspec". Refspec est juste un nom exotique pour un emplacement que Git peut résoudre (comme la branche `foo` ou juste `HEAD~1`)',"","Lorsque vous utilisez cette notation permettant de préciser la source et la destination indépendamment, vous pouvez produire des commandes à la fois très sophistiquées et très précises pour travailler avec les dépôts distants. Faisons une démo !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Rappelez-vous, `source` peut être n'importe quel emplacement que Git peut résoudre :"],afterMarkdowns:["Woahou ! C'est une commande très alambiquée mais qui a du sens : Git résoud `foo^` en un emplacement, envoie tous les commits qui n'étaient pas encore présents sur le dépôt distant, et met ensuite à jour la branche de destination."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Que se passe-t-il quand la destination du push n'existe pas encore ? Pas de problème ! Donnez simplement un nom de branche et Git va créer la branche distante pour vous."],afterMarkdowns:["Cool, c'est habile :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour ce niveau, essayez d'atteindre l'état montré dans la fenêtre d'objectif, et souvenez-vous du format :","","`:`"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Detalles sobre el parámetro ``","","Acordate de la lección anterior que cuando especificamos `main` 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 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 demasiado).","","Veamos cómo hacerlo a continuación..."]}},{type:"ModalAlert",options:{markdowns:["Para especificar tanto el origen como el destino de ``, simplemente unilos usando un dos puntos:","","`git push origin :`","","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 elegante y detallista con los comandos remotos. ¡Veamos una demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Recordá: `origen` es cualquier ubicación que git pueda entender:"],afterMarkdowns:["¡Woow! Ese commando es bastante loco, 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^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿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"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para este nivel, tratá de llegar al objetivo final, y acordate del formato:","","`:`"]}}]},es_ES:{childViews:[{type:"ModalAlert",options:{markdowns:["## Detalles sobre el parámetro ``","","Recuerda de la lección anterior que cuando especificamos `main` 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^:main",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 main: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:[{type:"ModalAlert",options:{markdowns:["## Detalhes sobre ``","","Lembra que na lição anterior especificamos `main` como o parâmetro lugar para o git push? Lá definimos tanto a *origem* de onde os commits viriam quanto o *destino* para onde os commits foram.","","Você pode estar se perguntando -- e se eu quisesse que a origem e o destino fossem diferentes? E se eu quisesse enviar commits do ramo local `foo` para o ramo remoto `bar`?","","Bem, infelizmente isso é impossível no Git... só brincando! Claro que é possível :)... o Git tem muita flexibilidade (até mais do que deveria).","","Veremos como fazê-lo no próximo slide..."]}},{type:"ModalAlert",options:{markdowns:["Para especificar tanto a origem como o destino do ``, simplesmente juntamos os dois usando dois-pontos:","","`git push origin :`","",'Isso é geralmente chamado de "colon refspec" (especificação de referência com dois-pontos). Refspec é só um nome extravagante para um local que o Git consiga entender (como o ramo `foo` ou mesmo `HEAD~1`)',"","Uma vez que você está especificando tanto a origem como o destino independentemente, você pode ser bastante preciso nos comandos relacionados a repositórios remotos. Vejamos uma demonstração!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembre-se, `origem` é qualquer lugar que o Git possa entender:"],afterMarkdowns:["Uau! Esse comando é bastante viajado, mas ele faz sentido -- o Git entendeu a referência `foo^`, enviou quaisquer commits que não estavam presentes no repositório remoto, e então atualizou o destino."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se o destino para o qual você quiser fazer push não existir? Sem problemas! Dê um nome de ramo e o Git criará o ramo no repositório remoto para você."],afterMarkdowns:["Doce, isso é muito bom :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para este nível, tente chegar ao estado do objetivo mostrado na visualização, e lembre-se do formato:","","`:`"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Detalles sobre o parámetro ``","","Lémbrate da lección anterior cando especificamos `main` como o parámetro lugar de git push, especificamos tanto a *orixe* do que sacar os commits como o *destino* ó que envialos.","","Poderías estar a preguntarte ¿E se quixéramos que a orixe e o destino sexan distintos? ¿Se quixéramos empurrar os commits da rama local `foo` á rama `bar` do remoto?","","Bueno, esto non se pode facer en git... ¡Caramboliñas! Claro que se pode :D. git é extremadísimamente flexibe (case case que de máis).","","Vexamos cómo facelo a continuación..."]}},{type:"ModalAlert",options:{markdowns:["Para especificar tanto a orixe como o destino de ``, sinxelamente úneos empregando dous puntos:","","`git push origin :`","","Esto pódeselle chamar refspec con dous puntos. Refspec é sinxelamente un nome cool para unha ubicación que git pode entender (como a rama `foo`, ou incluso `HEAD~1`)","","Unha vez que especificas a orixe e o destino independientemente, podes poñerte cómodo e preciso cos comandos remotos. ¡Vexamos a demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembra: `orixe` é calquera ubicación que git poida entender:"],afterMarkdowns:["¡Woow! Ese commando é unha tolemia, pero ten sentido: git resolveu `foo^` a unha ubicación, subiu calquera commit de ahí que aún non estivera no remoto, e logo actualizou o destino."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿E qué hai se o destino ó que queres empurrar non existise? ¡Non pasa nada! Sinxelamente dalle un nome á rama e git vaise encargar de crealo no remoto."],afterMarkdowns:["Xenial, sinxelamente tira para adiante."],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para este nivel, intenta chegar o obxectivo final, e lembrate do formato:","","`:`"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` 這個參數的細節","","回想一下,我們在之前的課程中提到,當我們用 `git push` 並且把 `main` 當作 `` 這個參數的時候,我們就相當於告訴 git 我們的所要更新的 commit 要*從哪裡來*(source) 並且要 *往哪裡去*(destination)。","","你可能會很好奇,當我們的 source 以及 destination 是不同的時候,應該怎麼做?當你想要 push `foo` branch 上面的 commit 到 remote 的 `bar` branch 的時候,應該怎麼做?","","很遺憾地,對於 git 來說這是不可能的...開玩笑的啦!當然是有可能的:)... git 有非常非常大的彈性(太超過了啦)。","","讓我們來看看下一頁..."]}},{type:"ModalAlert",options:{markdowns:["為了要指定 `` 的 source 以及 destination,只要利用一個冒號將這兩個連在一起:","","`git push origin :`","","這通常被稱為一個 colon (冒號) refspec,refspec 只是一個表示 location (位置) 的花俏的名稱,這個位置可以被 git 辨別(例如 `foo` branch 或是 `HEAD~1`)。","","一旦你單獨指定了 source 以及 destination,你可以看到花俏且準確的指令。讓我來來看一個例子!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["記住, `source` 表示任意可以被 git 辨識的位置:"],afterMarkdowns:["哇!這實在是一個很花俏的指令但是確很合理,git 把 `foo^` 解讀成一個位置,並且 push 該位置的 commit 到目前 remote 的 main branch。"],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果你想要 push 的 destination 不存在怎麼辦?沒有問題!只要給一個 branch 的名稱,git 就會在 remote 幫你建立。"],afterMarkdowns:["太讚了,實在非常地簡單:D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["對於這個關卡,想辦法達到這個視覺化的目標,而且要記得格式:","","`:`"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## ``参数详解","","还记得之前课程说的吧,当为 git push 指定 place 参数为 `main` 时,我们同时指定了提交记录的来源和去向。","","你可能想问 —— 如果来源和去向分支的名称不同呢?比如你想把本地的 `foo` 分支推送到远程仓库中的 `bar` 分支。","","哎,很遗憾 Git 做不到…… 开个玩笑,别当真!当然是可以的啦 :) Git 拥有超强的灵活性(有点过于灵活了)","","接下来咱们看看是怎么做的……"]}},{type:"ModalAlert",options:{markdowns:["要同时为源和目的地指定 `` 的话,只需要用冒号 `:` 将二者连起来就可以了:","","`git push origin :`","","这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支 `foo` 或者 `HEAD~1`)","","一旦你指定了独立的来源和目的地,就可以组织出言简意赅的远程操作命令了,让我们看看演示!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["记住,`source` 可以是任何 Git 能识别的位置:"],afterMarkdowns:["这是个令人困惑的命令,但是它确实是可以运行的 —— Git 将 `foo^` 解析为一个位置,上传所有未被包含到远程仓库里 `main` 分支中的提交记录。"],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果你要推送到的目的分支不存在会怎么样呢?没问题!Git 会在远程仓库中根据你提供的名称帮你创建这个分支!"],afterMarkdowns:["很赞吧!它是不是很聪明?! :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["在这个关卡中,试着完成目标窗口展示的提交树,记住参数格式哟:","","`:`"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Details zum ``-Parameter","",'Du erinnerst dich von dem vorherigen Level, dass, als wir `main` als "Ort" beim `git push` angegeben haben, daraus sowohl die *Quelle* als auch das *Ziel* für die Operation abgeleitet wurden.',"","Daher fragst du dich vielleicht -- was wäre, wenn wir möchten, dass Quelle und Ziel verschieden voneinander sind? Was wäre, wenn du Commits von einem lokalen Branch `foo` in den Branch `bar` auf einem Server schieben möchtest?","","Tja, leider ist das in Git unmöglich .... ein Scherz! Natürlich ist das möglich. Git besitzt tonnenweise Flexibilität (eher zu viel, als zu wenig).","","Und gleich sehen wir, wie das geht ..."]}},{type:"ModalAlert",options:{markdowns:["Um sowohl Quelle als auch Ziel im ``-Parameter anzugeben, gib sie einfach verbunden mit einem Doppelpunkt ein:","","`git push origin :`","","Das wird üblicherweise Refspec (Referenz-Spezifikation) genannt. Refspec ist nur ein anderer Name für einen Ort, mit dem Git etwas anfangen kann (wie mit Branch `foo` oder mit `HEAD~2`).","","Sobald du Quelle und Ziel separat angibst, kannst du flexibel und präzise entfernte Branches ansteuern. Hier eine Demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vergiss nicht, `Quelle` ist jeder mögliche Ort, mit dem Git etwas anfangen kann:"],afterMarkdowns:["Boah! Das ist ein ziemlich abgefahrener Befehl gewesen, aber er ist sinnvoll -- Git hat `foo^` zu einem Commit aufgelöst, alle Commits, die bis zu einschließlich diesem noch nicht auf dem Server waren, hochgeladen und dann dort das Ziel aktualisiert."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was wäre wenn das Ziel des `push` gar nicht existiert? Kein Problem! Wenn das Ziel ein Branch-Name ist, wird Git den Branch auf dem Server einfach anlegen."],afterMarkdowns:["Schick, das ist ziemlich praktisch. :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level zu schaffen versuche den dargestellten Zielzustand zu erreichen und vergiss nicht das Format:","","`:`"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` 引数","","前のレッスンでmainブランチをpushする際に、pushするコミットがどこから来て(source)、どこへ行くのか(destination)を``引数で指定したことを思い出してください","","では、sourceとdestinationを別々のブランチにしたい場合はどうすればよいのでしょうか?","","ローカルのfooブランチに存在するコミットをリモートのbarブランチにpushするにはどうすればよいのでしょうか?","","残念ながら、Gitでそれをしようと思っても不可能なのです... ","","というのは冗談です!もちろん可能ですし、Gitはすごく柔軟ですから!(正直過剰な程に)","","次の説明に移りましょう"]}},{type:"ModalAlert",options:{markdowns:["``引数でsourceとdestinationを指定するのはとても簡単です。次のようにコロンで連結すればよいのです!","","`git push origin :`","","この書式は一般的にコロンRefspecと呼ばれています。Refspecとは、ブランチや、HEAD~1等といったGitが解決できる場所を表す名称です。","","sourceとdestinationを別々に指定すると、よりきめ細やかなブランチ操作がリモートコマンドで行うことができます。","","それでは実際にデモを見ていきましょう!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["sourceはgitが解決できる場所であればどこでも良いことを思い出してください。"],afterMarkdowns:["うわぁ!これはかなり奇抜な見た目のコマンドです...が実は理にかなっています。","","Gitはfoo^の場所を解決し、リモートに存在していないコミットをアップロードして、destinationに指定されたmainブランチを更新しました。"],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["存在していないブランチにpushしようとするとどうなると思いますか?心配ご無用です!","","Gitは与えられた名前を利用してリモート上にブランチを作成してくれます!"],afterMarkdowns:["うん、とても良いですね。"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルでは、ゴールで示されている状態になるように挑戦してください。困ったときはこの書き方を思い出してくださいね。","","`:`"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Подробности аргумента `<пункт назначения>`","","Помните, когда в прошлом занятии мы указали в качестве аргумента ветку `main` для команды git push, мы указали совместно *источник*, откуда будут приходить коммиты, и *пункт назначения (получатель)*, куда коммиты будут уходить.","","Однако, вы, наверное, задаётесь вопросом - а что, если я хочу, чтобы мои источник и получатель коммитов были различными? Что, если мы хотим запушить коммиты из локальной ветки `foo` в ветку `bar` на удалённом репозитории?","","К огромному сожалению, это невозможно сделать средствами git... Да ладно! Я пошутил! Конечно, это возможно :)... git сам по себе достаточно гибок (даже слишком).","","Мы увидим, как именно, на следующем слайде..."]}},{type:"ModalAlert",options:{markdowns:["В том случае, когда вам необходимо разделить источник и получатель аргумента `<пункт назначения>`, соедините их вместе, используя двоеточие:","","`git push origin <источник>:<получатель>`","","Обычно это называется `refspec`. Refspec — это всего лишь модное имя для определения местоположения, которое git может распознать (например, ветка `foo` или просто `HEAD~1`)","","Как только вы указали источник и получатель независимо друг от друга, вы можете довольно причудливо и точно использовать команды для работы с удалёнными ветками и репозиториями. Давайте взглянем на демонстрацию!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Помните, `источник` - всего лишь местоположение, которое git должен понять:"],afterMarkdowns:["Вау! Это довольно нетривиальная команда, однако она имеет смысл - git видит в `foo^` не что иное, как местоположение, закачивает все коммиты, которые не присутствуют на удалённом репозитории, и затем обновляет получателя."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А что если пункт назначения, в который вы хотите запушить, не существует? Без проблем! Укажите имя ветки, и git сам создаст ветку на удалённом репозитории для вас."],afterMarkdowns:["Класс! Довольно легко! :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Для выполнения данного уровня попытайтесь привести своё дерево к такому же виду, как на визуализации. И не забудьте о формате:","","`<источник>:<получатель>`"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` 인자에 대한 세부사항들","","","기억하세요? 이전 강의에서 우리는 `main`를 커밋의 근원이되는 *source*와 목적지가 되는 *destination*으로 명령어의 인자로 넣어줌으로써 지정해줬습니다.","여러분은 이런 생각이 들 수 있어요 -- 내가 source와 destination이 다르길 원하면 어떻게 해야되지? 로컬의 `foo` 브랜치에서 원격의 `bar` 브랜치로 커밋을 push하고 싶으면 어떻게 해야 되지?","","사실 git에서는 그게 불가능합니다... 네 농담이고! 당연 가능합니다 :)... git의 어마무시하게 유연합니다(지나칠정도로요).","","어떻게 하는지는 다음 슬라이드에서 확인해봅시다..."]}},{type:"ModalAlert",options:{markdowns:["source와 destination을 모두 지정하기 위해서는, 이렇게 간단히 두개를 콜론을 사이에 두고 표현하면 됩니다.","","`git push origin :`","","이것을 일반적으로 colon refspec(콜론 참조스펙)이라고 부릅니다. 참조스펙은 그냥 \"git이 알아낼 수 있는 위치\"를 이름 붙여서 말하는거에요 (브랜치 'foo'라던가 HEAD~1 라던가)","","source와 destination을 따로 지정할 수 있게 되면서, 이제 원격관련 명령어를 좀 멋지고 정확히 사용할수 있게 되었어요. 데모를 봅시다!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["기억하세요, `source`는 git이 이해하는 아무 위치를 말합니다.:"],afterMarkdowns:["워 뭔가 잘 안쓸것 같은 명령이지만 잘 됩니다 -- git은 `foo^`의 위치를 알아내서 원격 저장소에 아직 반영되지 않은 커밋들을 업로드하고 destination 브랜치를 갱신했습니다."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["만약 여러분이 push하고 싶은 destination(목적지)가 없으면 어떻게하죠? 아무 문제 없어요! git이 만들 새 브랜치 이름을 지어주면 git이 원격 저장소에 새 브랜치를 만들어 줄거에요."],afterMarkdowns:["좋네요, 번지르르 삐까뻔쩍 :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨에서는, goal 시각화에 나오는 것처럼 만들어 주세요 인자의 형식은 다음과 같다는걸 기억하세요:","","`:`"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Детальніше про аргумент ``","","З попереднього уроку нам відомо, що коли ми вказуємо `main` в якості аргумента place для git push, ми задаємо і гілку, *з якої* брати нові коміти, і гілку *до якої* їх буде перенесено.","","Тут ти можеш задуматись, а чи можуть гілки, звідки беремо, і куди переносимо, бути різними? Що, коли потрібно коміти з локальної гілки `foo` перенести у віддалену гілку `bar`?","","Нажаль в git це неможливо... жартую! Звісно, що можливо :)... git просто неймовірно гнучкий (іноді аж занадто).","","Подивімося як це робиться..."]}},{type:"ModalAlert",options:{markdowns:["Для того, щоб в одному аргументі `` вказати і місце звідки і куди, треба їх просто розділити двокрапкою:","","`git push origin :`","",'Такий запис називають "colon refspec". Тут refspec - це просто зручна назва місця, яке git може ідентифікувати (наприклад, гілка `foo` чи просто `HEAD~1`)',"","Можливість вказати два різних місця дає велику свободу і гнучкість в роботі з віддаленим репозиторієм. Подивімось демонстрацію!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Пам'ятай, `source` -- це будь-яка назва місця, зрозуміла гіту:"],afterMarkdowns:["Овва! Це доволі незвична команда, але тут все має сенс -- git, знаючи куди вказує `foo^`, завантажив на віддалену сторону ще відсутні там коміти і оновив місце призначення."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А що, коли вказаного місця призначення не існує? Нема проблем! Просто вкажи назву гілки і гіт створить її на віддаленому сервері."],afterMarkdowns:["Спритно, еге-ж? :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["На цьому рівні спробуй досягти стану ропозиторію, показаного у візуалізації і пам'ятай про формат запису з двокрапкою:","","`:`"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Chi tiết về tham số ``","","Nhớ lại học trước, khi chỉ định tham số `` là `main` cho lệnh `git push`, ta cũng đã chỉ định nguồn và đích cho các commit.","","Có thể bạn sẽ thắng mắc -- Nếu như ta muốn nguồn và đích khác đi thì sao? Nếu như ta muốn đẩy commit từ nhánh cục bộ `foo` lên nhánh từ xa `bar` thì sao?","","Chà đáng tiếc là điều này là bất khả thi tron Git... đùa thôi! Tất nhiên là làm được chứ :)... Git có nhiều và rất nhiều lựa chọn linh động (có lẽ là quá nhiều)","","Hãy xem cách nó hoạt động..."]}},{type:"ModalAlert",options:{markdowns:["Để chỉ định `` cho cả nguồn và đích, chỉ cần sử dụng dấu hai chấm `:` để kết nối cả hai:","","`git push origin :<đích>`","",'Giá trị thực của tham số này là một refspec, "refspec" là một từ tự tạo, nghĩa là một vị trí Git có thể nhận ra (chẳng hạn như nhánh `foo` hoặc `HEAD ~ 1`).',"","Một khi bạn đã chỉ định các nguồn và đích độc lập, bạn có thể thao tác với kho chứa từ xa một cách khá thú vị và chính xác, hãy xem bản demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nhớ rằng, `nguồn` là bất kỳ vị trí nào mà Git hiểu:"],afterMarkdowns:["Wao! Lệnh này khá phức tạp, nhưng mà hợp lý -- Git diễn giải `foo^` thành một vị trí, tải lên tất cả các commit từ đó trở về trước mà chưa có trên nhánh đích rồi cập nhật nó."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu như đích đến mà bạn muốn không tồn tại thì sao? Chẳng sao cả! Đơn giản hãy gõ tên nhánh và Git sẽ tạo nhánh đó trên kho chứa từ xa cho bạn."],afterMarkdowns:["Tuyệt vời, thấy Git thú vị không :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ở cấp độ này, hãy hoàn thành mục tiêu được mô tả, và hãy nhớ cấu trúc:","","`:<đích>`"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Podrobnosti `` argumenta","","Spomni se prejšnje lekcije, kjer smo določili `main` kot place argument za git push, določili smo *izvor* iz kje bodo commiti prišli in *destinacijo*, kamor bodo commiti odšli.","","Morda se sprašuješ -- kaj če želimo, da sta izvor in destinacija različna? Kaj če želiš pushati commite iz lokalnega `foo` brancha na oddaljen `bar` branch?","","Nažalost to v gitu ni možno ... hecam se! Seveda je možno :) ... git ima ogromno opcij (skoraj preveč).","","Poglejmo kako v naslednjem razdelku ..."]}},{type:"ModalAlert",options:{markdowns:["Da bi določili in izvor in destinacijo ``, preprosto združimo oba skupaj z dvopičjem:","","`git push origin :`","","To je pogosto omenjeno kot dvopična referenca. Ta referenca je samo ime za lokacijo, ki jo lahko git razvozla (kot je branch `foo` ali samo `HEAD~1`).","","Ko enkrat določiš izvor in destinacijo neodvisno, lahko oddaljene ukaze uporabljaš zelo natačno in učinkovito. Poglejmo si primer!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pomni, `source` je bilokatera lokacija, ki jo git razume:"],afterMarkdowns:["Woah! To je kar zanimiv ukaz, ampak ima smisel -- git je razrešil `foo^` v lokacijo, naložil commite, ki še niso bili prisotni v oddaljenem repotu in nato posodobil destinacijo."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj če destinacija kamor želiš pushati ne obstaja? Ni problem! Samo podaj ime brancha in git bo naredil branch na oddaljenem repotu zate."],afterMarkdowns:["Lepa, to je kar kul :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Za to stopnjo poizkusi priti v ciljno stanje, prikazano v vizualizaciji in si zapomni obliko:","","`:`"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Szczegóły argumentu ``","","Przypomnij sobie, że na poprzedniej lekcji określając `main` jako argument miejsca dla polecenia git push, wybraliśmy zarówno *źródło*, z którego mają pochodzić commity, jak i *cel*, do którego mają trafić.","","No i może zastanawiasz się teraz -- co by było, gdybyśmy chcieli, żeby źródło i cel były różne od siebie? Co, gdybyśmy chcieli wypchać commity z lokalnej gałęzi `foo` do zdalnej gałęzi `bar`?","","Cóż... niestety w Gicie nie da się tego zrobić... Żart! Jasne, że się da :) Git jest bardzo, bardzo elastyczny (może aż za bardzo).","","Zobaczmy, jak bardzo, na następnym slajdzie..."]}},{type:"ModalAlert",options:{markdowns:["Aby określić zarówno źródło, jak i cel dla ``, po prostu połącz je dwukropkiem:","","`git push origin :`","","To nic innego jak refspec z dwukropkiem. Refspec to tylko wymyślny termin oznaczający lokalizację, którą Git potrafi zidentyfikować (na przykład gałąź `foo` albo po prostu `HEAD~1`).","","Kiedy już zaczniesz określać niezależnie źródła i cele, to możesz trochę zaszaleć na zdalnych repozytoriach. Zobaczmy demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pamiętaj, że `source` (źródło) to dowolna lokalizacja, którą Git zrozumie:"],afterMarkdowns:["Łaaał! Niezły odlot, ale jest w tym poleceniu jakiś sens -- Git zinterpretował `foo^` jako konkretną lokalizację, wrzucił tam wszystkie commity, jakich brakowało jeszcze w zdalnym repo, i na koniec zaktualizował cel."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A co, jeśli miejsce, do którego chcesz zrobić push, nie istnieje? Żaden problem! Wybierz tylko nazwę dla gałęzi, a Git stworzy ją dla ciebie w zdalnym repozytorium."],afterMarkdowns:["Pięknie! Całkiem sprytne! :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Na tym poziomie postaraj się uzyskać drzewo takie jak na wizualizacji, i pamiętaj o formacie:","","`<źródło>:`"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Dettagli sul parametro ``","","Ricorderai dalle lezioni precedenti che quando abbiamo specificato `main` come parametro place per git push, abbiamo specificato sia la *fonte* di provenienza dei commit che la *destinazione* d'arrivo.","","Potresti star pensando -- e se volessimo che la fonte e la destinazione fossero distinte? Se volessi caricare con push dei commit dal ramo locale `foo` verso il ramo remoto `bar`?","","Sfortunatamente ciò non è possibile in git... scherzetto! Ovviamente lo possiamo fare :)... git è davvero molto flessibile (forse troppo).","","Vediamo come nella prossima slide..."]}},{type:"ModalAlert",options:{markdowns:["Per specificare sia la fonte che la destinazione di ``, basta unire le due tramite i due punti:","","`git push origin :`","","Questo è comunemente conosciuto come colon refspec (*colon* sono i due punti). Refspec è solo un nome complicato per riferirsi ad una posizione che git può interpretare (come il ramo `foo` o anche solo `HEAD~1`).","","Potendo specificare sia fonte che destinazione in maniera indipendente, puoi sfruttare i comandi remoti in maniera molto precisa. Vediamo una demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ricorda, `source` può essere una qualsiasi posizione che git può capire:"],afterMarkdowns:["Wow! Un comando bello contorto ma sensato -- git ha interpretato `foo^` come una posizione, caricato i commit che non erano presenti nel repository remoto, e poi aggiornato la destinazione."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se la destinazione alla quale vuoi caricare i dati non esiste? Nessun problema! Basta specificare il nome di un ramo e git lo creerà sul remoto per te."],afterMarkdowns:["Facile così :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Per questo livello, prova a raggiungere lo stato finale mostrato nella finestra obiettivo, e ricorda il formato:","","`:`"]}}]}}}},{}],151:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22o/main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22main%22%5D%7D%2C%22side1%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22side1%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22side2%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22side2%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22side3%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22side3%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C6%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C8%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C8%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C8%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C8%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C8%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C8%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D",solutionCommand:"git fetch;git rebase o/main side1;git rebase side1 side2;git rebase side2 side3;git rebase side3 main;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]},"side1":{"target":"C2","id":"side1","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side2":{"target":"C4","id":"side2","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side3":{"target":"C7","id":"side3","remoteTrackingBranchID":null,"localBranchesThatTrackThis":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":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"side3","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C8","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C8":{"parents":["C1"],"id":"C8"}},"HEAD":{"target":"main","id":"HEAD"}}}',hint:{en_US:"Remember you can always use the undo or reset commands",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.",ja:"undoやresetコマンドをいつでも使用することができるのをお忘れなく",fr_FR:"Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.",ru_RU:"Помни - ты всегда можешь отменить команды с помощью undo или reset",ko:"명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요",uk:"Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset",vi:"Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh",sl_SI:"Vedno lahko razveljaviš ukaz ali ponastaviš stopnjo.",pl:"Pamiętaj, że zawsze możesz skorzystać z poleceń undo i reset",it_IT:"Ricorda che puoi sempre usare i comandi undo e reset"},name:{en_US:"Push Main!",zh_CN:"推送主分支",zh_TW:"push main!",es_AR:"¡Push Main!",es_ES:"¡Push Main!",pt_BR:"Push Main!",gl:"Empurra ó Main!",de_DE:"Push Main!",ja:"Push Main!",fr_FR:"Maître du push !",ru_RU:"Push Мастер!",ko:"Push Main!",uk:"Push Maйстер!",vi:"Push Main!",sl_SI:"Push Main!",pl:"Wypychanie dla wytrwałych!",it_IT:"Push main!"},compareOnlyMainHashAgnostic:!0,startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Merging feature branches","","Now that you're comfortable with fetching, pulling, and pushing, let's put these skills to the test with a new workflow.","","It's common for developers on big projects to do all their work on feature branches (off of `main`) and then integrate that work only once it's ready. This is similar to the previous lesson (where side branches get pushed to the remote), but here we introduce one more step.","","Some developers only push and pull when on the `main` branch -- that way `main` always stays updated to what is on the remote (`o/main`).","","So for this workflow we combine two things:","","* integrating feature branch work onto `main`, and","* pushing and pulling from the remote"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see a refresher real quick of how to update `main` and push work."],afterMarkdowns:["We executed two commands here that:","","* rebased our work onto new commits from remote, and","* published our work to the remote"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["This level is pretty hefty -- here is the general outline to solve:","","* There are three feature branches -- `side1` `side2` and `side3`","* We want to push each one of these features, in order, to the remote","* The remote has since been updated, so we will need to incorporate that work as well","",":O intense! good luck, completing this level is a big step."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Fusionner les feature branches","","Maintenant que vous êtes habitué à fetch, pull et push, mettons ces compétences à profit avec une autre approche de travail.","","Il est commun pour les développeurs de gros projets de faire tout leur travail dans des \"feature branches\" dédiées à une fonctionnalité (en dehors de `main`) et d'intégrer ce travail au reste seulement une fois qu'il est prêt. C'est similaire à la leçon précédente (où les branches secondaires étaient pushées sur le dépôt distant), mais ici nous introduisons une étape supplémentaire.","",'Certains développeurs utilisent la méthode "push puis pull" uniquement sur la branche `main` : de cette manière `main` reste toujours à jour avec ce qu\'il y a sur le dépôt distant (`o/main`).',"","Cette approche combine donc deux choses :","","* intégrer le travail présent depuis la feature branch (la fonctionnalité développée) vers `main`, puis","* pusher et puller sur le dépôt distant."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Rappelons-nous rapidement comment mettre à jour `main` et envoyer (push) le travail."],afterMarkdowns:["Nous exécutons ici deux commandes :","","* on rebase notre travail sur de nouveaux commits, puis","* on publie notre travail sur le dépôt distant"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ce niveau est assez conséquent; voici l'idée générale de la solution :","","* Il y a trois feature branches : `side1` `side2` et `side3`","* Nous voulons envoyer chacune de ces modifications, dans l'ordre, sur le dépôt distant","* Le dépôt distant a été mis à jour entre-temps, donc nous avons aussi besoin d'intégrer ce travail","",":O difficile ! bonne chance, finir ce niveau est une grande étape."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mergeando feature branches","","Ahora que fetcheás, pulleás y pusheás sin problemas, pongamos a prueba estas habilidades con un nuevo flujo de trabajo.","","Es bastante común que quienes desarrollan en los grandes proyectos trabajen sobre ramas específicas para cada tarea (feature branches) basadas en `main`, y que las integren sólo cuando están listas. Esto es similar a la lección anterior, en que pusheabamos las ramas periféricas al remoto, pero acá tenemos un paso más.","","Hay quienes sólo pushean y pullean cuando están en `main`: de ese modo, `main` siempre se mantiene actualizado con el remoto (`o/main`).","","Entonces, en este flujo de trabajo combinamos dos cosas:","","* integramos el trabajo de las ramas específicas a `main`, y","* pusheamos y pulleamos del remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Refresquemos un poco cómo actualizar `main` y pushear nuestro trabajo."],afterMarkdowns:["Acá 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. Acá tenés algunos lineamientos para resolverlo:","","* Tenemos tres ramas específicas -- `side1` `side2` and `side3`","* Queremos pushear 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 ¡Intenso! ¡Éxitos! Completar este nivel representa un gran avance."]}}]},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 `main`, 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 `main`: de ese modo, `main` siempre se mantiene actualizado con el remoto (`o/main`).","","Entonces, en este flujo de trabajo combinamos dos cosas:","","* integramos el trabajo de las ramas específicas a `main`, y","* pusheamos y pulleamos del remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Refresquemos un poco cómo actualizar `main` 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:[{type:"ModalAlert",options:{markdowns:["## Merge de ramos de funcionalidades","","Agora que você está confortável com fetch, pull e push, vamos colocar essas habilidades em teste com um novo fluxo de trabalho.","","É comum para desenvolvedores de grande projetos fazer todo o trabalho em ramos de funcionalidades (fora do `main`) e então integrar esse trabalho uma única vez quando ele estiver pronto. Isso é similar à lição anterior (onde ramos laterais eram enviados ao repositório remoto), mas introduzimos mais um passo.","","Alguns desenvolvedores só fazem push e pull quando no ramo `main` -- desta forma o `main` sempre se mantém atualizado com aquilo que está no ramo remoto (`o/main`).","","Então, para este fluxo de trabalho, combinaremos duas coisas:","","* Integrar ramos de funcionalidade no `main`, e","* Realizar push e pull do repositório remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos refrescar a memória sobre como atualizar o `main` e enviar trabalho."],afterMarkdowns:["Nós executamos dois comandos aqui que:","","* Fizeram rebase de nosso trabalho nos novos commits do repositório remoto, e","* Publicaram nosso trabalho no repositório remoto"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Esse nível é um pouco pesado -- aqui está a linha geral de como resolver:","","* Há três ramos de funcionalidades -- `side1`, `side2` e `side3`","* Queremos enviar cada uma dessas funcionalidades, em ordem, para o repositório remoto","* O repositório remoto foi atualizado desde então, então também precisaremos incorporar o trabalho realizado lá","",":O intenso! boa sorte, completar este nível é um grande passo."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mesturando ramas","","Agora que estás afeito a descargar, mesturar e empurrar, poñamos a proba estas habilidades cun novo fluxo de traballo.","","É bastante común que os desenvolvedores nos grandes proxectos traballen sobre ramas específicas para cada tarefa (feature branches) baseadas en `mater`, e que as integren só cando están preparadas. Esto é similar á lección anterior, na que empurrábamos as ramas periféricas ó remoto, pero acá temos un paso máis.","","Algúns desenvovledores só empurran e descargan cando están en `main`: de ese xeito, `main` sempre mantén actualizado o seu estado co remoto (`o/main`).","","Entón, neste fluxo de traballo combinamos dúas cousas:","","* integramos o traballo das ramas específicas a `main`, e","* empurramos e turramos do remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Refresquemos un pouco cómo actualizar `main` e empurrar o noso traballo."],afterMarkdowns:["Agora executamos dous comandos que:","","* rebasamos o noso traballo sobre os novos commits do remoto, e","* publicamos o noso traballo nese remoto"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Este nivel é bastante pesado. Aquí tes algúns patróns para resolvelo:","","* Temos tres ramas específicas -- `side1` `side2` e `side3`","* Queremos empurrar cada unha de esas ramas, en orde, ó remoto","* O remoto foi actualizado, así que imos ter que integrar eses cambios tamén","",":O ¡Intenso! ¡Éxitos! Completar este nivel representa un grande avance."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## merge feature branch","","現在你已經很熟悉 fetch、pull 以及 push,讓我們來針對一個新的問題來應用這些技巧。","","在一個大型的專案裡面,程式設計師經常會在 feature branch(有別於 main branch)上面做開發,之後等開發完之後,在一次 merge 回去。這跟之前的課程是很類似的(其它的 branch 被 push 到 remote),但是現在我們還要再多介紹一個步驟。","","某些程式設計師只針對 `main` branch 進行 push 或者是 pull。這樣子的話 `main` 一直都保持跟 remote (`o/main`) 同步。","","所以針對這個問題我們結合了兩件事情:","","* merge feature branch 到`main` branch,並且","* push remote 以及 pull remote"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們馬上來實際看一下如何更新 `main` 並且 push 到 remote。"],afterMarkdowns:["我們在這裡執行兩個指令:","","* rebase 我們的 branch 到 remote 的新的 commit 上面,並且","* 發佈到 remote 上面"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["這個關卡很複雜,這裡有一些提示:","","* 總共有三個 feature branch,分別是 `side1`,`side2` 以及 `side3`","* 我們想要將這三個 branch 分別 push 到 remote。","* 但是 remote 已經被事先更新過了,所以我們必須要先同步那些更新。","",":O 很好!祝你好運,完成這個關卡是一個很重要的步驟。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Einen Feature Branch reintegrieren","","Nun da du mit `fetch`, `pull`, und `push` vertraut bist, sollten wir diese Fähigkeiten mit einem neuen Arbeitsablauf auf die Probe stellen.","","Für Entwickler in großen Projekten ist es nicht ungewöhnlich ihre Arbeit in Feature Branches (von `main` abgeleitet) zu erledigen und dann diese Inhalte zu reintegrieren, wenn sie fertig sind. Das ist ähnlich dem vorherigen Level (in dem ein Feature Branch auf den Server geschoben wird), nur mit einem zusätzlichen Schritt.","","Einige Entwickler pushen und pullen nur auf dem `main` -- dadurch ist `main` immer aktuell zu seinem Gegenstück auf dem Server (`o/main`).","","Für diesen Ablauf werden wir also zwei Dinge kombinieren:","","* einen Feature Branch in `main` reintegrieren und","* vom entfernten Server pushen und pullen."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns zur Erinnerung schnell noch mal an, wie man den `main` aktualisiert und seine Commits pusht."],afterMarkdowns:["Wir haben hier zwei Befehle ausgeführt, die:","","* unsere Commits auf die neuen Commits vom Server gepackt und","* unsere Commits zum Server gepusht haben."],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Dieser Level ist ziemlich heftig -- hier ist im Groben der Weg:","","* Es gibt drei Feature Branches -- `side1`, `side2` und `side3`.","* Wir möchten jedes dieser Features, in dieser Reihenfolge, auf den Server bringen.","* Der Server hat Commits, die wir noch nicht haben, diese müssen also bei uns integriert werden.","",":O Krass! Viel Erfolg, diesen Level zu schaffen ist ein großer Schritt."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 合并特性分支","","既然你应该很熟悉 fetch、pull、push 了,现在我们要通过一个新的工作流来测试你的这些技能。","","在大型项目中开发人员通常会在(从 `main` 上分出来的)特性分支上工作,工作完成后只做一次集成。这跟前面课程的描述很相像(把 side 分支推送到远程仓库),不过本节我们会深入一些.","","但是有些开发人员只在 main 上做 push、pull —— 这样的话 main 总是最新的,始终与远程分支 (o/main) 保持一致。","","对于接下来这个工作流,我们集成了两个步骤:","","* 将特性分支集成到 `main` 上","* 推送并更新远程分支"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["让我们看看如何快速的更新 `main` 分支并推送到远程。"],afterMarkdowns:["我们执行了两个命令: ","","* 将我们的工作 rebase 到远程分支的最新提交记录","* 向远程仓库推送我们的工作"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["这个关卡的 Boss 很厉害 —— 以下是通关提示:","","* 这里共有三个特性分支 —— `side1` `side2` 和 `side3`","* 我需要将这三分支按顺序推送到远程仓库","* 因为远程仓库已经被更新过了,所以我们还要把那些工作合并过来","",":O 紧张了?祝你好运!完成了本关, 你就向目标又迈近了一大步啦!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Слияние фича-бранчей (веток)","","Теперь, когда вы умело владеете командами fetch, pull и push, давайте применим эти навыки в сочетании с новым рабочим процессом (он же workflow).","","Среди разработчиков, вовлечённых в большой проект, довольно распространённ приём — выполнять всю свою работу в так называемых фича-бранчах (вне `main`). А затем, как только работа выполнена, разработчик интегрирует всё, что было им сделано. Всё это, за исключением одного шага, похоже на предыдущий урок (там, где мы закачивали ветки на удалённый репозиторий)","","Ряд разработчиков делают push и pull лишь на локальную ветку `main` - таким образом ветка `main` всегда синхронизирована с тем, что находится на удалённом репозитории (`o/main`).","","Для этого рабочего процесса мы совместили две вещи:","","* интеграцию фича-бранчей в `main`","* закачку (push) и скачку (pull) с удалённого репозитория"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте быстренько вспомним, как нам обновить `main` и закачать выполненную работу."],afterMarkdowns:["Здесь мы выполнили две команды, которые:","","* перебазировали нашу работу на новенький коммит, пришедший с удалённого репозитория, и","* закачали свои наработки в удалённый репозиторий"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Текущая задача является достаточно обильной - здесь представлена общая схема выполнения:","","* Есть три фича-бранчи (фича-ветки) - `side1` `side2` и `side3`","* Нам необходимо закачать каждую из них по очереди на удалённый репозиторий","* При этом удалённый репозиторий хранит в себе какие-то наработки, которые также следует скачать к себе","",":O Сложно! Желаю вам удачи в выполнении этой непростой задачи."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 機能別のブランチ(フィーチャーブランチ)をマージする","","今や、あなたは`fetch`、`pull`、`push`を十分に使えるようになったでしょうから、そのスキルを新しい作業の流れで試してみましょう。","","大きなプロジェクトの開発者にとって、フィーチャーブランチ(`main`を除く)上で全ての作業を行い、完成したら一度でその作業を統合するというような流れが一般的です。これは前のレッスンの内容(他のブランチからリモートにプッシュされるような状況のところが)に似ていますが、ここではもう一歩踏み込んで解説しましょう。","","開発者は、`main`ブランチにいるときプッシュとプルしかしません -- `main`は常にリモート(`o/main`)に追従した状態のままにします。","","この作業の流れでは、私たちは二つのことを組み合わせています:","","* `main`にフィーチャーブランチの作業を統合し、","* リモートへの`push`と`pull`を行う"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`main`の更新と作業の反映の方法を手早く復習しましょう。"],afterMarkdowns:["我々はここで二つのコマンドを動かしました:","","* リモートから新しいコミットを我々の作業にリベースし、","* リモートに我々の作業を公開しました"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["このレベルはかなり難しいです -- ここに解答の一般的な道のりを示しておきます:","","* 三つのフィーチャーブランチ、`side1`、`side2`、`side3`があります。","* この機能をそれぞれ、この順に、リモートにプッシュしてください。","* リモートが更新されたなら、次はより良く作業を統合する方法を紹介しましょう。","",":O これはきつそうだ!このレベルを完了させることは大きな一歩となります。幸運を祈ります。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## feature 브랜치 병합하기","","이제 여러분은 fetch, pull, push하는데에 익숙해졌을겁니다. 연마한 기술들을 새로운 상황에서 시험 해봅시다.","","개발자들은 주로 큰 프로젝트를 개발할때 작업을 feature 브랜치(=토픽브랜치 / `main`브랜치가 아닌 작업을위해 임시로 만든 브랜치를 말합니다)들에 하고 준비가 되면 그 작업을 통합합니다. 이전 강의와 비슷한 모습인데(사이드 브랜치들을 원격저장소로 push한것), 여기서 한 단계 더 나아가 봅시다. ","","어떤 개발자들은 `main` 브랜치에 있을때만 push와 pull을 수행합니다 -- 이렇게하면 `main`는 항상 원격 브랜치 (`o/main`)의 상태와 항상 최신의 상태로 유지될 수 있습니다.","","이런 작업흐름은 두가지 작업을 같이하게됩니다 :","","* feature 브랜치의 작업을 main 브랜치로 통합하는것과","* 원격저장소에서 push하고 pull하는 작업입니다"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["다음을 보고 `main`를 갱신하고 작업을 push하는 방법을 다시 떠올려봅시다."],afterMarkdowns:["여기서 우리는 두개의 명령어를 실행 했습니다 :","","* 우리의 작업을 원격 저장소의 새 커밋들로 리베이스한 후","* 우리 작업을 원격저장소로 push했습니다."],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["이번 레벨은 꽤 덩치가 큽니다 -- 문제에대한 대략적인 설명을 해드리겠습니다 :","","* 세개의 feature 브랜치가 있습니다 -- `side1`, `side2` 그리고 `side3` 가 있습니다.","* 각각의 브랜치를 순서에 맞게 원격 저장소로 push하고 싶습니다.","* 원격 저장소가 최근에 갱신된적이 있기때문에 그 작업또한 포함시켜야 합니다.","",":O 이야 할게 많습니다! 행운을 빕니다, 이번 레벨은 많은걸 요구합니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Мердж гілок з фічами","","Тепер, коли ти вже впевнено володієш засобами `pull` та `push`, час перевірити ці знання в новому процесі.","","Зазвичай розробники працюють над якимось фічами в окремій гілці (не в `main`), а потім, коли роботу закінчено, інтегрують її. Це схоже на попередній урок (де окремі гілки пушили у віддалений репозиторій), але тут буде ще один додатковий крок.","","Деякі розробники виконують push і pull лише в гілці `main` -- тож `main` завжди буде актуальним і синхронізованим з віддаленою гілкою (`o/main`).","","Отже для цього процесу ми об'єднуємо дві речі:","","* інтеграцію гілки з фічею в `main`, і","* пул та пуш для синхронізації з віддаленим репозиторієм"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Пригадаймо коротко як оновити `main` і запушити свої зміни."],afterMarkdowns:["Ми виконали дві команди, які:","","* заребейсили нашу роботу поверх віддалених комітів, і","* опублікували наші зміни у віддаленому репозиторії"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Цей рівень доволі величенький -- ось, що треба буде зробити:","","* Є три гілки з фічами -- `side1` `side2` та `side3`","* Ми хочемо запушити кожну з них по черзі у віддалений репозиторій","* Віддалений репозиторій теж змінився, тож нам потрібно об'єднати всі ці зміни","",":O Чимале завдання! Успіху! Виконання цього рівня буде великим кроком."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Sáp nhập các nhánh tính năng","","Giờ thì bạn đã quen thuộc với tìm nạp, kéo và đẩy, bây giờ chúng tôi sẽ kiểm tra kỹ năng của bạn với một quy trình làm việc mới.","","Trong các dự án lớn, các nhà phát triển thường làm việc trên các nhánh tính năng (feature branch) (được phân nhánh từ `main`) và chỉ thực hiện tích hợp sau khi công việc hoàn thành. Điều này tương tự như mô tả trong bài học trước (đẩy nhánh bên sang kho lưu trữ từ xa), nhưng chúng ta sẽ đi sâu hơn một chút trong phần này.","","Một vài nhà phát triển chỉ thực hiện đẩy và kéo khi ở trên nhánh `main` -- như vậy thì nhánh `main` luôn luôn được cập nhật với nhánh từ xa (`o/main`).","","Vậy nên với quy trình làm việc này chúng tôi đã kết hợp 2 việc:","","* tích hợp nhánh chức năng lên nhánh `main`, và","* đẩy và kéo từ nhánh từ xa"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy xem qua cách cập nhật nhánh `main` và đẩy lên nhánh từ xa hoạt động như thế nào."],afterMarkdowns:["Ta thực thi 2 câu lệnh làm việc sau:","","* tái bố trí (`rebase`) thành quả của ta lên commit của nhánh từ xa, và","* xuất bản thành quả của ta lên nhánh từ xa"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Cấp độ này khá là phức tạp đấy -- để hoàn thành thì hãy xem qua hướng dẫn cơ bản sau:","","* Có 3 nhánh chức năng là -- `side1`, `side2` và `side3`","* Chúng tôi muốn bạn đẩy từng nhánh chức năng, theo thứ tự, lên nhánh từ xa","* Nhánh từ xa cũng đã được cập nhật, nên ta cũng cần sáp nhập thay đổi đó nữa","",":O khoai đây! Cố lên nhé, hoàn thành cấp độ này là lên trình nhiều lắm đấy."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Merganje funkcionalnih branchev","","Sedaj, ko se počutiš udobno s fetchanjem, pullanjem in pushanjem, preizkusimo ta znanja z novimi primeri.","","Za razvijalce na velikih projektih je pogosto, da delajo vse svoje stvari na funkcionalnih brancih (ne na `main`) in potem vključijo to delo, ko je končano. To je podobno prejšnjim lekcijam (kjer so bili pushani stranski branchi na oddaljen repo), a tu predstavljamo še en korak.","","Nekateri razvijaci samo pushajo in pullajo na `main` branchu -- zato `main` vedno ostane posodobljen z oddaljenim masterjem (`o/main`).","","Torej za tak primer uporabe, združimo dve stvari:","","* vključevanje dela funkcionalnih branchev na `main` in","* pushanje in pullanje iz oddaljenega repota"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Osvežimo si na hitro, kako posodobiti `main` in pushati delo."],afterMarkdowns:["Izvedli smo dva ukaza, ki:","","* rebasata naše delo na nove commite iz oddaljenega repozitorija in","* objavita naše delo na oddaljen repozitorij"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ta stopnja je kar zajetna -- tu je splošno ideja za rešitev:","","* Imamo tri branche -- `side1`, `side2` in `side3`","* Želimo pushati vsako od teh funkcionalnosti po vrstnem redu na oddaljen repo","* Oddaljen repo se je medtem posodobil, zato bomo morali vključiti tudi to delo","",":O Naporno! Srečno, končanje te stopnje je velik korak."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Scalanie gałęzi feature","","Teraz, kiedy fetch, pull ani push nie mają już przed tobą tajemnic, sprawdźmy, jak poradzisz sobie z inną kolejnością działań.","","W dużych projektach często pracuje się na gałęziach tematycznych (zazwyczaj nazywanych `feature`), a nie na `main`, i scala się je dopiero po ukończeniu pracy. To sytuacja zbliżona do tej z poprzedniej lekcji (gałęzie boczne wypychaliśmy do remote), ale tu dodamy jeszcze jeden krok.","","Niektórzy używają push i pull, tylko będąc na gałęzi `main` - dzięki temu `main` zawsze odzwierciedla to, co jest na zdalnej gałęzi (`o/main`).","","Dlatego tym razem połączymy dwie rzeczy:","","* integrację pracy na gałęzi `feature` z `main` oraz","* push i pull ze zdalnego repozytorium"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Przypomnijmy sobie w skrócie, jak uaktualnić `main` i wypchnąć naszą pracę."],afterMarkdowns:["Wykonaliśmy dwa polecenia, które:","","* przebazowały naszą pracę ponad nowymi commitami ze zdalnego repozytorium oraz","* opublikowały naszą pracę na remote"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ten poziom jest dość ciężki: oto ogólny zarys problemu do rozwiązania:","","* Mamy trzy boczne gałęzie: `side1`, `side2` i `side3`","* Każdą z nich chcemy kolejno wypchnąć do zdalnego repozytorium","* Zdalne repo było w tym czasie zmieniane, więc te zmiany również musimy nanieść","",":O Ciężka sprawa... Powodzenia! Ukończenie tego poziomu to duży krok naprzód."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Fondere rami di funzionalità","","Ora che ti sei ambientato con fetch, pull e push, vediamo di testare queste skill in un nuovo flusso di lavoro.","","È comune che gli sviluppatori di grandi progetti svolgano il loro lavoro su dei rami per le funzionalità (feature branch, basati sul `main`). Questo è simile alla lezione precedente (dove rami secondari vengono caricati nel remoto), ma qui aggiungiamo un ulteriore passo.","","Alcuni sviluppatori caricano e scaricano commit solo quando sono sul ramo `main` -- in questo modo `main` rimane sempre aggiornato allo stato del remoto ('`o/main`).","","Quindi per questo flusso di lavoro devi unire due cose:","","* integrare feature branch a partire dal `main`, e","* usare push e pull verso il repository remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diamo una rinfrescata veloce su come aggiornare `main` e caricare il nostro lavoro."],afterMarkdowns:["Abbiamo eseguito due comandi:","","* abbiamo ribasato il nostro lavoro sul nuovo commit dal remoto, e","* abbiamo pubblicato il nostro lavoro sul remoto"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Questo livello è abbastanza impegnativo -- ecco come risolverlo a grandi linee:","","* Ci sono tre feature branch -- `side1` `side2` e `side3`","* Vogliamo caricare ciascuna di queste funzionalità, in ordine, sul remoto","* Il remoto nel mentre è stato aggiornato, quindi dobbiamo prima incorporare quelle modifiche","","tosto :O! buona fortuna, completare questo livello è un gran passo."]}}]}}}},{}],152:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C3","id":"main"},"o/main":{"target":"C1","id":"o/main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"}},"HEAD":{"target":"C4","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git commit;git checkout o/main;git commit",startTree:'{"branches":{"main":{"target":"C1","id":"main"},"o/main":{"target":"C1","id":"o/main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Remote Branches",zh_CN:"远程分支",zh_TW:"remote branch (遠端分支)",es_AR:"Ramas remotas",es_MX:"Ramas remotas",es_ES:"Ramas remotas",pt_BR:"Ramos remotos",gl:"Ramas remotas",de_DE:"Branches auf entfernten Servern",ja:"リモートのブランチ",fr_FR:"Les branches distantes",ru_RU:"Удалённые ветки",ko:"원격 브랜치(remote branch)",uk:"Віддалені гілки",vi:"Nhánh từ xa",sl_SI:"Oddaljeni Branchi",pl:"Zdalne gałęzie",it_IT:"Rami Remoti"},hint:{en_US:"Pay attention to the ordering -- commit on main first!",zh_CN:"注意顺序 —— 先在 main 分支上提交!",zh_TW:"注意順序的問題喔!先在 main branch 上面送 commit",es_AR:"Prestá atención al orden: ¡commiteá sobre main primero!",es_MX:"Presta atención al orden: ¡haz commit sobre main primero!",es_ES:"Presta atención al orden: ¡haz commit sobre main primero!",pt_BR:"Preste atenção na ordem: commite no main primeiro!",gl:"Preta atención á orde: fai commit no main primeiro",de_DE:"Beachte die Sortierung -- committe zuerst auf dem main!",ja:"順番に注意 -- まずmainに対してcommitしましょう",fr_FR:"Prêtez attention à l'ordre -- les commits sur main d'abord !",ru_RU:"Уделяйте внимание очерёдности -- сперва commit на main",ko:"순서에 주의하세요: main 브랜치 에서 먼저 커밋하세요!",uk:"Звертайте увагу на послідовність -- спочатку коміт в мастер!",vi:"Chú ý đến thứ tự -- commit trên nhánh main trước!",sl_SI:"Bodi pozoren na vrsti red -- commitaj najprej na main!",pl:"Zwróć uwagę na kolejność -- najpierw zatwierdzaj na main",it_IT:"Presta attenzione all'ordine -- fai prima un commit sul main!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remote Branches","","Now that you've seen `git clone` in action, let's dive into what actually changed.","","The first thing you may have noticed is that a new branch appeared in our local repository called `o/main`. This type of branch is called a _remote_ branch; remote branches have special properties because they serve a unique purpose.","","Remote branches reflect the _state_ of remote repositories (since you last talked to those remote repositories). They help you understand the difference between your local work and what work is public -- a critical step to take before sharing your work with others.","","Remote branches have the special property that when you check them out, you are put into detached `HEAD` mode. Git does this on purpose because you can't work on these branches directly; you have to work elsewhere and then share your work with the remote (after which your remote branches will be updated).","","To be clear: Remote branches are on your _local_ repository, not on the remote repository."]}},{type:"ModalAlert",options:{markdowns:["### What is `o/`?","","You may be wondering what the leading `o/` is for on these remote branches. Well, remote branches also have a (required) naming convention -- they are displayed in the format of:","","* `/`","","Hence, if you look at a branch named `o/main`, the branch name is `main` and the name of the remote is `o`.","","Most developers actually name their main remote `origin`, not `o`. This is so common that git actually sets up your remote to be named `origin` when you `git clone` a repository.","","Unfortunately the full name of `origin` does not fit in our UI, so we use `o` as shorthand :( Just remember when you're using real git, your remote is probably going to be named `origin`!","","That's a lot to take in, so let's see all this in action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lets check out a remote branch and see what happens."],afterMarkdowns:["As you can see, git put us into detached `HEAD` mode and then did not update `o/main` when we added a new commit. This is because `o/main` will only update when the remote updates."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["To finish this level, commit once off of `main` and once after checking out `o/main`. This will help drive home how remote branches behave differently, and they only update to reflect the state of the remote."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les branches distantes de Git","","Maintenant que nous avons vu `git clone` en action, plongeons dans ce qui a changé.","","La première chose que vous avez peut-être remarquée est qu'une nouvelle branche est apparue dans votre dépôt local appelée `o/main`. Ce type de branche est appelée une branche _distante_ ; les branches distantes ont des propriétés spécifiques car elles servent à un but précis.","","Les branches distantes reflètent _l'état_ des dépôts distants (depuis la dernière fois où vous avez parlé avec ceux-ci). Elles vous aident à comprendre les différences entre votre travail et le travail public -- une étape critique à effectuer avant de partager son travail avec les autres.","","Les branches distantes ont une propriété particulière: quand vous vous rendez dessus (checkout), `HEAD` est détaché. Git fait cela car vous ne pouvez pas travailler sur ces branches directement ; vous devez travailler ailleurs et ensuite partager votre travail avec le dépôt distant (après quoi vos branches distantes seront mises à jour)."]}},{type:"ModalAlert",options:{markdowns:["### Qu'est-ce que `o/`?","","Vous vous demandez peut-être ce qu'est le préfixe `o/` devant ces branches distantes. En pratique, les branches distantes ont aussi une convention de nommage (obligatoire) -- elles sont affichées avec le format :","","* `/`","","Donc, si vous regardez une branche nommée `o/main`, le nom de la branche est `main` et le nom du dépôt distant est `o`.","","La plupart des développeurs nomment leur principal dépôt distant `origin`, pas `o`. C'est si commun que Git configure en fait votre dépôt local pour être nommé `origin` quand vous faîtes un `git clone` du dépôt.","","Malheureusement le nom complet `origin` ne rentre pas dans notre interface graphique et nous utilisons donc `o` comme raccourci :( Rappelez-vous juste que quand vous utilisez le vrai Git, votre dépôt distant est probablement nommé `origin`!","","Cela fait beaucoup d'un coup, donc voyons cela en action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Rendons-nous sur une branche et regardons ce qui se passe."],afterMarkdowns:["Comme vous pouvez le voir, Git nous a mis dans le mode \"detached\" (cf. `HEAD`) puis n'a pas mis à jour `o/main` quand nous avons ajouté un nouveau commit. C'est parce que `o/main` va se mettre à jour uniquement quand le dépôt distant sera mis à jour."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, faites un commit à partir de `main` puis un autre après vous être rendu dans `o/main`. Cela va nous aider à comprendre la différence de comportement des branches distantes, et le fait qu'elles se mettent à jour uniquement pour refléter l'état du dépôt distant."]}}]},es_AR:{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/main`. 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 el resto.","","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)."]}},{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 las muestra con el formato:","","* `/`","","Entonces, si mirás una rama llamada `o/main`, el nombre de la rama es `main`, y el nombre del remoto es `o`.","","La mayoría llama `origin` a su remoto en lugar de `o`. Esto es tan común que git efectivamente crea tu remoto llamándolo `origin` cuando hacés `git clone` de un repositorio.","","Desafortunadamente el nombre `origin` completo no entra en nuestra UI, así que usamos `o` para abreviar :( Simplemente recordá que cuando uses el git real, tu remoto ¡probablemente se llame `origin`!","","Hay mucho para procesar, así que veámoslo en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Checkouteemos una rama remota a ver qué pasa."],afterMarkdowns:["Como ves, git nos puso en el modo detached `HEAD` y no actualizó `o/main` cuando creamos un nuevo commit. Esto es porque `o/main` sólo va a actualizarse cuando el remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, commiteá una vez sobre `main` y una después de checkoutear `o/main`. Esto te va a ayudar a caer en cómo las ramas remotas funcionan distinto, y que sólo se actualizan para reflejar el estado del remoto."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas remotas de git","","Ahora que viste `git clone` en acción, profundicemos en lo que realmente cambió.","","Lo primero que habrás notado es que apareció una nueva rama en nuestro repositorio local llamada `o/main`. A este tipo de ramas se les llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven para un propósito específico.","","Las ramas remotas reflejan el _estado_ de los repositorios remotos (como estaban la última vez que te comunicaste 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 cual tus ramas remotas serán actualizadas).","","Para ser claros: Las ramas remotas están en tu repositorio local, no en el repositorio remoto"]}},{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 siguiente formato:","","* `/`","","Entonces, si observas una rama llamada `o/main`, el nombre de la rama es `main`, y el nombre del remoto es `o`.","","Realmente, la mayoría de los desarrolladores llaman `origin` a su remoto en lugar de `o`. Esto es tan común que git directamente crea tu remoto llamándolo `origin` cuando haces `git clone` de un repositorio.","","Desafortunadamente, el nombre `origin` no cabe 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`!","","Eso es mucho para digerir, así que veámoslo en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hagamos checkout sobre una rama remota y veamos qué pasa."],afterMarkdowns:["Como puedes ver, git nos puso en el modo detached `HEAD` y no actualizó `o/main` cuando creamos un nuevo commit. Esto es porque `o/main` sólo va a actualizarse cuando el remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para terminar este nivel, haz un commit sobre `main` y uno después de hacer checkout a `o/main`. Esto te va a ayudar a aprender cómo se comportan las ramas remotas, y que sólo se actualizan para reflejar el estado del remoto."]}}]},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/main`. 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/main`, el nombre de la rama es `main`, 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/main` cuando creamos un nuevo commit. Esto ocurre porque `o/main` sólo va a actualizarse cuando el remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, haz commit una vez sobre `main` y otra vez después de checkoutear `o/main`. 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:[{type:"ModalAlert",options:{markdowns:["## Ramos Remotos no Git","","Agora que vimos o `git clone` em ação, vamos estudar aquilo que realmente mudou.","","A primeira coisa que você pode ter percebido é que um novo ramo chamado `o/main` aparece no nosso repositório local. Esse tipo de ramo é chamado de ramo _remoto_; ramos remotos possuem propriedades especiais pois eles servem a um propósito único.","","Ramos remotos refletem o _estado_ de repositórios remotos (desde a última vez na qual você falou com eles). Eles ajudam a entender as diferenças entre o trabalho local e o trabalho atualmente público -- um passo crítico a ser dado antes de compartilhar seu trabalho com os outros.","",'Ramos remotos possuem a propriedade especial de, ao sofrerem um checkout, colocarem o repositório em modo "Detached HEAD". O Git faz isso de propósito, porque você não pode trabalhar nesses ramos diretamente; você é obrigado a trabalhar em outro lugar e só então compartilhar seu trabalho com o remoto (depois disso, os ramos remotos serão atualizados).']}},{type:"ModalAlert",options:{markdowns:["### O que é `o/`?","","Você pode estar se perguntando o que o `o/` no início do nome dos ramos remotos significa. Bem, ramos remotos possuem uma convenção obrigatória de nomes -- eles são mostrados no seguinte formato:","","* `/`","","Então, se o ramo remoto é chamado `o/main`, o nome do ramo é `main` e o nome do repositório remoto é `o`.","","A maioria dos desenvolvedores na verdade chama o repositório remoto principal de `origin`, e não de `o`. Isso é tão comum que o Git define por padrão o nome `origin` para o repositório remoto quando você usa o comando `git clone` para clonar um repositório.","","Infelizmente o nome completo `origin` não cabe na nossa tela, então usamos `o` como uma abreviação :( Apenas lembre-se que no Git de verdade, o repositório remoto provavelmente será chamado `origin` em vez de `o`!","","É muita informação de uma só vez, então vamos dar uma pausa e ver um pouco de ação."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos fazer checkout de um ramo remoto e ver o que acontece."],afterMarkdowns:['Como você pode ver, o Git nos colocou no modo "Detached HEAD", e não atualizou o `o/main` quando adicionamos um novo commit. Isso é porque o `o/main` só será atualizado quando o repositório remoto for atualizado.'],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, commite uma vez em `main`, e outra vez depois de fazer checkout em `o/main`. Isso vai ajudá-lo a sentir como os ramos remotos se comportam de forma diferente, e como eles apenas se atualizam para refletir o estado do repositório remoto."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas remotas de git","","Agora que viches `git clone` en acción, mergullémonos no que realmente mudou.","","O primeiro que notarías é que apareceu unha nova rama no teu repositorio local chamada `o/main`. A este tipo de ramas chámaselle ramas _remotas_. As ramas remotas teñén propiedades especiais porque serven para un propósito específico.","","As ramas remotas reflexan o _estado_ dos repositorios remotos (como estaban á última vez que falaches con eles). Axúdante a entender as diferencias entre o teu traballo local e o teu traballo que xa está publicado - un paso crítico antes de compartir o teu traballo cos demáis.","","As ramas remotas teñen a propiedade especial de que cando fas checkout, pasas o modo detached `HEAD`. Git faino a drede porque non podes traballar nesas ramas directamente: tes que traballar nalgún outro lado e despois compartir o teu traballo co remoto (tras o que as túas ramas remotas actualizaranse)."]}},{type:"ModalAlert",options:{markdowns:["### ¿Qué é `o/`?","","Poderías estar a preguntarte qué significa ese `o/` ó principio das ramas remotas. Bueno, as ramas remotas tamén teñen unha convención de nomes obligatoria -- se as amosas co formato:","","* `/`","","Entonces, se miras unha rama chamada `o/main`, o nome da rama é `main`, e o nome do remoto é `o`.","","A maioría dos desenvolvedores chaman `origin` ó seu remoto no lugar de `o`. Esto é tan común que git efectivamente crea o teu remoto chamandoo `origin` cando fas `git clone` dun repositorio.","","Desafortunadamente o nome `origin` completo non entra na nosa UI, así que empregaremos `o` para acortar: (Sinxelamente recorda que cando uses git na vida real, o teu remote ¡probablemente se chame `origin`!)","","Hai moito para procesar, así que vexámolo en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Fagamos checkout a unha rama remota a ver qué pasa."],afterMarkdowns:["Como ves, git púxonos no modo detached `HEAD` e non actualizou `o/mater` cando creamos un novo commit. Esto é porque `o/mater` só vai actualizarse cando o remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, fai commit unha vez sobre `mater` e despois de facer o checkout a `o/main`. Esto vaite axudar a entender cómo funcionan as ramas remotas, e que só se actualizan para reflexar o estado do remoto."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git remote branch","","現在你已經知道 `git clone` 在幹嘛了,讓我們仔細看看到底發生了什麼事。","","你首先看到的是在你的本地端(local repository)出現了一個新的 branch 叫作 `o/main`,這種型態的 branch 叫作 remote branch (遠端分支),因為特殊的需求,因此 remote branch 有特殊的性質。","","remote branch 反應了 remote repository 的狀態(因為你最後接觸的是這些 remote repository),最重要的是,在你想要分享你的 commit 給其他人時,你必須知道你現在的 commit 跟 remote repository 有哪些不同,而 remote branch 的狀態就是在告訴你這些資訊。","","remote branch 有特別的特性,當你移動到 remote branch 時,你就進入到分離 `HEAD` 的狀態,git 這樣做的原因是告訴你不能夠直接影響這些 branch。你必須要在其它的 branch 工作,並且分享到 remote (分享之後,你的 remote branch 就會被更新)。"]}},{type:"ModalAlert",options:{markdowns:["### 什麼是 `o/`?","","你也許會對於 remote branch 前面的 `o/` 感到困惑,喔!remote branch 也(需要) 一個命名法則,或者是一般表示 remote branch 的格式。","","* `/`","","因此,當你看到一個 branch 叫做 `o/main`,就表示這個 branch 叫做 main,而且這個 remote 的名稱叫作 `o`。","","很多程式設計師實際上會把他們的 remote 命名為 `origin`,而不是 `o`,這在 git 是很常見的事情,因為當你使用 `git clone` 時,git 會自動把你的 remote 命名為 `origin`。","","但是很不幸的是 `origin` 並沒有辦法完全顯示在我們的 UI 上面,所以我們用 `o` 來簡化它(只要記住當你使用 git 的時候,實際上是命名為 `origin`)。","","有很多事情需要說明,現在讓我們來看看吧!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們移動到(checkout)一個 remote branch 並且看一下會發生什麼事情"],afterMarkdowns:["就像你看到的, git 讓我們進到 detached `HEAD` 狀態,同時,當我們加入一個新的 commit 時,`o/main` 都沒有更新,這是因為只有當 remote 更新的時候,`o/main` 才會更新。"],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,先在 main branch 上面做一次 commit,再移動到 `o/main` 上做一次 commit,這有助於我們了解到 remote branch 的不同,它們只會反應 remote 的狀態。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches auf entfernten Servern","","Nun da du `git clone` in Aktion gesehen hast, lass uns tiefer in die Materie eintauchen.","","Dir ist wahrscheinlich als Erstes aufgefallen, dass ein neuer Branch namens `o/main` in unserem lokalen Repository aufgetaucht ist. Diese Art von Branch nennt sich _Remote_ Branch; er hat besondere Eigenschaften, weil er einem bestimmten Zweck dient.","","Ein Remote Branch bildet den Zustand des entsprechenden Branch in einem entfernten Repository ab (dem Zustand in dem der Branch war, als du das letzte Mal das entfernte Repository angesprochen hast). Er hilft dir, den Unterschied zwischen deinem lokalen Branch und dem Gegenstück auf dem Server zu sehen -- eine nötige Information, bevor du deine Arbeit mit anderen teilen kannst.","",'Remote Branches besitzen die besondere Eigenschaft dein Repository in den "Detached `HEAD`" Zustand zu versetzen, wenn du sie auscheckst. Git macht das absichtlich so, denn du kannst nicht direkt auf Remote Branches arbeiten; du musst auf Kopien von ihnen arbeiten und deine Änderungen von dort auf den entfernten Server schieben (wonach der Remote Branch dann auch bei dir aktualisiert wird).']}},{type:"ModalAlert",options:{markdowns:["### Was heißt `o/`?","","Du fragst dich vielleicht was das `o/` am Anfang des Namens des Remote Branch bedeuten soll. Nun, Namen von Remote Branches folgen einer (zwingenden) Konvention -- sie werden mit diesem Format gebildet:","","* `/`","","Wenn du also einen Remote Branch namens `o/main` hast, ist es eine Abbildung des Branches `main` auf dem Server, der in deinem Repository als `o` bekannt ist.","","Die meisten Entwickler nennen das Haupt-Remote eigentlich `origin` und nicht `o`. Das ist so verbreitet, dass Git den entfernten Server, von dem man ein `git clone` macht, standardmäßig als `origin` im Clone speichert.","","Leider passt der ganze Name, `origin`, nicht in unsere Darstellung, deshalb benutzen wir hier kurz `o`. :( Merk dir einfach: wenn du echtes Git benutzt, werden die Remotes meistens `origin` heißen!","","So, das war eine Menge zu verdauen. Schauen wir uns das in Aktion an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Checken wir mal einen Remote Branch aus und schauen was passiert."],afterMarkdowns:['Wie du siehst setzt uns Git in den "Detached `HEAD`" Modus und aktualisiert dann nach dem Commit nicht den Branch `o/main`. Das liegt daran, dass der Remote Branch nur aktualisiert wird, wenn sich der entsprechende Branch auf dem Remote verändert.'],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu bewältigen, musst du einen Commit in `main` machen und einen, nachdem du `o/main` ausgecheckt hast. Das illustriert noch einmal wie sich Branches und Remote Branches unterschiedlich verhalten und dass letztere sich nur verändern, wenn sich ihr Zustand auf dem entfernten Server ändert."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 远程分支","","既然你已经看过 `git clone` 命令了,咱们深入地看一下发生了什么。","","你可能注意到的第一个事就是在我们的本地仓库多了一个名为 `o/main` 的分支, 这种类型的分支就叫**远程**分支。由于远程分支的特性导致其拥有一些特殊属性。","","远程分支反映了远程仓库(在你上次和它通信时)的**状态**。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.","","远程分支有一个特别的属性,在你切换到远程分支时,自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。"]}},{type:"ModalAlert",options:{markdowns:["### 为什么有 `o/`?","","你可能想问这些远程分支的前面的 `o/` 是什么意思呢?好吧, 远程分支有一个命名规范 —— 它们的格式是: ","","* `/`","","因此,如果你看到一个名为 `o/main` 的分支,那么这个分支就叫 `main`,远程仓库的名称就是 `o`。","","大多数的开发人员会将它们主要的远程仓库命名为 `origin`,并不是 `o`。这是因为当你用 `git clone` 某个仓库时,Git 已经帮你把远程仓库的名称设置为 `origin` 了","","不过 `origin` 对于我们的 UI 来说太长了,因此不得不使用简写 `o` :) 但是要记住, 当你使用真正的 Git 时, 你的远程仓库默认为 `origin`! ","","说了这么多,让我们看看实例。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果切换到远程分支会怎么样呢?"],afterMarkdowns:["正如你所见,Git 变成了分离 HEAD 状态,当添加新的提交时 `o/main` 也不会更新。这是因为 `o/main` 只有在远程仓库中相应的分支更新了以后才会更新。"],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["要通过本关,在 `main` 分支上做一次提交;然后切换到 `o/main`,再做一提交。这有助于你理解远程分支的不同,他们的更新只是反映了远程的状态。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## リモートのブランチ","","あなたは今や`git clone`の動作を知ったことでしょうから、次は実際に詳細を見てみましょう。","","まず、もしかしたらもう気付いているかもしれないですが、私たちのローカルリポジトリにo/mainという名前の新しいブランチが追加されています。このようなブランチは、_リモート_ブランチと呼ばれます。リモートブランチは、その固有の役割を担うために特別なプロパティを持っています。","","リモートブランチは、リモートリポジトリの_状態_を反映します(あなたがそのリモートリポジトリから変更を最後に問い合わせてからの)。","","リモートブランチは、あなたがチェックアウトするとき、`HEAD`が分離された状態になるという特殊な性質を持っています。Gitはこの上での動作を保証しません。なぜこのようになるかというと、リモートブランチ上での直接の作業はできないからなのです。あなたは、別の場所で作業をし、その後でリモートブランチに共有するようにしなければなりません(その後であなたのリモートブランチは更新されます)。"]}},{type:"ModalAlert",options:{markdowns:["### `o/`とは何か?","","あなたは、リモートブランチが`o/`で始まることに驚くかもしれません。そう、リモートブランチには固有の(必要な)命名規則も存在するのです。 -- これは次のようなフォーマットで表示されます:","","* `<リモート名>/<ブランチ名>`","","これに基づいて、`o/main`と名付けられたブランチを見てみると、`main`はブランチの名前、`o`はリモートの名前であることが分かります。","","多くの開発者は、実際にはメインのリモート名として`o`ではなく`origin`を使います。これは一般的には、Gitが`git clone`した時に`origin`という名前をリモートに付与するためです。","","残念ながら、`origin`という長い名前は私たちのUIには合いませんでした。なので、私たちは短い`o`を使っています(覚えておいてもらいたいのは、実際のGitでは、リモートはおそらく`origin`と名付けられるであろうということです!)","","理解すべきことはたくさんあるので、ひとまず全ての動作を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["リモートブランチをチェックアウトすると何が起こるかを見てみましょう"],afterMarkdowns:["見ていた通り、`o/main`に移ってから新しいコミットをしても`HEAD`が分離状態になり`o/main`は更新されていません。これは、`o/main`がリモートの更新時のみ更新されるからです。"],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["このレベルを終えるには、まずコミットを`main`に一回行い、その後`o/main`にチェックアウトしてからもう一度コミットをします。これは、リモートブランチがどれほど違った動きをするか、そしてリモートブランチがリモートの状態を反映する時しか更新されないことを理解するのに役立つでしょう。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Удалённые ветки в Git","","Теперь, когда вы уже увидели `git clone` в действии, давайте углубимся в детали и посмотрим что же на самом деле изменилось.","","Во-первых, вы должны были заметить, что у нас в локальном репозитории появилась новая ветка с именем `o/main`. Такой тип ветки называется _удалённой_ веткой. Поскольку удалённые ветки играют важную и уникальную роль, они обладают рядом специальных свойств.","","Удалённые ветки отражают _состояние_ удалённых репозиториев (с того момента, как вы обращались к этим удалённым репозиториям в последний раз). Они позволяют вам отслеживать и видеть разницу между вашими локальными наработками и тем, что было сделано другими участниками - важный шаг, который необходимо делать, прежде чем делиться своими наработками с другими.","","Важным свойством удалённых веток является тот факт, что когда вы извлекаете их, вы отделяете (detaching) `HEAD`. Git делает это потому, что вы не можете работать непосредственно в этих ветках; сперва вам необходимо сделать наработки где-либо, а уж затем делиться ими с удалёнными репозиториями (после чего ваши удалённые ветки будут обновлены)."]}},{type:"ModalAlert",options:{markdowns:["### Что такое `o/` в названии ветки?","","Вы, наверное, догадались, что первый символ `o/` в названии ветки служит для обозначения именно удалённых веток. Да. Удалённые ветки также имеют (обязательное) правило именования - они отображаются в формате:","","* `<удалённый репозиторий>/<имя ветки>`","","Следовательно, если вы взглянете на имя ветки `o/main`, то здесь `main` - это имя ветки, а `o` - это имя удалённого репозитория.","","Большинство разработчиков именуют свои главные удалённые репозитории не как `o`, а как `origin`. Также общепринятым является именование удалённого репозитория как `origin`, когда вы клонируете репозиторий командой `git clone`.","","К сожалению, полное имя `origin` не помещается на элементах дизайна наших уроков, поэтому мы используем краткое `o` :( Просто помните, когда вы пользуетесь git в реальном проекте, ваш удалённый репозиторий скорее всего будет называться `origin`!","","Давайте посмотрим на всё это в действии."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте извлечём (check out) удалённую ветку и посмотрим что произойдёт"],afterMarkdowns:["Как вы можете видеть, git отделил (detached) `HEAD` и не обновил `o/main`, когда мы добавили новый коммит. Всё потому, что `o/main` обновится тогда и только тогда, когда обновится сам удалённый репозиторий."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Для завершения уровня выполните коммит единожды на `main`, а затем на `o/main` (предварительно переключившись на эту ветку). Это наглядно продемонстрирует поведение удалённых веток, а также покажет, как изменения влияют на состояние удалённых репозиториев."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 원격 브랜치","","이제 `git clone`을 직접 확인 해 보셨습니다. 이제 무엇이 변했는지 살펴 봅시다.","","가장 먼저 알아차릴만한 변화는 우리의 로컬 저장소에 `o/main`라고하는 새 브랜치가 생긴겁니다. 이런 종류의 브랜치는 _원격_브랜치라고 불립니다; 원격 브랜치는 특정한 목적을 제공하기 때문에 특별한 속성들이 있습니다.","","원격 브랜치는 원격 저장소의 _상태_를 반영합니다(가장 최근 원격 원격저장소와 작업을 했을때를 기준으로). 원격 브랜치는 로컬에서의 작업과 공개적으로 되고있는 작업의 차이를 이해하는데 도와줍니다 -- 다른 사람들과 작업을 공유하기전에 반드시해야할 과정이죠.","","원격 브랜치는 체크 아웃을 하게 되면 분리된 `HEAD` 모드로 가게되는 특별한 속성이 있습니다. Git은 여러분이 이 브랜치들에서 직접 작업할 수 없기 때문에 일부로 이렇게 합니다; 여러분은 다른곳에 작업을 하고 원격 저장소와 여러분의 작업을 공유해야합니다(그 이후에 원격 브랜치가 갱신됩니다)."]}},{type:"ModalAlert",options:{markdowns:["### `o/`가 뭐죠?","","여러분은 원격 브랜치들 앞에 붙는 `o/`가 뭔지 궁금할 것입니다. 음, 원격 브랜치 또한 (필수적인) 이름짓기 규약이 있습니다 -- 다음의 형식으로 나타납니다:","","* `/`","","이런 이유로, 만약 `o/main`라는 이름의 브랜치를 보게되면, 브랜치의 이름은 `main`이고 원격 저장소의 이름은 `o`인겁니다.","","대부분의 개발자들은 자신의 주 원격 저장소를 `o`가 아닌 `origin`이라고 짓습니다. 사실 보통 다 이렇게 쓰기 때문에 git은 저장소를 `git clone`하게 되면 원격 저장소의 이름을 `origin`이라고 자동으로 설정해놓습니다.","","부득이하게도 `origin`이라는 풀네임은 우리 UI에 안 맞아서 `o`로 간략히 표현하겠습니다 :( 진짜 git을 사용하게되면 여러분의 원격저장소가 아마 `origin`이라고 되있다는것을 알아두세요!","","머리속에 넣기엔 너무 많이 떠든것 같습니다. 직접 확인해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["원격 브랜치를 체크아웃하고 무엇이 일어나는지 확인해 봅시다"],afterMarkdowns:["보이는것 처럼, git은 우리를 분리된 `HEAD` 모드로 만들고 새로운 커밋을 추가해도 `o/main`를 갱신하지 않습니다. 이것은 `o/main`가 원격 저장소가 갱신될때만 갱신되기 때문입니다."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["다음 레벨로 가기 위해서는 `main`에서 한번 커밋하고 `o/main`를 체크아웃 하고 다시 한번 커밋을 하세요. 이를 통해서 원격 브랜치가 어떻게 다르게 작동하는지 알아보고, 원격 브랜치는 원격 저장소의 상태를 반영하기만 한다는것을 이해해 봅시다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Віддалені гілки","","Тепер, коли ти познайомився з `git clone` в дії, розгляньмо деталі й подивімося, що дійсно змінилося.","","Перше, що ти міг помітити -- це те, що з’явився новий бранч з назвою `o/main`. Такі гілки називаються _віддаленими_ (remote); віддалені гілки в гіт відіграють в певному сенсі унікальну роль, тому в них є деякі спеціальні властивості, непритаманні іншим гілкам.","","Віддалені гілки відображають _стан_ віддалених репозиторіїв (точніше, стан віддаленого репо на момент останньої синхронізації). Вони дозволяють відрізняти та відслідковувати локальні зміни та зміни інших учасників, що є дуже важливим для успішної синхронізації роботи між різними репозиторіями.","","Важливою властивістю віддалених гілок є те, що коли перейти на них, ти опинишся в стані `detached HEAD`. Git робить це спеціально, так як неможливо працювати з ними напряму; ти маєш працювати в локальній гілці й по необхідності синхронізуватися з віддаленим репозиторієм (після чого віддалену гілку буде оновлено)."]}},{type:"ModalAlert",options:{markdowns:["### Що за `o/`? Або Римський салют","","Ти, можливо, здогадуєшся для чого потрібен префікс `o/` на віддалених гілках. Так, існує (примусове) правило іменування віддалених гілок -- вони відображаються в форматі:","","* `<ім’я віддаленого репо>/<ім’я гілки>`","","Отже, якщо розглянути гілку з назвою `o/main`, то ім’я гілки -- це `main` а ім’я віддаленого репозиторію -- це `o`.","","Більшість розробників насправді називають ім’я головного віддаленого репозиторію `origin` (початок), а не `o`. Це настільки поширена практика, що гіт автоматично називає віддалений репозиторій `origin` коли ти його клонуєш.","","На жаль повністю ім’я `origin` не влазить в наш UI, натомість ми будемо використовувати коротше `o` :( Просто не забудь, коли будеш використовувати звичайний гіт, що твій віддалений репо скоріш за все називається `origin`!","","Це багато інформації, погляньмо як це працює на прикладі."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Зробімо checkout віддаленої гілки й подивімось, що буде"],afterMarkdowns:["Як бачиш, git перейшов в стан `detached HEAD` і не оновив `o/main` коли ми зробили новий коміт. Це тому, що `o/main` буде оновлено лише тоді, коли буде оновлено віддалений репозиторій."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, зроби один коміт в `main`, а потім переключись в `o/main` і закомітся ще раз. Це наглядно продемонструє поведінку віддалених гілок, а також покаже як зміни впливають на стан віддаленого репозиторію."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh Git từ xa","","Giờ bạn đã thấy cách thức hoạt động của `git clone`, cùng xem xét kỹ hơn những gì đã xảy ra.","","Điều đầu tiên mà có thể bạn để ý là một nhánh mới xuất hiện trong kho chứa cục bộ của ta là `o/main`. Loại nhánh này được gọi là nhánh _từ xa_ (_remote_); nhánh từ xa có những thuộc tính đặc biệt vì chúng phục vụ một mục đích duy nhất.","","Nhánh từ xa phản ánh _trạng thái_ (_state_) của kho chứa từ xa (kể từ lần cuối cùng bạn tương tác với kho chứa từ xa). Chúng giúp bạn hiểu về sự khác biệt giữa công việc trên kho chứa cục bộ với kho chứa từ xa -- một bước quan trọng trước khi chia sẻ công việc của bạn với người khác.","","Nhánh từ xa có một thuộc tính đặc biệt đó là khi bạn chuyển sang chúng, bạn sẽ vào trạng thái tách rời `HEAD`. Mục đích của Git là để bạn không thể làm việc trực tiếp trên nhánh từ xa; bạn phải làm việc ở nơi khác và chia sẻ thành quả lên kho chứa từ xa (sau đó nhánh từ xa sẽ được cập nhật).","","Nói rõ một chút: Các nhánh từ xa nằm trên kho lưu trữ cục bộ của bạn, không phải trên kho lưu trữ từ xa."]}},{type:"ModalAlert",options:{markdowns:["### `o/` là gì vậy?","","Có thể bạn sẽ thắc mắc về ký tự `o/` ở đầu tên nhánh từ xa có ý nghĩa gì. Chà, tên nhánh từ xa cũng có (ràng buộc) quy tắc đặt tên -- chúng được hiển thị dưới dạng:","","* `/`","","Do đó, đối với `o/main` thì `main` là tên nhánh còn `o` là tên kho chứa từ xa.","","Thực tế thì hầu hết các nhà phát triển đặt tên kho chứa từ xa là `origin` chứ không phải `o`. Nó trở thành thông lệ đến nỗi Git đặt tên `origin` cho kho chứa từ xa khi bạn dùng `git clone` để sao chép một kho chứa.","","Đáng tiếc là `origin` không khớp trong giao diện của chúng tôi, nên chúng tôi đành phải viết tắt là `o` :( Nhưng hãy nhớ rằng khi dùng Git thật sự thì chắc hẳn tên của kho chứa từ xa sẽ là `origin`!","","Lý thuyết hơi nhiều rồi, đi vào thực hành thôi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy thử chuyển sang nhánh từ xa xem điều gì xảy ra."],afterMarkdowns:["Như bạn thấy, Git đưa ta vào trạng thái tách rời `HEAD` và không cập nhật nhánh `o/main` khi ta thêm một commit. Đó là bởi vì `o/main` chỉ cập nhật khi kho chứa từ xa cập nhật."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, commit một lần trên `main` và một lần nữa sau khi chuyển sang `o/main`. Điều này sẽ giúp ta hiểu cách nhánh từ xa hành xử, chúng chỉ cập nhật để phản ánh trạng thái của kho chứa từ xa."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Oddaljeni Branchi","","Sedaj ko smo videli `git clone` v praksi se poglobimo v dejanske spremembe.","","Prva stvar, ki si jo morda opazil je, da se je pojavil nov branch na našem lokalnem repotu imenovan `o/main`. Temu tipu brancha pravimo _oddaljen_ (remote) branch; oddaljeni branchi imajo posebne lastnosti, ker služijo določenim namenom.","","Oddaljeni branchi odražajo _stanje_ oddaljenega repozitorija (od kar si nazadnje komuniciral z oddaljenim repotom). To ti morda pomaga razumeti razliko med tvojim lokalnim delom in delom, ki je javno -- ključni korak, preden deliš svoje delo z ostalimi.","","Oddaljeni branchi imajo posebno lastnost, da ko jih checkoutaš, si postavljen v stanje z ločenim `HEAD-om`. Git naredi to zanalašč, ker ne moreš delati neposredno na teh branchih; moreš delati drugje in nato deliti svoje delo z oddaljenim repotom (po tem bodo oddaljeni branchi bili posodobljeni)."]}},{type:"ModalAlert",options:{markdowns:["### Kaj je `o/`?","","Morda se sprašuješ, kaj je ta `o/` spredaj pred oddaljenmi branchi. Tudi oddaljeni branchi imajo (zahtevano) pravilo za poimenovanje -- predstavljeni so v sledečem formatu:","","* `/`","","Posledično, če pogledamo branch poimenovan `o/main`, je ime brancha `main`, ime oddaljenega repota pa `o`.","","Večina razvijalcev v bistvu poimenuje njihov glavni oddaljeni repozitorij `origin`, ne `o`. To je takoj pogosto, da git ubistvu nastavi tvoj oddaljen repo z imenom `origin` ko izvedeš `git clone` nad repozitorijem.","","Nažalost polno ime `origin` ne paše v naš prikaz, zato uporabljamo `o` kot bližnjico :( Samo zapomni si, ko uporabljaš pravi git, bo tvoj oddaljen repo verjetno poimenovan `origin`!","","To je kar veliko za razumeti, zato si poglejmo stvar v akciji."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Checkoutajmo oddaljen branch in poglejmo kaj se zgodi."],afterMarkdowns:["Kot lahko vidiš, nas git postavi v stanje ločenega `HEAD-a` in ne posodobi `o/main`, ko dodamo nov commit. To je zato, ker se bo `o/main` posodobil šele, ko se bo posodobil oddaljen repo."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, commitaj enkrat iz `main` in enkrat, ko checkoutaš `o/main`. To ti bo pomagalo osvojiti, kako se oddaljeni branchi obnašajo drugače in se posodobijo le da odražajo stanje na oddaljenem repozitoriju."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zdalne gałęzie Git","","Teraz, gdy zobaczyliśmy już, jak działa `git clone`, przyjrzyjmy się temu, co faktycznie się zmieniło.","","Pierwszą rzeczą, która mogła ci się rzucić w oczy, jest to, że w naszym lokalnym repozytorium pojawiła się nowa gałąź o nazwie `o/main`. Ten typ gałęzi nazywany jest gałęzią _zdalną_. Gałęzie zdalne mają specjalne właściwości, ponieważ służą do wyjątkowego celu.","","Zdalne gałęzie odzwierciedlają _stan_ zdalnych repozytoriów (od czasu ostatniej komunikacji z nimi). Pomagają zrozumieć różnicę między pracą lokalną a dostępną publicznie -- to niezwykle ważna sprawa przed udostępnieniem swojej pracy innym.","","Zdalne gałęzie mają specjalną właściwość. Kiedy je checkoutujesz, Git wprowdza cię w tryb odłączonego `HEADa`. Robi to celowo, ponieważ nie możesz pracować bezpośrednio na tych gałęziach; musisz pracować w innym miejscu, a następnie udostępnić swoją pracę zdalnie (i wtedy twoje zdalne gałęzie zostaną zaktualizowane)."]}},{type:"ModalAlert",options:{markdowns:["### Czym jest `o/`?","","Możesz się zastanawiać, do czego służy początkowy znak `o/` w zdalnych gałęziach. Otóż zdalne gałęzie również mają (wymaganą) konwencję nazewnictwa -- są wyświetlane w formacie:","","* `/`","","Więc jeśli spojrzysz na gałąź o nazwie `o/main`, nazwą gałęzi (branch name) jest `main`, a nazwą zdalną (remote name) jest `o`.","","Większość programistów w rzeczywistości nazywa główną (main) zdalną gałąź `origin`, a nie `o`. Jest to tak powszechne, że Git w praktyce sam ustawia zdalną nazwę na `origin`, kiedy wykonujesz `git clone` na repozytorium.","","Niestety pełna nazwa `origin` nie zmieści się w naszym interfejsie, więc używamy `o` jako skrótu :( Pamiętaj więc, że kiedy używasz prawdziwego Gita, twoja zdalna nazwa najprawdopodobniej brzmi `origin`!","","To dużo do przyswojenia, więc przyjrzyjmy się, jak to wszystko działa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wyciągnijmy (check out) zdalną gałąź i zobaczmy, co się stanie."],afterMarkdowns:["Jak widzisz, git przełączył nas w tryb odłączonego `HEADa` i nie zaktualizował `o/main`, kiedy dodaliśmy nowy commit. Dzieje się tak, ponieważ `o/main` zaktualizuje się tylko przy aktualizacji zdalnego repozytorium."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, zrób jeden commit z `main` i drugi, po przełączeniu się (check out) na `o/main`. Pomoże ci to zrozumieć różnice w zachowaniu zdalnych gałęzi i zapamiętać, że aktualizują się wyłącznie, aby odzwierciedlić stan zdalnego repozytorium."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami remoti di Git","","Adesso che hai visto `git clone` in azione, tuffiamoci all'interno di quello che è effettivamente cambiato.","","Come potrai aver notato un nuovo ramo è apparso nel nostro repository locale chiamato `o/main`. Questo tipo di ramo è chiamato ramo remoto; i rami remoti hanno proprietà speciali perché servono ad un unico scopo.","","I rami remoti riflettono lo _stato_ dei repository remoti (dall'ultima volta che hai comunicato con quei repository remoti). Ti aiutano a capire la differenza tra il tuo lavoro locale e quello pubblico -- un passo fondamentale da fare prima di condividere il tuo lavoro con gli altri.","","I rami remoti hanno la proprietà speciale che quando li controlli, `HEAD` viene inserito nella modalità di distacco. Git fa questo di proposito così che tu non possa lavorare direttamente su questi rami; ma dovrai lavorare altrove per poi condividere il tuo lavoro con il remoto (dopodiché i tuoi rami remoti verranno aggiornati)."]}},{type:"ModalAlert",options:{markdowns:["### Cos'è o/?","","Ti starai chiedendo a cosa serve `o/` su questi rami remoti. Bene, i rami remoti hanno anche un nome convenzionale (obbligatorio) -- vengono visualizzati nel formato:","","* `/`","","Quindi, se guardi ad un ramo chiamato `o/main`, il nome del ramo è `main` e il nome del remoto è `o`.","","La maggior parte degli sviluppatori in realtà nomina il loro main remoto `origin`, non `o`. Questo è così comune che git in realtà configura il remoto per essere chiamato `origin` quando viene eseguito `git clone` su un repository.","","Sfortunatamente il nome completo di `origin` non si adatta alla nostra interfaccia utente, quindi usiamo `o` come abbreviazione :( Ricorda solo che quando usi git realmente, il tuo remoto probabilmente si chiamerà `origin`!","","Tutto questo è molto da elaborare, quindi vediamolo in azione."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dai un'occhiata ad un ramo remoto e vedi che cosa fa."],afterMarkdowns:["Come puoi vedere, git ci ha messo im modalità `HEAD` distaccata e poi non ha aggiornato `o/main` quando abbiamo aggiunto un nuovo commit. Questo perché `o/main` si aggiornerà solo quando lo farà anche il remoto."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, fai un commit una volta dal `main` e una volta dopo aver eseguito il checkout su `o/main`. Questo ti aiuterà a capire come i rami remoti si comportano differentemente, e si aggiornano solo per riflettere lo stato del remoto"]}}]}}}},{}],153:[function(e,t,o){o.level={compareAllBranchesAndEnforceBranchCleanup:!0,disabledMap:{"git branch":!0,"git checkout":!0,"git switch":!0},goalTreeString:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git push origin :foo;git fetch origin :bar",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Source of nothing",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",ja:"無のsource",fr_FR:"Source de rien du tout",ru_RU:"Пустой источник",ko:"Source가 없다",uk:"Нема джерела",vi:"Không có nguồn",sl_SI:"Izvor Ničesar",pl:"Źródło nicości",it_IT:"Fonte del nulla"},hint:{en_US:"The branch command is disabled for this level so you'll have to use fetch!",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",ja:"このレベルではbranchコマンドが無効になっているのでfetchを使うしかない!",fr_FR:"La commande branch est désactivée pour ce niveau, vous devrez donc utiliser fetch !",ru_RU:"Команда branch недоступна на этом упражнении, пользуйтесь командой fetch!",ko:"branch 명령이 비활성화 되어있습니다. fetch를 사용해야 돼요!",uk:"Команда branch недоступна на цьому уроці, користуйся командою fetch!",vi:"Lệnh branch đã bị vô hiệu hóa ở cấp độ này nên bạn sẽ phải dùng fetch!",sl_SI:"Ukaz za branchanje je v tej stopnji onemogočen, zato boš moral uporabiti fetch!",pl:"Polecenie branch jest zablokowane na tym poziomie, musisz skorzystać z fetch!",it_IT:"Il comando branch è disabilitato per questo livello quindi dovrai usare fetch!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Oddities of ``","",'Git abuses the `` parameter in two weird ways. These two abuses come from the fact that you can technically specify "nothing" as a valid `source` for both git push and git fetch. The way you specify nothing is via an empty argument:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Let's see what these do..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['What does pushing "nothing" to a remote branch do? It deletes it!'],afterMarkdowns:['There, we successfully deleted the `foo` branch on remote by pushing the concept of "nothing" to it. That kinda makes sense...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finally, fetching "nothing" to a place locally actually makes a new branch.'],afterMarkdowns:["Very odd / bizarre, but whatever. That's git for you!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["This is a quick level -- just delete one remote branch and create a new branch with `git fetch` to finish!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Les bizarreries de ``","","Git permet de faire deux choses contre-intuitives avec le paramètre ``. Ces deux astuces viennent du fait que vous pouvez techniquement ne *rien* spécifier comme `source` valide pour git push et git fetch. Autrement dit laisser vide la partie gauche de la refspec (avant le deux-points) :","","* `git push origin :side`","* `git fetch origin :bugFix`","","Voyons ce que cela fait..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Qu'est-ce que produit l'envoi de \"rien\" sur une branche distante ? Cela la détruit !"],afterMarkdowns:['Ici, nous avons brillamment supprimé la branche `foo` du dépôt distant en lui envoyant le concept de "rien". Cela paraît à peu près logique...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Ensuite, un fetch de "rien" dans un emplacement local crée une nouvelle branche.'],afterMarkdowns:["Très étrange, mais peu importe. C'est Git !"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["L'exercice pour ce niveau est simple : supprimez d'abord une branche distante puis terminez en en créant une nouvelle (locale) avec `git fetch` !"]}}]},es_AR:{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 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`","","Veamos qué hacen estos..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['¿Qué hace el pushear "nada" a una rama remota? ¡La elimina!'],afterMarkdowns:['Ahí está, borramos la rama `foo` exitosamente del remoto pusheándole el concepto de "nada". Tiene algo de sentido...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finalmente, fetchear "nada" a un lugar local en realidad crea una nueva rama.'],afterMarkdowns:["Bastante bizarro, pero, meh, da igual. Así es git."],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Este es un nivel rápido: simplemente borrá una rama remota y creá una nueva usando `git fetch` para completarlo."]}}]},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 main: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:[{type:"ModalAlert",options:{markdowns:["### Coisas estranhas do ``","",'O Git abusa do parâmetro `` de duas formas estranhas. Esses dois abusos vem do fato de que tecnicamente você pode especificar "nada" como uma `origem` válida tanto para o git push como para o git fetch. A forma como você especifica "nada" é por meio de um argumento vazio:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Vejamos o que esses comandos fazem..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['O que fazer push de "coisa nenhuma" para um ramo remoto significa? Deletar o ramo!'],afterMarkdowns:['Aqui, excluímos com sucesso o ramo `foo` do repositório remoto por meio de um push de "coisa nenhuma" direcionado a ele. Até que faz sentido...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finalmente, fazer um fetch de "coisa nenhuma" para uma referência local cria um novo ramo.'],afterMarkdowns:["Bastante estranho / bizarro, mas de qualquer forma. É assim que o Git é!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Este é um nível rápido de resolver -- basta remover um ramo remoto com `git push` e criar um novo ramo local com `git fetch` para terminar!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rarezas do ``","",'Git abusa do parámetro `` de dúas maneiras extranas. Estos dous abusos veñen do feito de que técnicamente podes especificar "á nada" como un `orixe` válido tanto para git push como para git fetch. O modo de especificar a nada é a través dun parámetro vacío:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Vexamos qué fan..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['¿Qué fai cando se empurra a "nada" a unha rama remota? ¡Eliminaa!'],afterMarkdowns:['Ahí está, borramos a rama `foo` exitosamente do remoto empurrando o concepto da "nada". Ten algo de sentido...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finalmente, descargar a "nada" a un lugar local na realidade crea unha nova rama.'],afterMarkdowns:["Bastante bizarro, pero, meh, da igual. Así é git."],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Este é un nivel rápido: simplemente borra unha rama remota e crea unha nova empregando `git fetch` para completalo."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["###`` 奇怪的地方","",'在兩個奇怪的情況下,git 不使用 `` 參數,事實上,在`git push`以及`git fetch`的情況下,可以允許你"不用"指定` source`,你可以藉由把參數留空,來表示你不想指定 source:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","讓我們來看看這些在做什麼..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["當*沒有*指定 source 的時候,`push` 對於 remote branch 做了什麼?`push`把它刪除掉了!"],afterMarkdowns:['看吧,我們藉由把 source "留空",成功用 `push` 刪除了 `foo` branch,這合理吧...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['最後,對於 `fetch` 來說,source "留空" 表示我們要在 local 上建立一個新的 branch。'],afterMarkdowns:["很奇怪吧!但那正是 git 為你做的事情!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["這是一個很簡單的關卡,只需要利用 `git push` 刪除一個 remote 的 branch,並且利用 `git fetch` 建立一個新的 local 的 branch!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 古怪的 ``","","Git 有两种关于 `` 的用法是比较诡异的,即你可以在 git push 或 git fetch 时不指定任何 `source`,方法就是仅保留冒号和 destination 部分,source 部分留空。","","* `git push origin :side`","* `git fetch origin :bugFix`","","我们分别来看一下这两条命令的作用……"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果 push 空 到远程仓库会如何呢?它会删除远程仓库中的分支!"],afterMarkdowns:["就是这样子, 我们通过给 push 传空值 source,成功删除了远程仓库中的 `foo` 分支, 这真有意思..."],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果 fetch 空 到本地,会在本地创建一个新分支。"],afterMarkdowns:["很神奇吧!但无论怎么说, 这就是 Git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["这个关卡很容易 —— 只要删除一个远程的分支, 再用 `git fetch` 在本地创建一个新分支就可以了!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Die Eigentümlichkeiten von ``","",'Git "missbraucht" den ``-Parameter in zwei Fällen. Dies rührt daher, dass man technisch gesehen "nichts" als gültige `` sowohl für `git push` als auch für `git fetch` angeben kann. Das macht man so:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Schauen wir, was das bewirkt ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Was passiert, wenn man "nichts" auf einen entfernten Branch pusht? Er wird gelöscht!'],afterMarkdowns:['Und schon haben wir `foo` erfolgreich auf dem Remote gelöscht, weil wir "Leere" darauf geschoben haben. Ist auf seine Weise irgendwie logisch ...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Und weiter: indem man "nichts" von einem Remote in sein lokales Repository zieht, erstellt man tatsächlich einen neuen Branch.'],afterMarkdowns:["Ziemlich abgefahren / bizarr, aber was soll's. Das ist halt Git."],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Das ist ein kurzer Level -- lösch einfach den Remote Branch und erstelle einen neuen Branch mit `git fetch`, um ihn zu lösen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### ``の変わり種","","Gitは`git push`や`git fetch`の引数としてsourceに何も指定しないことで悪用することができます。","","何も指定しない方法は次のようにsourceに空の引数を渡すことです。","","* `git push origin :side`","* `git fetch origin :bugFix`","","こうするとどうなるでしょうか..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["リモートブランチに「無」をpushするとどうなるでしょうか?","","結果はそのブランチが削除されてしまいます!"],afterMarkdowns:["「無」という概念をブランチに押し付けることで、リモートの`foo`ブランチを削除することに成功しました。"],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["最後に「無」をローカル上に`fetch`すると、実際に新しいブランチが作られます。"],afterMarkdowns:["非常に奇妙ですが、気にする程のことでもありません。"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["このレベルは難しくありません!リモートのブランチを削除して`git fetch`で新しいブランチを作成するだけで完了します。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Странный `<источник>`","","Git использует параметр `<источник>` странным образом. Странность заключается в том, что Вы можете оставить пустым параметр `<источник>` для команд git push и git fetch:","","* `git push origin :side`","* `git fetch origin :bugFix`","","Посмотрим, что же из этого выйдет..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Что же будет с веткой, на которую мы делаем git push с пустым аргументом `<источник>`? Она будет удалена!"],afterMarkdowns:['Как видите, мы удалили ветку `foo` в удаленном репозитории, попытавшить протолкнуть(git push) в неё "ничего".'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Наконец, если мы попытаемся притянуть изменения(git fetch) из "ничего" к нам в локальный репозиторий, то это создаст у нас новую ветку'],afterMarkdowns:["Вот такой вот чудной git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Это легкое упражнение - нужно всего лишь удалить одну ветку в удаленном репозитории и создать новую ветку в локальном, с помощью команд `git push` и `git fetch` соответственно!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["###``의 이상함","",'Git은 `` 인자를 두가지 방법으로 이상하게 사용합니다. 이 두가지 오용은 여러분이 git push와 git fetch에 `source`에 "없음"을 지정할 수 있기 때문에 나타납니다. "없음"을 지정하는 방법은 인자로 아무것도 안쓰면 됩니다:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","위에 처럼 말이죠, 뭘 할 수 있는지 확인해봅시다..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['"없음"을 원격 브랜치로 push하면 무엇을 할까요? 원격저장소의 그 브랜치를 삭제합니다!'],afterMarkdowns:['됐습니다, 원격 저장소의 `foo`브랜치를 성공적으로 삭제했습니다. "없음"을 push한다는것이 이것을 이뤘습니다. 흠 말이 되는것 같네요 null을 push했어요...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['마지막으로, "nothing"을 fetch하면 로컬에 새 브랜치를 만듭니다'],afterMarkdowns:["기괴합니다... 뭐어때요. git이 이런데요 뭐!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["이번 레벨은 금방 넘어가는 레벨입니다 -- 원격저장소의 브랜치하나를 삭제하고 `git fetch`를 이용해서 새 브랜치를 만들어보세요!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Неочевидні способи використання ``","","Git має два хитрі способи використання ``. Обидва випливають з факту, що формально (і цілком легально) ти можеш не вказувати джерело (`source`) як для git push так і для git fetch. Ось, як саме ти можеш це зробити:","","* `git push origin :side`","* `git fetch origin :bugFix`","","Погляньмо, що в результаті вийде..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Що буде, якщо спробувати запушити "ніщо" у гілку віддаленого репозиторію? Git її видалить!'],afterMarkdowns:['Ось, ми успішно видалили гілку `foo` на віддаленому сервері, запушивши в неї "ніщо". Ну, ніби все правильно...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['І останнє, звантаження "нічого" в локальний репозиторій створює нову гілку'],afterMarkdowns:["Дуже дивно, але такий він, git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Це швидкий рівень -- просто видали одну віддалену гілку і створи нову локальну гілку, використовуючи `git fetch`!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Sự kỳ quặc của ``","",'Git lợi dụng tham số `` theo 2 cách khá dị. Hai cách lợi dụng này bắt nguồn từ thực tế là bạn có thể "không chỉ định" `nguồn` cho cả git push và git fetch. Bạn có thể làm điều này bằng cách để trống tham số như sau:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Hãy xem thử 2 câu lệnh này làm việc gì..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Nếu ta đẩy "không gì cả" lên một nhánh từ xa thì nó sẽ làm gì? Nó xóa nhánh đó!'],afterMarkdowns:['Đó, ta đã xóa thành công nhánh `foo` trên kho chứa từ xa bằng cách đẩy "không gì cả" lên nó. Khá là hợp lý...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Cuối cùng, nạp "không gì cả" vào một kho chứa cục bộ thực tế sẽ tạo ra một nhánh mới'],afterMarkdowns:["Khá là quái và dị. Nhưng mà đó là những gì Git làm!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Ở cấp độ đơn giản này -- bạn chỉ cần xóa một nhánh từ xa và tạo ra một nhánh mới với `git fetch` để hoàn thành!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Čudnosti ``","",'Git zlorablja `` parameter na dva čudna načina. Te dve zlorabi nastaneta iz dejstva, da lahko tehnično določiš "nič" kot veljaven `izvor` za git push in git fetch. Način, da določiš nič je z uporabo praznega argumenta:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Poglejmo, kaj to naredi ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Kaj naredi pushanje "ničesar" na oddaljen branch? Izbriše ga!'],afterMarkdowns:['Tako, uspešno smo izbrisali `foo` branch na oddaljenem repotu s konceptom pushanja "ničesar" nanj. To ima nekako smisel ...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['In končno, fetchanje "ničesar" lokalno dejansko naredi nov branch.'],afterMarkdowns:["Zelo čudno / bizarno, ampak kakorkoli. Tak je git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["To je hitra stopnja -- samo izbriši en oddaljen branch in naredi novega z `git fetch`, da zaključiš!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Osobliwości ``","",'Git pozwala wykorzystać parametr `` (źródło) na dwa osobliwe sposoby. Oba są dziwaczne dlatego, że - technicznie rzecz biorąc - możesz określić "nic" jako poprawne `źródło` zarówno dla `git push`, jak i `git fetch`. Tę "nicość" określasz za pomocą pustego argumentu:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Zobaczmy, co z tego wyniknie..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Co daje wypchnięcie "nicości" na zdalną gałąź? Usuwa ją!'],afterMarkdowns:['Oto właśnie usunęliśmy skutecznie gałąź `foo` na zdalnym repozytorium, wypychając do niej ideę "nicości". To nawet ma jakiś sens...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Natomiast ściągnięcie "nicości" za pomocą fetch do lokalnego miejsca tworzy nową gałąź.'],afterMarkdowns:["Osobliwe i dziwaczne, ale nic nie poradzisz... Git tak ma!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["To jest krótki poziom -- żeby go ukończyć, po prostu usuń jedną zdalną gałąź i stwórz jedną nową, używając `git fetch`!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Stranezze di ``","",'Git abusa del parametro `` in due strani modi. Questi due abusi derivano dal fatto che tu puoi tecnicamente specificare "nulla" come una fonte valida sia per git push che per git fetch. Si può fare ciò lasciando il parametro vuoto:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Vediamo cosa fanno questi..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['In cosa consiste il caricare "nulla" ad un ramo remoto? Lo elimina!'],afterMarkdowns:['Ecco, abbiamo eliminato con successo il ramo `foo` avendovi caricato il concetto di "nulla". Ha senso effettivamente...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Infine, scaricare il "nulla" in una posizione locale va a creare un nuovo ramo.'],afterMarkdowns:["Molto strano, ma vabbé. Questo e altro da git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Questo è un livello rapido -- elimina un ramo remoto e creane uno localmente tramite `git fetch` per terminare il livello!"]}}]}}}},{}],154:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%7D%2C%22o/main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22o/main%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D",solutionCommand:"git checkout -b side o/main;git commit;git pull --rebase;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Remote Tracking",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",ja:"リモートのトラッキング",fr_FR:"Suivi de branche distante",ru_RU:"Слежка за удалённым репозиторием",ko:"원격 저장소 추적하기",uk:"Слідкуємо за віддаленим репозиторієм",vi:"Theo dõi từ xa",sl_SI:"Sledenje Oddaljenega Repota",pl:"Śledzenie zdalnych repo",it_IT:"Tracciamento remoto"},hint:{en_US:"Remember there are two ways to set remote tracking!",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!",ja:"リモートトラッキングを設定する方法が二つあるのをお忘れなく!",fr_FR:"Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !",ru_RU:"Помни, есть два способа установить слежку за удалённым репозиторием!",ko:"원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!",uk:"Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!",vi:"Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!",sl_SI:"Spomni se, da obstajata dva načina za sledenje oddaljenega repota.",pl:"Pamiętaj, zdalne repo można śledzić na dwa sposoby!",it_IT:"Ricorda che ci sono due modi per impostare il tracciamento remoto!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Remote-Tracking branches","",'One thing that might have seemed "magical" about the last few lessons is that git knew the `main` branch was related to `o/main`. Sure these branches have similar names and it might make logical sense to connect the `main` branch on the remote to the local `main` branch, but this connection is demonstrated clearly in two scenarios:',"","* During a pull operation, commits are downloaded onto `o/main` and then *merged* into the `main` branch. The implied target of the merge is determined from this connection.","* During a push operation, work from the `main` branch was pushed onto the remote's `main` branch (which was then represented by `o/main` locally). The *destination* of the push is determined from the connection between `main` and `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'Long story short, this connection between `main` and `o/main` is explained simply by the "remote tracking" property of branches. The `main` branch is set to track `o/main` -- this means there is an implied merge target and implied push destination for the `main` branch.',"","You may be wondering how this property got set on the `main` branch when you didn't run any commands to specify it. Well, when you clone a repository with git, this property is actually set for you automatically. ","","During a clone, git creates a remote branch for every branch on the remote (aka branches like `o/main`). It then creates a local branch that tracks the currently active branch on the remote, which is `main` in most cases.","","Once git clone is complete, you only have one local branch (so you aren't overwhelmed) but you can see all the different branches on the remote (if you happen to be very curious). It's the best of both worlds!","","This also explains why you may see the following command output when cloning:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Can I specify this myself?","","Yes you can! You can make any arbitrary branch track `o/main`, and if you do so, that branch will have the same implied push destination and merge target as `main`. This means you can run `git push` on a branch named `totallyNotMain` and have your work pushed to the `main` branch on the remote!","","There are two ways to set this property. The first is to checkout a new branch by using a remote branch as the specified ref. Running","","`git checkout -b totallyNotMain o/main`","","Creates a new branch named `totallyNotMain` and sets it to track `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Enough talking, let's see a demonstration! We will checkout a new branch named `foo` and set it to track `main` on the remote."],afterMarkdowns:["As you can see, we used the implied merge target of `o/main` to update the `foo` branch. Note how main doesn't get updated!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["This also applies for git push."],afterMarkdowns:["Boom. We pushed our work to the `main` on the remote even though our branch was named something totally different."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Way #2","","Another way to set remote tracking on a branch is to simply use the `git branch -u` option. Running","","`git branch -u o/main foo`","","will set the `foo` branch to track `o/main`. If `foo` is currently checked out you can even leave it off:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see this other way of specifying remote tracking real quick..."],afterMarkdowns:["Same as before, just a more explicit command. Sweet!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! For this level let's push work onto the `main` branch on remote while *not* checked out on `main` locally. I'll let you figure out the rest since this is the advanced course :P"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Le suivi des branches distantes","",'Dans les dernières leçons, Git savait que la branche `main` était reliée à `o/main`, et cela a pu vous paraître "magique". Il est certain que ces deux branches ont des noms similaires et il peut être logique de croire que la branche locale `main` est liée à la branche distante `main`, mais la relation n\'est avérée que dans deux scénarios :',"","* Pendant un pull, les commits sont téléchargés dans `o/main` et ensuite *fusionnés* (merge) dans la branche `main`. La cible impliquée dans cette fusion est déterminée par cette relation.","* Pendant un push, le travail de la branche `main` a été envoyé sur la branche distante `main` (qui est localement représentée par `o/main`). La *destination* du push est déterminée par la relation entre `main` and `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","","Pour faire court, cette relation entre `main` et `o/main` est simplement portée par la propriété \"remote tracking\" (suivi distant) des branches. La branche `main` est configurée pour suivre `o/main` : cela signifie qu'il y a une cible de fusion et une destination d'envoi implicites pour la branche `main`.","","Vous vous demandez peut-être comment cette propriété a été configurée pour la branche `main` alors que vous n'avez exécuté aucune commande pour le faire. Eh bien, quand vous clonez un dépôt avec Git, cette propriété est configurée automatiquement. ","","Pendant le clonage, Git crée une branche distante pour chaque branche du dépôt distant (c'est à dire des branches comme `o/main`). Il crée ensuite une branche locale qui suit la branche actuellement active sur le dépôt distant, qui se trouve être `main` dans la plupart des cas.","","Une fois que git clone est terminé, vous avez seulement une branche locale (comme ça vous n'êtes pas submergé) mais vous pouvez voir toutes les branches distantes (si vous êtes très curieux). C'est le compromis idéal !","","Cela explique aussi pourquoi vous avez peut-être vu la sortie suivante pendant le clonage :","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Puis-je configurer cette relation moi-même ?","","Absolument ! Vous pouvez suivre `o/main` depuis n'importe quelle branche, et si vous le faîtes, cette branche va avoir la même destination de push et cible de merge que pour `main`. Cela signifie que vous pouvez exécuter `git push` sur une branche nommée `totallyNotMain` mais envoyer tout de même votre travail sur la branche `main` du dépôt distant !","","Il y a deux façons de configurer cette propriété. La première est de créer une nouvelle branche en la branchant immédiatement sur la branche distante, à l'aide de `git checkout -b` :","","`git checkout -b totallyNotMain o/main`","","Cette commande crée une nouvelle branche nommée `totallyNotMain` et la configure pour suivre `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Assez parlé, faisons une démonstration ! Nous allons nous placer sur une nouvelle branche nommée `foo` et la configurer pour suivre `main` du dépôt distant."],afterMarkdowns:["Comme vous pouvez le voir, nous avons utilisé la cible de fusion déclarée pour `o/main` afin de mettre à jour la branche `foo`. Remarquez que la branche `main` n'a pas été mise à jour !!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cela s'applique aussi pour git push :"],afterMarkdowns:["Boum. Nous avons envoyé notre travail sur `main` vers le dépôt distant alors que notre branche avait un nom totalement différent."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Méthode n°2","","Une autre façon de configurer le suivi d'une branche est d'utiliser l'option `git branch -u`. La commande est alors :","","`git branch -u o/main foo`","","Ce qui va configurer la branche `foo` (déjà existante) en la faisant suivre `o/main`. Si `foo` est la branche courante, vous pouvez même ne pas la préciser :","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons cette autre manière de paramètrer le suivi d'une branche distante..."],afterMarkdowns:["C'est la même chose, et c'est juste un peu plus explicite. Cool !"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok ! Pour ce niveau, envoyons notre travail sur la branche distante `main` en ne se trouvant *pas* sur la branche `main` locale. Je vous laisse chercher comment faire, puisque c'est une leçon de niveau avancé :P"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Ramas que trackean remotos","",'Una de las cosas que pueden haber parecido "mágicas" de las últimas lecciones es que git sabía que la rama `main` estaba relacionada con `o/main`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `main` del remoto con la rama `main` local, pero esta conexión es bien evidente en dos escenarios:',"","* Durante una operación de pull, los commits se descargan a `o/main` y después se *mergean* a la rama `main`. El objetivo implícito del merge se determina con esta conexión.","* Durante un push, el trabajo de la rama `main` se sube a la rama `main` del remoto (que estaba representada localmente por `o/main`). El *destino* del push se determina con esta conexión entre `main` y `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Trackeando remotos","",'Haciéndola corta, esta conexión entre `main` y `o/main` se explica simplemente por la propiedad de "trackear (seguir) remotos" de las ramas. La rama `main` está configurada para trackear `o/main` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `main`.',"","Podrías estar pensando cómo esa propiedad apareció en tu rama `main` si vos no corriste ningún comando para especificarlo. Bueno, cuando clonás un repositorio con git, esta propiedad se asigna por vos automáticamente.","","Durante un clone, git crea una rama remota por cada rama en el remoto (por ejemplo, ramas como `o/main`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `main`.","","Una vez completado el git clone, sólo tenés una única rama local (para que no te asustes) pero podés ver todas las ramas del remoto (si fueras tan 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 "main" set to track remote branch "o/main"',"",' rama local "main" establecida para trackear la rama remota "o/main"']}},{type:"ModalAlert",options:{markdowns:["### ¿Puedo especificarlo yo?","","¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/main`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `main`. Eso significa que podés correr `git push` en una rama llamada `absolutamenteNoEsMain` y ¡que tu trabajo se pushee a la rama `main` 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","","`git checkout -b absolutamenteNoEsMain o/main`","","Crea una nueva rama llamada `absolutamenteNoEsMain` y la hace trackear a `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Suficiente charla, ¡veamos una demo! Vamos a checkoutear una nueva rama llamada `foo` y hacer que trackee a `main` en el remoto."],afterMarkdowns:["Como podés ver, usamos el objetivo implícito de merge `o/main` para actualizar la rama `foo`. ¡Notá cómo `main` no fue actualizada!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lo mismo aplica para git push."],afterMarkdowns:["Boom. Pusheamos nuestro trabajo a la rama `main` del remoto incluso cuando nuestra rama se llamaba totalmente distinto."],command:"git checkout -b foo o/main; 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/main foo`","","establecemos que la rama `foo` trackee a `o/main`. Si encima estás parado en `foo`, incluso podés obviarlo:","","`git branch -u o/main`",""]}},{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. ¡Una belleza!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["¡Ok! Para este nivel, pusheá tu trabajo a la rama `main` del remoto *sin* estar parado sobre `main` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P"]}}]},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 `main` estaba relacionada con `o/main`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `main` del remoto con la rama `main` local, pero esta conexión es bien evidente en dos escenarios:',"","* Durante una operación de pull, los commits se descargan a `o/main` y después se *mergean* a la rama `main`. El objetivo implícito del merge se determina con esta conexión.","* Durante un push, el trabajo de la rama `main` se sube a la rama `main` del remoto (que estaba representada localmente por `o/main`). El *destino* del push se determina con esta conexión entre `main` y `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Trackeando remotos","",'Resumiendo, esta conexión entre `main` y `o/main` se explica simplemente por la propiedad de "trackear (seguir) remotos" de las ramas. La rama `main` está configurada para trackear `o/main` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `main`.',"","Podrías estar pensando cómo esa propiedad apareció en tu rama `main` 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/main`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `main`.","","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 "main" set to track remote branch "o/main"',"",' rama local "main" establecida para trackear la rama remota "o/main"']}},{type:"ModalAlert",options:{markdowns:["### ¿Puedo especificarlo yo?","","¡Claro que sí! Puedes hacer que cualquier rama que quieras trackee `o/main`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `main`. Eso significa que puedes ejecutar `git push` en una rama llamada `absolutamenteNoEsMain` y ¡que tu trabajo se pushee a la rama `main` 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 absolutamenteNoEsMain o/main`","","Crea una nueva rama llamada `absolutamenteNoEsMain` y la hace trackear a `o/main`."]}},{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 `main` en el remoto."],afterMarkdowns:["Como puedes ver, usamos el objetivo implícito de merge `o/main` para actualizar la rama `foo`. ¡Observa cómo `main` no fue actualizada!"],command:"git checkout -b foo o/main; 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 `main` del remoto incluso cuando nuestra rama se llamaba totalmente distinto."],command:"git checkout -b foo o/main; 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/main foo`","","establecemos que la rama `foo` trackee a `o/main`. Si encima estás parado en `foo`, incluso puedes obviarlo:","","`git branch -u o/main`",""]}},{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/main 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 `main` del remoto *sin* estar parado sobre `main` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Seguindo ramos remotos","",'Uma coisa que pode ter parecido "mágica" nas lições passadas é que o Git sabia que o ramo `main` estava relacionado com o `o/main`. Certamente esses ramos possuem nomes similares, e tem todo sentido lógico conectar o ramo `main` do lado remoto com o ramo `main` local, mas essa conexão é demonstrada claramente em dois cenários:',"","* Durante uma operação de pull, os commits são baixados em `o/main` e então são *mergidos* no ramo `main`. O alvo do merge é determinado a partir dessa conexão.","* Durante uma operação de push, o trabalho do ramo `main` local é enviado para o ramo `main` remoto (que é representado localmente por `o/main`). O *destino* do push é determinado da conexão entre `main` e `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'Resumindo a história, essa conexão entre `main` e `o/main` é explicada pela propriedade de "remote tracking" dos ramos. O ramo `main` é configurado para seguir o ramo `o/main` -- isso significa que existe um alvo implícito de merge e um destino implícito de push para o ramo `main`.',"","Você pode estar se perguntando como essa propriedade foi configurada no ramo `main` se você não executou nenhum comando ordenando que isso fosse feito. Bem, quando você clona um repositório com o Git, essa propriedade é configurada para você automaticamente. ","","Durante a clonagem, o Git cria um ramo remoto para cada ramo que existe no repositório remoto (ou seja, ramos como o `o/main`). Ele cria então um ramo local que segue o ramo atualmente ativo no repositório remoto, que geralmente é o `main`.","","Uma vez que a clonagem esteja completa, você terá apenas um único ramo local (para que você não seja sobrecarregado), mas você pode ver todos os ramos diferentes que existem no repositório remoto (caso você esteja curioso). É o melhor dos dois mundos!","","Isso também explica porque você vê a seguinte mensagem quando clona um repositório:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Posso eu mesmo especificar isso?","","Sim, você pode! Você pode fazer com que qualquer ramo arbitrário siga o `o/main`, e se você fizer isso, esse ramo terá o mesmo destino de push implícito que e o mesmo alvo de merge que o `main`. Isso significa que você pode executar `git push` em um ramo chamado `realmenteNaoSouOMain` e ainda assim ter seu trabalho enviado ao ramo `main` do repositório remoto!","","Há duas formas de configurar essa propriedade. A primeira consiste em fazer checkout de um novo ramo usando o ramo remoto como especificação de referência. Executar","","`git checkout -b realmenteNaoSouOMain o/main`","","Cria um novo ramo chamado `realmenteNaoSouOMain` e o configura para seguir o `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Já foi conversa o suficiente, vamos ver uma demonstração! Vamos fazer checkout de um novo ramo chamado `foo` e configurá-lo para seguir o `main` do repositório remoto."],afterMarkdowns:["Como você pode ver, usamos o alvo implícito de merge do `o/main` para atualizar o ramo `foo`. Veja como o main local não sofreu atualização!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Isso também se aplica ao git push."],afterMarkdowns:["Boom. Nós enviamos nosso trabalho para o ramo remoto `main` ainda que nosso ramo local tivesse um nome completamente diferente."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Forma #2","","Outra maneira de configurar remote tracking em um ramo é utilizando `git branch -u`. Executando","","`git branch -u o/main foo`","","configuraremos o ramo local `foo` para seguir o `o/main`. Se `foo` for o que estiver atualmente em checkout, você pode inclusive omiti-lo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos outra forma realmente rápida de configurar remote tracking..."],afterMarkdowns:["O mesmo de antes, apenas um comando mais explícito. Doce!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! Para este nível, vamos fazer push no ramo remoto `main` *sem estar* em um checkout do `main` local. Vou deixar você descobrir o resto, já que isto é um curso avançado :P"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Ramas que trackean os remotos","",'Unha das cousas que poden semellar "máxicas" das últimas leccións é que git sabía que a rama `main` estaba relacionada co `o/main`. Obviamente, estas ramas teñen nomes semellantes, e podería semellar lóxico conectar a rama `main` do remoto ca rama `main` local, pero esta conexión é ben evidente nos dous escenarios:',"","* Durante unha operación de pull, os commits descarganse ó `o/main` e logo *mesturanse* á rama `main`. O obxectivo implícito do merge determinase con esta conexión.","* Durante un push, o traballo da rama `main` súbese á rama `main` do remoto (que estaba representada localmente por `o/main`). O *destino* do push determinouse con esta conexión entre `main` e `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Trackeando remotos","",'Facéndoa curta, esta conexión entre `main` e `o/main` ensínase pola propiedade de "trackear (seguir) remotos" das ramas. A rama `main` está configurada para trackear `o/main` -- o que quere dicir, que hai un obxectivo implícito para o merge e un destino implícito para a rama `main`.',"","Poderías estar pensando cómo esa propiedade apareceu na túa rama `main` se ti non executaches ningún comando para especificalo. Bueno, cando clonas un repositorio co git, esta propiedade asignase por ti automáticamente.","","Durante un clone, git crea unha rama remota por cada rama no remoto (por exemplo, ramas como `o/main`). Pero despois crea unha rama local que trakea a rama activa do remoto, que habitúa ser `main`.","","Una vez completado o git clone, só tés unha única rama local (para que non te asustes) pero podes ver todalas ramas que do remoto (se fora tan curioso). ¡É o mellor de ámbolos dous mundos!","","Esto tamén explica por qué poderías ver unha mensaxe como este durante a clonación:","",' local branch "main" set to track remote branch "o/main"',"",' rama local "main" establecida para trackear a rama remota "o/main"']}},{type:"ModalAlert",options:{markdowns:["### ¿Podo especificalo eu?","","¡Claro que sí! Podes facer que calquera rama que quixeras seguir `o/main`, e se o fixeras, esa rama vai ter o mesmo destino implícito de push e obxectivo implícito de merge que `main`. Eso significa que podes executar `git push` nunha rama chamada `nonMain` e ¡que o teu traballo se empurre á rama `main` do remoto!","","Hai dúas formas de establecer esta propiedade. A primeira é facer checkout a unha nova rama empregando unha rama remota como a referencia especificada. Executar","","`git checkout -b nonMain o/main`","","Crea unha nova rama chamada `nonMain` e persigue a `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Suficiente charla, ¡vexamos unha demo! Imos facer checkout a unha nova rama chamada `foo` e facer que siga a `main` no remoto."],afterMarkdowns:["Como podes ver, empregamos o obxectivo implícito de merge `o/main` para actualizar a rama `foo`. ¡Nota como `main` non foi actualizada!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O mismo aplica para git push."],afterMarkdowns:["Boom. Empurramos o noso traballo á rama `main` do remoto incluso cando a nosa rama se chamaba totalmete distinto."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Forma número 2","","Outra forma de especificar a rama a seguir é usar a opción `git branch -u`. Executando","","`git branch -u o/main foo`","","establecemos que a rama `foo` segue a `o/mater`. Se por riba estás parado en `foo`, incluso podes obvialo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos rápidamente está outra forma de especificar a rama a seguir..."],afterMarkdowns:["O mesmo que antes, só que un comando bastante máis explícito. ¡Unha cousa preciosa!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["¡Ok! Para este nivel, empurra o teu traballo á rama `main` do remoto *sen* estar parado sobre `main` localmente. Déixote que te decates do resto ti só, que para algo estás nun nivel avanzado :P"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["### remote tracking branch","",'在之前的課程中,有一件事情看起來很"神奇",那就是 git 知道 `main` branch 是對應到 `o/main` branch。當然這些 branch 有類似的名稱,所以可以大概猜到, local 的 `main` branch 可以對應到 remote 的 `main branch`,但是我們是在兩種情況下可以確定有這個對應關係:',"","* 在使用 `pull` 的時候,下載 commit 到 `o/main`,並且 `merge` 這些 commit 到 `main` branch,這就表示這個 merge 的目標是決定於這個對應關係。","* 在使用 `push` 的時候,在 `main` branch 上面的 commit 被 push 到 remote 上面的 `main` branch (它在 local 被表示成 `o/main`),這就表示 push 的目標是決定於 `main` 以及 `o/main` 之間的對應關係。",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'長話短說,我們可以用 branch 上面的 "remote tracking" 特性來表示介於 `main` 以及 `o/main` 的對應關係,`main` branch 被設定用來追蹤(track) `o/main`,這就表示對於 `main` branch 來說的話,有一個 merge 的目標以及 push 的目標。',"","你可能會覺得很奇怪,當你沒有下任何指令去設定的時候,關於 `main` branch 的對應關係是如何被設定的。喔!其實當你 clone 一個 repo 的時候,其實就已經自動幫你做設定了。 ","","在做 clone 的時候,git 會針對每一個在 remote 上面的 branch 建立一個 branch (例如 `o/main`),之後它會建立一個 local branch 來追蹤目前在 remote 上面的 active branch,在大部份的情況下,幾乎都是設定 `main` branch。","","一旦 git 完成這個動作,你就只會有一個 local branch ,但是你可以看到所有在 remote 上面的不同的 branch,對於 local 和 remote 來說的話,這樣子是最好的!","","這也解釋了為什麼當你 clone 的時候可能會看到以下被輸出的指令:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### 我可以自己設定嗎?","","是的你可以!你可以設定任何的 branch 來 track `o/main`, 假如你真的這麼做的話,那麼該 branch 的 push 及 merge 的目標就會跟 `main` 一樣。這就表示說你可以在 `totallyNotMain` branch 上面執行 `git push`,並且 push 你的 commit 到 remote 的 `main` branch!","","有兩個方式可以設定,第一個就是藉由參考一個 remote branch 來 checkout 一個新的 branch。執行","","`git checkout -b totallyNotMain o/main`","","建立一個新的 `totallyNotMain` branch 並且它會 track `o/main`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["說的好多,我們現在來看一個例子!我們會 checkout 一個新的 `foo` branch,而且該 branch 會被用來 track remote 上的 `main` branch。"],afterMarkdowns:["就像你看到的,當 `o/main` 更新的時候,`foo` branch 也跟著一起被更新,要注意 main 並沒有被更新!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["同樣適用於 `git push`"],afterMarkdowns:["哇,即使我們的 branch 名稱完全一點關係都沒有,但我們還是 push 了 commit 到 remote 的 `main` branch 上面。"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 方法 #2","","另外一個設定 remote tracking 的方法是使用 `git branch -u` 這一個指令,執行","","`git branch -u o/main foo`","","你就會看到 `foo` branch 被設定成 track `o/main`,如果你現在已經 checkout 到 foo 這個 branch 上面了,你就可以省略掉它:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我們來看這個快速設定 remote tracking 的方法..."],afterMarkdowns:["跟之前一樣,就只是一個更加明確的指令,讚啦!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["好!在這個關卡中,我們要 push 我們的 commit 到 remote 上面的 `main` branch,但是我們*不* checkout 到 local 的 `main` branch。因為這是一個進階的課程,所以我會讓你明白其它的東西。:P"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 远程跟踪分支","","在前几节课程中有件事儿挺神奇的,Git 好像知道 `main` 与 `o/main` 是相关的。当然这些分支的名字是相似的,可能会让你觉得是依此将远程分支 main 和本地的 main 分支进行了关联。这种关联在以下两种情况下可以清楚地得到展示:","","* pull 操作时, 提交记录会被先下载到 o/main 上,之后再合并到本地的 main 分支。隐含的合并目标由这个关联确定的。","* push 操作时, 我们把工作从 `main` 推到远程仓库中的 `main` 分支(同时会更新远程分支 `o/main`) 。这个推送的目的地也是由这种关联确定的!",""]}},{type:"ModalAlert",options:{markdowns:["## 远程跟踪","","直接了当地讲,`main` 和 `o/main` 的关联关系就是由分支的“remote tracking”属性决定的。`main` 被设定为跟踪 `o/main` —— 这意味着为 `main` 分支指定了推送的目的地以及拉取后合并的目标。","","你可能想知道 `main` 分支上这个属性是怎么被设定的,你并没有用任何命令指定过这个属性呀!好吧, 当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。","","当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 `o/main`)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 `main`。","","克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的),但是可以查看远程仓库中所有的分支(如果你好奇心很强的话)。这样做对于本地仓库和远程仓库来说,都是最佳选择。","","这也解释了为什么会在克隆的时候会看到下面的输出:","",' local branch "main" set to track remote branch "o/main"',""]}},{type:"ModalAlert",options:{markdowns:["### 我能自己指定这个属性吗?","","当然可以啦!你可以让任意分支跟踪 `o/main`, 然后该分支会像 `main` 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 `totallyNotMain` 上执行 `git push`,将工作推送到远程仓库的 `main` 分支上。","","有两种方法设置这个属性,第一种就是通过远程分支切换到一个新的分支,执行: ","","`git checkout -b totallyNotMain o/main`","","就可以创建一个名为 `totallyNotMain` 的分支,它跟踪远程分支 `o/main`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["闲话少说,咱们先看看演示!我们切换到一个名叫 `foo` 的新分支,让其跟踪远程仓库中的 `main`"],afterMarkdowns:["正如你所看到的, 我们使用了隐含的目标 `o/main` 来更新 `foo` 分支。需要注意的是 main 并未被更新!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git push 同样适用"],afterMarkdowns:["我们将一个并不叫 `main` 的分支上的工作推送到了远程仓库中的 `main` 分支上"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 第二种方法","","另一种设置远程追踪分支的方法就是使用:`git branch -u` 命令,执行:","","`git branch -u o/main foo`","","这样 `foo` 就会跟踪 `o/main` 了。如果当前就在 foo 分支上, 还可以省略 foo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["看看这种方式的实际的效果..."],afterMarkdowns:["跟之前一样, 但这个命令更明确!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["OK! 本节我们在**不**切换到 `main` 分支的情况下将工作推送到的远程仓库中的 `main` 分支上。因为这是高级课程, 就不做过多的提示了! :P"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Remote Tracking Branches","",'In den letzten paar Leveln wirkte es womöglich etwas "magisch", dass Git automatisch wusste, dass der Branch `main` irgendwie mit `o/main` verwandt ist. Klar, sie haben ähnliche Namen und daher mag es logisch erscheinen sie in Verbindung zu bringen, aber offensichtlich wird es in zwei Szenarien:',"","* Beim `pull` werden Commits in `o/main` heruntergeladen und dann per *Merge* in den Branch `main` gebracht. Aus der Verbindung zwischen den beiden Branches leitet sich das Ziel des Merges ab.","* Beim `push` werden Commits vom `main` auf den `main` des Remote Servers geschoben (und die Änderung _danach_ im lokalen `o/main` Branch abgebildet). Das *Ziel* des Push wird aus der Verbindung zwischen `main` und `o/main` abgeleitet.",""]}},{type:"ModalAlert",options:{markdowns:['Langer Rede kurzer Sinn, die Verbindung zwischen `main` und `o/main` ist einfach die Eigenschaft des "Remote Tracking" von Branches. `main` ist so eingestellt, dass er `o/main` trackt -- das heißt es gibt ein implizites Ziel für `pull` und `push` Operationen auf dem `main` Branch.',"","Du fragst dich vielleicht wieso diese Eigenschaft auf dem `main` definiert ist, wenn du das doch gar nicht explizit gemacht hast. Naja, beim Clonen eines Repository macht Git das für den `main` automatisch.","","Während des Clonens erstellt Git einen Remote Branch für jeden Branch, den es auf dem Remote Server findet (also Branches wie `o/main`); dann erstellt es für den Branch, auf den auf dem entfernten Server `HEAD` zeigt (meistens `main`) automatisch einen lokalen Branch und stellt ihn so ein, dass er sein Gegenstück auf dem Server trackt. Deswegen hast du beim Clonen vielleicht schon mal dies gesehen:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Kann ich das auch selbst machen?","","Na klar! Du kannst jeden beliebigen Branch so einstellen, dass er `o/main` trackt, und wenn du das tust wird der Branch dieselben impliziten Zielangaben für `push` und `pull` haben wie `main`. Du kannst also `git push` auf dem Branch `absolut_nicht_main` ausführen und deine Commits auf `main` des entfernten Servers schieben lassen.","","Es gibt zwei Möglichkeiten diese Eigenschaft zu definieren. Die erste ist, einen neuen lokalen Branch von einem Remote Branch auszuchecken. Wenn man",""," git checkout -b absolut_nicht_main o/main","","eingibt, wird ein neuer lokaler Branch namens `absolut_nicht_main` angelegt, der `o/main` trackt."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Genug gequatscht, schauen wir uns eine Demonstration an! Wir checken einen neuen Branch `foo` aus, so dass er `main` auf dem Server trackt."],afterMarkdowns:["Wie du siehst, benutzen wir das implizite Ziel beim `pull` um `foo` zu aktualisieren. Beachte, dass `main` nicht aktualisiert wird."],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Das gilt auch für `git push`."],afterMarkdowns:["Bämm. Wir haben unsere Commits auf den `main` auf dem Server geschoben, obwohl unser lokaler Branch völlig anders heißt."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Methode 2","","Noch eine Möglichkeit um Remote Tracking auf einem Branch einzustellen, ist `git branch -u`. Wenn man",""," git branch -u o/main foo","","eingibt, wird damit der lokale Branch `foo` so eingestellt, dass er `o/main` trackt. Den Namen des lokalen Branch kannst du auch weglassen, falls du ihn eh aktuell ausgecheckt hast:",""," git branch -u o/main",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns auch diese Methode noch an ..."],afterMarkdowns:["Genau wie vorher, nur ist der Befehl ein bisschen eindeutiger. Schick!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok. In diesem Level musst du Commits auf den `main` auf dem Server schieben, *ohne* den lokalen `main` ausgecheckt zu haben. Den Rest kannst du selbst herausfinden, schließlich ist das hier für Fortgeschrittene. :P"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Удалённые-отслеживаемые ветки","",'Единственное, что могло бы показаться вам "магией" в нескольких предыдущих уроках - это то, как git знает, что ветка `main` соответствует `o/main`. Конечно, эти ветки имеют схожие имена и связь между локальной и удалённой ветками `main` выглядит вполне логично, однако, эта связь наглядно продемонстрирована в двух сценариях:',"","* Во время операции pull коммиты скачиваются в ветку `o/main` и затем *соединяются* в ветку `main`. Подразумеваемая цель слияния определяется исходя из этой связи.","* Во время операции push наработки из ветки `main` закачиваются на удалённую ветку `main` (которая в локальном представлении выглядит как `o/main`). *Пункт назначения* операции push определяется исходя из связи между `main` и `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Удалённые-отслеживаемые ветки","",'Короче, связь между `main` и `o/main` объясняется не иначе как свойство "удалённое отслеживание" веток. Ветка `main` настроена так, чтобы следить за `o/main` -- это подразумевает наличие источника для merge и пункта назначения для push в контексте ветки `main`.',"","Вы, должно быть, удивлены, как это отслеживание появилось на ветке `main`, если мы не запускали ни одной специфической команды. На самом деле, когда вы клонируете репозиторий, это слежение включается автоматически.","","В процессе клонирования git локально создаёт удалённые ветки для каждой ветки с удалённого репозитория (такие как `o/main`). Затем он - git - создаёт локальные ветки, которые отслеживают текущую, активную ветку на удалённом репозитории. В большинстве случаев - это `main`.","","К тому моменту как `git clone` завершит своё выполнение, у вас будет лишь одна локальная ветка (так что вы ещё не сильно перегружены), но, если вам будет интересно, вы сможете увидеть все удалённые ветки (при желании).","","Именно это объясняет, почему сразу после клонирования вы видите в консоли надпись:","",' local branch "main" set to track remote branch "o/main"',"",' (локальная ветка "main" теперь следит за удалённой веткой "o/main") ']}},{type:"ModalAlert",options:{markdowns:["### А могу ли я сделать это самостоятельно?","","Само собой! Вы можете сказать любой из веток, чтобы она отслеживала `o/main`, и если вы так сделаете, эта ветка будет иметь такой же пункт назначения для push и merge как и локальная ветка `main`. Это значит, что вы можете выполнить `git push`, находясь на ветке `totallyNotMain`, и все ваши наработки с ветки `totallyNotMain` будут закачены на ветку `main` удалённого репозитория!","","Есть два способа сделать это. Первый - это выполнить checkout для новой ветки, указав удалённую ветку в качестве ссылки. Для этого необходимо выполнить команду","","`git checkout -b totallyNotMain o/main`","",", которая создаст новую ветку с именем `totallyNotMain` и укажет ей следить за `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Хватит болтовни, давайте взглянем на демонстрацию! Мы выполним checkout для новой ветки `foo` и укажем ей, чтобы она отслеживала `main` с удалённого репозитория."],afterMarkdowns:["Как вы увидели, мы использовали `o/main`, чтобы обновить ветку `foo`. Обратите внимание, как обновился `main`!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Это работает также и для git push."],afterMarkdowns:["Оп! Мы закачали наши наработки на ветку `main` нашего удалённого репозитория. При том, что наша локальная ветка называется абсолютно по-другому."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Способ №2","","Другой способ указать ветке отслеживать удалённую ветку — это просто использовать команду `git branch -u`. Выполнив команду","","`git branch -u o/main foo`","","вы укажете ветке `foo` следить за `o/main`. А если вы ещё при этом находитесь на ветке `foo`, то её можно не указывать:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Как видно, второй способ указать слежение за веткой намного быстрее..."],afterMarkdowns:["Словом, всё как и раньше, просто отдельная, специальная команда. Здорово!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Отлично! Для выполнения этого уровня давайте выполним push наших наработок в ветку `main` на удалённом репозитории, при этом *не* скачивая и не создавая ветку `main` локально. Я объясню вам оставшееся чуть позже, т.к. это продвинутый курс :P"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### リモートトラッキングブランチ","","もしかしたら直近の幾つかの章で、「魔法」の様に見えた現象があるかもしれません:gitが`main`ブランチは`o/main`に関連していることを知っていたということです。確かにこれらのブランチは似た名前を持っていて、リモートの`main`ブランチとローカルの`main`ブランチを繋ぐ論理的な意味を成すかもしれません。以下の2例がこれらブランチが明確に繋がっている事を示します:","","* プルの実行時は、コミットを`o/main`上にダウンロードし、`main`ブランチにそれを*マージ*します。マージのターゲットはこの繋がりから求められます。","* プッシュの実行時は、`main`ブランチの作業はリモートの`main`ブランチにプッシュされます(その後に`o/main`によってローカルに反映されています)。プッシュ先の決定は、`main`と`o/main`の繋がりから求められます。",""]}},{type:"ModalAlert",options:{markdowns:["## リモートトラッキング","",'端的に言えば、`main`と`o/main`の繋がりの正体はそれぞれのブランチの"remote traking"というプロパティです。`main`ブランチは`o/main`に追跡するように設定されているのです。これは、`main`ブランチのための暗黙のプッシュ先と暗黙の取り込み先が存在することを意味します。',"","特にそのような設定を行うコマンドを走らせていないのに、`main`ブランチにこのプロパティが設定されていたことに疑問を持つかもしれません。そう、gitによってリポジトリをクローンした時、gitはこのプロパティを自動的に設定してくれるのです。","","クローンしている間、gitはリモートブランチをリモートリポジトリのブランチ全てに対して作ります(`o/main`のように)。その後、リモート上でアクティブなブランチを追跡するローカルブランチを作成します。多くの場合それは`main`ブランチになります。","","gitのクローンが完了した時、一つのローカルブランチしか存在しません(なので、情報量に圧倒される事はありません)。しかし、全てのリモートのブランチを見ることもできるのです(もしあなたが十分な好奇心を持っていれば、ですが)。いわゆるwin-winの関係ですね!","","クローン中に次のような出力が表示されることの説明にもなりますね:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### 自分でトラッキング元を設定できますか?","","はい、できます!`o/main`を追跡するブランチを作成できますし、そのブランチは`main`と同じ暗黙のプッシュ先とマージターゲットを持ちます。例えば`tottallyNotMain`という名前のブランチで`git push`を走らせ、リモートの`main`ブランチにプッシュするといったことができるということを意味しています!","","このプロパティを設定するには2つの方法があります。一つ目は、リモートブランチをリファレンスとして新しいブランチをチェックアウトするというものです。例えば","","`git checkout -b totallyNotMain o/main`","","を実行する事で`totallyNotMain`という名前のブランチを新しく作り、`o/main`への追跡プロパティを設定します。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["説明は十分でしょう、デモを見ていきましょう!`foo`という名前の新しいブランチをチェックアウトし、リモートの`main`への追跡プロパティを設定してみます。"],afterMarkdowns:["見ての通り、暗黙の取り込み先である`o/main`を使って`foo`ブランチを更新しました。`main`が更新されないことに注意してください!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["これは`git push`にも適用されます"],afterMarkdowns:["わーお。全く違う名前がつけられているブランチですが、リモートの`main`に内容をプッシュできました。"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 二番目の方法","","ブランチのリモートトラッキングを設定するもう一つの方法は、単に`git branch -u`オプションを使うというものです。例えば","","`git branch -u o/main foo`","","を実行する事で`foo`ブランチが`o/main`を追跡するように設定できます。もし、`foo`が現在チェックアウトしているブランチだった場合、以下のように省略することができます:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["もう一つの方法でリモートトラッキングを指定する様子を見てみましょう..."],afterMarkdowns:["前回と一緒で、より明示的なコマンドですね。とてもいい感じです!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["OK!このレベルでは、ローカルで`main`にチェックアウトしていない状態で、リモートの`main`ブランチに作業をプッシュしてみましょう。これは高度な課題ですから、理解するのに少し時間をおく必要があると言っておきます:P"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### 원격-추적 브랜치","",'지난 몇개의 레슨에서 "마법"처럼 보일 수 있는게 하나 있었는데, git이 `main`브랜치가 `o/main`와 연관 되어있는걸 안다는 것입니다. 물론 이 두 브랜치가 이름이 비슷하기 때문에 로컬 `main`브랜치가 원격의 `main`브랜치와 연결 되어있다고 하자면 어찌 논리적으로 말이 되긴 합니다만..., 이 연결은 두가지 시나리오를 통해 뚜렷하게 확인이 됩니다:',"","* pull 작업을 하는 도중, 커밋들은 `o/main`에 내려받아 지고 그다음 `main` 브랜치로 *merge*됩니다. merge에서 내재된 타겟은 이 연결에서 결정합니다.","* push 작업을 하는 도중, `main` 브랜치의 작업은 원격의 `main`브랜치(로컬에서 `o/main`로 표현되는)로 push 됩니다. push의 *목적지*는 main와 `o/main`의 연결에서 결정됩니다.",""]}},{type:"ModalAlert",options:{markdowns:["## 원격 추적","",'간단히 말해서, 이 `main`와 `o/main`사이의 연결은 브랜치의 "원격 추적" 속성을 통해 간단하게 설명됩니다. `main`브랜치는 `o/main`브랜치를 추적하도록 설정되어 있습니다 -- 이것은 `main`가 merge와 push할 내재된 목적지가 생겼다는 뜻 입니다.',"","여러분은 어떻게 이 속성을 지정해주는 그 어떤 명령어 없이 `main` 브랜치에 설정되있는지 궁금할것 입니다. 사실, 여러분이 git으로 저장소를 clone할때 이 속성이 여러분을 위해 자동으로 설정 됩니다.","","clone을 진행하면서 git은 원격 저장소에있는 모든 브랜치에 대해 로컬에 원격 브랜치를 생성합니다(`o/main`같은것들 말이죠). 그 후 원격 저장소에서 현재 active한 브랜치를 추적하는 로컬 브랜치를 생성합니다, 대부분의 경우 `main`가 됩니다.","","git clone이 완료되면, 여러분은 오로지 하나의 로컬 브랜치를 가지게 됩니다(부담스럽지 않도록) 물론 원격 저장소에있는 여러 다른 브랜치도 여전히 확인할 수 있습니다(호기심이 많으시다면). 로컬, 원격 저장소 양쪽에 최적화 되있는거죠!","","여러분이 clone을 할 때 아래의 명령어를 볼 수도 있는 이유입니다:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### 내 스스로 지정할수도 있나요?","","당연하죠! 여러분은 아무 임의의 브랜치를 `o/main`를 추적하게 만들 수 있습니다. 이렇게 하면 이 브랜치 또한 내재된 push,merge 목적지를 `main`로 할 것입니다. 여러분은 이제 `totallyNotMain`라는 브랜치에서 `git push`를 수행해서 원격 저장소의 브랜치 `main`로 작업을 push할 수 있습니다!","","이 속성을 설정하는데에는 두가지 방법이 있습니다. 첫 번째는 지정한 원격 브랜치를 참조해서 새로운 브랜치를 생성하여 checkout 하는 방법 입니다. 다음을 실행하면","","`git checkout -b totallyNotMain o/main`","","`totallyNotMain`라는 이름의 새 브랜치를 생성하고 `o/main`를 추적하게 설정합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["설명은 충분히 한듯 합니다. 직접 확인해 봅시다! `foo`라는 이름의 새 브랜치를 checkout하고 이것을 원격 저장소의 `main`를 추적하도록 설정하겠습니다."],afterMarkdowns:["보이듯이, 우리는 `o/main`를 `foo` 브랜치를 갱신하기 위한 내재된 merge 타겟으로 사용하고 있습니다. main이 갱신되지 않는다는것을 눈치챘죠?"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git push에도 적용이 됩니다"],afterMarkdowns:["Boom. 브랜치의 이름을 전혀 다른것으로 지었는데도 불구하고 우리 작업이 `main`로 push 되었습니다."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 방법 #2","","브랜치에 원격 추적 설정을 하는 또 다른 방법으로는 간단하게 `git branch -u` 옵션을 사용하는 방법이 있습니다. 다음을 실행하면","","`git branch -u o/main foo`","","가 `foo` 브랜치가 `o/main`를 추적하도록 설정합니다. 만약 `foo`가 현재 작업하고 있는 브랜치라면 생략해도 됩니다:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["자 이 다른 방법이 작동하는 모습을 확인해 봅시다..."],afterMarkdowns:["이전과 같습니다, 좀 더 분명하게 알 수 있는 명령어죠. 좋아요!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:[" 이번 레벨에서는 로컬의 `main`브랜치가 아닌 다른 브랜치에서 작업을 원격 저장소의 `main`브랜치로 push하세요. 고급 과정이니 더 길게 설명하지는 않을게요 :p"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Гілки віддаленого стеження","",'Одна з речей в попередніх уроках, яка могла виглядати, наче "магія" -- це те, що гіт якось знає, що локальна гілка `main` відповідає віддаленій `o/main`. Звичайно, ці гілки мають схожі назви, і виглядає логічним співставити віддалену гілку `main` з локальною `main`, однак цей зв\'язок найкраще видно в двох випадках:',"","* Під час операції `pull`, коміти попадають в `o/main`, а вже потім *мерджаться* в локальний `main`. Гілка в яку відбудеться мердж якраз і визначається цим зв'язком.","* Під час операції `push`, коміти з гілки `main` переносяться у віддалений `main` (який локально представлений як `o/main`). *Гілка-призначення* для `push` визначена зв'язком між `main` і `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Гілки віддаленого стеження","",'В двох словах, цей зв\'язок між `main` та `o/main` і є тим "віддаленим стеженням", визначеним для гілки. Гілка `main` налаштована стежити за `o/main` -- це визначає неявну ціль для мерджу і неявне призначення під час операції `push` для гілки `main`.',"","Ви можете подумати, а як же такий зв'язок було встановлено, якщо я не виконував жодної команди? Ну, коли гіт клонує репозиторій, він встановлює цей зв'язок автоматично.","","Під час клонування гіт створює гілки для стеження за кожною гілкою віддаленого репозиторію (напр. `o/main`). Потім він створює локальну гілку, що пов'язана і стежить за активною гілкою у віддаленому репозиторії, яка в більшості випадків називається `main`.","","Після закінчення клонування у вас буде лише одна локальна гілка (щоб не перевантажувати) але ви можете переглянути всі віддалені гілки (якщо буде цікаво). Такий собі розумний компроміс!","","Це пояснює чому ви бачите наступне повідомлення під час клонування:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### А можу я сам вибирати?","","Так, можеш! Ти можеш вибрати довільну гілку, яка слідкуватиме за `o/main`, і тоді для цієї гілки `push` та `merge` автоматично працюватимуть з `main`. Це означає, що виконання `git push` в гілці з назвою `totallyNotMain` (зовсім не main) може зберегти локальні коміти у віддалену гілку `main`!","","Є два шляхи встановити такий зв'язок. Перший - створити нову гілку з явним вказанням зв'язку (за ким слідкувати). Виконання","","`git checkout -b totallyNotMain o/main`","","створить гілку `totallyNotMain`, яка слідкує за `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Досить розмов, подивімось в дії! Створімо нову гілку `foo` і змусьмо її слідкувати за віддаленою гілкою `main`."],afterMarkdowns:["Як видно з результату, при оновленні `foo` було використано автоматичний зв'язок з `o/main` під час операції `merge`. Зверніть увагу, `main` не було оновлено!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Це також справджується і для git push."],afterMarkdowns:["Ка-бум!. Ми запушили наші зміни у віддалений `main`, незважаючи на те, що локальна гілка називалась зовсім по-іншому."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Спосіб №2","","Інший спосіб вказати за якою віддаленою гілкою слідкувати -- просто використовувати опцію `git branch -u`. Виконання","","`git branch -u o/main foo`","","змусить гілку `foo` слідкувати за `o/main`. Якщо `foo` є поточною гілкою, її можна навіть не вказувати:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Подивімось на цей спосіб швидко вказати віддалену гілку для відслідковування..."],afterMarkdowns:["Як і перший спосіб, але своя окрема команда."],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Гаразд! На цьому рівні збережімо свою роботу у віддалену гілку `main` *без* переходу на локальну `main`. Про решту здогадайся сам, раз ти вже дойшов до цього рівня :P"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Theo dõi nhánh từ xa","",'Trong những bài học vừa qua có một điểu có vẻ như là "ma thuật" đó là Git lại biết được nhánh `main` có liên kết đến nhánh `o/main`. Dù các nhánh này có tên giống nhau và có vẻ hợp lý để kết nối nhánh `main` trên remote với nhánh `main` trên local, nhưng điều này được thể hiện rõ ràng qua hai tình huống sau:',"","* Trong quá trình thực hiện thao tác kéo, các commit được tải xuống nhánh `o/main` và sau đó *hợp nhất* vào nhánh `main`. Mục tiêu hợp nhất dược ngầm định bởi kết nối này.","* Trong quá trình thực hiện thao tác đẩy, thảnh quả trên nhánh `main` được đẩy lên nhánh `main` từ xa (sau đó được biểu thị bằng nhánh `o/main` ở kho chứa cục bộ). *Đích đến* của lệnh đẩy được xác định bằng kết nối giữa nhánh `main` và nhánh `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Theo dõi từ xa","",'Nói tóm lại, kết nối giữa nhánh `main` và nhánh `o/main` đơn giản được giải thích bằng thuộc tính "theo dõi từ xa" ("remote tracking") của các nhánh. Nhánh `main` được thiết lập để theo dõi nhánh `o/main` -- Điều này có nghĩa là có điểm đến ngụ ý cho việc hợp nhất (merge) và đẩy lên (push) của nhánh `main`.',"","Có thể bạn sẽ thắc mắc rằng tại sao thuộc tính này được thiết lập lên nhánh `main` trong khi bạn chẳng hề chạy một câu lệnh nào chỉ định điều này. Chà, khi bạn dùng Git để nhân bản kho chứa, thì thuộc tính này đã được tự động thiết lập cho bạn rồi. ","","Trong quá trình thực hiện nhân bản, Git tạo ra nhánh từ xa trên kho chứa cục bộ cho tất cả các nhánh trên kho chứa từ xa (các nhánh như `o/main`). Sau đó nó sẽ tạo một nhánh cục bộ theo dõi nhánh hoạt động hiện tại của kho chứa từ xa, đa phần các trường hợp là nhánh `main`.","","Một khi quá trình nhân bản hoàn thành, bạn sẽ chỉ có một nhánh cục bộ (để bạn không thấy quá tải) nhưng bạn có thể thấy tất cả các nhánh trên kho chứa từ xa (phòng trường hợp bạn thấy tò mò). Đây là phương án tối ưu!","","Điều này giải thích việc sau khi nhân bản bạn có thể thấy dòng lệnh sau xuất hiện:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Tôi có thể tự chỉ định chứ?","","Tất nhiên là được chứ! Bạn có thế khiến bất kỳ nhánh nào theo dõi nhánh `o/main`, và nếu bạn làm vậy, nhánh đó sẽ được được chỉ định đích của lệnh đẩy và mục tiêu hợp nhất giống như nhánh `main`. Điều này có nghĩa là bạn có thể chạy lệnh `git push` trên nhánh có tên là `totallyNotMain` và thành quả của bạn sẽ được đẩy lên nhánh `main` ở kho chứa từ xa!","","Có 2 cách để thiết lập thuộc tính này. Cách đầu tiên là chuyển sang một nhánh mới từ một nhánh từ xa bằng cách thực hiện","","`git checkout -b totallyNotMain o/main`","","Tạo ra một nhánh mới `totallyNotMain` và thiết lập cho nó theo dõi nhánh `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nói vậy là đủ rồi, hãy xem thử một mô tả nào! Ta sẽ chuyển sang một nhánh tên là `foo` và thiết lập cho nó theo dõi nhánh `main` trên kho chứa từ xa."],afterMarkdowns:["Như bạn đã thấy, chúng tôi đã sử dụng mục tiêu ngầm `o / main` để cập nhật nhánh `foo`. Để ý rằng nhánh `main` không được cập nhật!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Điều này cũng được áp dụng cho lệnh git push."],afterMarkdowns:["Bùùm. Ta đã đẩy thành quả lên nhánh `main` ở kho chứa tù xa mặc dù nhánh của ta có tên hoàn toàn khác biệt"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Cách thứ #2","","Cách khác để thiết lập theo dõi trên một nhánh đó là sử dụng lệnh `git branch -u`. Thực hiện","","`git branch -u o/main foo`","","sẽ thiết lập nhánh `foo` theo dõi nhánh `o/main`. Nếu nhánh `foo` đang được `HEAD` trỏ tới bạn có thể bỏ tham số này:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy xem thử cách này để thiết lập theo dõi..."],afterMarkdowns:["Y hệt như trước, nhưng biểu hiện rõ ràng hơn. Tuyệt!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Được rồi! Ở cấp độ này hãy để thành quả lên nhánh `main` trên kho lưu trữ từ xa mà không chuyển sang nhánh `main` tại kho chứa cục bộ. Hãy tự tìm ra cách nhé, giờ là khóa học nâng cao rồi :P"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Sledenje oddaljenih branchev","",'Stvar, ki se je morda zdela "čarobna" v zadnjih lekcijah je, da je git vedel, da je `main` branch povezan z `o/main`. Seveda imata brancha podobno ime in morda deluje logično, da se poveže `main` branch na oddaljenem repotu z lokalnim `main` branchem, toda ta povezava je jasno predstavljena v dveh scenarijih:',"","* Med pull operacijo so commiti preneseni na `o/main` in nato *zmergani* v `main` branch. Implicirana tarča merga je določena iz te povezave.","* Med push operacijo je delo iz `main` brancha naloženo na oddaljen `main` branch (ki je bil prej predstavljen kot `o/main` lokalno). *Destinacija* pusha je določena iz povezave med `main` in `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Sledenje oddaljenega repota","",'Če povzamem, ta povezava med `main` in `o/main` je preprosto razložena z lastnostnjo "oddaljenega sledenja" branchev. `main` branch je nastavljen, da sledi `o/main` -- to pomeni, da obstaja impliciran cilj merga in impliciran cilj pusha za `main` branch.',"","Morda se sprašuješ, kako se je nastavila ta lastnost na `main` branchu, čeprav nisi izvedel nobenega ukaza za to. No, ko kloniraš repo z gitom, je ta lastnost v bistvu nastavljena zate avtomatično. ","","Med kloniranjem git ustvari oddaljen branch za vsak branch na oddaljenem repotu (branchi kot `o/main`). Nato ustvari lokalen branch, ki sledi trenutno aktivnemu branchu na oddaljenem repotu, ki je v večini primerov `main`.","","Ko git clone zaključi, imaš samo en lokalen branch (da nisi zasipan), ampak lahko vidiš vse različne branche na oddaljenem repotu (če si zelo radoveden). Najboljše iz obeh svetov!","","To tudi razloži, zakaj lahko vidiš sledeč izpis ukaza med kloniranjem:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Ali ga lahko določim sam?","","Seveda se da! Narediš lahko, da bilokateri branch sledi `o/main`. V tem primeru bo imel ta branch enak impliciran cilj za push in merge kot `main`. To pomeni, da lahko poženeš `git push` na branchu poimenovanem `splohNiMain` in pushas svoje delo na `main` branch na oddaljenem repotu!","","Obstajata dva načina, da nastaviš to lastnost. Prvi je, da checkoutaš nov branch z uporabo oddaljenega brancha kot določeno referenca. Izvedba","","`git checkout -b splohNiMain o/main`","","Ustvari nov branch imenovan `splohNiMain` in nastavi, da sledi `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dovolj besedičenja, poglejmo primer! Checkoutali bomo nov branch poimenovan `foo` in ga nastavili, da sledi `main` na oddaljenem repotu."],afterMarkdowns:["Kot lahko vidiš, smo uporabili impliciran cilj mergea `o/main`, da posodobi `foo` branch. Opazi, kako se main ne posodobi!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["To velja tudi za git push."],afterMarkdowns:["Boom. Naše delo smo naložili na `main` na oddaljenem repotu, čeprav je ime našega brancha nekaj povsem drugega."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Način #2","","Še en način, da se nastavi oddaljeno sledenje na branchu, je, da se uporabi `git branch -u` opcija. Izvedba","","`git branch -u o/main foo`","","bo nastavila `foo` branch, da sledi `o/main`. Če je `foo` trenutno checkoutan, ga lahko celo izpustiš","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si na hitro še ta drug način določanja oddaljenega sledenja ..."],afterMarkdowns:["Enako kot prej, le bolj natančno. Lepa!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! Za to stopnjo pushajmo delo na `main` branch na oddaljenem repotu, medtem ko lokalno *nismo* na `masterju`. Ostalo prepustim tebi, ker je to vseeno napredna stopnja :P"]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["### தூரத்திலுள்ள கிளையை கண்காணித்தல்","",'கடந்த சில பாடங்களில் கிட் `main` மற்றும் `o/main` தொடர்பை கிட் அறிந்திருந்தது ஒரு "தந்திரம் போன்று" தோன்றி இருக்கலாம். நிச்சயமாக இரு கிளைகளுக்கும் ஒத்த பெயர்கள் உள்ளன, மேலும் தொலைதூரத்தில் உள்ள `main` கிளையை நமது கணினில் உள்ள `main` கிளையுடன் இணைக்க இது சரியான காரணமாக தெரியலாம், ஆனால் இந்த இணைப்பு இரண்டு காரணிகளில் தெளிவாக நிரூபிக்கப்பட்டுள்ளது:',"","* புல் செயல்பாட்டின் போது, கமிட்ஸ் `o/main` மீது பதிவிறக்கம் செய்யப்பட்டு `main` உடன் *ஒன்றிணைக்கப்படுகின்றது *. கிளைகளுக்கு இடையிலான இணைப்பின் மறைமுக இலக்கு இந்த தொடர்பினால் தீர்மானிக்கப்படுகிறது.","* புஸ் செயல்பாட்டின் பொது, `main` கிளையில் உள்ள மாற்றங்கள் தூரத்திலுள்ள `main` கிளைக்கு தள்ளப்படிகிரது (அது பின்னர் `o/main` என்று நம்மிடத்தில் குறித்துக்காட்டப்படும்).`main` மற்றும் `o/main` இடையிலான தொடர்பினை பொருத்து புஸ் செயலின் இலக்கு தீர்மானிக்கப்படுகிறது.",""]}},{type:"ModalAlert",options:{markdowns:["## தொலைதூர இலக்கை கண்காணித்தல்","",'சுருக்கமாக கூரினால், `main` மற்றும் `o/main` இடையிலான தொடர்பு "remote tracking" குணத்தினால் விளக்கப்பட்டுகிறது. `main` கிளை `o/main` கிளையை கண்காணிக்குமாரு அமைக்கப்பட்டுள்ளது -- என்றால் இணைப்பிற்க்கான இலக்கும் புஸ்க்கான இலக்கும் மறைமுகமாக குறிக்கப்பட்டுள்ளது.',"","எந்த ஓரு கட்டளையும் கொடுக்கப்படாமல் இந்த குணம் எப்படி கிடைத்தது என்ற குழப்பன் வேண்டாம், அது நீங்கள் ஒரு களஞ்சியத்தை நகல் எடுக்கும் போது தானாக பொறுத்த படுகிறது. ","","நகல் எடுக்கும் பொலுது, கிட் தூரத்திலுள்ள கிளைகளுக்கும் ஒரு கிளையை உருவாக்குகிறது (`o/main` கிளையை போன்று). பின்பு அது தூரத்தில் நடைமுறையில் உள்ள கிளையை கண்காணிக்கும் படி ஒரு கிளையை நமது இடத்தில் உருவாக்கும், அது பொதுவாக `main`ஆக இருக்கும்.","","நகால் எடுத்த பின்பு, நம்மிடம் உள்ள கிளை மட்டும் மீதம் இருக்கும் (எனவே நீங்கள் அதிகபடியாக எதையும் பெரவில்லை) ஆயினும் தேவைப்பட்டால் நீங்கள் தூரத்தில் உள்ள அனைத்து கிளைகளையும் காணலாம். இது இரு நிளைககளிலும் சிறந்தது!","","இதுதான் பின் வரும் கட்டளை நகல் எடுக்கும் போது பதிவு செயப்படுவதன் காரனம்:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### இதை நானே குறிப்பிட முடியுமா?","","ஆமாம் கண்டிப்பாக! உங்களால் எந்த ஒரு கிளையையும் `o/main` கண்காணிக்கும் படி அமைக்க முடியும், அப்படி செய்தால் அதிலும் இணைப்பிற்க்கான இலக்கு மற்றும் புஸ்க்கான இலக்கு் இரண்டும் மறைமுகமாக `main`ஐ குறிக்கும் படி இருக்கும். அதலான் `totallyNotMain` கிளையில் செய்யப்படும் `git push` தூரத்தில் உள்ள `main` கிளையில் மாற்றங்களை இணைத்துவிடும்.","","இதனை இரண்டு வகையாக செய்யலாம். முதலாவதாக புதிய கிளையை பின் வரும் கட்டளை கொண்டு பதிப்பித்தல்","","`git checkout -b totallyNotMain o/main`","","அல்லது `totallyNotMain` என்ற கிளையை உருவாக்கி `o/main` கண்காணிக்கு படி அமைத்தல்."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["விளக்கங்கள் போதும், இப்போது செயல்முறையை காண்போம்! `foo` கிளையை `main` கண்காணிக்கு படி பதிப்பிப்போம்."],afterMarkdowns:["நீங்கள் பார்ப்பதை போன்று, `foo` கிளை `o/main`ஐ மறைமுக இணை்ப்பு இல்க்காக அமைக்கப்பட்டுள்ளது. எவ்வளவு `main` புதுப்பிக்கப்படவில்லை என்பதை நினைவில் கொள்க!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["கிட் புஸ்-ஐயும் செயல் படுத்துங்கள்."],afterMarkdowns:["சிரப்பு. நமது கிளைக்கு முற்றிலும் வேறுபட்ட பெயரிடப்பட்டிருந்தாலும், நமது மாற்றங்களை தொலைதூரத்தில் உள்ள `main`தள்ளினோம்."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### வழி #2","","தூரத்திலுள்ள கிளையை கண்காணிக்கும் மற்றும் ஒரு முறை `git branch -u`ஐ பயன்படுத்துவது. பின்வருமாரு கட்டளையிட்டு","","`git branch -u o/main foo`","","இது `foo` `o/main`ஐ கண்காணிக்கும் படி செய்யும். `foo` ஏற்க்கனவே பதிப்பிட பட்டு இருந்தால் அதையும் நீ்ங்கள் உள்ளீடாக தர அவசியம் இல்லை:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது இந்த இரண்டாவது முறையை விரைவாக காண்போம்..."],afterMarkdowns:["முன்பு குறிப்பிட்டது போன்றுதான், மேலும் சற்று வெளிப்படையன கட்டளையாக!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["சரி! இந்த நிலைக்கு நாம் தூரத்தில் உள்ள `main` கிளைக்கு அதனை பதிப்பிடாமல் மாற்றங்களை தள்ளுவோம். இது உயர்நிலை பாட பகுதி என்பதால் அதை எவ்வாரு செய்யலாம் என்பது உங்களிடமெ விட்டு விடுகின்றேன் :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Gałęzie śledzące","",'Może ci się wydawać od kilku lekcji, że Git jakoś "magicznie" wie, że gałąź `main` jest powiązana z `o/main`. Co prawda nazwy tych gałęzi są podobne i, logicznie rzecz biorąc, `main` na zdalnym repo można skojarzyć z lokalną gałęzią `main`, ale na dwóch przykładach pokażemy, jak to działa w rzeczywistości:',"","* Podczas operacji pull commity są pobierane do `o/main`, a następnie za pomocą *merge* scalane z gałęzią `main`. Na podstawie tego połączenia określa się pośrednio cel scalania.","* Podczas operacji push praca z gałęzi `main` jest wypychana do zdalnej gałęzi `main` (lokalnie reprezentowanej przez `o/main`). *Cel* polecenia push jest określony przez połączenie pomiędzy `main` a `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'Żeby nie przedłużać: połączenie pomiędzy `main` i `o/main` da się wyjaśnić po prostu jedną z właściwości gałęzi: "remote tracking". Gałąź `main` ma ustawione śledzenie gałęzi `o/main` -- a to oznacza, że dla operacji merge i push określony jest domyślny cel.',"","Może się zastanawiasz, jak to się stało, że `main` ma już ustawione śledzenie, skoro nie robiliśmy tego żadnym poleceniem. Otóż, kiedy klonujesz repozytorium w Gicie, ta właściwość jest ustawiana za ciebie automatycznie. ","","Przy klonowaniu Git tworzy zdalną gałąź dla każdej z gałęzi zdalnego repozytorium (czyli gałęzie takie jak `o/main`). Następnie tworzy lokalną gałąź, która śledzi aktualnie aktywną gałąź na zdalnym repo - czyli najczęściej `main`.","","Po zakończeniu klonowania lokalnie masz tylko jedną gałąź (żeby nie zawracać sobie niepotrzebnie głowy), ale możesz zobaczyć wszystkie gałęzie na zdalnym repozytorium (jeśli aż tak cię to ciekawi). To idealne dwa w jednym!","","A przy okazji to wyjaśnia, dlaczego przy klonowaniu możesz zobaczyć:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### A czy mogę to określić samodzielnie?","","Jasne, że tak! Możesz kazać dowolnej gałęzi śledzić `o/main`, i w takim wypadku będzie miała taki sam domyślny cel operacji push i merge co `main`. To znaczy, że możesz zrobić `git push` na gałęzi o nazwie `totallyNotMain`, a twoja praca i tak zostanie wypchnięta do gałęzi `main` w zdalnym repozytorium!","","Są dwa sposoby ustawienia tej właściwości. Pierwszym jest checkout nowej gałęzi wykorzystujący zdalną gałąź jako określoną referencję. Polecenie","","`git checkout -b totallyNotMain o/main`","","tworzy nową gałąź o nazwie `totallyNotMain` i każe jej śledzić `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dość gadania, pora zobaczyć, jak to działa! Będziemy checkoutować nową gałąź o nazwie `foo` i każemy jej śledzić `main` na zdalnym repozytorium."],afterMarkdowns:["Jak widzisz, użyliśmy domyślnego celu scalania `o/main`, żeby zaktualizować gałąź `foo`. Zwróć uwagę, że `main` się nie aktualizuje!!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dotyczy to również git push."],afterMarkdowns:["Tadam! Wypchnęliśmy naszą pracę do `main` na `remote`, mimo że nasza gałąź nazywała się zupełnie inaczej."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Sposób #2","","Inny sposób na ustawienie remote tracking na branchu to po prostu użycie opcji `git branch -u`. Polecenie","","`git branch -u o/main foo`","","spowoduje, że gałąź `foo` będzie śledzić `o/main`. Jeśli aktualnie wybraną gałęzią jest `foo`, to możesz nawet pominąć jej nazwę:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spójrzmy jeszcze szybko, jak to wygląda w praktyce..."],afterMarkdowns:["Tak samo jak poprzednio, tylko wyraźniej, widać to w poleceniu. Pięknie!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Oki! Na tym poziomie wypchnijmy (push) pracę do gałęzi `main` na zdalnym repozytorium, *nie* checkoutując `main` lokalnie. Wymyśl samodzielnie, jak to zrobić. To przecież zaawansowana część kursu :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rami che tracciano il remoto","",'Una cosa che può esser sembrata "magica" riguardo le ultime lezioni è come git sapesse che il ramo `main` fosse connesso a `o/main`. Certo questi rami hanno dei nomi simili e avrebbe senso collegare il ramo `main` sul repository remoto al ramo `main` locale, ma questa connessione è chiaramente dimostrata in due scenari:',"","* Durante un'operazione di pull, i commit sono scaricati su `o/main` e poi *fusi* al ramo `main`. Il destinatario del merge è determinato da questa connessione.","* Durante un'operazione di push, il lavoro proveniente dal ramo `main` è stato caricato sul ramo `main` remoto (rappresentato localmente da `o/main`). La *destinazione* del push è determinata dalla connessione tra `main` e `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Tracciamento remoto","",'Per farla breve, questa connessione tra `main` e `o/main` viene spiegata facilmente dalla proprietà di "tracciamento remoto" dei rami. Il ramo `main` è impostato per tracciare `o/main` -- questo significa che sono presenti un destinatario implicito della fusione e una destinazione implicita del push per il ramo `main`.',"","Potresti chiederti come questa proprietà è stata impostata sul ramo `main` quando tu non hai eseguito alcun comando per specificarlo. Quando cloni un repository con git, questa proprietà viene impostata automaticamente.","","Durante un clone, git crea un ramo remoto per ciascun ramo presente sul repository remoto (aka rami come `o/main`). Crea poi un ramo locale che traccia il ramo attivo al momento sul remoto, che risulta essere `main` nella maggior parte dei casi.","","Una volta terminato git clone, di questi rimane solo un ramo locale (per non sovraccaricarti) ma puoi vedere tutti i vari rami presenti sul remoto (in caso tu fossi curioso). È come prendere due piccioni con una fava!","","Questo spiega inoltre perché potresti ricevere questo output durante la clonazione:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Posso specificarlo io?","","Sì che puoi! Puoi decidere arbitrariamente di far tracciare a qualsiasi ramo `o/main`, e se lo fai, quel ramo avrà le stesse destinazioni implicite per push e merge di `main`. Ciò significa che puoi eseguire `git push` su un ramo chiamato `perNienteIlMain` e vedere il tuo lavoro caricato sul ramo `main` nel repository remoto!","","Ci sono due modi per impostare questa proprietà. Il primo è creare il nuovo ramo tramite checkout specificando un ramo remoto come riferimento. Eseguire","","`git checkout -b perNienteIlMain o/main`","","Crea un nuovo ramo chiamato `perNienteIlMain` e lo imposta a tracciare `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Abbiamo parlato abbastanza, vediamo una dimostrazione! Creeremo tramite checkout un nuovo ramo chiamato `foo` e verrà impostato a tracciare `main` sul remoto."],afterMarkdowns:["Come puoi vedere, abbiamo usato il destinatario implicito di `o/main` per aggiornare il ramo `foo`. Se vedi il main non è stato aggiornato!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lo stesso vale per git push."],afterMarkdowns:["Boom. Abbiamo caricato il nostro lavoro al ramo `main` sul repository remoto nonostante il nostro ramo avesse un nome totalmente diverso."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Way #2","","Un altro modo per impostare il tracciamento remoto su un ramo è tramite l'opzione `git branch -u`. Eseguire","","`git branch -u o/main foo`","","imposterà il ramo `foo` a tracciare `o/main`. Se stiamo attualmente lavorando su `foo` possiamo ometterlo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo al volo quest'altro metodo per specificare il tracciamento remoto..."],afterMarkdowns:["Come prima, solo tramite un comando più esplicito. Bene dai!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! Per qusto livello carica del lavoro sul ramo `main` del remoto mentre *non* sei attualmente sul ramo `main` locale. Al resto devi arrivarci tu, d'altronde questo è il corso avanzato :P"]}}]}}}},{}]},{},[48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,84,85,86,87,88,89,90,91,92,93,94,95,96,98,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,77,79,78,80,81,82,83]); \ No newline at end of file +"use strict";var i,a,n,r;if("object"==typeof performance&&"function"==typeof performance.now){var s=performance;o.unstable_now=function(){return s.now()}}else{var c=Date,l=c.now();o.unstable_now=function(){return c.now()-l}}if("undefined"==typeof window||"function"!=typeof MessageChannel){var m=null,u=null,d=function(){if(null!==m)try{var e=o.unstable_now();m(!0,e),m=null}catch(e){throw setTimeout(d,0),e}};i=function(e){null!==m?setTimeout(i,0,e):(m=e,setTimeout(d,0))},a=function(e,t){u=setTimeout(e,t)},n=function(){clearTimeout(u)},o.unstable_shouldYield=function(){return!1},r=o.unstable_forceFrameRate=function(){}}else{var h=window.setTimeout,p=window.clearTimeout;if("undefined"!=typeof console){var g=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),"function"!=typeof g&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")}var f=!1,b=null,v=-1,k=5,w=0;o.unstable_shouldYield=function(){return o.unstable_now()>=w},r=function(){},o.unstable_forceFrameRate=function(e){0>e||125>>1,a=e[i];if(!(void 0!==a&&0D(r,o))void 0!==c&&0>D(c,r)?(e[i]=c,e[s]=o,i=s):(e[i]=r,e[n]=o,i=n);else{if(!(void 0!==c&&0>D(c,o)))break e;e[i]=c,e[s]=o,i=s}}}return t}return null}function D(e,t){var o=e.sortIndex-t.sortIndex;return 0!==o?o:e.id-t.id}var x=[],M=[],j=1,E=null,T=3,q=!1,S=!1,G=!1;function V(e){for(var t=A(M);null!==t;){if(null===t.callback)_(M);else{if(!(t.startTime<=e))break;_(M),t.sortIndex=t.expirationTime,z(x,t)}t=A(M)}}function B(e){if(G=!1,V(e),!S)if(null!==A(x))S=!0,i(R);else{var t=A(M);null!==t&&a(B,t.startTime-e)}}function R(e,t){S=!1,G&&(G=!1,n()),q=!0;var i=T;try{for(V(t),E=A(x);null!==E&&(!(E.expirationTime>t)||e&&!o.unstable_shouldYield());){var r=E.callback;if("function"==typeof r){E.callback=null,T=E.priorityLevel;var s=r(E.expirationTime<=t);t=o.unstable_now(),"function"==typeof s?E.callback=s:E===A(x)&&_(x),V(t)}else _(x);E=A(x)}if(null!==E)var c=!0;else{var l=A(M);null!==l&&a(B,l.startTime-t),c=!1}return c}finally{E=null,T=i,q=!1}}var I=r;o.unstable_IdlePriority=5,o.unstable_ImmediatePriority=1,o.unstable_LowPriority=4,o.unstable_NormalPriority=3,o.unstable_Profiling=null,o.unstable_UserBlockingPriority=2,o.unstable_cancelCallback=function(e){e.callback=null},o.unstable_continueExecution=function(){S||q||(S=!0,i(R))},o.unstable_getCurrentPriorityLevel=function(){return T},o.unstable_getFirstCallbackNode=function(){return A(x)},o.unstable_next=function(e){switch(T){case 1:case 2:case 3:var t=3;break;default:t=T}var o=T;T=t;try{return e()}finally{T=o}},o.unstable_pauseExecution=function(){},o.unstable_requestPaint=I,o.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var o=T;T=e;try{return t()}finally{T=o}},o.unstable_scheduleCallback=function(e,t,r){var s=o.unstable_now();switch("object"==typeof r&&null!==r?r="number"==typeof(r=r.delay)&&0s?(e.sortIndex=r,z(M,e),null===A(x)&&e===A(M)&&(G?n():G=!0,a(B,r-s))):(e.sortIndex=c,z(x,e),S||q||(S=!0,i(R))),e},o.unstable_wrapCallback=function(e){var t=T;return function(){var o=T;T=t;try{return e.apply(this,arguments)}finally{T=o}}}},{}],44:[function(e,t,o){"use strict";t.exports=e("./cjs/scheduler.production.min.js")},{"./cjs/scheduler.development.js":42,"./cjs/scheduler.production.min.js":43}],45:[function(e,t,o){"use strict";t.exports=e("./cjs/scheduler-tracing.production.min.js")},{"./cjs/scheduler-tracing.development.js":40,"./cjs/scheduler-tracing.production.min.js":41}],46:[function(e,t,o){(function(t,i){(function(){var a=e("process/browser.js").nextTick,n=Function.prototype.apply,r=Array.prototype.slice,s={},c=0;function l(e,t){this._id=e,this._clearFn=t}o.setTimeout=function(){return new l(n.call(setTimeout,window,arguments),clearTimeout)},o.setInterval=function(){return new l(n.call(setInterval,window,arguments),clearInterval)},o.clearTimeout=o.clearInterval=function(e){e.close()},l.prototype.unref=l.prototype.ref=function(){},l.prototype.close=function(){this._clearFn.call(window,this._id)},o.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},o.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},o._unrefActive=o.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},o.setImmediate="function"==typeof t?t:function(e){var t=c++,i=!(arguments.length<2)&&r.call(arguments,1);return s[t]=!0,a((function(){s[t]&&(i?e.apply(null,i):e.call(null),o.clearImmediate(t))})),t},o.clearImmediate="function"==typeof i?i:function(e){delete s[e]}}).call(this)}).call(this,e("timers").setImmediate,e("timers").clearImmediate)},{"process/browser.js":22,timers:46}],47:[function(e,t,o){(function(e){(function(){!function(e,i){"object"==typeof o&&void 0!==t?t.exports=i():"function"==typeof define&&define.amd?define("underscore",i):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var t=e._,o=e._=i();o.noConflict=function(){return e._=t,o}}())}(this,(function(){var t="1.13.2",o="object"==typeof self&&self.self===self&&self||"object"==typeof e&&e.global===e&&e||Function("return this")()||{},i=Array.prototype,a=Object.prototype,n="undefined"!=typeof Symbol?Symbol.prototype:null,r=i.push,s=i.slice,c=a.toString,l=a.hasOwnProperty,m="undefined"!=typeof ArrayBuffer,u="undefined"!=typeof DataView,d=Array.isArray,h=Object.keys,p=Object.create,g=m&&ArrayBuffer.isView,f=isNaN,b=isFinite,v=!{toString:null}.propertyIsEnumerable("toString"),k=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],w=Math.pow(2,53)-1;function y(e,t){return t=null==t?e.length-1:+t,function(){for(var o=Math.max(arguments.length-t,0),i=Array(o),a=0;a=0&&o<=w}}function Q(e){return function(t){return null==t?void 0:t[e]}}var X=Q("byteLength"),Z=$(X),K=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var J=m?function(e){return g?g(e)&&!P(e):Z(e)&&K.test(c.call(e))}:W(!1),Y=Q("length");function ee(e,t){t=function(e){for(var t={},o=e.length,i=0;i":">",'"':""","'":"'","`":"`"},Le=Ne(Oe),Ue=Ne(ye(Oe)),We=ie.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},$e=/(.)^/,Qe={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Xe=/\\|'|\r|\n|\u2028|\u2029/g;function Ze(e){return"\\"+Qe[e]}var Ke=/^\s*(\w|\$)+\s*$/;var Je=0;function Ye(e,t,o,i,a){if(!(i instanceof t))return e.apply(o,a);var n=xe(e.prototype),r=e.apply(n,a);return C(r)?r:n}var et=y((function(e,t){var o=et.placeholder,i=function(){for(var a=0,n=t.length,r=Array(n),s=0;s1)it(s,t-1,o,i),a=i.length;else for(var c=0,l=s.length;c0&&(o=t.apply(this,arguments)),e<=1&&(t=null),o}}var lt=et(ct,2);function mt(e,t,o){t=Ie(t,o);for(var i,a=te(e),n=0,r=a.length;n0?0:a-1;n>=0&&n0?r=n>=0?n:Math.max(n+c,r):c=n>=0?Math.min(n+1,c):n+c+1;else if(o&&n&&c)return i[n=o(i,a)]===a?n:-1;if(a!=a)return(n=t(s.call(i,r,c),U))>=0?n+r:-1;for(n=e>0?r:c-1;n>=0&&n0?0:r-1;for(a||(i=t[n?n[s]:s],s+=e);s>=0&&s=3;return t(e,Ve(o,a,4),i,n)}}var Ct=yt(1),zt=yt(-1);function At(e,t,o){var i=[];return t=Ie(t,o),kt(e,(function(e,o,a){t(e,o,a)&&i.push(e)})),i}function _t(e,t,o){t=Ie(t,o);for(var i=!ot(e)&&te(e),a=(i||e).length,n=0;n=0}var Mt=y((function(e,t,o){var i,a;return V(t)?a=t:(t=je(t),i=t.slice(0,-1),t=t[t.length-1]),wt(e,(function(e){var n=a;if(!n){if(i&&i.length&&(e=Ee(e,i)),null==e)return;n=e[t]}return null==n?n:n.apply(e,o)}))}));function jt(e,t){return wt(e,Ge(t))}function Et(e,t,o){var i,a,n=-1/0,r=-1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,c=(e=ot(e)?e:we(e)).length;sn&&(n=i);else t=Ie(t,o),kt(e,(function(e,o,i){((a=t(e,o,i))>r||a===-1/0&&n===-1/0)&&(n=e,r=a)}));return n}var Tt=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function qt(e){return e?H(e)?s.call(e):D(e)?e.match(Tt):ot(e)?wt(e,qe):we(e):[]}function St(e,t,o){if(null==t||o)return ot(e)||(e=we(e)),e[Pe(e.length-1)];var i=qt(e),a=Y(i);t=Math.max(Math.min(t,a),0);for(var n=a-1,r=0;r1&&(i=Ve(i,t[1])),t=ce(e)):(i=Ft,t=it(t,!1,!1),e=Object(e));for(var a=0,n=t.length;a1&&(o=t[1])):(t=wt(it(t,!1,!1),String),i=function(e,o){return!xt(t,o)}),Pt(e,i,o)}));function Nt(e,t,o){return s.call(e,0,Math.max(0,e.length-(null==t||o?1:t)))}function Ot(e,t,o){return null==e||e.length<1?null==t||o?void 0:[]:null==t||o?e[0]:Nt(e,e.length-t)}function Lt(e,t,o){return s.call(e,null==t||o?1:t)}var Ut=y((function(e,t){return t=it(t,!0,!0),At(e,(function(e){return!xt(t,e)}))})),Wt=y((function(e,t){return Ut(e,t)}));function $t(e,t,o,i){A(t)||(i=o,o=t,t=!1),null!=o&&(o=Ie(o,i));for(var a=[],n=[],r=0,s=Y(e);rt?(i&&(clearTimeout(i),i=null),s=l,r=e.apply(a,n),i||(a=n=null)):i||!1===o.trailing||(i=setTimeout(c,m)),r};return l.cancel=function(){clearTimeout(i),s=0,i=a=n=null},l},debounce:function(e,t,o){var i,a,n,r,s,c=function(){var l=He()-a;t>l?i=setTimeout(c,t-l):(i=null,o||(r=e.apply(s,n)),i||(n=s=null))},l=y((function(l){return s=this,n=l,a=He(),i||(i=setTimeout(c,t),o&&(r=e.apply(s,n))),r}));return l.cancel=function(){clearTimeout(i),i=n=s=null},l},wrap:function(e,t){return et(t,e)},negate:st,compose:function(){var e=arguments,t=e.length-1;return function(){for(var o=t,i=e[t].apply(this,arguments);o--;)i=e[o].call(this,i);return i}},after:function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},before:ct,once:lt,findKey:mt,findIndex:dt,findLastIndex:ht,sortedIndex:pt,indexOf:ft,lastIndexOf:bt,find:vt,detect:vt,findWhere:function(e,t){return vt(e,Se(t))},each:kt,forEach:kt,map:wt,collect:wt,reduce:Ct,foldl:Ct,inject:Ct,reduceRight:zt,foldr:zt,filter:At,select:At,reject:function(e,t,o){return At(e,st(Ie(t)),o)},every:_t,all:_t,some:Dt,any:Dt,contains:xt,includes:xt,include:xt,invoke:Mt,pluck:jt,where:function(e,t){return At(e,Se(t))},max:Et,min:function(e,t,o){var i,a,n=1/0,r=1/0;if(null==t||"number"==typeof t&&"object"!=typeof e[0]&&null!=e)for(var s=0,c=(e=ot(e)?e:we(e)).length;si||void 0===o)return 1;if(o'})),a="https://learngitbranching.js.org/?locale="+m.getDefaultLocale(),i.push(''),$("head").prepend(i),n.command){var r=unescape(n.command);e.mainVis.customEvents.on("gitEngineReady",(function(){p.trigger("commandSubmitted",r)}))}};function C(){i.$=$;e("../views");var t=e("../models/collections"),o=e("../views/commandViews"),a=e("../react_views/CommandHistoryView.jsx"),n=e("../react_views/MainHelperBarView.jsx");this.commandCollection=new t.CommandCollection,this.commandBuffer=new t.CommandBuffer({collection:this.commandCollection}),this.commandPromptView=new o.CommandPromptView({el:$("#commandLineBar")}),s.render(r.createElement(n),document.getElementById("helperBarMount")),s.render(r.createElement(a,{commandCollection:this.commandCollection}),document.getElementById("commandDisplay"))}e("../util").isBrowser()&&$(document).ready(b),o.getEvents=function(){return f},o.getSandbox=function(){return h},o.getEventBaton=function(){return p},o.getCommandUI=function(){return d},o.getLevelDropdown=function(){return g},o.init=b},{"../actions/LocaleActions":51,"../intl":67,"../models/collections":75,"../react_views/CommandHistoryView.jsx":77,"../react_views/MainHelperBarView.jsx":83,"../sandbox/":85,"../stores/LocaleStore":89,"../util":96,"../util/eventBaton":95,"../views":106,"../views/commandViews":104,"../views/levelDropdownView":107,backbone:1,events:4,jquery:18,raphael:30,react:39,"react-dom":33}],53:[function(e,t,o){var i=e("../intl"),a=e("../util/errors"),n=e("../git/commands"),r=e("../mercurial/commands"),s=a.CommandProcessError,c=(a.CommandResult,{git:n.commandConfig,hg:r.commandConfig}),l={execute:function(e,t,o,i){if(!c[e][t])throw new Error("i don't have a command for "+t);var a=c[e][t];if(a.delegate)return this.delegateExecute(a,o,i);a.execute.call(this,o,i)},delegateExecute:function(e,t,o){var i=e.delegate.call(this,t,o);i.multiDelegate?i.multiDelegate.forEach((function(e){o.setOptionsMap(e.options||{}),o.setGeneralArgs(e.args||[]),c[e.vcs][e.name].execute.call(this,t,o)}),this):(e=c[i.vcs][i.name],c[i.vcs][i.name].execute.call(this,t,o))},blankMap:function(){return{git:{},hg:{}}},getShortcutMap:function(){var e=this.blankMap();return this.loop((function(t,o,i){t.sc&&(e[i][o]=t.sc)}),this),e},getOptionMap:function(){var e=this.blankMap();return this.loop((function(t,o,i){var a=t.displayName||o,n={};(t.options||[]).forEach((function(e){n[e]=!1})),e[i][a]=n})),e},getRegexMap:function(){var e=this.blankMap();return this.loop((function(t,o,i){var a=t.displayName||o;e[i][a]=t.regex})),e},getCommandsThatCount:function(){var e=this.blankMap();return this.loop((function(t,o,i){t.dontCountForGolf||(e[i][o]=t.regex)})),e},loop:function(e,t){Object.keys(c).forEach((function(t){var o=c[t];Object.keys(o).forEach((function(i){var a=o[i];e(a,i,t)}))}))}};function m(e,t,o){if(this.vcs=e,this.method=t,this.rawOptions=o,this.supportedMap=l.getOptionMap()[e][t],void 0===this.supportedMap)throw new Error("No option map for "+t);this.generalArgs=[]}m.prototype.explodeAndSet=function(){for(var e=0;e"]}},{type:"ModalAlert",options:{markdowns:["## Git 명령어","","연습 모드에서 쓸 수 있는 다양한 git명령어는 다음과 같습니다",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## 공유해주세요!","","`export tree` 와 `import tree`로 여러분의 친구들에게 트리를 공유해주세요","","훌륭한 학습 자료가 있으신가요? `build level`로 레벨을 만들어 보시거나, 친구의 레벨을 `import level`로 가져와서 실험해보세요","","이제 레슨을 시작해봅시다..."]}}],fr_FR:[{type:"ModalAlert",options:{markdowns:["## Bienvenue sur Learn Git Branching !","","Cette application a été conçue pour aider les débutants à saisir ","les puissants concepts derrière les branches en travaillant ","avec git. Nous espérons que vous apprécierez cette application et ","que vous apprendrez peut-être quelque chose d'intéressant !","","# Démo !","","Si vous n'avez pas vu la démo, vous pouvez le faire là :","","[https://pcottle.github.io/learnGitBranching/?locale=fr_FR&demo](https://pcottle.github.io/learnGitBranching/?locale=fr_FR&demo)","","Agacé par ce dialogue ? Ajoutez `NODEMO` à l'URL pour le supprimer, en lien ci-dessous pour votre commodité :","","[https://pcottle.github.io/learnGitBranching/?locale=fr_FR&NODEMO](https://pcottle.github.io/learnGitBranching/?locale=fr_FR&NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Commandes Git","","Il existe une large variété de commandes git disponibles dans le mode bac à sable. Sont incluses :",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Partager, c'est se soucier !","","Partagez des arbres avec vos amis via `export tree` et `import tree`","","Vous avez une grande leçon à partager ? Essayez de construire un niveau avec `build level` ou essayez le niveau d'un ami avec `import level`","","Pour voir la gamme complète des commandes, tapez `show commands`. Il y a quelques perles telles que `undo` et `reset`","","Mais tout de suite commencez sur les `levels`…"]}}],ru_RU:[{type:"ModalAlert",options:{markdowns:["## Добро пожаловать в LearnGitBranching!","","Это приложение создано, чтобы помочь новичкам постичь ","мощные возможности ветвления и работы ","с git. Мы надеемся, что вам понравится эта игра ","и может вы что-то усвоите!","","# Демо!","","Если ты не видел демонстрацию – посмотри её тут:","","[https://pcottle.github.io/learnGitBranching/?locale=ru_RU&demo](https://pcottle.github.io/learnGitBranching/?locale=ru_RU&demo)","","Достало это сообщение? Добавь `NODEMO` к адресу и навсегда забудь о нём, ниже ссылка для удобства:","","[https://pcottle.github.io/learnGitBranching/?locale=ru_RU&NODEMO](?locale=ru_RU&NODEMO)"]}},{type:"ModalAlert",options:{markdowns:["## Команды Git","","В нашей песочнице можно использовать множество команд:",""," * commit"," * branch"," * checkout"," * cherry-pick"," * reset"," * revert"," * rebase"," * merge"]}},{type:"ModalAlert",options:{markdowns:["## Бог велел – делись!","","Ты можешь делиться результатами с друзьями при помощи `export tree` и `import tree`","","Хочешь создать классный уровень? Сделай это при помощи `build level` или добавь уровень друга при помощи `import level`","","Команда `show commands` покажет все доступные инструкции. Там есть очень полезные, например `undo` и `reset`","","А пока просто начни игру при помощи `levels`..."]}}],uk:[{type:"ModalAlert",options:{markdowns:["## Ласкаво просимо до Learn Git Branching","","Хочеш вивчити Git? Тоді ти знайшов те, що шукав!",'"Learn Git Branching" — це найбільш візуальний та інтерактивний спосіб вивчення Git в Інтернеті. ',"Ти зможеш проходити захопливі рівні, дивитися ","покрокові інструкції з використання потужних функцій Git, навіть трохи ","розважитись в процесі навчання.","","Після цього діалогу побачиш список доступних рівнів. Якщо ти новачок, ","просто почни з першого рівня. Якщо вже знаєш основи Git, ","спробуй більш складні рівні в кінці.","","P.S. Хочеш перейти одразу до пісочниці наступного разу?","Спробуй ","[це спеціальне посилання.](https://pcottle.github.io/learnGitBranching/?locale=uk&NODEMO)"]}}],vi:[{type:"ModalAlert",options:{markdowns:["## Chào mừng đến với Học Nhánh Git","","Bạn có hứng thú học Git? Bạn đến đúng nơi rồi đấy! ",'"Học Nhánh Git" là cách trực quan và hiệu quả nhất để học Git trên web; ',"thông qua một loạt các thử thách cấp độ thú vị, bạn sẽ từng bước tìm hiểu sức mạnh của Git.","","Sau khi hộp thoại này đóng lại, bạn sẽ thấy nhiều cấp độ mà chúng tôi cung cấp. ","Nếu bạn là người mới thì hãy bắt đầu từ bài đầu tiên. Nếu bạn đã có hiểu biết cơ bản về Git, ","hãy thử những bài mang tính thách thức hơn phía sau.","","Bạn có thể dùng lệnh `show commands` để xem tất cả các lệnh được hỗ trợ.","","Ghi chú: Nếu muốn trực tiếp vào hộp cát (sandbox) ở lần sau?","Hãy dùng","[đường link đặc biệt này của chúng tôi](https://pcottle.github.io/learnGitBranching/?locale=vi&NODEMO)","","Tái bút: GitHub đã đổi tên cho nhánh mặc định là `main` thay vì `master` ","nhằm tránh dùng thuật ngữ có xu hướng thiên vị [(xem chi tiết tại đây)](https://github.com/github/renaming). ",'Để bắt kịp xu hướng công nghệ này, chúng tôi cũng đã cập nhật "Học Nhánh Git" sử ',"dụng `main` thay thế cho `master` trong các bài học. Việc đổi tên được thực hiện khá nhất quán cho đến ","thời điểm hiện tại, nhưng nếu bạn phát hiện bất kỳ lỗi nào, đừng ngần ngại mà gửi một pull request (PR), hoặc tạo một vấn đề (New issue)."]}}],sl_SI:[{type:"ModalAlert",options:{markdowns:["## Dobrodošel na učenju Git Branchanja","","Bi se rad naučil Git? No, prišel si na pravo mesto! ",'"Learn Git Branching" je najbolj vizualen in interaktiven način učenja Git-a ',"na spletu; zagrizel boš v zanimive stopnje, po korakih boš spoznaval osupljive ","funkcije in kaj pa veš, morda ti bo celo zabavno. ;)","","Za tem oknom boš videl kopico stopenj, ki so na razpolago. Če si ","začetnik, kar pogumno, začni s prvo. Če pa že poznaš Git osnove, ","se preizkusi v zahtevnejših stopnjah.","","Vidiš lahko vse ukaze, ki so na voljo, z ukazom `show commands` v terminalu.","","PS: Bi šel rad naslednjič naravnost v peskovnik?","Poizkusi s","[to posebno povezavo](https://pcottle.github.io/learnGitBranching/?locale=sl_SI&NODEMO)"]}}],pl:[{type:"ModalAlert",options:{markdowns:["## Witaj w Learn Git Branching!","","Jesteś zainteresowany nauką Gita? Cóż, trafiłeś we właściwe miejsce!",'"Learn Git Branching" jest najbardziej wizualnym i interaktywnym sposobem na naukę gita w sieci.',"Czekają na Ciebie ekscytujące poziomy, demonstracje zaawansowanych funkcji krok po kroku. Może nawet będziesz się dobrze bawić.","","Po tym oknie dialogowym zobaczysz różnorodność poziomów, które mamy do zaoferowania.","Jeśli jesteś początkujący, po prostu zacznij od pierwszego poziomu.","Jeśli znasz już podstawy gita, wypróbuj niektóre z naszych późniejszych, bardziej wymagających poziomów.","","Możesz zobaczyć wszystkie komendy wpisując `show commands` w terminalu.","","Chcesz następnym razem przejść prosto do trybu piaskownicy? Kilknij [tutaj](https://pcottle.github.io/learnGitBranching/?locale=pl&NODEMO)","","PS. GitHub zaczął nazywać domyślną gałąź `main` zamiast `master`, aby odejść od tendencyjnej terminologii. [(więcej informacji tutaj)](https://github.com/github/renaming)",,'Zgodnie z tym ogólnobranżowym ruchem, zaktualizowaliśmy również "Learn Git Branching", by używać `main` zamiast `master` w naszych zadaniach.',"Ta zmiana nazwy powinna być już w miarę spójna, ale jeśli zauważysz jakieś błędy, nie krępuj się dodać pull request (lub zgłosić issue na githubie - prawy górny róg)."]}}],ta_IN:[{type:"ModalAlert",options:{markdowns:["## Git Branching கற்க வரவேற்கிறோம்","","கிட் கற்க ஆர்வமா? அப்படியானால் நீங்கள் சரியான இடத்திற்கு வந்துவிட்டீர்கள்! ",'"Learn Git Branching" Git ஐக் கற்றுக்கொள்வதற்கான வரைபடம் மற்றும் செயல்முறை ',"பயிற்சியுடன் கூடிய சிரந்த கருவி; ","உங்களை சோதிக்கும் வகையிலான நிலைகளுடன் மிகுந்த சக்திவாய்ந்த அம்சங்களை ","படிப்படியாகவும், சில சமையம் விளையாட்டாகவும் கற்றுத்தர கூடியது.","","இந்த அறிவிற்ப்புக்கு பிறகு, நாங்கள் வழங்க உள்ள பல்வேறு நிலைகளை நீங்கள் காண்பீர்கள். ","நீங்கள் ஆரம்ம நிலையில் இருந்தால், முதல் கட்டத்தில் இருந்து தொடங்கவும். ","கிட்டின் சில அடிப்படைகளை நீங்கள் ஏற்கனவே அறிந்திருந்தால், மெலும் உள்ள கடினமான கட்டங்களை முயற்ச்சி செய்யுங்கள்.","","தேவையானால் `show commands` ஐ பயன்படுத்தி அனைத்து கட்டளைகளையும் முனையத்தில் பார்க்கலாம்.","","பின்குறிப்பு: அடுத்தமுறை நேராக sandbox செல்ல வேண்டுமா?","அப்படியானால் பின் வரும் இணைப்பை பயன்பாடித்துக ","[this special link](https://pcottle.github.io/learnGitBranching/?locale=ta_IN&NODEMO)","","பின்குறிப்பு: GitHub (பெரிய அளவில் பயன்பாட்டில் உள்ள இணையதலம்) `main` என்ற கிளையை `master`-க்கு பதில் ","முன்னிருப்பு கிளையாக பயன் படுத்த உள்ளது [more details available here](https://github.com/github/renaming). ","இந்த மாற்றத்தை பின்னோக்கி இணக்கமான வழியில் பொருத்துவதற்காக, `main`-ஐ முதன்மையாக கருதி ","இந்த இரண்டு பெயர்களும் ஒன்றுக்கொன்று மாற்றுப்பெயர்களாகக் கருதப்படும். ","இந்த மாற்றத்தை அனைத்து நிலை உள்ளடக்கங்களிலும் புதுப்பிக்க நாங்கள் சிறந்த முயற்சியை ","மேற்கொண்டோம், ஆயினும் ஏதேனும் விடுபட்டி இருந்தால் PR உருவாக்கி உதவுங்கள்.","ஒருபக்கச்சார்பான சொற்களிலிருந்து விலகிச் செல்ல உதவியதற்கு நன்றி."]}}],it_IT:[{type:"ModalAlert",options:{markdowns:["## Benvenuto su Learn Git Branching","","Vorresti imparare Git? Bene, sei nel posto giusto! ",'"Learn Git Branching" è il modo più chiaro e interattivo per imparare Git ',"su internet; sarai messo alla prova tramite livelli stimolanti, con dimostrazioni ","passo a passo sulle sue potenzialità e, perché no, magari ti divertirai lungo questo percorso.","","Dopo questa finestra vedrai una varietà di livelli che abbiamo da offrire. Se sei alle","prime armi procedi e parti dall'inizio. Se hai delle conoscenze base di Git ","prova con gli ultimi livelli più impegnativi.","","Puoi vedere tutti i comandi disponibili digitando `show commands` sul terminale.","","PS: Preferisci andare direttamente al sandbox?","Prova ","[questo link](https://pcottle.github.io/learnGitBranching/?NODEMO?locale=it_IT).","","PPS: GitHub (e il settore in generale) sta modificando il nome del ramo di default in `main` invece che `master` ","(leggi [qui per ulteriori dettagli](https://github.com/github/renaming)). Per adattarci a questo cambiamento ","mantenendo la retrocompatibilità, questi nomi saranno considerati equivalenti. `main` sarà comunque ","il nome predefinito. Ci siamo impegnati per aggiornare tutti i livelli ma ci sarà ","sicuramente qualcosa che potremmo aver dimenticato. Esegui una PR (o segnala un problema) se ne trovi. ","Grazie per l'aiuto!"]}}],tr_TR:[{type:"ModalAlert",options:{markdowns:["## Learn Git Branching'e hoşgeldiniz.","","Git öğrenmeye ilgi duyuyor musunuz? O zaman doğru yerdesiniz!",'"Learn Git Branching," Git\'i öğrenmenin en görsel ve etkileşimli yoludur.',"web üzerinde; sizi heyecan verici seviyelerle zorlayacak, güçlü özelliklerin adım adım gösterimlerini sunacak","ve belki de eğlenceli vakit geçirmenizi sağlayacaktır.","","Bu iletişim kutusunu geçtikten sonra sunduğumuz çeşitli seviyeleri göreceksiniz. Eğer yeni başlayan biriyseniz, ","sadece ilk seviyeye başlayabilirsiniz. Eğer zaten Git temellerini biliyorsanız, ","daha sonraki daha zorlu seviyeleri deneyebilirsiniz.","","Terminalde `show commands` ile mevcut tüm komutları görebilirsiniz.","","Not: Bir sonraki seferde doğrudan bir deneme ortamına gitmek mi istiyorsunuz?","Denemek için bu özel bağlantıyı kullanın: ","[özel bağlantı](https://pcottle.github.io/learnGitBranching/?NODEMO)","","Not: GitHub, önyargılı terimlerden uzaklaşmak için varsayılan Branch ismini `master` yerine `main` ","olarak adlandırmaya başladı [(daha fazla detay için tıklayın)](https://github.com/github/renaming). ",'Biz de sektör genelindeki harekete uygun olarak, "Learn Git Branching" ',"derslerimizde de `master` yerine `main` kullanımını güncelledik. Bu adlandırmanın ","şu anda oldukça tutarlı olması gerekiyor, ancak herhangi bir hata fark ederseniz,","lütfen bir PR (veya issue) göndermekten çekinmeyin."]}}]}},{"../git":63}],59:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("flux").Dispatcher,n=i.PayloadSources,r=new a;r.handleViewAction=function(e){this.dispatch({source:n.VIEW_ACTION,action:e})},r.handleURIAction=function(e){this.dispatch({source:n.URI_ACTION,action:e})},t.exports=r},{"../constants/AppConstants":54,flux:6}],60:[function(e,t,o){var i=e("../util/escapeString"),a=e("../intl"),n=e("../graph"),r=e("../util/errors"),s=(r.CommandProcessError,r.GitError),c=(r.Warning,r.CommandResult),l=function(e){return e.replace(/'/g,"'").replace(///g,"/")};function m(e){return-1!==e.indexOf(":")&&2===e.split(":").length}var u=function(e,t){e.resolveID(t)},d=function(e,t){return e.validateBranchName(t)},h=function(e,t){return e.origin.validateBranchName(t)},p=function(e,t){return e.refs[t]?t:d(e,t)},g=function(e,t){if(e.refs[t]&&e.HEAD.get("target")===e.refs[t])throw new s({msg:a.todo("cannot fetch to "+t+" when checked out on "+t)})},f=function(e,t){u(e,t);var o=e.resolveID(t);if(!o||"branch"!==o.get("type"))throw new s({msg:a.todo(t+" is not a branch")})},b=function(e){if(e.length&&"origin"!==e[0])throw new s({msg:a.todo(e[0]+" is not a remote in your repository! try adding origin to that argument")})},v=function(e,t){if(t=l(t),!e.resolveID(t))throw new s({msg:a.todo(t+" is not a branch!")});var o=e.resolveID(t);if("branch"!==o.get("type"))throw new s({msg:a.todo(t+" is not a branch!")});var i=o.getRemoteTrackingBranchID();if(!i)throw new s({msg:a.todo(t+" is not a remote tracking branch! I don't know where to push")});return i},k={commit:{sc:/^(gc|git ci)($|\s)/,regex:/^git +commit($|\s)/,options:["--amend","-a","--all","-am","-m"],execute:function(e,t){var o=t.getOptionsMap();if(t.acceptNoGeneralArgs(),o["-am"]&&(o["-a"]||o["--all"]||o["-m"]))throw new s({msg:a.str("git-error-options")});var i=null,n=null;(o["-a"]||o["--all"])&&t.addWarning(a.str("git-warning-add")),o["-am"]&&(n=o["-am"],t.validateArgBounds(n,1,1,"-am"),i=n[0]),o["-m"]&&(n=o["-m"],t.validateArgBounds(n,1,1,"-m"),i=n[0]),o["--amend"]&&(n=o["--amend"],t.validateArgBounds(n,0,0,"--amend"));var r=e.commit({isAmend:!!o["--amend"]});i&&(i=i.replace(/"/g,'"').replace(/^"/g,"").replace(/"$/g,""),r.set("commitMessage",i));var c=e.animationFactory.playCommitBirthPromiseAnimation(r,e.gitVisuals);e.animationQueue.thenFinish(c)}},cherrypick:{displayName:"cherry-pick",regex:/^git +cherry-pick($|\s)/,execute:function(e,t){t.getOptionsMap();var o=t.getGeneralArgs();t.validateArgBounds(o,1,Number.MAX_VALUE);var i=n.getUpstreamSet(e,"HEAD"),r=o.map((function(t){var o=e.getCommitFromRef(t);if(i[o.get("id")])throw new s({msg:a.str("git-error-already-exists",{commit:o.get("id")})});return o}),this);e.setupCherrypickChain(r)}},gc:{displayName:"gc",regex:/^git +gc($|\s)/,execute:function(e,t){e.pruneTree(!1)}},pull:{regex:/^git +pull($|\s)/,options:["--rebase"],execute:function(e,t){if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});var o,i,n=t.getOptionsMap(),r=t.getGeneralArgs();n["--rebase"]&&(r=n["--rebase"].concat(r)),t.twoArgsForOrigin(r),b(r);var c=r[1];if(c&&m(c)){var u=c.split(":");o=u[0],i=p(e,l(u[1])),g(e,i)}else if(c)o=c,f(e.origin,o),i=e.origin.resolveID(o).getPrefixedID();else{if(e.getDetachedHead())throw new s({msg:a.todo("Git pull can not be executed in detached HEAD mode if no remote branch specified!")});var d=e.getOneBeforeCommit("HEAD"),h=d.get("id");v(e,h),o=(i=d.getRemoteTrackingBranchID()).replace("o/","")}e.pull({source:o,destination:i,isRebase:!!n["--rebase"]})}},fakeTeamwork:{regex:/^git +fakeTeamwork($|\s)/,execute:function(e,t){var o,i,n=t.getGeneralArgs();if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});switch(t.validateArgBounds(n,0,2),n.length){case 0:o="main",i=1;break;case 1:isNaN(parseInt(n[0],10))?(o=h(e,n[0]),i=1):(i=parseInt(n[0],10),o="main");break;case 2:if(o=h(e,n[0]),isNaN(parseInt(n[1],10)))throw new s({msg:"Bad numeric argument: "+n[1]});i=parseInt(n[1],10)}if("branch"!==e.origin.resolveID(o).get("type"))throw new s({msg:a.str("git-error-options")});e.fakeTeamwork(i,o)}},clone:{regex:/^git +clone *?$/,execute:function(e,t){t.acceptNoGeneralArgs(),e.makeOrigin(e.printTree())}},remote:{regex:/^git +remote($|\s)/,options:["-v"],execute:function(e,t){if(t.acceptNoGeneralArgs(),!e.hasOrigin())throw new c({msg:""});e.printRemotes({verbose:!!t.getOptionsMap()["-v"]})}},fetch:{regex:/^git +fetch($|\s)/,execute:function(e,t){if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});var o,i,n=t.getGeneralArgs();t.twoArgsForOrigin(n),b(n);var r=n[1];if(r&&m(r)){var c=r.split(":");o=c[0],i=p(e,l(c[1])),g(e,i)}else r&&(o=r,f(e.origin,o),i=e.origin.resolveID(o).getPrefixedID());o&&u(e.origin,o),e.fetch({source:o,destination:i})}},branch:{sc:/^(gb|git br)($|\s)/,regex:/^git +branch($|\s)/,options:["-d","-D","-f","--force","-a","-r","-u","--contains"],execute:function(e,t){var o,i=t.getOptionsMap(),n=t.getGeneralArgs(),r=null;if(i["-d"]||i["-D"]){var c=i["-d"]||i["-D"];return c=c.concat(n),t.validateArgBounds(c,1,Number.MAX_VALUE,"-d"),void c.forEach((function(t){e.validateAndDeleteBranch(t)}))}if(i["-u"]){r=i["-u"].concat(n),t.validateArgBounds(r,1,2,"-u");var m=l(r[0]),d=r[1]||e.getOneBeforeCommit("HEAD").get("id");return function(e,t){u(e,t);var o=e.resolveID(t);if("branch"!==o.get("type")||!o.getIsRemote())throw new s({msg:a.todo(t+" is not a remote branch")})}(e,m),f(e,d),void e.setLocalToTrackRemote(e.resolveID(d),e.resolveID(m))}return i["--contains"]?(r=i["--contains"],t.validateArgBounds(r,1,1,"--contains"),void e.printBranchesWithout(r[0])):i["-f"]||i["--force"]?(r=(r=i["-f"]||i["--force"]).concat(n),t.twoArgsImpliedHead(r,"-f"),void e.forceBranch(r[0],r[1])):0===n.length?(o=i["-a"]?e.getBranches():i["-r"]?e.getRemoteBranches():e.getLocalBranches(),void e.printBranches(o)):(t.twoArgsImpliedHead(n),void e.branch(n[0],n[1]))}},add:{dontCountForGolf:!0,sc:/^ga($|\s)/,regex:/^git +add($|\s)/,execute:function(){throw new c({msg:a.str("git-error-staging")})}},reset:{regex:/^git +reset($|\s)/,options:["--hard","--soft"],execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs();if(o["--soft"])throw new s({msg:a.str("git-error-staging")});if(o["--hard"]&&(t.addWarning(a.str("git-warning-hard")),i=i.concat(o["--hard"])),t.validateArgBounds(i,1,1),e.getDetachedHead())throw new s({msg:a.str("git-error-reset-detached")});e.reset(i[0])}},revert:{regex:/^git +revert($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.validateArgBounds(o,1,Number.MAX_VALUE),e.revert(o)}},merge:{regex:/^git +merge($|\s)/,options:["--no-ff","--squash"],execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs().concat(o["--no-ff"]||[]).concat(o["--squash"]||[]);t.validateArgBounds(i,1,1);var a=e.merge(i[0],{noFF:!!o["--no-ff"],squash:!!o["--squash"]});void 0!==a?e.animationFactory.genCommitBirthAnimation(e.animationQueue,a,e.gitVisuals):e.animationFactory.refreshTree(e.animationQueue,e.gitVisuals)}},revlist:{dontCountForGolf:!0,displayName:"rev-list",regex:/^git +rev-list($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.validateArgBounds(o,1),e.revlist(o)}},log:{dontCountForGolf:!0,regex:/^git +log($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.impliedHead(o,0),e.log(o)}},show:{dontCountForGolf:!0,regex:/^git +show($|\s)/,execute:function(e,t){var o=t.getGeneralArgs();t.oneArgImpliedHead(o),e.show(o[0])}},rebase:{sc:/^gr($|\s)/,options:["-i","--solution-ordering","--interactive-test","--aboveAll","-p","--preserve-merges","--onto"],regex:/^git +rebase($|\s)/,execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs();if(o["-i"]){var a=o["-i"].concat(i);return t.twoArgsImpliedHead(a," -i"),void(o["--interactive-test"]?e.rebaseInteractiveTest(a[0],a[1],{interactiveTest:o["--interactive-test"]}):e.rebaseInteractive(a[0],a[1],{aboveAll:!!o["--aboveAll"],initialCommitOrdering:o["--solution-ordering"]}))}if(o["--onto"]){a=o["--onto"].concat(i);return t.threeArgsImpliedHead(a," --onto"),void e.rebaseOnto(a[0],a[1],a[2],{preserveMerges:o["-p"]||o["--preserve-merges"]})}t.twoArgsImpliedHead(i),e.rebase(i[0],i[1],{preserveMerges:o["-p"]||o["--preserve-merges"]})}},status:{dontCountForGolf:!0,sc:/^(gst|gs|git st)($|\s)/,regex:/^git +status($|\s)/,execute:function(e){e.status()}},checkout:{sc:/^(go|git co)($|\s)/,regex:/^git +checkout($|\s)/,options:["-b","-B","-"],execute:function(e,t){var o=t.getOptionsMap(),i=t.getGeneralArgs(),n=null;if(o["-b"]){n=o["-b"].concat(i),t.twoArgsImpliedHead(n,"-b");var r=e.validateBranchName(n[0]);return e.branch(r,n[1]),void e.checkout(r)}if(o["-"]){var c=e.HEAD.get("lastLastTarget");if(!c)throw new s({msg:a.str("git-result-nothing")});e.HEAD.set("target",c)}else{if(o["-B"])return n=o["-B"].concat(i),t.twoArgsImpliedHead(n,"-B"),e.forceBranch(n[0],n[1]),void e.checkout(n[0]);t.validateArgBounds(i,1,1),e.checkout(e.crappyUnescape(i[0]))}}},push:{regex:/^git +push($|\s)/,options:["--force","--delete","-d"],execute:function(e,t){if(!e.hasOrigin())throw new s({msg:a.str("git-error-origin-required")});var o,i,n,r=t.getOptionsMap(),c=r["-d"]||r["--delete"],l=t.getGeneralArgs();if(c){let e=r["-d"]||r["--delete"];l="origin"===e[0]?e.concat(l):l.concat(e)}t.twoArgsForOrigin(l),b(l);var h=l[1];if(c){if(!h)throw new s({msg:a.todo("--delete doesn't make sense without any refs")});if(m(h))throw new s({msg:a.todo("--delete only accepts plain target ref names")});h=":"+h}if(h&&m(h)){var p=h.split(":");if(i=p[0],o=d(e,p[1]),""===i&&!e.origin.resolveID(o))throw new s({msg:a.todo("cannot delete branch "+{}.destination+" which doesn't exist")})}else if(h?(u(e,h),n=e.resolveID(h)):n=e.getOneBeforeCommit("HEAD"),i=n.get("id"),n.getRemoteTrackingBranchID&&n.getRemoteTrackingBranchID()){v(e,i);var g=n.getRemoteTrackingBranchID();o=e.resolveID(g).getBaseID()}else o=d(e,i);i&&u(e,i),e.push({destination:o,source:i,force:!!r["--force"]})}},describe:{regex:/^git +describe($|\s)/,execute:function(e,t){if(0===e.tagCollection.toArray().length)throw new s({msg:a.todo("fatal: No tags found, cannot describe anything.")});var o=t.getGeneralArgs();t.oneArgImpliedHead(o),u(e,o[0]),e.describe(o[0])}},tag:{regex:/^git +tag($|\s)/,options:["-d"],execute:function(e,t){var o=t.getGeneralArgs(),i=t.getOptionsMap();if(i["-d"]){var n,r=i["-d"];if(u(e,r),t.oneArgImpliedHead(r),e.tagCollection.each((function(e){e.get("id")==r&&(n=e)}),!0),null==n)throw new s({msg:a.todo("No tag found, nothing to remove")});return e.tagCollection.remove(n),delete e.refs[r],void e.gitVisuals.refreshTree()}if(0!==o.length)t.twoArgsImpliedHead(o),e.tag(o[0],o[1]);else{var c=e.getTags();e.printTags(c)}}},switch:{sc:/^(gsw|git sw)($|\s)/,regex:/^git +switch($|\s)/,options:["-c","--create","-C","--force-create","-"],execute:function(e,t){var o=t.getGeneralArgs(),i=t.getOptionsMap();let n=i["-c"]?i["-c"]:i["--create"];if(n){let i=n.concat(o);t.twoArgsImpliedHead(i,"-c");let a=e.validateBranchName(i[0]);return e.branch(a,i[1]),void e.checkout(a)}let r="-C",c=i[r]?i[r]:i["--force-create"];if(c){let i=c.concat(o);t.twoArgsImpliedHead(i,r);let a=e.validateBranchName(i[0]);return e.forceBranch(a,i[1]),void e.checkout(a)}if(i["-"]){var l=e.HEAD.get("lastLastTarget");if(!l)throw new s({msg:a.str("git-result-nothing")});e.HEAD.set("target",l)}else t.validateArgBounds(o,1,1),e.checkout(e.crappyUnescape(o[0]))}}},w=[[/^(git help($|\s)|git$)/,function(){var t=[a.str("git-version"),"
",a.str("git-usage"),i(a.str("git-usage-command")),"
",a.str("git-supported-commands"),"
"],o=e("../commands").commands.getOptionMap().git;Object.keys(o).forEach((function(e){var i=o[e];t.push("git "+e),Object.keys(i).forEach((function(e){t.push("\t "+e)}),this)}),this);var n=t.join("\n");throw n=n.replace(/\t/g,"   "),new c({msg:n})}]];o.commandConfig=k,o.instantCommands=w},{"../commands":53,"../graph":64,"../intl":67,"../util/errors":93,"../util/escapeString":94}],61:[function(e,t,o){var i=e("q"),a=e("../app");e("../views/multiView").MultiView;function n(e){e=e||{},this.beforeCB=e.beforeCB||function(){},this.afterCB=e.afterCB||function(){};var t=function(e){e.resolve()};this.beforeDeferHandler=e.beforeDeferHandler||t,this.afterDeferHandler=e.afterDeferHandler||t,this.eventBaton=e.eventBaton||a.getEventBaton()}n.prototype.insertShim=function(){this.eventBaton.stealBaton("processGitCommand",this.processGitCommand,this)},n.prototype.removeShim=function(){this.eventBaton.releaseBaton("processGitCommand",this.processGitCommand,this)},n.prototype.processGitCommand=function(e,t){this.beforeCB(e);var o=i.defer();o.promise.then(function(){this.afterGitCommandProcessed(e,t)}.bind(this)).done();var a=function(){this.eventBaton.passBatonBack("processGitCommand",this.processGitCommand,this,[e,o])}.bind(this),n=i.defer();n.promise.then(a).done(),this.beforeDeferHandler(n,e)},n.prototype.afterGitCommandProcessed=function(e,t){this.afterCB(e);var o=i.defer();o.promise.then((function(){t.resolve()})).done(),this.afterDeferHandler(o,e)},o.GitShim=n},{"../app":52,"../views/multiView":108,q:29}],62:[function(e,t,o){e("backbone");var i=e("q"),a=e("../git").GitEngine,n=e("../visuals/animation/animationFactory").AnimationFactory,r=e("../visuals").GitVisuals,s=(e("../graph/treeCompare"),e("../util/eventBaton").EventBaton),c=e("../models/collections"),l=c.CommitCollection,m=c.BranchCollection,u=c.TagCollection,d=e("../models/commandModel").Command,h=e("../util/mock").mock,p=e("../util");var g=function(){this.init()};g.prototype.init=function(){this.commitCollection=new l,this.branchCollection=new m,this.tagCollection=new u;var e=function(){var e={},t=function(){var e=i.defer();return e.resolve(),e.promise};for(var o in n)e[o]=t;return e.playRefreshAnimationAndFinish=function(e,t){t.finish()},e.refreshTree=function(e,t){e.finish()},e.highlightEachWithPromise=function(e,t,o){return e},e}(),t=h(r),o={makeOrigin:function(e){e.localRepo;var t=e.treeString,o=new g;return o.gitEngine.loadTreeFromString(t),{customEvents:{on:function(e,t,o){t.apply(o,[])}},gitEngine:o.gitEngine}}};t.getVisualization=function(){return o},this.gitEngine=new a({collection:this.commitCollection,branches:this.branchCollection,tags:this.tagCollection,gitVisuals:t,animationFactory:e,eventBaton:new s}),this.gitEngine.init()};g.prototype.sendCommand=function(e,t){var o=i.defer(),a=o.promise,n=((new Date).getTime(),[]);return p.splitTextCommand(e,(function(e){a=a.then(function(){var t=new d({rawStr:e}),o=i.defer();return this.gitEngine.dispatch(t,o),n.push(t),o.promise}.bind(this))}),this),a.then((function(){(new Date).getTime();t&&t.resolve(n)})),a.fail((function(e){console.log("!!!!!!!! error !!!!!!!"),console.log(e),console.log(e.stack),console.log("!!!!!!!!!!!!!!!!!!!!!!")})),o.resolve(),a},o.HeadlessGit=g,o.getTreeQuick=function(e,t){var o=i.defer(),a=new g;a.sendCommand(e,o),o.promise.then((function(){t.resolve(a.gitEngine.exportTree())}))}},{"../git":63,"../graph/treeCompare":65,"../models/collections":75,"../models/commandModel":76,"../util":96,"../util/eventBaton":95,"../util/mock":99,"../visuals":112,"../visuals/animation/animationFactory":110,backbone:1,q:29}],63:[function(e,t,o){var i=e("backbone"),a=e("q"),n=e("../intl"),r=e("../visuals/animation/animationFactory").AnimationFactory,s=e("../visuals/animation").AnimationQueue,c=e("../graph/treeCompare"),l=e("../graph"),m=e("../util/errors"),u=e("../app"),d=e("../commands"),h=m.GitError,p=m.CommandResult,g="o/",f="   ",b="STAPH";function v(e){if(e!==b)throw e}function k(e){this.rootCommit=null,this.refs={},this.HEAD=null,this.origin=null,this.mode="git",this.localRepo=null,this.branchCollection=e.branches,this.tagCollection=e.tags,this.commitCollection=e.collection,this.gitVisuals=e.gitVisuals,this.eventBaton=e.eventBaton,this.eventBaton.stealBaton("processGitCommand",this.dispatch,this),this.animationFactory=e.animationFactory?e.animationFactory:r,this.initUniqueID()}k.prototype.initUniqueID=function(){var e;this.uniqueId=(e=0,function(t){return t?t+e++:e++})},k.prototype.handleModeChange=function(e,t){if(this.mode!==e){u.getEvents().trigger("vcsModeChange",{mode:e});var o=this.setMode(e);this.origin&&this.origin.setMode(e,(function(){})),o?o.then(t):t()}else t()},k.prototype.getIsHg=function(){return"hg"===this.mode},k.prototype.setMode=function(e){var t="git"===this.mode&&"hg"===e;if(this.mode=e,t){var o=a.defer();o.resolve();var i=o.promise;if(this.updateAllBranchesForHg())return i=(i=i.then(function(){return this.animationFactory.playRefreshAnimationSlow(this.gitVisuals)}.bind(this))).then(function(){if(this.pruneTree())return this.animationFactory.playRefreshAnimation(this.gitVisuals)}.bind(this));if(this.pruneTree())return this.animationFactory.playRefreshAnimation(this.gitVisuals)}},k.prototype.assignLocalRepo=function(e){this.localRepo=e},k.prototype.defaultInit=function(){var e=l.getDefaultTree();this.loadTree(e)},k.prototype.init=function(){this.rootCommit=this.makeCommit(null,null,{rootCommit:!0}),this.commitCollection.add(this.rootCommit);var e=this.makeBranch("main",this.rootCommit);this.HEAD=new w({id:"HEAD",target:e}),this.refs[this.HEAD.get("id")]=this.HEAD,this.commit()},k.prototype.hasOrigin=function(){return!!this.origin},k.prototype.isOrigin=function(){return!!this.localRepo},k.prototype.exportTreeForBranch=function(e){var t=this.exportTree(),o=l.getUpstreamSet(this,e),i=t.commits;t.commits={},i.forEach((function(e,i){o[i]&&(t.commits[i]=e)}));var a=t.branches;return t.branches={},a.forEach((function(o,i){i===e&&(t.branches[i]=o)})),t.HEAD.target=e,t},k.prototype.exportTree=function(){var e={branches:{},commits:{},tags:{},HEAD:null};this.branchCollection.toJSON().forEach((function(t){t.target=t.target.get("id"),delete t.visBranch,e.branches[t.id]=t})),this.commitCollection.toJSON().forEach((function(t){C.prototype.constants.circularFields.forEach((function(e){delete t[e]})),t.parents=(t.parents||[]).map((function(e){return e.get("id")})),e.commits[t.id]=t}),this),this.tagCollection.toJSON().forEach((function(t){delete t.visTag,t.target=t.target.get("id"),e.tags[t.id]=t}),this);var t=this.HEAD.toJSON();return t.lastTarget=t.lastLastTarget=t.visBranch=t.visTag=void 0,t.target=t.target.get("id"),e.HEAD=t,this.hasOrigin()&&(e.originTree=this.origin.exportTree()),e},k.prototype.printTree=function(e){e=e||this.exportTree(),c.reduceTreeFields([e]);var t=JSON.stringify(e);return/'/.test(t)&&(t=escape(t)),t},k.prototype.printAndCopyTree=function(){window.prompt(n.str("Copy the tree string below"),this.printTree())},k.prototype.loadTree=function(e){e=JSON.parse(JSON.stringify(e)),this.removeAll(),this.instantiateFromTree(e),this.reloadGraphics(),this.initUniqueID()},k.prototype.loadTreeFromString=function(e){this.loadTree(JSON.parse(unescape(this.crappyUnescape(e))))},k.prototype.instantiateFromTree=function(e){var t={};Object.values(e.commits).forEach((function(o){var i=this.getOrMakeRecursive(e,t,o.id,this.gitVisuals);this.commitCollection.add(i)}),this),Object.values(e.branches).forEach((function(o){var i=this.getOrMakeRecursive(e,t,o.id,this.gitVisuals);this.branchCollection.add(i,{silent:!0})}),this),Object.values(e.tags||{}).forEach((function(o){var i=this.getOrMakeRecursive(e,t,o.id,this.gitVisuals);this.tagCollection.add(i,{silent:!0})}),this);var o=this.getOrMakeRecursive(e,t,e.HEAD.id,this.gitVisuals);if(this.HEAD=o,this.rootCommit=t.C0,!this.rootCommit)throw new Error("Need root commit of C0 for calculations");if(this.refs=t,this.gitVisuals.gitReady=!1,this.branchCollection.each((function(e){this.gitVisuals.addBranch(e)}),this),this.tagCollection.each((function(e){this.gitVisuals.addTag(e)}),this),e.originTree){var i=JSON.stringify(e.originTree);this.animationQueue=this.animationQueue||new s({callback:function(){}}),this.makeOrigin(i)}},k.prototype.makeOrigin=function(e){if(this.hasOrigin())throw new h({msg:n.str("git-error-origin-exists")});e=e||this.printTree(this.exportTreeForBranch("main"));var t=this.gitVisuals.getVisualization().makeOrigin({localRepo:this,treeString:e});this.animationQueue.set("promiseBased",!0),t.customEvents.on("gitEngineReady",(function(){this.origin=t.gitEngine,t.gitEngine.assignLocalRepo(this),this.syncRemoteBranchFills(),this.origin.externalRefresh(),this.animationFactory.playRefreshAnimationAndFinish(this.gitVisuals,this.animationQueue)}),this);var o=JSON.parse(unescape(e));Object.keys(o.branches).forEach((function(e){var t=o.branches[e];if(!this.refs[g+e]){var i=this.findCommonAncestorWithRemote(t.target),a=this.makeBranch(g+e,this.getCommitFromRef(i));this.setLocalToTrackRemote(this.refs[t.id],a)}}),this)},k.prototype.makeRemoteBranchIfNeeded=function(e){if(!this.doesRefExist(g+e)&&"branch"===this.origin.resolveID(e).get("type"))return this.makeRemoteBranchForRemote(e)},k.prototype.makeBranchIfNeeded=function(e){if(!this.doesRefExist(e)){var t=this.findCommonAncestorForRemote(this.getCommitFromRef("HEAD").get("id"));return this.validateAndMakeBranch(e,this.getCommitFromRef(t))}},k.prototype.makeRemoteBranchForRemote=function(e){var t=this.origin.resolveID(e).get("target"),o=this.findCommonAncestorWithRemote(t.get("id"));return this.makeBranch(g+e,this.getCommitFromRef(o))},k.prototype.findCommonAncestorForRemote=function(e){if(this.origin.refs[e])return e;var t=this.refs[e].get("parents");if(1===t.length)return e=t[0].get("id"),this.findCommonAncestorForRemote(e);var o=this.findCommonAncestorForRemote(t[0].get("id")),i=this.findCommonAncestorForRemote(t[1].get("id"));return this.getCommonAncestor(o,i,!0).get("id")},k.prototype.findCommonAncestorWithRemote=function(e){if(this.refs[e])return e;var t=this.origin.refs[e].get("parents");if(1===t.length)return this.findCommonAncestorWithRemote(t[0].get("id"));var o=this.findCommonAncestorWithRemote(t[0].get("id")),i=this.findCommonAncestorWithRemote(t[1].get("id"));return this.getCommonAncestor(o,i,!0).get("id")},k.prototype.makeBranchOnOriginAndTrack=function(e,t){var o=this.makeBranch(g+e,this.getCommitFromRef(t));this.refs[e]&&this.setLocalToTrackRemote(this.refs[e],o);var i=this.findCommonAncestorForRemote(this.getCommitFromRef(t).get("id"));this.origin.makeBranch(e,this.origin.getCommitFromRef(i))},k.prototype.setLocalToTrackRemote=function(e,t){if(e.setRemoteTrackingBranchID(t.get("id")),this.command){var o='local branch "'+e.get("id")+'" set to track remote branch "'+t.get("id")+'"';this.command.addWarning(n.todo(o))}},k.prototype.getOrMakeRecursive=function(e,t,o,i){if(t[o])return t[o];var a=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if("HEAD"==t)return"HEAD";if(e.tags[t])return"tag";throw new Error("bad type for "+t)}(e,o);if("HEAD"==a){var n=e.HEAD,r=new w(Object.assign(e.HEAD,{target:this.getOrMakeRecursive(e,t,n.target)}));return t[o]=r,r}if("branch"==a){var s=e.branches[o],c=new y(Object.assign(e.branches[o],{target:this.getOrMakeRecursive(e,t,s.target)}));return t[o]=c,c}if("tag"==a){var l=e.tags[o],m=new z(Object.assign(e.tags[o],{target:this.getOrMakeRecursive(e,t,l.target)}));return t[o]=m,m}if("commit"==a){var u=e.commits[o],d=u.parents.map((function(o){return this.getOrMakeRecursive(e,t,o)}),this),h=new C(Object.assign(u,{parents:d,gitVisuals:this.gitVisuals}));return t[o]=h,h}throw new Error("ruh rho!! unsupported type for "+o)},k.prototype.tearDown=function(){this.tornDown||(this.eventBaton.releaseBaton("processGitCommand",this.dispatch,this),this.removeAll(),this.tornDown=!0)},k.prototype.reloadGraphics=function(){this.gitVisuals.rootCommit=this.refs.C0,this.gitVisuals.initHeadBranch(),this.gitVisuals.drawTreeFromReload(),this.gitVisuals.refreshTreeHarsh()},k.prototype.removeAll=function(){this.branchCollection.reset(),this.tagCollection.reset(),this.commitCollection.reset(),this.refs={},this.HEAD=null,this.rootCommit=null,this.origin&&(this.origin.gitVisuals.getVisualization().tearDown(),delete this.origin,this.gitVisuals.getVisualization().clearOrigin()),this.gitVisuals.resetAll()},k.prototype.getDetachedHead=function(){return"branch"!==this.HEAD.get("target").get("type")},k.prototype.validateBranchName=function(e){if(e=(e=e.replace(///g,"/")).replace(/\s/g,""),!/^(\w+[.\/\-]?)+\w+$/.test(e)||0===e.search("o/"))throw new h({msg:n.str("bad-branch-name",{branch:e})});if(/^[cC]\d+$/.test(e))throw new h({msg:n.str("bad-branch-name",{branch:e})});if(/[hH][eE][aA][dD]/.test(e))throw new h({msg:n.str("bad-branch-name",{branch:e})});return e.length>9&&(e=e.slice(0,9),this.command.addWarning(n.str("branch-name-short",{branch:e}))),e},k.prototype.validateAndMakeBranch=function(e,t){if(e=this.validateBranchName(e),this.doesRefExist(e))throw new h({msg:n.str("bad-branch-name",{branch:e})});return this.makeBranch(e,t)},k.prototype.validateAndMakeTag=function(e,t){if(e=this.validateBranchName(e),this.refs[e])throw new h({msg:n.str("bad-tag-name",{tag:e})});this.makeTag(e,t)},k.prototype.makeBranch=function(e,t){if(this.refs[e]){var o=new Error;throw new Error("woah already have that ref "+e+" "+o.stack)}var i=new y({target:t,id:e});return this.branchCollection.add(i),this.refs[i.get("id")]=i,i},k.prototype.makeTag=function(e,t){if(this.refs[e])throw new Error("woah already have that");var o=new z({target:t,id:e});return this.tagCollection.add(o),this.refs[o.get("id")]=o,o},k.prototype.getHead=function(){return Object.assign({},this.HEAD)},k.prototype.getTags=function(){var e=[];return this.tagCollection.each((function(t){e.push({id:t.get("id"),target:t.get("target"),remote:t.getIsRemote(),obj:t})}),this),e},k.prototype.getBranches=function(){var e=[];return this.branchCollection.each((function(t){e.push({id:t.get("id"),selected:this.HEAD.get("target")===t,target:t.get("target"),remote:t.getIsRemote(),obj:t})}),this),e},k.prototype.getRemoteBranches=function(){return this.getBranches().filter((function(e){return!0===e.remote}))},k.prototype.getLocalBranches=function(){return this.getBranches().filter((function(e){return!1===e.remote}))},k.prototype.printBranchesWithout=function(e){var t=this.getUpstreamBranchSet()[this.getCommitFromRef(e).get("id")].map((function(e){return e.selected=this.HEAD.get("target").get("id")==e.id,e}),this);this.printBranches(t)},k.prototype.printBranches=function(e){var t="";throw e.forEach((e=>{t+=(e.selected?"* ":"")+this.resolveName(e.id).split('"')[1]+"\n"})),new p({msg:t})},k.prototype.printTags=function(e){var t="";throw e.forEach((function(e){t+=e.id+"\n"})),new p({msg:t})},k.prototype.printRemotes=function(e){var t="";throw e.verbose?(t+="origin (fetch)\n",t+=f+"git@github.com:pcottle/foo.git\n\n",t+="origin (push)\n",t+=f+"git@github.com:pcottle/foo.git"):t+="origin",new p({msg:t})},k.prototype.getUniqueID=function(){for(var e=this.uniqueId("C"),t=function(e){return!!this.refs[e]||!(!this.origin||!this.origin.refs[e])}.bind(this);t(e);)e=this.uniqueId("C");return e},k.prototype.makeCommit=function(e,t,o){t||(t=this.getUniqueID());var i=new C(Object.assign({parents:e,id:t,gitVisuals:this.gitVisuals},o||{}));return this.refs[i.get("id")]=i,this.commitCollection.add(i),i},k.prototype.revert=function(e){var t=e.map((function(e){return this.getCommitFromRef(e)}),this),o=a.defer(),i=o.promise,r=this.resolveID("HEAD");i=this.animationFactory.highlightEachWithPromise(i,t,r);var s=this.getCommitFromRef("HEAD"),c=function(e){var t=this.rebaseAltID(e.get("id")),o=n.str("git-revert-msg",{oldCommit:this.resolveName(e),oldMsg:e.get("commitMessage")}),i=this.makeCommit([s],t,{commitMessage:o});return s=i,this.animationFactory.playCommitBirthPromiseAnimation(i,this.gitVisuals)}.bind(this);t.forEach((function(e){i=i.then((function(){return c(e)}))})),i=i.then(function(){return this.setTargetLocation("HEAD",s),this.animationFactory.playRefreshAnimation(this.gitVisuals)}.bind(this)),this.animationQueue.thenFinish(i,o)},k.prototype.reset=function(e){this.setTargetLocation("HEAD",this.getCommitFromRef(e))},k.prototype.setupCherrypickChain=function(e){var t=a.defer(),o=t.promise,i=this.resolveID("HEAD");o=this.animationFactory.highlightEachWithPromise(o,e,i);var n=function(e){var t=this.cherrypick(e);return this.animationFactory.playCommitBirthPromiseAnimation(t,this.gitVisuals)}.bind(this);e.forEach((function(e){o=o.then((function(){return n(e)}))}),this),this.animationQueue.thenFinish(o,t)},k.prototype.checkUpstreamOfSource=function(e,t,o,i,a){if(!l.getUpstreamSet(t,i)[e.getCommitFromRef(o).get("id")])throw new h({msg:a||n.str("git-error-origin-fetch-no-ff")})},k.prototype.getTargetGraphDifference=function(e,t,o,i,a){a=a||{},i=t.resolveID(i);var r=l.getUpstreamSet(e,o),s=t.getCommitFromRef(i),c=t.exportTree(),m=c.commits[s.get("id")];if(r[m.id]){if(a.dontThrowOnNoFetch)return[];throw new h({msg:n.str("git-error-origin-fetch-uptodate")})}m.depth=0;for(var u=[],d=[m],p=function(e){if(!r[e]){var t=c.commits[e];t.depth=g.depth+1,d.push(t)}};d.length;){var g=d.pop();u.push(g),g.parents.forEach(p)}for(var f=l.getUniqueObjects(u),b=[],v=function(e){var t=!0;return e.parents.forEach((function(e){t=t&&r[e]})),t};f.length;)for(var k=0;kt[e]=!0));var i=[];if(this.commitCollection.each((function(e){t[e.get("id")]||i.push(e)}),this),i.length)return this.command&&e&&this.command.addWarning(n.str("hg-prune-tree")),i.forEach((function(e){e.removeFromParents(),this.commitCollection.remove(e);var t=e.get("id");this.refs[t]=void 0,delete this.refs[t];var o=e.get("visNode");o&&o.removeAll()}),this),!0},k.prototype.getUpstreamBranchSet=function(){return this.getUpstreamCollectionSet(this.branchCollection)},k.prototype.getUpstreamTagSet=function(){return this.getUpstreamCollectionSet(this.tagCollection)},k.prototype.getUpstreamCollectionSet=function(e){var t={};return e.each((function(e){(function(e){for(var t=[],o=[e];o.length;){var i=o.pop();t.push(i.get("id")),i.get("parents")&&i.get("parents").length&&(o=o.concat(i.get("parents")))}return t})(e.get("target")).forEach((function(o){t[o]=t[o]||[],function(e,t){var o=!1;return e.forEach((function(e){e.id==t&&(o=!0)})),o}(t[o],e.get("id"))||t[o].push({obj:e,id:e.get("id")})}))})),t},k.prototype.getUpstreamHeadSet=function(){var e=l.getUpstreamSet(this,"HEAD");return e[this.getCommitFromRef("HEAD").get("id")]=!0,e},k.prototype.getOneBeforeCommit=function(e){var t=this.resolveID(e);return t!==this.HEAD||this.getDetachedHead()||(t=t.get("target")),t},k.prototype.scrapeBaseID=function(e){var t=/^C(\d+)/.exec(e);if(!t)throw new Error("regex failed on "+e);return"C"+t[1]},k.prototype.rebaseAltID=function(e){for(var t=this.getBumpedID(e);this.refs[t];)t=this.getBumpedID(t);return t},k.prototype.getMostRecentBumpedID=function(e){for(var t,o=e;this.refs[o];)t=o,o=this.getBumpedID(o);return t},k.prototype.getBumpedID=function(e){for(var t=[[/^C(\d+)[']{0,2}$/,function(e){return e[0]+"'"}],[/^C(\d+)[']{3}$/,function(e){return e[0].slice(0,-3)+"'^4"}],[/^C(\d+)['][\^](\d+)$/,function(e){return"C"+String(e[1])+"'^"+String(Number(e[2])+1)}]],o=0;o0)throw new h({msg:n.todo("Hey those commits don't exist in the set!")})}this.rebaseFinish(i,{},e,t)},k.prototype.rebaseInteractive=function(t,o,i){i=i||{};var r=this.getInteractiveRebaseCommits(t,o);this.animationQueue.set("defer",!0);var s,c=a.defer();if(c.promise.then(function(e){if(!e.length)throw new p({msg:n.str("git-result-nothing")});this.rebaseFinish(e,{},t,o)}.bind(this)).fail(function(e){this.filterError(e),this.command.set("error",e),this.animationQueue.start()}.bind(this)).done(),i.initialCommitOrdering&&i.initialCommitOrdering.length>0){var l={};r.forEach((function(e){l[e.get("id")]=!0})),s=[],i.initialCommitOrdering[0].split(",").forEach((function(e){if(!l[e])throw new h({msg:n.todo("Hey those commits don't exist in the set!")});s.push(e)}))}new(0,e("../views/rebaseView").InteractiveRebaseView)({deferred:c,toRebase:r,initialCommitOrdering:s,aboveAll:i.aboveAll})},k.prototype.filterRebaseCommits=function(e,t,o){var i={};Object.keys(t).forEach((function(e){i[this.scrapeBaseID(e)]=!0}),this);var a={};return e.filter((function(e){if(1!==e.get("parents").length&&!o.preserveMerges)return!1;var t=this.scrapeBaseID(e.get("id"));return!i[t]&&(!a[e.get("id")]&&(a[e.get("id")]=!0,!0))}),this)},k.prototype.getRebasePreserveMergesParents=function(e){return e.get("parents").map((function(e){var t=e.get("id"),o=this.getMostRecentBumpedID(t);return this.refs[o]}),this)},k.prototype.rebaseFinish=function(e,t,o,i,r){r=r||{};var s=this.resolveID(o),c=r.deferred||a.defer(),l=r.chain||c.promise,m=this.filterRebaseCommits(e,t,r);if(!m.length)throw new h({msg:n.str("git-error-rebase-none")});l=this.animationFactory.highlightEachWithPromise(l,m,s);var u=this.getCommitFromRef(o),d=!1,p=function(e){var t,o=this.rebaseAltID(e.get("id"));t=r.preserveMerges&&d&&d?this.getRebasePreserveMergesParents(e):[u];var i=this.makeCommit(t,o);return u=i,d=!0,this.animationFactory.playCommitBirthPromiseAnimation(i,this.gitVisuals)}.bind(this);return m.forEach((function(e){l=l.then((function(){return p(e)}))}),this),l=l.then(function(){return"commit"==this.resolveID(i).get("type")?this.checkout(u):(this.setTargetLocation(i,u),this.checkout(i)),this.animationFactory.playRefreshAnimation(this.gitVisuals)}.bind(this)),r.dontResolvePromise||this.animationQueue.thenFinish(l,c),l},k.prototype.mergeCheck=function(e,t){var o=this.getCommitFromRef(e)===this.getCommitFromRef(t);return this.isUpstreamOf(e,t)||o},k.prototype.merge=function(e,t){t=t||{};var o="HEAD";if(this.mergeCheck(e,o))throw new p({msg:n.str("git-result-uptodate")});if(this.isUpstreamOf(o,e)&&!t.noFF&&!t.squash)return this.setTargetLocation(o,this.getCommitFromRef(e)),void this.command.setResult(n.str("git-result-fastforward"));var i=this.getCommitFromRef(o),a=this.getCommitFromRef(e),r=n.str("git-merge-msg",{target:this.resolveName(e),current:this.resolveName(o)}),s=[i];t.squash||s.push(a);var c=this.makeCommit(s,null,{commitMessage:r});return this.setTargetLocation(o,c),c},k.prototype.checkout=function(e){var t=this.resolveID(e);if("HEAD"!==t.get("id")){var o=t.get("type");if("branch"===o&&t.getIsRemote()&&(t=this.getCommitFromRef(t.get("id"))),"branch"!==o&&"tag"!==o&&"commit"!==o)throw new h({msg:n.str("git-error-options")});"tag"===o&&(t=t.get("target")),this.HEAD.set("target",t)}},k.prototype.forceBranch=function(e,t){e=this.crappyUnescape(e),this.doesRefExist(e)||this.branch(e,t);var o=this.resolveID(e);if("branch"!==o.get("type"))throw new h({msg:n.str("git-error-options")});if(o.getIsRemote())throw new h({msg:n.str("git-error-remote-branch")});var i=this.getCommitFromRef(t);this.setTargetLocation(o,i)},k.prototype.branch=function(e,t){var o=this.getCommitFromRef(t),i=this.validateAndMakeBranch(e,o);t=this.resolveID(t),this.isRemoteBranchRef(t)&&this.setLocalToTrackRemote(i,t)},k.prototype.isRemoteBranchRef=function(e){var t=this.resolveID(e);return"branch"===t.get("type")&&t.getIsRemote()},k.prototype.tag=function(e,t){var o=this.getCommitFromRef(t);this.validateAndMakeTag(e,o)},k.prototype.describe=function(e){var t=this.getCommitFromRef(e),o={};this.tagCollection.toJSON().forEach((function(e){o[e.target.get("id")]=e.id}));for(var i,a=[t],r=[];a.length;){var s=a.pop(),c=s.get("id");if(o[c]){i=o[c];break}r.push(s.get("id"));var l=s.get("parents");l&&l.length&&(a=a.concat(l)).sort(this.dateSortFunc)}if(!i)throw new h({msg:n.todo("Fatal: no tags found upstream")});if(0===r.length)throw new p({msg:i});throw new p({msg:i+"_"+r.length+"_g"+t.get("id")})},k.prototype.validateAndDeleteBranch=function(e){var t=this.resolveID(e);if("branch"!==t.get("type")||"main"==t.get("id")||this.HEAD.get("target")===t)throw new h({msg:n.str("git-error-branch")});var o=t;if(t.getIsRemote())throw new h({msg:n.str("git-error-remote-branch")});this.deleteBranch(o)},k.prototype.deleteBranch=function(e){this.branchCollection.remove(e),this.refs[e.get("id")]=void 0,delete this.refs[e.get("id")],this.HEAD.get("target")===e&&this.HEAD.set("target",this.refs.main),e.get("visBranch")&&e.get("visBranch").remove()},k.prototype.crappyUnescape=function(e){return e.replace(/'/g,"'").replace(///g,"/")},k.prototype.filterError=function(e){if(!(e instanceof h||e instanceof p))throw e},k.prototype.externalRefresh=function(){this.animationQueue=new s({callback:function(){}}),this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals),this.animationQueue.start()},k.prototype.dispatch=function(e,t){this.command=e;var o=e.get("vcs"),i=function(){this.dispatchProcess(e,t)}.bind(this);this.handleModeChange(o,i)},k.prototype.dispatchProcess=function(e,t){var o=function(){e.finishWith(t)}.bind(this);this.animationQueue=new s({callback:o});var i=e.get("vcs"),a=e.get("method").replace(/-/g,"");try{d.commands.execute(i,a,this,this.command)}catch(o){return this.filterError(o),e.set("error",o),void t.resolve()}var n=this.animationQueue.get("defer")||this.animationQueue.get("promiseBased");this.animationQueue.get("animations").length||n||this.animationFactory.refreshTree(this.animationQueue,this.gitVisuals),n||this.animationQueue.start()},k.prototype.show=function(e){var t=this.getCommitFromRef(e);throw new p({msg:t.getShowEntry()})},k.prototype.status=function(){var e=[];if(this.getDetachedHead())e.push(n.str("git-status-detached"));else{var t=this.resolveNameNoPrefix("HEAD");e.push(n.str("git-status-onbranch",{branch:t}))}e.push("Changes to be committed:"),e.push(""),e.push(f+"modified: cal/OskiCostume.stl"),e.push(""),e.push(n.str("git-status-readytocommit"));var o="";throw e.forEach((function(e){o+="# "+e+"\n"})),new p({msg:o})},k.prototype.logWithout=function(e,t){t=t.slice(1),this.log(e,l.getUpstreamSet(this,t))},k.prototype.revlist=function(e){var t=new A(this,e).formatRevisions((function(e){return e.id+"\n"}));throw new p({msg:t})},k.prototype.log=function(e){var t=new A(this,e).formatRevisions((function(e){return e.getLogEntry()}));throw new p({msg:t})},k.prototype.getCommonAncestor=function(e,t,o){if(this.isUpstreamOf(t,e)&&!o)throw new Error("Don't use common ancestor if we are upstream!");for(var i=l.getUpstreamSet(this,e),a=[this.getCommitFromRef(t)];a.length;){var n=a.pop();if(i[n.get("id")])return n;a=a.concat(n.get("parents"))}throw new Error("something has gone very wrong... two nodes aren't connected!")},k.prototype.isUpstreamOf=function(e,t){return e=this.getCommitFromRef(e),void 0!==l.getUpstreamSet(this,t)[e.get("id")]},k.prototype.getDownstreamSet=function(e){var t=this.getCommitFromRef(e),o=t.get("id"),i=[t],a={};a[o]=!0;for(var n=function(e){a[e.get("id")]=!0,i.push(e)};i.length;){i.pop().get("children").forEach(n)}return a};var w=i.Model.extend({initialize:function(){if(!this.get("target"))throw new Error("must be initialized with target");if(!this.get("id"))throw new Error("must be given an id");this.set("type","general ref"),"HEAD"==this.get("id")&&(this.set("lastLastTarget",null),this.set("lastTarget",this.get("target")),this.on("change:target",this.targetChanged,this))},getIsRemote:function(){return!1},getName:function(){return this.get("id")},targetChanged:function(e,t,o){this.set("lastLastTarget",this.get("lastTarget")),this.set("lastTarget",t)},toString:function(){return"a "+this.get("type")+"pointing to "+String(this.get("target"))}}),y=w.extend({defaults:{visBranch:null,remoteTrackingBranchID:null,remote:!1},initialize:function(){w.prototype.initialize.call(this),this.set("type","branch")},setRemoteTrackingBranchID:function(e){this.set("remoteTrackingBranchID",e)},getRemoteTrackingBranchID:function(){return this.get("remoteTrackingBranchID")},getPrefixedID:function(){if(this.getIsRemote())throw new Error("im already remote");return g+this.get("id")},getBaseID:function(){if(!this.getIsRemote())throw new Error("im not remote so can't get base");return this.get("id").replace(g,"")},getIsRemote:function(){return this.get("id"),this.get("id").slice(0,2)===g}}),C=i.Model.extend({defaults:{type:"commit",children:null,parents:null,author:"Peter Cottle",createTime:null,commitMessage:null,visNode:null,gitVisuals:null},constants:{circularFields:["gitVisuals","visNode","children"]},getLogEntry:function(){return["Author: "+this.get("author"),"Date: "+this.get("createTime"),"",this.get("commitMessage"),"","Commit: "+this.get("id")].join("
")+"\n"},getShowEntry:function(){return[this.getLogEntry().replace("\n",""),"diff --git a/bigGameResults.html b/bigGameResults.html","--- bigGameResults.html","+++ bigGameResults.html","@@ 13,27 @@ Winner, Score","- Stanfurd, 14-7","+ Cal, 21-14"].join("
")+"\n"},validateAtInit:function(){if(!this.get("id"))throw new Error("Need ID!!");if(this.get("createTime")||this.set("createTime",(new Date).toString()),this.get("commitMessage")||this.set("commitMessage",n.str("git-dummy-msg")),this.set("children",[]),!(this.get("rootCommit")||this.get("parents")&&this.get("parents").length))throw new Error("needs parents")},addNodeToVisuals:function(){var e=this.get("gitVisuals").addNode(this.get("id"),this);this.set("visNode",e)},addEdgeToVisuals:function(e){this.get("gitVisuals").addEdge(this.get("id"),e.get("id"))},getParent:function(e){return this&&this.attributes&&this.attributes.parents?this.attributes.parents[e]:null},removeFromParents:function(){this.get("parents").forEach((function(e){e.removeChild(this)}),this)},checkForUpdatedParent:function(e){var t=this.get("parents");if(!(t.length>1)){var o=t[0].get("id"),i=e.getMostRecentBumpedID(o);if(o!==i){var a=e.refs[i];this.removeFromParents(),this.set("parents",[a]),a.get("children").push(this);var n=this.get("visNode");n&&n.removeAllEdges();var r=this.get("gitVisuals");return r&&r.addEdge(this.get("id"),i),!0}}},removeChild:function(e){var t=[];this.get("children").forEach((function(o){o!==e&&t.push(o)})),this.set("children",t)},isMainParent:function(e){return 0===this.get("parents").indexOf(e)},initialize:function(e){this.validateAtInit(),this.addNodeToVisuals(),(this.get("parents")||[]).forEach((function(e){e.get("children").push(this),this.addEdgeToVisuals(e)}),this)}}),z=w.extend({defaults:{visTag:null},initialize:function(){w.prototype.initialize.call(this),this.set("type","tag")}});function A(e,t){this.engine=e,this.tipsToInclude=[],this.tipsToExclude=[],this.includedRefs={},this.excludedRefs={},this.revisions=[],this.processSpecifiers(t)}var _=/^(.*)\.\.(.*)$/;A.prototype.processAsRange=function(e){var t=e.match(_);return!!t&&(this.tipsToExclude.push(t[1]),this.tipsToInclude.push(t[2]),!0)},A.prototype.processAsExclusion=function(e){return!!e.startsWith("^")&&(this.tipsToExclude.push(e.slice(1)),!0)},A.prototype.processAsInclusion=function(e){return this.tipsToInclude.push(e),!0},A.prototype.processSpecifiers=function(e){var t=this,o=[this.processAsRange,this.processAsExclusion];e.forEach((function(e){o.some((function(o){return o.bind(t)(e)}))||t.processAsInclusion(e)})),this.tipsToExclude.forEach((function(e){t.addExcluded(l.getUpstreamSet(t.engine,e))})),this.tipsToInclude.forEach((function(e){t.addIncluded(l.getUpstreamSet(t.engine,e))}));var i=Array.from(Object.keys(t.includedRefs));t.revisions=i.map((function(e){return t.engine.resolveStringRef(e)})),t.revisions.sort(t.engine.dateSortFunc),t.revisions.reverse()},A.prototype.isExcluded=function(e){return this.excludedRefs.hasOwnProperty(e)},A.prototype.addExcluded=function(e){var t=this;Object.keys(e).forEach((function(e){t.isExcluded(e)||(t.excludedRefs[e]=!0)}))},A.prototype.addIncluded=function(e){var t=this;Object.keys(e).forEach((function(e){t.isExcluded(e)||(t.includedRefs[e]=!0)}))},A.prototype.formatRevisions=function(e){var t="";return this.revisions.forEach((function(o){t+=e(o)})),t},o.GitEngine=k,o.Commit=C,o.Branch=y,o.Tag=z,o.Ref=w},{"../app":52,"../commands":53,"../graph":64,"../graph/treeCompare":65,"../intl":67,"../util/errors":93,"../views/rebaseView":109,"../visuals/animation":111,"../visuals/animation/animationFactory":110,backbone:1,q:29}],64:[function(e,t,o){var i={getOrMakeRecursive:function(t,o,i,a){var n=e("../git"),r=n.Commit,s=n.Ref,c=n.Branch,l=n.Tag;if(o[i])return o[i];var m=function(e,t){if(e.commits[t])return"commit";if(e.branches[t])return"branch";if("HEAD"==t)return"HEAD";if(e.tags[t])return"tag";throw new Error("bad type for "+t)}(t,i);if("HEAD"==m){var u=t.HEAD,d=new s(Object.assign(t.HEAD,{target:this.getOrMakeRecursive(t,o,u.target)}));return o[i]=d,d}if("branch"==m){var h=t.branches[i],p=new c(Object.assign(t.branches[i],{target:this.getOrMakeRecursive(t,o,h.target)}));return o[i]=p,p}if("tag"==m){var g=t.tags[i],f=new l(Object.assign(t.tags[i],{target:this.getOrMakeRecursive(t,o,g.target)}));return o[i]=f,f}if("commit"==m){var b=t.commits[i],v=[];b.parents.forEach((function(e){v.push(this.getOrMakeRecursive(t,o,e))}),this);var k=new r(Object.assign(b,{parents:v,gitVisuals:this.gitVisuals}));return o[i]=k,k}throw new Error("ruh rho!! unsupported type for "+i)},descendSortDepth:function(e){return e.sort((function(e,t){return t.depth-e.depth}))},bfsFromLocationWithSet:function(e,t,o){for(var i=[],a=[e.getCommitFromRef(t)];a.length;){var n=a.pop();o[n.get("id")]||(i.push(n),a=a.concat(n.get("parents")))}return i},getUpstreamSet:function(e,t){var o=e.getCommitFromRef(t),i=o.get("id"),a=[o],n={};n[i]=!0;for(var r=function(e){n[e.get("id")]=!0,a.push(e)};a.length;){(a.pop().get("parents")||[]).forEach(r)}return n},getUniqueObjects:function(e){var t={},o=[];return e.forEach((function(e){t[e.id]||(t[e.id]=!0,o.push(e))})),o},getDefaultTree:function(){return JSON.parse(unescape("%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22main%22%2C%22type%22%3A%22branch%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22type%22%3A%22commit%22%2C%22parents%22%3A%5B%22C0%22%5D%2C%22author%22%3A%22Peter%20Cottle%22%2C%22createTime%22%3A%22Mon%20Nov%2005%202012%2000%3A56%3A47%20GMT-0800%20%28PST%29%22%2C%22commitMessage%22%3A%22Quick%20Commit.%20Go%20Bears%21%22%2C%22id%22%3A%22C1%22%7D%7D%2C%22HEAD%22%3A%7B%22id%22%3A%22HEAD%22%2C%22target%22%3A%22main%22%2C%22type%22%3A%22general%20ref%22%7D%7D"))}};t.exports=i},{"../git":63}],65:[function(e,t,o){var i=e("underscore"),a={dispatchFromLevel:function(e,t){var o=e.goalTreeString;return"string"!=typeof t&&console.warn("NEED to pass in string!! gah"),a.dispatch(e,o,t)},onlyMainCompared:function(e){switch(!0){case!!e.compareOnlyMain:case!!e.compareOnlyMainHashAgnostic:case!!e.compareOnlyMainHashAgnosticWithAsserts:return!0;default:return!1}},dispatch:function(e,t,o){var i=this.convertTreeSafe(t);if(o=this.convertTreeSafe(o),typeof i.originTree!=typeof o.originTree)return!1;var a=this.dispatchShallow(e,i,o);if(!a||!i.originTree)return a;var n=e.originCompare?e.originCompare:e;return a&&this.dispatchShallow(n,i.originTree,o.originTree)},dispatchShallow:function(e,t,o){switch(!0){case!!e.compareOnlyMain:return a.compareBranchWithinTrees(o,t,"main");case!!e.compareAllBranchesAndEnforceBranchCleanup:return a.compareAllBranchesAndEnforceBranchCleanup(o,t);case!!e.compareOnlyBranches:return a.compareAllBranchesWithinTrees(o,t);case!!e.compareAllBranchesHashAgnostic:return a.compareAllBranchesWithinTreesHashAgnostic(o,t);case!!e.compareOnlyMainHashAgnostic:return a.compareBranchesWithinTreesHashAgnostic(o,t,["main"]);case!!e.compareOnlyMainHashAgnosticWithAsserts:return a.compareBranchesWithinTreesHashAgnostic(o,t,["main"])&&a.evalAsserts(o,e.goalAsserts);case!!e.onlyEvaluateAsserts:return a.evalAsserts(o,e.goalAsserts);default:return a.compareAllBranchesWithinTreesAndHEAD(o,t)}},compareAllBranchesWithinTreesAndHEAD:function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),e.HEAD.target===t.HEAD.target&&this.compareAllBranchesWithinTrees(e,t)&&this.compareAllTagsWithinTrees(e,t)},compareAllBranchesAndEnforceBranchCleanup:function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t);var o=Object.assign({},e.branches,t.branches);return Object.keys(o).every(function(o){return this.compareBranchWithinTrees(e,t,o)}.bind(this))},compareAllBranchesWithinTrees:function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),Object.keys(t.branches).every(function(o){return this.compareBranchWithinTrees(e,t,o)}.bind(this))},compareAllTagsWithinTrees:function(e,t){return e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]),i.isEqual(e.tags,t.tags)},compareBranchesWithinTrees:function(e,t,o){var i=!0;return o.forEach((function(o){i=i&&this.compareBranchWithinTrees(e,t,o)}),this),i},compareBranchWithinTrees:function(e,t,o){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var a=this.getRecurseCompare(e,t),n=e.branches[o],r=t.branches[o];return i.isEqual(n,r)&&a(e.commits[n.target],t.commits[r.target])},compareAllBranchesWithinTreesHashAgnostic:function(e,t){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var o=Object.assign({},e.branches,t.branches),i=Object.keys(o||{});return this.compareBranchesWithinTreesHashAgnostic(e,t,i)},compareBranchesWithinTreesHashAgnostic:function(e,t,o){e=this.convertTreeSafe(e),t=this.convertTreeSafe(t),this.reduceTreeFields([e,t]);var a=function(e,t){return!(!e||!t)&&(e=Object.assign({},e),t=Object.assign({},t),e.target=this.getBaseRef(e.target),t.target=this.getBaseRef(t.target),i.isEqual(e,t))}.bind(this),n=this.getRecurseCompareHashAgnostic(e,t),r=!0;return o.forEach((function(o){var i=e.branches[o],s=t.branches[o];r=r&&a(i,s)&&n(e.commits[i.target],t.commits[s.target])}),this),r},evalAsserts:function(e,t){var o=!0;return Object.keys(t).forEach((function(i){var a=t[i];o=o&&this.evalAssertsOnBranch(e,i,a)}),this),o},evalAssertsOnBranch:function(e,t,o){if(!(e=this.convertTreeSafe(e)).branches[t])return!1;for(var i=[e.branches[t].target],a={},n=0;i.length;){var r=i.pop();a[this.getBaseRef(r)]=this.getNumHashes(r),i=i.concat(e.commits[r].parents),n++}a.__num_commits_upstream=n;var s=!0;return o.forEach((function(e){try{s=s&&e(a)}catch(e){console.warn("error during assert",e),s=!1}})),s},getNumHashes:function(e){for(var t=[[/^C(\d+)([']{0,3})$/,function(e){return e[2]?e[2].length:0}],[/^C(\d+)['][\^](\d+)$/,function(e){return Number(e[2])}]],o=0;o []",de_DE:"git []",zh_CN:"git <命令> [<参数>]",zh_TW:"git <指令> [<參數>]",es_AR:"git []",es_MX:"git []",es_ES:"git []",pt_BR:"git []",gl:"git []",fr_FR:"git []",ru_RU:"git <команда> [<аргументы>]",uk:"git <команда> [<аргументи>]",ko:"git <명령어> [<인자들>]",vi:"git []",sl_SI:"git []",pl:"git []",it_IT:"git []",ta_IN:"git []"},"git-supported-commands":{__desc__:"In the git help command, the header above the supported commands",en_US:"Supported commands:",de_DE:"Unterstützte Befehle:",zh_CN:"支持的命令有:",zh_TW:"支援的指令有:",es_AR:"Comandos soportados:",es_MX:"Comandos compatibles:",es_ES:"Comandos compatibles:",pt_BR:"Comandos suportados:",gl:"Comandos soportados:",fr_FR:"Commandes supportées",ru_RU:"Поддерживаемые команды",uk:"Допустимі команди",ko:"지원되는 명령어들:",vi:"Các lệnh được hỗ trợ:",sl_SI:"Podprti ukazi:",pl:"Obsługiwane polecenia:",it_IT:"Comandi supportati:",ta_IN:"செயலாக்கம் உள்ள கட்டளைகள்;"},"git-usage":{__desc__:"In the dummy git output, the header before showing all the commands",en_US:"Usage:",de_DE:"Benutzung:",zh_CN:"使用:",zh_TW:"用法:",es_AR:"Uso:",es_MX:"Uso:",es_ES:"Uso:",pt_BR:"Uso:",gl:"Uso:",fr_FR:"Utilisation :",ru_RU:"Использование:",uk:"Використання:",ko:"사용법",vi:"Cách dùng:",sl_SI:"Uporaba:",pl:"Użyj",it_IT:"Utilizzo:",ta_IN:"பயன்பாடு"},"git-version":{__desc__:"The git version dummy output, kind of silly. PCOTTLE is my unix name but feel free to put yours instead",en_US:"Git Version PCOTTLE.1.0",de_DE:"Git Version PCOTTLE.1.0.jbr",zh_CN:"Git 版本 PCOTTLE.1.0",zh_TW:"Git 版本 PCOTTLE.1.0",es_AR:"Git Versión PCOTTLE.1.0",es_MX:"Git Versión PCOTTLE.1.0",es_ES:"Git Versión PCOTTLE.1.0",pt_BR:"Git versão PCOTTLE.1.0",gl:"Git versión PCOTTLE.1.0",fr_FR:"Git version PCOTTLE.1.0",ru_RU:"Версия git PCOTTLE.1.0",uk:"Версія git PCOTTLE.1.0",ko:"Git Version PCOTTLE.1.0",vi:"Phiên bản Git PCOTTLE.1.0",sl_SI:"Git Verzija PCOTTLE.1.0",pl:"Wersja GIT-a OLSZA-YSC-1.0",it_IT:"Git Version SHARDANA_SOFT.1.0.0",ta_IN:"Git Version PCOTTLE.1.0"},"flip-tree-command":{__desc__:"when the tree is being flipped",en_US:"Flipping tree...",de_DE:"Kehre den Baum um...",zh_CN:"翻转树中...",zh_TW:"翻轉樹中...",es_AR:"Invirtiendo el árbol...",es_MX:"Invirtiendo el árbol...",es_ES:"Invirtiendo el árbol...",pt_BR:"Invertendo a árvore...",gl:"Invirtindo a árbore...",fr_FR:"Inversion de l'arbre...",ru_RU:"Переворачиваю дерево...",uk:"Перевертаю дерево...",ko:"트리 뒤집는중...",vi:"Cây lật...",sl_SI:"Obračanje drevesa ...",pl:"Odwracanie drzewa...",it_IT:"Girando l'albero...",ta_IN:"Flipping tree..."},"refresh-tree-command":{__desc__:"when the tree is visually refreshed",en_US:"Refreshing tree...",de_DE:"Aktualisiere Baum ...",zh_CN:"正在刷新树结构...",zh_TW:"正在更新樹狀結構...",es_AR:"Refrezcando el árbol...",es_MX:"Actualizando el árbol...",es_ES:"Actualizando el árbol...",pt_BR:"Atualizando a árvore...",gl:"Actualizando a árbore...",fr_FR:"Actualisation de l'arbre…",ru_RU:"Обновляю дерево...",uk:"Оновлюю дерево...",ko:"트리 다시 불러오는중...",vi:"Đang làm mới cây...",sl_SI:"Osveževanje drevesa ...",pl:"Odświeżanie drzewa...",it_IT:"Aggiornando l'albero...",ta_IN:"Refreshing tree..."},"locale-command":{__desc__:"when the locale is set to something",en_US:"Locale set to {locale}",de_DE:"Locale auf {locale} gesetzt",zh_CN:"语言更改为 {locale}",zh_TW:"語系設為 {locale}",es_AR:"Localización actualizada a {locale}",es_MX:"Idioma actualizado a {locale}",es_ES:"Idioma puesto a {locale}",pt_BR:"Língua trocada para {locale}",gl:"Cambiado o idioma a {locale}",fr_FR:"Langue changée à {locale}",ru_RU:"Локаль теперь равна {locale}",uk:"Локаль тепер дорівнює {locale}",ko:"로케일이 {locale}로 설정되었습니다.",vi:"Ngôn ngữ được thay đổi thành {locale}",sl_SI:"Locale nastavljen na {locale}",pl:"Ustawiono język na {locale}",it_IT:"Locale impostato a {locale}",ta_IN:"பிரதேசம் {locale}ஆக மற்ற பட்டுள்ளது"},"locale-reset-command":{__desc__:"when the locale is reset",en_US:"Locale reset to default, which is {locale}",de_DE:"Locale auf Standard zurückgesetzt, also {locale}",zh_CN:"语言重置为默认的 {locale}",zh_TW:"還原為預設語系 {locale}",es_AR:"Localización vuelta al default, que es {locale}",es_MX:"Idioma reestablecido al default, que es {locale}",es_ES:"Idioma reajustado a su valor por defecto ({locale})",pt_BR:"Língua retornada para a padrão, que é {locale}",gl:"Lingua reaxustada ó seu valor por defecto {locale}",fr_FR:"Langue remise par défaut, qui est {locale}",ru_RU:"Локаль сброшена. Теперь она равна {locale}",uk:"Локаль скинута. Тепер вона дорівнює {locale}",ko:"로케일이 {locale}로 초기화 되었습니다.",vi:"Ngôn ngữ được đổi thành mặc định: {locale}",sl_SI:"Locale ponastavljen na {locale}",pl:"Przywrócono język do wartości domyślnych, czyli {locale}",it_IT:"Locale resettato al valore di default, che è {locale}",ta_IN:"பிரதேசம் இயல்புநிலை {locale}க்கி மீட்டமைக்கப்பட்டுள்ளது"},"show-command":{__desc__:'command output title from "show"',en_US:"Please use one of the following commands for more info:",zh_TW:"請使用下列其中一個指令取得更多資訊:",zh_CN:"请使用以下命令以了解更多:",de_DE:"Bitte benutze einen der folgenden Befehle um mehr Informationen zu bekommen:",es_AR:"Usá alguno de estos comandos para tener más información:",es_MX:"Por favor, utilice alguno de estos comandos para tener más información:",es_ES:"Por favor usa uno de los siguientes comandos para más información:",pt_BR:"Use algum destes comandos para ter mais informações:",gl:"Usa algún destes comandos para ter máis información:",fr_FR:"Merci d'utiliser une des commandes suivantes pour obtenir plus d'informations",ru_RU:"Для получения большей информации используй следующие команды:",uk:"Щоб отримати більше інформації використовуй наступні команди:",ko:"더 많은 정보를 위해 다음 명령어들중 하나를 사용하세요.",vi:"Vui lòng dùng một trong các lệnh sau để có thêm thông tin:",sl_SI:"Prosim uporabi enega od naslednjih ukazov",pl:"Aby uzyskać więcej informacji, użyj jednego z następujących poleceń:",it_IT:"Usa uno dei seguenti comandi per maggiori informazioni:",ta_IN:"மேலும் தகவலுக்கு பின்வரும் கட்டளைகளில் ஒன்றைப் பயன்படுத்தவும்:"},"show-all-commands":{__desc__:'command output title from "show commands"',en_US:"Here is a list of all the commmands available:",zh_TW:"這份清單列出所有可用指令:",zh_CN:"该列表列出了所有可用的指令:",de_DE:"Hier ist eine Liste aller verfügbaren Befehle:",es_AR:"Esta es una lista de los comandos disponibles:",es_MX:"Esta es una lista de todos los comandos disponibles:",es_ES:"Esta es una lista de todos los comandos disponibles:",pt_BR:"Esta é uma lista dos comandos disponíveis:",gl:"Esta é unha lista dos comando dispoñibles:",fr_FR:"Ci-dessous est la liste de toutes les commandes disponibles :",ru_RU:"Вот все поддерживаемые команды:",uk:"Ось список всіх можливих команд:",ko:"여기에 사용 가능한 모든 명령어들의 리스트가 있습니다.",vi:"Dưới đây là danh sách tất cả các lệnh có sẵn:",sl_SI:"Tu je seznam vseh možnih ukazov:",pl:"Oto lista wszystkich dostępnych poleceń:",it_IT:"Ecco la lista con tutti i comandi disponibili:",ta_IN:"கிடைக்கக்கூடிய அனைத்து கட்டளைகளின் பட்டியல்:"},"cd-command":{__desc__:"dummy command output for the command in the key",en_US:'Directory changed to "/directories/dont/matter/in/this/demo"',de_DE:'Verzeichnis gewechselt zu "/verzeichnisse/sind/in/dieser/demo/irrelevant"',zh_CN:'目录切换到 "/directories/dont/matter/in/this/demo"',zh_TW:'目錄切換到 "/directories/dont/matter/in/this/demo"',es_AR:'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',es_MX:'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',es_ES:'Directorio cambiado a "/los/directorios/no/importan/en/esta/demo"',pt_BR:'Diretório mudado para "/diretorios/nao/importam/neste/demo"',gl:'Directorio cambiado a "/os/directorios/non/importan/nesta/demo"',fr_FR:'Répertoire changé à "/directories/dont/matter/in/this/demo" (les répertoires ne servent à rien dans cette démo)',ru_RU:'Директория изменена на "/директории/не/важны/в/этом/демо"',uk:'Директорія змінена на "/директорії/не/мають/значення/в/цьому/демо"',ko:'디렉토리가 "/directories/dont/matter/in/this/demo"로 변경되었습니다.',vi:'Thay đổi thư mục thành "/directories/dont/matter/in/this/demo"',sl_SI:'Mapa spremenjena na "/directories/dont/matter/in/this/demo"',pl:'Katalog zmieniony na "/home/users/windows/pl/demo"',it_IT:'Cartella modificata in "/directories/dont/matter/in/this/demo"',ta_IN:'அடைவு "/directories/dont/matter/in/this/demo"க்கு மாற்றப்பட்டது'},"ls-command":{__desc__:"Dummy command output for the command in the key",en_US:"DontWorryAboutFilesInThisDemo.txt",de_DE:"VergissDateienInDieserDemo.txt",zh_CN:"在本程序中无须考虑文件问题.txt",zh_TW:"DontWorryAboutFilesInThisDemo.txt (譯註:在 demo 裡不用擔心檔案)",es_AR:"NoTePreocupesPorLosArchivosEnEstaDemo.txt",es_MX:"NoTePreocupesPorLosArchivosEnEstaDemo.txt",es_ES:"NoTePreocupesPorLosArchivosEnEstaDemo.txt",pt_BR:"NaoSePreocupeComNomesDeArquivoNesteDemo.txt",gl:"NonTePreocupesPolosCambiosNestaDemo.txt",fr_FR:"DontWorryAboutFilesInThisDemo.txt (ne vous préoccupez pas des noms de fichier dans cette démo)",ru_RU:"НеНадоЗаботитьсяОФайлахВЭтомДемо.txt",uk:"ЗабийНаФайлиВЦьомуДемо.txt",ko:"DontWorryAboutFilesInThisDemo.txt (이_데모에서_파일에_대한_걱정은_하지마세요.txt)",vi:"DontWorryAboutFilesInThisDemo.txt (ĐừngLoLắngVềTậpTinTrongBảnGiớiThiệuNày.txt)",sl_SI:"DontWorryAboutFilesInThisDemo.txt",pl:"SpokojnieToTylkoPlikDemo.txt",it_IT:"NoNdEvIpReOcCuPaRtIdEiFiLeInQuEsTaDeMo.txt",ta_IN:"DontWorryAboutFilesInThisDemo.txt"},"mobile-alert":{__desc__:"When someone comes to the site on a mobile device, they can not input commands so this is a nasty alert to tell them",en_US:"LGB can't receive input on mobile, visit on desktop! it's worth it :D",de_DE:"LGB ist nicht mit mobilen Endgeräten kompatibel, benutz es vom Desktop! Es lohnt sich :D",zh_CN:"无法在移动设备/平板上调出键盘 :( 请试试桌面版 :D",zh_TW:"無法在行動裝置上叫出鍵盤,請改用桌面版!",es_AR:"LGB no puede recibir comandos en dispositivos móviles. Visitanos desde una desktop, ¡lo vale! :D",es_MX:"LGB no puede recibir comandos en dispositivos móviles. Visítanos en una computadora de escritorio u laptop, ¡Vale la pena! :D",es_ES:"LGB no puede recibir comandos en dispositivos móviles. Visítanos en una computadora de escritorio, ¡lo vale! :D",pt_BR:"Provavelmente você não vai conseguir digitar comandos no celular, neste caso tente acessar de um computador",gl:"LGB non pode recibir os comandos nos dispositivos móbiles. Visítanos dende un ordenador de escritorio, ¡paga a pena! :D",fr_FR:"Impossible de faire apparaître le clavier sur mobile / tablette :( Essayez de passer sur un ordinateur de bureau :D",ru_RU:"Мобильные не поддерживаются, зайди с компьютера!",uk:"LGB не підтримує ввід тексту з мобільного, зайди з компьютера! Це цього варте!",ko:"LGB는 모바일에서 입력을 받을 수 없습니다. 데스크톱으로 접속하세요! 이것은 가치가 있습니다. :D",vi:"Đáng tiếc là ứng dụng không thể nhận thông tin từ điện thoại hay máy tính bảng, hãy sử dụng máy tính cá nhân, đáng để bỏ công mà :D",sl_SI:"LGB ne more sprejeti ukazov na mobilni napravi, obiščite nas na računalinku! Je vredno :D ",pl:"Przepraszamy, ale LearnGitBranching nie obsługuje wpisywania komend z urządzeń mobilnych. Odwiedź LearnGitBranching na komputerze stacjonarnym, warto! :D",it_IT:"LGB non funziona su mobile, vieni a trovarci da pc! Ne vale veramente la pena :D",ta_IN:"LGBஆல் மொபைலில் உள்ளீட்டைப் பெற முடியாது, டெஸ்க்டாப்பில் பார்வையிடவும், அது பயணுள்ளது :D"},"share-tree":{__desc__:"When you export a tree, we want you to share the tree with friends",en_US:'Share this tree with friends! They can load it with "import tree"',de_DE:'Teile diesen git-Baum mit Freunden! Sie können ihn mit "import tree" laden',zh_CN:'与你的好友分享提交树!他们可以用 "import tree" 加载它',zh_TW:'與你的好友分享這棵樹!他們可以用 "import tree" 來載入它',es_AR:'¡Compartí este árbol con amigos! Pueden cargarlo con "import tree"',es_MX:'¡Comparte éste árbol con amigos! Pueden cargarlo con "import tree"',es_ES:'¡Comparte este árbol con amigos! Pueden cargarlo con "import tree"',pt_BR:'Compartilhe esta árvore com seus amigos! Eles podem carregá-la com "import tree"',gl:'¡Comparte esta árbore cos teus amigos! Eles poden cargalo con "import tree"',fr_FR:'Partagez cet arbre avec vos amis ! Ils peuvent le charger avec "import tree"',ru_RU:'Поделись деревом с друзьями! Они могут загрузить его при помощи "import tree"',uk:'Поділись цим деревом з друзями! Вони зможуть його завантажити за допомогою "import tree"',ko:'친구들과 이 트리를 공유하세요! 그들은 "import tree"를 사용해 이를 로드할 수 있습니다.',vi:'Hãy chia sẻ cây này với bạn của mình! Họ có thể dùng "import tree" để tải',sl_SI:'Deli to drevo s prijatelji! Lahko ga naložijo z "import tree"',pl:'Udostępnij to drzewo znajomym! Mogą je załadować za pomocą "import tree"',it_IT:'Condividi quest\'albero con i tuoi amici! Può essere importato tramite "import tree"',ta_IN:'இந்த `tree`ஐ நண்பர்களுடன் பகிர்ந்து கொள்ளுங்கள்! அவர்கள் அதை "import tree" மூலம் பெறலாம்'},"paste-json":{__desc__:"When you are importing a level or tree",en_US:"Paste a JSON blob below!",de_DE:"Füg einen JSON-Blob unten ein!",zh_CN:"在下边粘贴一个 JSON 串",zh_TW:"在下方貼上一串 JSON",es_AR:"¡Pegá un blob JSON abajo!",es_MX:"¡Pega un blob JSON abajo!",es_ES:"¡Pega un blob JSON abajo!",pt_BR:"Cole o JSON abaixo!",gl:"Pega un JSON abaixo!",fr_FR:"Collez un blob JSON ci-dessous !",ru_RU:"Вставь JSON ниже!",uk:"Встав JSON нижче!",ko:"아래에 JSON blob을 붙여넣으세요.",vi:"Dán một chuỗi JSON xuống bên dưới!",sl_SI:"Prilepi JSON kodo spodaj!",pl:"Wklej poniżej obiekt z kodem JSON!",it_IT:"Incolla un blob JSON qui sotto!",ta_IN:"ஒரு JSON blob-ஐ கீழே ஒட்டவும்"},"solved-map-reset":{__desc__:"When you reset the solved map to clear your solved history, in case someone else wants to use your browser",en_US:"Solved map was reset, you are starting from a clean slate!",de_DE:"Gelöste Karte wurde zurückgesetzt, du fängst mit einem leeren Blatt an!",zh_CN:"解决列表已重置,您现在可以从头开始了",zh_TW:"過關地圖已經重新設置,您現在從零開始了",es_AR:"El mapa resuelto fue eliminado, estás arrancando desde un estado limpio",es_MX:"El mapa resuelto fue eliminado, estás empezando desde un estado limpio",es_ES:"El mapa resuelto fue eliminado, estás empezando de un estado limpio.",pt_BR:"Mapa de resolvidos descartado, você está começando com ficha limpa!",gl:"O mapa resolto foi eliminado, estás arrancando dende un estado limpo.",fr_FR:"La carte des niveaux résolus a été effacée, vous repartez de zéro !",ru_RU:"Всё сброшено! Можно начать с чистого листа!",uk:"Все скинуте! Можна починати з чистого аркушу!",ko:"해결된 지도가 초기화 되었습니다. 당신은 깨끗한 상태에서 시작합니다.",vi:"Tất cả đáp án đã được xóa, bạn có thể bắt đầu lại từ đầu!",sl_SI:"Rešena mapa je ponastavljena, začel boš lahko na novo!",pl:"Rozwiązania zostały wyczyszczone, zaczynasz z czystą kartą.",it_IT:"I progresse salvati sono stati resettati, stai iniziando da zero!",ta_IN:"தீர்க்கப்பட்ட கோப்பு மீட்டமைக்கப்பட்டது, நீங்கள் ஆரம்பத்தில் இருந்து தொடங்குகிறீர்கள்!"},"level-cant-exit":{__desc__:"When the user tries to exit a level when they are not in one",en_US:'You are not in a level! You are in a sandbox, start a level with "levels"',de_DE:'Du bist nicht in einem Level! Du bist im Sandkasten-Modus, starte ein Level mit "levels"',zh_CN:'您没在关卡中而是在沙盒中,要开始关卡请输入 "levels"',zh_TW:'您沒在關卡中!您在沙盒中,要開始關卡請輸入 "levels"',es_AR:'¡No estás en un nivel! Estás en el sandbox, comenzá un nivel usando "levels"',es_MX:'¡No estás en un nivel! Estás en el sandbox, comienza un nivel con "levels"',es_ES:'¡No estás en un nivel! Estás en el sandbox, comienza un nivel con "levels"',pt_BR:'Você não está em um nível! Você está no sandbox, comece um nível com "levels"',gl:'¡Non estás en ningún nivel! Estás nunha caixa de arena, comeza un nivel usando "levels"',fr_FR:'Vous n\'êtes pas dans un niveau ! Vous êtes dans le mode bac à sable, commencez un niveau avec "levels"',ru_RU:'Ты не проходишь уровень! Ты в песочнице! Чтобы начать уровень, используй команду "levels"!',uk:'Ти не в рівні! Ти в пісочниці! Почни рівень з "levels"',ko:'당신은 샌드박스에 있습니다. "levels"를 사용하여 레벨을 시작하세요.',vi:'Bạn hiện không ở cấp độ nào cả! Bạn đang ở trong hộp cát (sandbox), hãy bắt đầu một cấp độ với "levels"',sl_SI:'Nisi v stopnji! Si v peskovniku, začni stopnjo z "levels"',pl:'Nie jesteś na poziomie! Jesteś w trybie piaskownicy, zacznij poziom wpisując "levels"',it_IT:'Non ti trovi in un livello! Sei nella sandbox, inizia un livello con "levels"',ta_IN:'ஒரு நிலையில் இல்லாமல், நீங்கள் sandbox-இல் உள்ளீர்கள்! "நிலைகள்" மூலம் ஒரு நிலையைத் தொடங்கவும்'},"level-no-id":{__desc__:"When you say an id but that level doesn't exist",en_US:'A level for that id "{id}" was not found! Opening up a level selection view',de_DE:'Konnte kein Level mit der ID "{id}" finden! Öffne den Level-Auswahldialog',zh_CN:'没找到 id 为 "{id}" 的关卡!打开关卡选择框',zh_TW:'找不到 id 為 "{id}" 的關卡!開啟關卡選擇視窗',es_AR:"No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...",es_MX:"No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...",es_ES:"No se encontró ningún nivel {id}. Abriendo la vista de selección de niveles...",pt_BR:'O nível "{id}" não existe! Abrindo uma caixa de seleção de nível',gl:'O nivel "{id}" non existe! Abrindo unha caixa de seleción de nivel',fr_FR:"Le niveau dont l'identifiant est {id} n'a pas été trouvé ! Ouverture de la vue de sélection des niveaux",ru_RU:'Уровень с id "{id}" не найден! Открываю выбор уровней',uk:'Рівень з id "{id}" не знайдений! Відкриваю вибір рівней',ko:'id "{id}"에 대한 레벨이 존재하지 않습니다. 레벨 선택 화면을 열어보세요.',vi:'Không tìm thấy cấp độ cho định danh "{id}"! Mở cửa sổ chọn cấp độ',sl_SI:'Stopnja za ta id "{id}" ni bila najdena! Odpiram pogled za izbiro stopnje',pl:"Nie znaleziono poziomu {id}!. Otwieranie widoku wyboru poziomu...",it_IT:'Non è stato trovato un livello con id "{id}"! Apro la finestra con la selezione dei livelli',ta_IN:'அந்த "{id}"-க்கான நிலை காணப்படவில்லை! நிலை தேர்வு செய்யும் திரை திறக்கிறது'},"undo-stack-empty":{__desc__:"The undo command can only undo back until the last time the level was reset or the beginning of the level",en_US:"The undo stack is empty!",de_DE:"Die Undo-Liste ist leer!",zh_CN:"还没有什么可以撤销",zh_TW:"還沒有什麼可以取消",es_AR:"No hay comandos que deshacer",es_MX:"No hay comandos para deshacer",es_ES:"No hay comandos que deshacer",pt_BR:"Você já desfez tudo!",gl:"Nonn hai comandos que desfacer",fr_FR:"La pile d'annulation est vide !",ru_RU:"Некуда откатывать!",uk:"Нема куди відкочуватись!",ko:"되돌리기 스택이 비었습니다!",vi:"Không có gì để hoàn tác!",sl_SI:"Undo seznam je prazen!",pl:"Nie ma już poleceń do cofnięcia!",it_IT:"Non sono presenti comandi da annullare!",ta_IN:"மீள்பதிவு அடுக்கு காலியாக உள்ளது!"},"already-solved":{__desc__:"When you play in a level that is already solved",en_US:'You have already solved this level, try other levels with "levels" or go back to sandbox with "sandbox"',de_DE:'Du hast dieses Level bereits gelöst, probier ein anderes Level mit "levels" aus oder geh in den Sandkasten-Modus mit "sandbox"',zh_CN:'你已经解决了本关,输入 "levels" 尝试其他关卡,或者输入 "sandbox" 回到沙盒中',zh_TW:'你已經解决了本關,輸入 "levels" 嘗試其他關卡,或者輸入 "sandbox" 回到沙盒中',es_AR:'Ya resolviste este nivel, probá otros usando "levels" o volvé al sandbox usando "sandbox"',es_MX:'Ya resolviste este nivel, prueba otros usando "levels" o vuelve al sandbox usando "sandbox"',es_ES:'Ya resolviste este nivel, prueba otros usando "levels" o vuelve al sandbox usando "sandbox"',pt_BR:'Você já resolveu este nível, tente outros com "levels" ou volte ao sandbox com "sandbox"',gl:'Xa resolviches este nivel, proba outros usando "levels" ou volve á caixa de area con "sandbox"',fr_FR:'Vous avez déjà résolu ce niveau, essayez d\'autres niveaux avec "levels" ou revenez au bac à sable avec "sandbox"',ru_RU:'Ты уже прошел этот уровень, попробуй пройти другие при помощи команды "levels" или иди в песочницу "sandbox"',uk:'Ти вже пройшов цей рівень, спробуй інші рівні з "levels" чи повернись в пісочницю з "sandbox"',ko:'당신은 이미 이 레벨을 해결했습니다. "levels"를 사용하여 다른 레벨에 도전하거나 "sandbox"를 사용하여 샌드박스로 돌아가세요.',vi:'Bạn đã vượt qua cấp độ này. Thử cấp độ khác với "levels" hoặc dùng "sandbox" để trở lại hộp cát',sl_SI:'To stopnjo si že rešil, poizkusi druge stopnje z "levels" ali pojdi nazaj v peskovnik s "sandbox"',pl:'Już rozwiązałeś ten poziom, wypróbuj inne, używając "levels" lub wróć do trybu piaskownicy za pomocą polecenia "sandbox"',it_IT:'Hai già risolto questo livello, prova altri livelli con "levels" o torna alla sandbox con "sandbox"',ta_IN:'நீங்கள் ஏற்கனவே இந்த நிலையை தீர்த்துள்ளீர்கள், "நிலைகள்" மூலம் பிற நிலைகளை முயற்சிக்கவும் அல்லது "sandbox" உடன் sandbox-க்குச் செல்லவும்'},"solved-level":{__desc__:"When you solved a level",en_US:"Solved!!!\n:D",es_MX:"¡Resuelto!!!",de_DE:"Gelöst!!!\n:D",zh_CN:"恭喜过关!!!",zh_TW:"恭喜,本關解決了!!!",es_ES:"¡Resuelto!!!\n:D",gl:"¡Resolto!!!",ru_RU:"Решено!!!\n:D",uk:"Вирішено!!!\n:D",ko:"해결 완료!!!\n:D",vi:"ĐÃ XONG!!!\n:D",sl_SI:"Rešeno!!!\n:D",pl:"Rozwiązany!!!\n:D",it_IT:"Risolto!!!\n:D",ta_IN:"தீர்க்கப்பட்டது!!!\n:D",tr_TR:"Tebrikler!!!\n:D"},"command-disabled":{__desc__:"When you try a command that is disabled",en_US:"That git command is disabled for this level!",de_DE:"Dieser git-Befehl ist für dieses Level deaktiviert!",zh_CN:"本关不允许使用该命令!",zh_TW:"本關禁止使用該 git 指令!",es_AR:"¡Ese comando de git está deshabilitado para este nivel!",es_MX:"¡Ese comando de git está deshabilitado para éste nivel!",es_ES:"¡Ese comando de git está deshabilitado para este nivel!",pt_BR:"Achou que seria fácil assim? Desabilitamos esse comando durante este nível, só para dificultar ;-)",gl:"¡Ese comando de git está deshabilitado para este nivel!",fr_FR:"Cette commande git est désactivée pour ce niveau !",ru_RU:"На этом уровне нельзя использовать эту команду!",uk:"На цьому рівні не можна використовувати цю команду!",ko:"그 Git 명령어는 이 레벨에서 사용할 수 없습니다.",vi:"Ở cấp độ này thì lệnh git đó bị vô hiệu hóa!",sl_SI:"Ta git ukaz je onemogočen za to stopnjo!",pl:"To polecenie Gita jest wyłączone na tym poziomie!",it_IT:"Questo comando git è disabilitato per questo livello!",ta_IN:"இந்த நிலையில் அந்த கிட் கட்டளை முடக்கப்பட்டுள்ளது"},"share-json":{__desc__:"when you have made the level, prompt to share this",en_US:"Here is the JSON for this level! Share it with someone or send it to me on GitHub",de_DE:"Hier ist das JSON für dieses Level! Teil es mit jemandem or schick es mir über GitHub",zh_CN:"这是一个关卡定义 JSON !您可以分享它或者发到我的 GitHub 上",zh_TW:"這是本關的 JSON!您可以分享給別人,或是送到 GitHub 上給我",es_AR:"Este es el JSON de este nivel. Compartilo con quien quieras o mandámelo por GitHub",es_MX:"Este es el JSON de éste nivel. Compártelo con quien quieras o mándamelo por GitHub.",es_ES:"Este es el JSON de este nivel. Compártelo con quien quieras o mandámelo por GitHub.",pt_BR:"Aqui está o JSON para este nível! Compartilhe com alguém ou me envie pelo GitHub",gl:"Este é o JSON deste nivel. Comparteo con quen queiras ou mándao por GitHub",fr_FR:"Voici le JSON pour ce niveau ! Partagez-le avec quelqu'un ou envoyez-le moi sur GitHub",ru_RU:"Вот JSON для этого уровня! Поделись им с кем-нибудь или отправь его нам на GitHub",uk:"Ось JSON для цього рівня! Поділись з кимось чи відправ мені його на GitHub",ko:"이 레벨을 위한 JSON 데이터가 있습니다! 이를 다른 사람들과 공유하거나 GitHub에서 제게 보내보세요.",vi:"Đây là chuỗi JSON cho cấp độ này! Hãy chia sẻ với người khác hoặc với tôi qua GitHub",sl_SI:"Tu je JSON za to stopnjo! Deli ga z nekom ali ga pošlji meni na GitHub",pl:"To jest JSON dla tego poziomu. Udostępnij go, komu chcesz, lub wyślij do mnie na GitHub.",it_IT:"Ecco il JSON per questo livello! Condividilo con qualcuno o inviamelo tramite GitHub",ta_IN:"இதோ இந்த நிலைக்கான JSON, இதை பகிர்ந்து கொள்ளுங்கள் அல்லது GitHub-இல் எனக்கு அனுப்புங்கள்"},"want-start-dialog":{__desc__:"prompt to add a start dialog",en_US:"You have not specified a start dialog, would you like to add one?",de_DE:"Du hast noch keinen Einführungs-Dialog geschrieben, willst du einen hinzufügen?",zh_CN:"您还没有定义一开始的介绍,是否添加一个?",zh_TW:"尚未指定開始對話視窗,是否立即新增?",es_AR:"No especificaste un mensaje de inicio, ¿querés agregar uno?",es_MX:"No especificaste un mensaje de inicio, ¿Quieres agregar uno?",es_ES:"No especificaste un mensaje de inicio, ¿quieres agregar uno?",pt_BR:"Você não especificou uma mensagem de início, quer colocar uma?",gl:"Non especificaches unha mensaxe de incio. ¿queres agregar un?",fr_FR:"Vous n'avez pas spécifié de dialogue de départ, voulez-vous en ajouter un ?",ru_RU:"Не указано стартово сообщение! Точно продолжаем?",uk:"Не вказано стартовий діалог, хочеш додати стартовий діалог?",ko:"당신은 시작 대화창을 지정하지 않았습니다. 추가 하시겠습니까?",vi:"Không có cửa sổ hộp thoại được chỉ định, thêm một cái chứ?",sl_SI:"Nisi določil začetnega dialoga, bi ga rad dodal?",pl:"Nie określiłeś okna startowego, czy chcesz je dodać?",it_IT:"Non hai specificato una finestra di partenza, ne vuoi aggiungere una?",ta_IN:"தொடக்க உரை எதுவும் நீங்கள் குறிப்பிடவில்லை, ஏதேனும் ஒன்றைச் சேர்க்க விரும்புகிறீர்களா?"},"want-hint":{__desc__:"prompt to add a hint",en_US:"You have not specified a hint, would you like to add one?",de_DE:"Du hast noch keinen Hinweis geschrieben, magst du einen hinzufügen?",zh_CN:"您还没有定义提示,是否添加一个?",zh_TW:"尚未指定提示,是否立即新增?",es_AR:"No especificaste ninguna pista, ¿querés agregar alguna?",es_MX:"No especificaste ninguna pista, ¿Quieres agregar alguna?",es_ES:"No especificaste ninguna pista, ¿quieres agregar alguna?",pt_BR:"Você não especificou uma dica, quer colocar uma?",gl:"Ti non especificaches unha pista, ¿queres agregar algunha?",fr_FR:"Vous n'avez pas spécifié d'indice, voulez-vous en ajouter un ?",ru_RU:"Не указана подсказка для уровня! Пренебречь? Вальсируем?",uk:"Не вказана підказка, хочеш додати підказку?",ko:"당신은 힌트를 지정하지 않았습니다. 추가 하시겠습니까?",vi:"Bạn chưa chỉ định một gợi ý, thêm một cái chứ?",sl_SI:"Nisi določil namiga, bi ga rad dodal?",pl:"Nie podałeś podpowiedzi, czy chcesz ją dodać?",it_IT:"Non hai specificato un suggerimento, ne vuoi aggiungere uno?",ta_IN:"நீங்கள் குறிப்பெதுவும் தரவில்லை, ஏதேனும் ஒன்றைச் சேர்க்க விரும்புகிறீர்களா?"},"prompt-hint":{__desc__:"prompt for hint",en_US:"Enter the hint for this level, or leave this blank if you do not want to include one",de_DE:"Gib den Hinweis für dieses Level an, oder lass es leer wenn du keinen hinzufügen willst",zh_CN:"请输入关卡提示,如果没有请留空",zh_TW:"請輸入關卡提示,或者故意留空",es_AR:"Ingresá una pista para este nivel, o dejalo en blanco si no querés incluir ninguna",es_MX:"Ingresa una pista para este nivel, o déjalo en blanco si no quieres incluir ninguna.",es_ES:"Ingresa una pista para este nivel, o déjalo en blanco si no quieres incluir ninguna.",pt_BR:"Colocque uma dica para este nível, ou deixe em branco se não quiser incluir",gl:"Ingresa unha pista para este nivel, ou déixao en branco se non a queres incluír.",fr_FR:"Entrez l'indice pour ce niveau, ou laissez-le vide pour ne pas l'inclure",ru_RU:"Введи подсказку для уровня, если хочешь.",uk:"Додай підказку для рівня, якщо хочеш",ko:"이 레벨을 위한 힌트를 입력하거나 만약 이를 포함시키고 싶지 않을 경우엔 비워두세요.",vi:"Thêm một gợi ý cho cấp độ này, hoặc cứ để trống nếu bạn không muốn thêm",sl_SI:"Vnesi namig za to stopnjo ali pusti to prazno, če ga nočeš dodati",pl:"Wpisz wskazówkę dotyczącą tego poziomu lub pozostaw ją pustą, jeśli nie chcesz jej uwzględniać.",it_IT:"Inserisci un suggerimento per questo livello, oppure lascialo vuoto se non ne vuoi aggiungere",ta_IN:"இந்த நிலைக்கான குறிப்பை உள்ளிடவும், குறிப்பு தேவை இல்லை என்றால் இதனை காலியாக விடுவும்"},"prompt-name":{__desc__:"prompt for level name",en_US:"Enter the name for the level",de_DE:"Gib den Namen für dieses Level an",zh_CN:"请输入关卡名称",zh_TW:"請輸入關卡名稱",es_AR:"Ingresá el nombre del nivel",es_MX:"Ingresa el nombre del nivel",es_ES:"Ingresa el nombre del nivel.",pt_BR:"Coloque o nome do nível",gl:"Coloque o nome do nivel",fr_FR:"Entrez le nom pour ce niveau",ru_RU:"Введи название уровня",uk:"Введи назву рівня",ko:"레벨 이름을 입력하세요.",vi:"Nhập tên cho cấp độ này",sl_SI:"Vnesi ime za stopnjo",pl:"Wprowadź nazwę poziomu",it_IT:"Inserisci il nome per questo livello",ta_IN:"நிலைக்கான பெயரை உள்ளிடவும்"},"solution-empty":{__desc__:"If you define a solution without any commands, aka a level that is solved without doing anything",en_US:"Your solution is empty!! Something is amiss",de_DE:"Deine Auflösung ist leer! Hier fehlt etwas",zh_CN:"你的解法是空的!! 可能是程序出错了",zh_TW:"您的解法是空的!這一定是哪裡出錯了",es_AR:"¡Tu solución está vacía! Algo hay que hacer",es_MX:"¡Tu solución está vacía! Algo hay que hacer",es_ES:"¡Tu solución está vacía! Algo hay que hacer.",pt_BR:"Sua solução está vazia! O aprendiz deveria ter que fazer alguma coisa",gl:"¡Su solución está vacía! Algo haberá que facer.",fr_FR:"Votre solution est vide !! Quelque chose ne tourne pas rond",ru_RU:"Решение не указано! Так не годится!",uk:"Розв’язок порожній!! Щось не так",ko:"해답이 비어있습니다. 무언가 잘못되었습니다.",vi:"Đáp án bị bỏ trống!! Có gì thiếu rồi",sl_SI:"Tvoja rešitev je prazna!! Nekaj ni vredu.",pl:"Twoje rozwiązanie jest puste!! Coś musi zostać zrobione.",it_IT:"C'è qualcosa che non va. La soluzione è vuota!! ",ta_IN:"உங்கள் தீர்வு காலியாக உள்ளது!! ஏதோ தவறாக இருக்கிறது"},"define-start-warning":{__desc__:"When you define the start point again, it overwrites the solution and goal so we add a warning",en_US:"Defining start point... solution and goal will be overwritten if they were defined earlier",de_DE:"Lege Startpunkt fest ... Auflösung und Ziel werden überschrieben, falls sie schon festgelegt waren",zh_CN:"定义开始点... 解决方法和目标会被新的替代",zh_TW:"正在定義起始點...先前定義的解法和目標會被覆蓋掉",es_AR:"Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos",es_MX:"Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos",es_ES:"Estableciendo el punto de inicio... La solución y el objetivo serán sobreescritos si ya habían sido definidos.",pt_BR:"Esbelecendo o ponto de início... a solução e o objetivo serão sobrescritos caso já existirem",gl:"Establecendo o punto de inicio... A solución e o obxectivo serán sobreescritos se xa foron definidos.",fr_FR:"Redéfinition du point de départ… la solution et la cible seront écrasés s'ils ont déjà été définis",ru_RU:"Устанавливаю стартовую точку... Решение и итоговое состояние будут стёрты, если они указаны ранее",uk:"Встановлюю стартову точку... розв’язок та ціль будуть переписані якщо вони були задані раніше",ko:"시작 지점을 정의하세요... 만약 그것이 먼저 정의된다면 해답과 목표가 덮어씌워질 것입니다.",vi:"Đang xác định điểm bắt đầu... Các giải pháp và mục tiêu sẽ được thay thế nếu đã được chỉ định từ trước",sl_SI:"Določanje začetne točke ... rešitev in cilj bosta povožena, če sta bila prej že podana",pl:"Ustawianie punktu startowego... Rozwiązanie i cel zostaną nadpisane, jeśli zostały wcześniej zdefiniowane",it_IT:"Definendo punto di partenza... soluzione e obiettivo saranno sovrascritti se erano già stati definiti.",ta_IN:"தொடக்கத்தை வரையறுத்தல்... தீர்வு மற்றும் குறிக்கோள் முன்னரே வரையறுக்கப்பட்டிருந்தால் மேலெழுதப்படும்"},"help-vague-level":{__desc__:"When you are in a level and you say help, its vague and you need to specify",en_US:'You are in a level, so multiple forms of help are available. Please select either "help level" to learn more about this lesson, "help general" for using Learn GitBranching, or "objective" to learn about how to solve the level.',de_DE:'Du befindest dich in einem Level, daher gibt es verschiedene Hilfen. Gib "help level" ein um mehr über dieses Level zu erfahren, "help general" um zu sehen wie Learn Git Branching bedient wird, oder "objective" um das Ziel dieses Levels zu erfahren.',zh_CN:'您正在关卡中,这里有多种形式的帮助,请选择 "help level" (关卡帮助)或 "help general" (一般帮助)',zh_TW:'您正在進行關卡中,這裡有多種不同型式的幫助,請選擇 "help level" 來了解這個關卡,或者是選擇 "help general" 來學習如何使用 Learn GitBranching,或者是選擇 "objective" 來學習如何解決這個關卡',es_AR:'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elegí entre "help level" para aprender algo más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.',es_MX:'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elige entre "help level" para aprender algo más sobre ésta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "bjective" para aprender a resolver este nivel.',es_ES:'Estás en un nivel, por lo que hay varios tipos de ayuda. Por favor elige "help level" para aprender más sobre esta lección, "help general" para ayuda sobre el uso de Learn GitBranching, o "objective" para aprender a resolver este nivel.',pt_BR:'Você está em um nível, então há vários tipos de ajuda. Selecione "help level" para aprender mais sobre esta lição, "help general" para aprender a usar o Learn GitBranching, ou "objective" ver como resolver o nível.',gl:'Estás nun nivel, entón hai varios tipos de axuda. Selecione "help level" para aprender máis sobre esta lección, "gelp general" para aprender a usar o Learn Git Branching, ou "objective" para ver como resolver o nivel.',fr_FR:'Vous êtes dans un niveau, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help level" pour en apprendre plus sur cette leçon, "help general" pour l\'utilisation de Learn GitBranching, ou "objective" pour apprendre comment résoudre le niveau',ru_RU:'При прохождении уровня доступны несколько видов помощи. Определить что нужно: "help level" чтобы получить информацию об этом уровне, "help general" для того, чтобы узнать о игре в целом или "objective" чтобы узнать что надо сделать в этом уровне.',uk:'При проходженні рівня доступні декілька різновидів допомоги. Виберіть або "help level" щоб взнати більше про цей рівень, чи "help general" щоб взнати більше про Learn Git Branching, чи "objective" щоб дізнатись більше про проходження цього рівня',ko:'당신은 한 레벨에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. 레슨에 대해 더 알고싶을 땐 "help level", LearnGitBranching을 사용하고 싶을 땐 "help general", 또는 레벨을 어떻게 해결해야할지 알고싶을 땐 "objective"를 선택하세요.',vi:'Bạn đang ở trong một cấp độ, nên sẽ có nhiều hỗ trợ. Vui lòng dùng "help level" để biết thêm về bài học này, "help general" để sử dụng HọcNhánhGit, hoặc "objective" để biết cách giải quyết bài tập.',sl_SI:'Si v stopnji, zato so na voljo različne pomoči. Prosim izberi "help level" za več informacij o tej lekciji, "help general" za splošna navodila ali "objective" da izveš kako rešiti to stopnjo',pl:'Jesteś na poziomie, więc istnieje kilka rodzajów pomocy. Wpisz "help level", aby dowiedzieć się więcej o tej lekcji, wpisz "help general", aby uzyskać pomoc dotyczącą korzystania z nauki GitBranching, lub wpisz "objective", aby dowiedzieć się, jak rozwiązać ten poziom.',it_IT:'Sei dentro a un livello, hai a disposizione vari tipi di aiuto. Digita "help level" per saperne di più su questa lezione, "help general" per come usare Learn GitBranching, o "objective" per capire come risolvere il livello.',ta_IN:'நீங்கள் ஒரு நிலையில் உள்ளீர்கள், எனவே பல வகையான உதவி பெற இயலும். இந்த பாடத்தைப் பற்றி மேலும் அறிய "நிலைக்கான உதவி" என்பதைத் தேர்ந்தெடுக்கவும், Learn GitBranching பற்றி மேலும் அறிய "பொது உதவி" பயன்படுத்துக, அல்லது இந்த நிலையை எவ்வாறு தீர்ப்பது என்பது பற்றி அறிய "நோக்கம்" தேர்ந்தெடுக்கவும்.'},"help-vague-builder":{__desc__:"When you are in a level builder, the help command is vague so you need to specify what you mean",en_US:'You are in a level builder, so multiple forms of help are available. Please select either "help general" or "help builder"',de_DE:'Du befindest dich im Level-Editor, daher gibt es verschiedene Hilfen. Gib bitte "help general" oder "help builder" ein',zh_CN:'您正在进行关卡构建中,这里有多种形式的帮助,请选择 "help general" (一般帮助)或 "help builder" (关卡构建帮助)',zh_TW:'您正在進行關卡構建中,這裡有多種不同型式的幫助,請選擇 "help general" (一般幫助)或 "help builder" (製造關卡的幫助)',es_AR:'Estás en el constructor de niveles, por lo que hay varios tipos de ayuda. Elegí entre "help general" para ayuda sobre Learn GitBranching y "help builder" para ayuda sobre el constructor de niveles',es_MX:'Estás en el constructor de niveles, por lo que hay varios tipos de ayuda. Elige "help general" para ayuda sobre Learn GitBranching y "help builder" para ayuda sobre el constructor de niveles',es_ES:'Estás en un constructor de niveles, por lo que hay varios tipos de ayuda. Elige "help general" para ayuda sobre Learn GitBranching o "help builder" para ayuda sobre el constructor de niveles',pt_BR:'Você está no construtor de nívels, então há vários tipos de ajuda. Selecione "help general" ou "help builder"',gl:'Estás no constructor de niveis, polo que hai varios tipos de axuda. Elixe "help general" ou "help builder"',fr_FR:'Vous êtes dans l\'éditeur de niveaux, donc plusieurs formes d\'aide sont disponibles. Merci de sélectionner soit "help general" soit "help builder"',ru_RU:'При создании уровней доступны несколько видов помощи. Выбери между "help general" и "help builder"',uk:'При створенні рівня доступні декілька різновидів допомоги. Виберіть або "help general", чи "help builder"',ko:'당신은 한 레벨 생성기에 들어가 있고, 여러가지 도움 양식들을 사용할 수 있습니다. "help general" 또는 "help builder"를 선택해주세요.',vi:'Bạn đang tạo một cấp độ, nên sẽ có nhiều trợ giúp có sẵn. Vui lòng chọn "help general" hoặc "help builder"',sl_SI:'Si v graditelju stopenj, zato so na voljo različne pomoči. Prosim izberi "help general" ali "help builder"',pl:'Znajdujesz się w kreatorze poziomów. Dostępnych jest tu kilka rodzajów pomocy. Wpisz "help general", aby uzyskać pomoc dotyczącą nauki GitBranching-u, lub wpisz "help builder", aby uzyskać pomoc dotyczącą konstruktora poziomów',it_IT:'Sei in un generatore di livelli, hai a disposizione vari tipi di aiuto. Digita "help general" o "help builder"',ta_IN:'நீங்கள் ஒரு நிலை கட்டமைப்பானில் உள்ளீர்கள், எனவே பல வகையான உதவி பெற இயலும். தயவுசெய்து "பொது உதவி" அல்லது "கட்டமைப்பான் உதவி" என்பதைத் தேர்ந்தெடுக்கவும்'},"show-goal-button":{__desc__:"button label to show goal",en_US:"Show Goal",de_DE:"Ziel anzeigen",zh_TW:"顯示目標",zh_CN:"显示目标",fr_FR:"Afficher les cibles",pt_BR:"Mostrar objetivo",gl:"Amosar obxectivo",es_AR:"Mostrar objetivo",es_MX:"Mostrar objetivo",es_ES:"Mostrar objetivo",ja:"ゴールを表示",ru_RU:"Цель уровня",uk:"Ціль рівня",ko:"목표 보기",vi:"Hiển thị mục tiêu",sl_SI:"Prikaži Cilj",pl:"Pokaż cel",it_IT:"Mostra obiettivo",ta_IN:"இலக்கைக் காட்டு"},"hide-goal-button":{__desc__:"button label to hide goal",en_US:"Hide Goal",de_DE:"Ziel verstecken",fr_FR:"Cacher les cibles",zh_TW:"隱藏目標",zh_CN:"隐藏目标",pt_BR:"Ocultar objetivo",gl:"Ocultar obxectivo",es_AR:"Ocultar objetivo",es_MX:"Ocultar objetivo",es_ES:"Ocultar objetivo",ja:"ゴールを隠す",ru_RU:"Спрятать цель",uk:"Сховати ціль",ko:"목표 숨기기",vi:"Ẩn mục tiêu",sl_SI:"Skrij Cilj",pl:"Ukryj cel",it_IT:"Nascondi obiettivo",ta_IN:"இலக்கை மறை"},"objective-button":{__desc__:"button label to show objective",en_US:"Instructions",de_DE:"Ziel",zh_TW:"提示",zh_CN:"提示",es_ES:"Objetivo",es_MX:"Objetivo",gl:"Obxectivo",ru_RU:"Задача",uk:"Задача",ko:"목적",vi:"Chỉ dẫn",sl_SI:"Navodila",pl:"Instrukcje",it_IT:"Istruzioni",ta_IN:"வழிமுறைகள்"},"git-demonstration-title":{__desc__:"title of git demonstration window",en_US:"Git Demonstration",de_DE:"Git Demonstration",zh_TW:"Git示範",zh_CN:"Git示范",es_ES:"Demostración de Git",es_MX:"Demostración de Git",gl:"Demostración de Git",ru_RU:"Git демо",uk:"Git демо",ko:"Git 데모",vi:"Trình diễn Git",sl_SI:"Git Predstavitev",pl:"Demo GIT",it_IT:"Dimostrazione Git",ta_IN:"கிட் செயல் விளக்கம்"},"goal-to-reach":{__desc__:"title of window that shoes the goal tree to reach",en_US:"Goal To Reach",de_DE:"Zu erreichendes Ziel",zh_CN:"目标",zh_TW:"目標",es_AR:"Objetivo a cumplir",es_MX:"Objetivo a cumplir",es_ES:"Objetivo a cumplir",pt_BR:"Objetivo a cumprir",gl:"Obxectivo a cumprir",fr_FR:"Cible à atteindre",ja:"到達目標",ru_RU:"Цель уровня",uk:"Ціль рівня",ko:"목표",vi:"Mục tiêu cần đạt",sl_SI:"Končni Cilj",pl:"Cel do osiągnięcia",it_IT:"Obiettivo da raggiungere",ta_IN:"அடைய வேண்டிய இலக்கு"},"goal-only-main":{__desc__:"the helper message for the window that shows the goal tree when the goal will only be compared using the main branch",en_US:'Note: Only the main branch will be checked in this level. The other branches are simply for reference (shown as dashed labels below). As always, you can hide this dialog with "hide goal"',fr_FR:'Note: Dans ce niveau on ne doit faire de git checkout que sur la branche main. Les autres branches représentées ici (entourées d\'un cadre en tirets) doivent être utilisées uniquement comme références. Comme toujours, vous pouvez cacher cette fenêtre avec "Cacher les objectifs"',de_DE:'Hinweis: In diesem Level wird nur der Branch main geprüft. Die anderen Branches dienen nur als Vergleichsbasis (als gestrichelte Bezeichner dargestellt). Wie immer kannst du diese Meldung mit "hide goal" ausblenden',es_AR:'Nota: Sólo la rama main va a ser chequeada en este nivel. Las otras ramas sólo son para referencia. Como siempre, podés ocultar este mensaje con "hide goal"',es_MX:'Nota: Sólo la rama main va a ser inspeccionada en este nivel. Las otras ramas sólo son para referencia (etiquetados abajo con guión). Como siempre, puedes ocultar éste mensaje con "hide goal"',es_ES:'Nota: Sólo la rama main va a ser inspeccionado en este nivel. Las otras ramas sólo son para referencia (etiquetados abajo con guion). Siempre puedes ocultar este mensaje con "hide goal."',pt_BR:'Nota: Apenas o ramo main será verificado neste nível. Os outros ramos (dentro das caixas clareadas) são somente para referência. Como sempre, você pode ocultar esta janela com "hide goal"',gl:'Nota: Só a rama main será verificada neste nivel. As outras ramas (dentro das caixas clareadas) son soamente de referencia. Coma sempre, podes ocultar está ventá con "hide goal"',zh_CN:'注意:本关卡中,只检查 main 分支,其他分支只是用作 reference 存在(以虚线标签表示)。照常,你可以用 “hide goal” 来隐藏此窗口。',zh_TW:'在這個關卡中,只有 main branch 會被檢查,別的 branch 只是用來做為 reference (下面用虛線符號表示)。一如往常,你可以利用 "hide goal" 來隱藏這個對話視窗',ja:'Note: mainブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます',ru_RU:'Важно: В этом уровне проверяется только ветка main. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"',uk:'Важливо: В цьому рівні буде перевірятися тільки гілка main. Решта гілок тільки для наглядності (показані пунктиром нижче). Як завжди, можна сховати цей діалог за допомогою "hide goal"',ko:'Note: 이 레벨에선 오직 메인 브랜치만이 검사될 것입니다.. 다른 브랜치들은 단순히 참고용입니다. (아래에 대시 라벨로 보여집니다.). "hide goal"을 사용하여 언제든지 창을 숨길 수 있습니다.',vi:'Chú ý: Ở cấp độ này chỉ nhánh main bị kiểm tra. Các nhánh khác chỉ dùng để tham chiếu (có dấu - ở nhãn). Như thường lệ, bạn có thể ẩn mục tiêu bằng "hide goal"',sl_SI:'Opomba: Samo main branch bo preverjen v tej stopnji. Ostali branchi so zgolj za referenco (prikazani kot črtaste oznake spodaj). Kot ponavadi, lahko skriješ dialog z "hide goal"',pl:' Uwaga: Na tym poziomie będzie sprawdzana tylko poprawność gałęzi main. Pozostałe gałęzie są tylko odniesieniem (pokazane jako przerywane etykiety poniżej). Jak zawsze, możesz ukryć to okno klikając "Ukryj cel".',it_IT:'Nota: In questo livello sarà selezionato solo il ramo main. Gli altri rami ci sono solo come riferimento (mostrati come etichette tratteggiate). Come sempre, puoi nascondere questa finestra con "hide goal"',ta_IN:'குறிப்பு: இந்த மட்டத்தில் பிரதான கிளை மட்டுமே சரிபார்க்கப்படும். மற்ற கிளைகள் வெறுமனே விளக்க குறிப்புக்காக மட்டுமே (கீழே விடுபட்ட மேற்கோள்களாக காட்டப்பட்டுள்ளது). எப்பொழுதும் போல், "இலக்கை மறை" மூலம் இந்த சாளரத்தை மறைக்கலாம்'},"hide-goal":{__desc__:"the helper message for the window that shows the goal tree",en_US:'You can hide this window with "hide goal"',de_DE:'Du kannst diese Meldung mit "hide goal" ausblenden',zh_CN:'你可以通过 "hide goal" 命令关闭这个窗口',zh_TW:'你可以透過 "hide goal" 關閉這個視窗',es_AR:'Podés ocultar esta ventana con "hide goal"',es_MX:'Puedes ocultar esta ventana con "hide goal"',es_ES:'Puedes ocultar esta ventana con "hide goal."',pt_BR:'Você pode ocultar esta janela com "hide goal"',gl:'Podes ocultar esta ventá con "hide goal"',fr_FR:'Vous pouvez masquer cette fenêtre avec "Cacher les cibles"',ja:'このウィンドウは"hide goal"と打つかクリックで閉じれます',ru_RU:'Можно скрыть это окно при помощи "hide goal"',uk:'Можна сховати це вікно за допомогою "hide goal"',ko:'"hide goal"을 사용하여 이 창을 숨길 수 있습니다.',vi:'Bạn có thể ẩn cửa sổ này với "hide goal"',sl_SI:'To okno lahko skriješ z "hide goal"',pl:'Możesz ukryć to okno za pomocą opcji "ukryj cel"',it_IT:'Puoi nascondere questa finestra con "hide goal"',ta_IN:'இந்த சாளரத்தை "இலக்கை மறை" மூலம் மறைக்கலாம்'},"hide-start":{__desc__:"The helper message for the window that shows the start tree for a level",en_US:'You can hide this window with "hide start"',de_DE:'Du kannst diese Meldung mit "hide start" ausblenden',zh_CN:'你可以通过 "hide start" 命令关闭这个窗口',zh_TW:'你可以透過 "hide start" 關閉這個視窗',es_AR:'Podés ocultar esta ventana con "hide start"',es_MX:'Puedes ocultar ésta ventana con "hide start"',es_ES:'Puedes ocultar esta ventana con "hide start."',pt_BR:'Você pode ocultar esta janela com "hide start"',gl:'Podes ocultar esta ventá con "hide start"',fr_FR:'Vous pouvez masquer cette fenêtre avec "hide start"',ja:'このウィンドウは"hide start"かクリックで閉じれます',ru_RU:'Можно скрыть это окно при помощи "hide start"',uk:'Можна сховати це вікно за допомогою "hide start"',ko:'"hide start"를 사용하여 이 창을 숨길 수 있습니다.',vi:'Bạn có thể ẩn cửa sổ này với "hide start"',sl_SI:'To okno lahko skriješ z "hide start"',pl:'Możesz ukryć to okno za pomocą opcji "ukryj start"',it_IT:'Puoi nascondere questa finestra con "hide start"',ta_IN:'இந்த சாளரத்தை "தொடக்கத்தை மறை" மூலம் மறைக்கலாம்'},"level-builder":{__desc__:"The name for the environment where you build levels",en_US:"Level Builder",de_DE:"Level-Editor",zh_CN:"关卡生成器",zh_TW:"關卡產生器",es_AR:"Constructor de niveles",es_MX:"Constructor de niveles",es_ES:"Constructor de niveles",pt_BR:"Construtor de níveis",gl:"Constructor de nivéis",fr_FR:"Éditeur de niveaux",ja:"Levelエディタ",ru_RU:"Редактор уровней",uk:"Редактор рівнів",ko:"레벨 생성기",vi:"Trình tạo cấp độ",sl_SI:"Graditelj Stopenj",pl:"Twórca poziomu",it_IT:"Generatore di livelli",ta_IN:"நிலை கட்டமைப்பான்"},"no-start-dialog":{__desc__:"when the user tries to open a start dialog for a level that does not have one",en_US:"There is no start dialog to show for this level!",de_DE:"Es gibt keinen Einführungs-Dialog für dieses Level!",zh_CN:"这个关卡没有介绍!",zh_TW:"這關沒有介紹!",es_AR:"¡No hay mensaje de inicio para este nivel!",es_MX:"¡No hay mensaje de inicio para este nivel!",es_ES:"¡No hay mensaje de inicio para este nivel!",pt_BR:"Não há mensagem de início para este nível!",gl:"¡Non hai mensaxe de inicio para este nivel!",fr_FR:"Il n'y a aucun dialogue de départ à afficher pour ce niveau !",ja:"このLevelにはスタートダイアログが存在しません",ru_RU:"Нет стартового сообщение для уровня!",uk:"Немає початкового діалогу для цього рівня!",ko:"이 레벨을 위한 시작 대화창이 없습니다.",vi:"Không có hộp thoại giới thiệu cho cấp độ này!",sl_SI:"Ni začetnega dialoga za prikaz te stopnje!",pl:"Dla tego poziomu nie ma okna startowego do wyświetlenia!",it_it:"Non esiste una finestra di partenza per questo livello!",ta_IN:"இந்த நிலை பற்றி விளக்கிகாட்ட தொடக்க உரையாடல் எதுவும் இல்லை"},"no-hint":{__desc__:"when no hint is available for a level",en_US:"Hmm, there doesn't seem to be a hint for this level :-/",de_DE:"Hm, es gibt anscheinend keinen Hinweis für dieses Level :-/",zh_CN:"呃……,这关好像没有提示 :-/",zh_TW:"嗯‧‧‧這關沒有提示 :-/",es_AR:"Mmm... Pareciera no haber pistas para este nivel :-/",es_MX:"Mmm... Parece que no hay pistas para Este nivel. :-/",es_ES:"Mmm... Parece que no hay pistas para este nivel. :-/",pt_BR:"Hmm, não existe nenhuma pista para este nível :-/",gl:"Hmm, non existe ningunha pista para este nivel :-/",fr_FR:"Hum, il ne semble pas y avoir d'indice pour ce niveau :-/",ja:"あらら、このLevelでは、残念ながらヒントが存在しません :-/",ru_RU:"Милый мой, хороший, догадайся сам :-/ Подсказка не создана...",uk:"Хм, схоже для цього рівня немає підказки :-/",ko:"흠, 이 레벨을 위한 힌트가 없어보이는군요.",vi:"Hmmm, có vẻ cấp độ này không có gợi ý rồi :-/",sl_SI:"Hmm, izgleda da ni namiga za to stopnjo :-/",pl:"Hmm, wydaje się, że nie ma podpowiedzi dla tego poziomu :-/",it_IT:"Mmh, sembra non ci sia un suggerimento per questo livello :-/",ta_IN:"ஹ்ம், இந்த நிலைக்கு ஒரு குறிப்பு எதுவும் இருப்பதாகத் தெரியவில்லை :-/"},"error-untranslated-key":{__desc__:"This error happens when we are trying to translate a specific key and the locale version is mission",en_US:"The translation for {key} does not exist yet :( Please hop on github and offer up a translation!",de_DE:"Die Übersetzung für {key} existiert noch nicht :( Falls du eine hast, dann teile sie mir bitte auf GitHub mit!",zh_CN:"还没翻译 {key} :( 请在 GitHub 上贡献您的翻译!",zh_TW:"還沒翻譯 {key} :( 請在 GitHub 上貢獻您的翻譯!",es_AR:"Aún no hay traducción para {key} :( ¡Metete en GitHub y sugerí una! :)",es_MX:"Aún no existe una traducción para {key}. :( ¡Métete en GitHub y sugiere una! :)",es_ES:"Aún no hay traducción para {key}. :( ¡Métete en GitHub y sugiere una! :)",pt_BR:"Não existe tradução para {key} :( Pule no GitHub e sugira uma! :)",gl:"Non existe tradución para {key} :( Axúdanos en GitHub e suxire unha! :)",fr_FR:"La traduction pour {key} n'existe pas encore :( Venez sur GitHub pour en offrir une !",ja:"{key}の翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m",ru_RU:"Перевода для {key} не создано :( Пожалуйста, предложи перевод на GitHub",uk:"Немає перекладу для {key} :( Будь-ласка, запропонуй переклад на GitHub",ko:"{key}를 위한 번역은 아직 존재하지 않습니다 :( 번역에 참여해주세요!",vi:"Bản dịch cho {key} không có rồi :( Nếu có thể thì hãy lên dự án của chúng tôi ở GitHub để cung cấp bản dịch!",sl_SI:"Prevod za {key} še ne obstaja :( Skoči na github in dodaj prevod!",pl:'Tłumaczenie dla klucza "{key}" jeszcze nie istnieje tłumaczenia :( Zapraszam na GitHub, aby pomóc w tłumaczeniu!',it_IT:"La traduzione per {key} non esiste ancora :( Fai un salto su GitHub e dacci una mano!",ta_IN:"{key}-இன் மொழிபெயர்ப்பு கிடைக்கவில்லை :( github-இன் வழியாக் நீங்களும் மொழி பெயர்க்க உதவலாம்!"},"error-untranslated":{__desc__:"The general error when we encounter a dialog that is not translated",en_US:"This dialog or text is not yet translated in your locale :( Hop on github to aid in translation!",de_DE:"Dieser Dialog oder Text ist noch nicht in deiner Sprache verfügbar. :( Schau auf GitHub vorbei um bei der Übersetzung zu helfen!",zh_CN:"这段对话还没有被翻译成您的语言 :( 欢迎在 GitHub 上贡献您的翻译!",zh_TW:"這段對話尚未翻成您的語言 :( 歡迎到 GitHub 貢獻翻譯!",es_AR:"Este mensaje o texto aún no fue traducido a tu idioma :( ¡Metete en GitHub y ayudanos a traducirlo!",es_MX:"Este mensaje o texto aún no ha sido traducido en tu idioma. :( ¡Métete en GitHub y ayúdanos a traducirlo!",es_ES:"Este mensaje o texto aún no fue traducido a tu idioma. :( ¡Métete en GitHub y ayúdanos a traducirlo!",pt_BR:"Esta mensagem ou texto não foi traduzida para Português :( Ajude-nos a traduzir no GitHub!",gl:"Esta mensaxe ou texto non foi traducida ó teu idioma :( Axúdanos a traducir a web en GitHub, é moi doado!",fr_FR:"Ce message n'a pas encore été traduit dans votre langue :( Venez sur GitHub aider à la traduction !",ja:"このダイアログ、またはテキストの翻訳がまだ存在しません :( GitHubでの、翻訳の協力をお願いします m(_)m",ru_RU:"Для этого сообщения нет перевода :( Пожалуйста, предложи перевод на GitHub",uk:"Для цього повідомлення ще немає перекладу :( Будь-ласка, запропонуй переклад на GitHub",ko:"이 대화창이나 텍스트는 아직 번역되지 않았습니다. :( 번역에 참여해주세요!",vi:"Hộp thoại hoặc văn bản này chưa được dịch ra ngôn ngữ của bạn rồi :( Hãy lên GitHub để cung cấp bản dịch!",sl_SI:"Ta dialog ali tekst še ni preveden za tvoj jezik :( Skoči na github in dodaj prevod!",pl:"Kolejne okno dialogowe lub tekst nie zostało jeszcze przetłumaczone na język polski :( Zapraszam na GitHub, aby pomóc w tłumaczeniu!",it_IT:"Questo messaggio o testo non è ancora stato tradotto nella tua lingua :( Fai un salto su GitHub e dacci una mano!",ta_IN:"இந்த உரையாடல் அல்லது உரை உங்கள் தமிழில் இன்னும் மொழிபெயர்க்கப்படவில்லை :( github-இன் வழியாக் நீங்களும் மொழி பெயர்க்க உதவலாம்!",tr_TR:"Bu ileti veya metin henüz dilimize çevrilmemiş :( Çeviriye yardımcı olmak için GitHub'da bize katılın!"},"cancel-button":{__desc__:"Cancel button label after completing a level",es_AR:"Cancelar",en_US:"Cancel",es_MX:"Cancelar",de_DE:"Abbrechen",zh_TW:"取消",pl:"Powrót",it_IT:"Annulla",ta_IN:"இரத்துசெய்",vi:"Hủy",tr_TR:"İptal"},"confirm-button":{__desc__:"Confirm button label after completing a level",es_AR:"Confirmar",en_US:"Confirm",es_MX:"Confirmar",de_DE:"Bestätigen",zh_TW:"確認",pl:"Dalej",it_IT:"Conferma",ta_IN:"உறுதிப்படுத்தவும்",vi:"Đồng ý",tr_TR:"Tamam"},"level-label":{__desc__:"Label in the top of the left-side menu. Remember to leave some space on the sides",es_AR:"Nivel",en_US:" Level ",es_MX:"Nivel",de_DE:" Level ",zh_TW:"關卡 ",it_IT:" Livello ",pl:" Poziom ",tr_TR:" Seviye "},"command-helper-bar-levels":{__desc__:"Levels command label in the bottom command helper bar.",es_AR:"Niveles",en_US:"Levels",es_MX:"Niveles",de_DE:"Levels",zh_TW:"關卡",it_IT:"Livelli",pl:"Poziomy"},"command-helper-bar-solution":{__desc__:"Solution command label in the bottom command helper bar.",es_AR:"Solución",en_US:"Solution",es_MX:"Solución",de_DE:"Lösung",zh_TW:"解答",it_IT:"Soluzione",pl:"Rozwiązanie"},"command-helper-bar-reset":{__desc__:"Reset command label in the bottom command helper bar.",es_AR:"Reiniciar",en_US:"Reset",es_MX:"Reiniciar",de_DE:"Zurücksetzen",zh_TW:"重新開始",it_IT:"Reset",pl:"Wyczyść"},"command-helper-bar-undo":{__desc__:"Undo command label in the bottom command helper bar.",es_AR:"Deshacer",en_US:"Undo",es_MX:"Deshacer",de_DE:"Rückgängig",zh_TW:"回到上一步",it_IT:"Annulla",pl:"Cofnij"},"command-helper-bar-objective":{__desc__:"Objective command label in the bottom command helper bar.",es_AR:"Objetivo",en_US:"Objective",es_MX:"Objetivo",de_DE:"Zielvorgabe",zh_TW:"目標",it_IT:"Obiettivo",pl:"Cel"},"command-helper-bar-help":{__desc__:"Help command label in the bottom command helper bar.",es_AR:"Ayuda",en_US:"Help",es_MX:"Ayuda",de_DE:"Hilfe",zh_TW:"幫助",it_IT:"Aiuto",pl:"Pomoc"},"error-command-currently-not-supported":{__desc__:"Message that appears in git console when command is not supported in the current environment.",es_AR:"¡El comando es valido, pero no está soportado en este ambiente! intentá ingresar un nivel o un constructor de nivel para usar ese comando",en_US:"That command is valid, but not supported in this current environment! Try entering a level or level builder to use that command",es_MX:"¡El comando es válido, pero no es suportado en este ambiente! Intenta ingresar un nivel o un constructor de niveles para usar ese comando",de_DE:"Der Befehl ist gültig, aber in der aktuellen Umgebung nicht unterstützt! Rufe ein Level oder den Level-Editor auf, um diesen Befehl zu nutzen",zh_TW:"這項指令輸入正確,然而目前的環境不支援此指令。試著前往關卡或關卡建造器中使用此指令。",it_IT:"Il comando è valido, ma non supportato in questo ambiente! Prova a entrare in un livello o nel generatore di livelli per usare quel comando",pl:"To polecenie jest poprawne, ale nie jest obsługiwane w obecnym środowisku! Spróbuj wybrać poziom lub włączyć konstruktor poziomów, aby użyć tej komendy",vi:"Lệnh đó hợp lệ, nhưng không được hỗ trợ ở môi trường hiện tại! Hãy thử vào một cấp độ hoặc trình tạo cấp độ để sử dụng lệnh",tr_TR:"Bu komut geçerli bir komuttur, fakat bu ortamda desteklenmemektedir, bu komutu kullanmak için bir seviye (level) ya da seviye oluşturucu ekleyin (level builder)."},"interactive-rebase-title":{__desc__:"Title for the popup",es_AR:"Rebase interactivo",en_US:"Interactive Rebase",es_MX:"Rebase interactivo",de_DE:"Interaktives Rebase",zh_TW:"互動式 Rebase",it_IT:"Rebase interattivo",pl:"Interaktywny Rebase",vi:"Rebase tương tác"}}},{}],69:[function(e,t,o){e("backbone");var i=e("q"),a=e("../util"),n=e("../app"),r=e("../intl"),s=e("../util/errors"),c=e("../visuals/visualization").Visualization,l=(e("../level/parseWaterfall").ParseWaterfall,e("../level").Level),m=e("../stores/LocaleStore"),u=e("../stores/LevelStore"),d=(e("../models/commandModel").Command,e("../git/gitShim").GitShim,e("../views/multiView").MultiView,e("../views").CanvasTerminalHolder),h=e("../views").ConfirmCancelTerminal,p=(e("../views").NextLevelConfirm,e("../views/builderViews").MarkdownPresenter),g=e("../views/builderViews").MultiViewBuilder,f=(e("../views/builderViews").MarkdownGrabber,{"define goal":/^define goal$/,"define name":/^define name$/,"help builder":/^help builder$/,"define start":/^define start$/,"edit dialog":/^edit dialog$/,"show start":/^show start$/,"hide start":/^hide start$/,"define hint":/^define hint$/,finish:/^finish$/}),b=a.genParseCommand(f,"processLevelBuilderCommand"),v=l.extend({initialize:function(t){(t=t||{}).level={},this.options=t;var o,i=m.getLocale();t.level.startDialog={},t.level.startDialog[i]={childViews:r.getDialog(e("../dialogs/levelBuilder"))},t.editLevel&&(o=u.getLevel(t.editLevel),t.level=o),v.__super__.initialize.apply(this,[t]),t.editLevel?(this.startDialogObj=o.startDialog[i],this.definedGoal=!0):(this.startDialogObj=void 0,this.definedGoal=!1),delete this.treeCompare,delete this.solved},initName:function(){},initGoalData:function(){this.options.editLevel||(this.level.goalTreeString='{"branches":{"main":{"target":"C1","id":"main"},"makeLevel":{"target":"C2","id":"makeLevel"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"makeLevel","id":"HEAD"}}',this.level.solutionCommand="git checkout -b makeLevel; git commit"),v.__super__.initGoalData.apply(this,arguments)},minimizeGoal:function(e,t){this.doBothVis("hide"),this.goalWindowPos=e,this.goalWindowSize=t,$("#goalPlaceholder").is(":visible")&&($("#goalPlaceholder").hide(),this.mainVis.myResize())},doBothVis:function(e){this.startVis&&this.startVis[e].call(this.startVis),this.goalVis&&this.goalVis[e].call(this.goalVis)},resizeGoal:function(){this.doBothVis("myResize")},initStartVisualization:function(){return this.startCanvasHolder=new d({parent:this,additionalClass:"startTree",text:r.str("hide-start")}),this.startVis=new c({el:this.startCanvasHolder.getCanvasLocation(),containerElement:this.startCanvasHolder.getCanvasLocation(),treeString:this.level.startTree,noKeyboardInput:!0,smallCanvas:!0,noClick:!0}),this.startCanvasHolder},startOffCommand:function(){n.getEventBaton().trigger("commandSubmitted","echo :D")},objectiveDialog:function(e,t){var o=[e,t,void 0===this.startDialogObj?null:{startDialog:{en_US:this.startDialogObj}}];v.__super__.objectiveDialog.apply(this,o)},initParseWaterfall:function(e){v.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",b),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands())},buildLevel:function(e,t){this.exitLevel(),setTimeout((function(){n.getSandbox().buildLevel(e,t)}),1.5*this.getAnimationTime())},getInstantCommands:function(){return[[/^help$|^\?$/,function(){throw new s.CommandResult({msg:r.str("help-vague-builder")})}]]},takeControl:function(){n.getEventBaton().stealBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),v.__super__.takeControl.apply(this)},releaseControl:function(){n.getEventBaton().releaseBaton("processLevelBuilderCommand",this.processLevelBuilderCommand,this),v.__super__.releaseControl.apply(this)},showGoal:function(){this.hideStart(),v.__super__.showGoal.apply(this,arguments)},showStart:function(e,t){this.hideGoal(),this.showSideVis(e,t,this.startCanvasHolder,this.initStartVisualization)},resetSolution:function(){this.gitCommandsIssued=[],this.level.solutionCommand=void 0},hideStart:function(e,t){this.hideSideVis(e,t,this.startCanvasHolder)},defineStart:function(e,t){this.hideStart(),e.addWarning(r.str("define-start-warning")),this.resetSolution(),this.level.startTree=this.mainVis.gitEngine.printTree(),this.mainVis.resetFromThisTreeNow(this.level.startTree),this.showStart(e,t)},defineGoal:function(e,t){if(this.hideGoal(),!this.gitCommandsIssued.length)return e.set("error",new s.GitError({msg:r.str("solution-empty")})),void t.resolve();this.definedGoal=!0,this.level.solutionCommand=this.gitCommandsIssued.join(";"),this.level.goalTreeString=this.mainVis.gitEngine.printTree(),this.initGoalVisualization(),this.showGoal(e,t)},defineName:function(e,t){this.level.name={en_US:prompt(r.str("prompt-name"))},e&&e.finishWith(t)},defineHint:function(e,t){this.level.hint={en_US:prompt(r.str("prompt-hint"))},e&&e.finishWith(t)},editDialog:function(e,t){var o=i.defer();this.currentBuilder=new g({multiViewJSON:this.startDialogObj,deferred:o}),o.promise.then(function(e){this.startDialogObj=e}.bind(this)).fail((function(){})).done((function(){e?e.finishWith(t):t.resolve()}))},finish:function(e,t){if(!(this.options.editLevel||this.gitCommandsIssued.length&&this.definedGoal))return e.set("error",new s.GitError({msg:r.str("solution-empty")})),void t.resolve();for(;!this.level.name;)this.defineName();var o=i.defer(),a=o.promise;if(void 0===this.level.hint){var n=i.defer();a=a.then((function(){return n.promise})),new h({markdowns:[r.str("want-hint")]}).getPromise().then(this.defineHint.bind(this)).fail(function(){this.level.hint={en_US:""}}.bind(this)).done((function(){n.resolve()}))}if(void 0===this.startDialogObj){var c=i.defer();a=a.then((function(){return c.promise})),new h({markdowns:[r.str("want-start-dialog")]}).getPromise().then(function(){var e=i.defer();return this.editDialog(void 0,e),e.promise}.bind(this)).fail((function(){})).done((function(){c.resolve()}))}a=a.done(function(){new p({fillerText:JSON.stringify(this.getExportObj(),null,2),previewText:r.str("share-json")}),e.finishWith(t)}.bind(this)),o.resolve()},getExportObj:function(){var e=Object.assign({},this.level);return delete e.startDialog,this.startDialogObj&&(e.startDialog={en_US:this.startDialogObj}),e},processLevelBuilderCommand:function(e,t){var o={"define goal":this.defineGoal,"define start":this.defineStart,"show start":this.showStart,"hide start":this.hideStart,finish:this.finish,"define hint":this.defineHint,"define name":this.defineName,"edit dialog":this.editDialog,"help builder":v.__super__.startDialog};if(!o[e.get("method")])throw new Error("woah we don't support that method yet");o[e.get("method")].apply(this,arguments)},afterCommandDefer:function(e,t){e.resolve()},die:function(){this.hideStart(),v.__super__.die.apply(this,arguments),delete this.startVis,delete this.startCanvasHolder}});o.LevelBuilder=v,o.regexMap=f},{"../app":52,"../dialogs/levelBuilder":56,"../git/gitShim":61,"../intl":67,"../level":71,"../level/parseWaterfall":72,"../models/commandModel":76,"../stores/LevelStore":88,"../stores/LocaleStore":89,"../util":96,"../util/errors":93,"../views":106,"../views/builderViews":103,"../views/multiView":108,"../visuals/visualization":119,backbone:1,q:29}],70:[function(e,t,o){var i=e("../intl"),a=e("../commands"),n=e("../util/errors").GitError;function r(e){e=e||{},this.disabledMap=e.disabledMap||{"git cherry-pick":!0,"git rebase":!0}}r.prototype.getInstantCommands=function(){var e=[],t=function(){throw new n({msg:i.str("command-disabled")})};return Object.keys(this.disabledMap).forEach(function(o){o=o.slice("git".length+1);var i=a.commands.getRegexMap().git[o];if(!i)throw new Error("wuttttt this disbaled command"+o+" has no regex matching");e.push([i,t])}.bind(this)),e},o.DisabledMap=r},{"../commands":53,"../intl":67,"../util/errors":93}],71:[function(e,t,o){var i=e("q"),a=e("react"),n=e("react-dom"),r=e("../util"),s=e("../app"),c=e("../intl"),l=e("../log"),m=e("../util/errors"),u=e("../sandbox/").Sandbox,d=e("../actions/GlobalStateActions"),h=e("../stores/GlobalStateStore"),p=e("../actions/LevelActions"),g=e("../stores/LevelStore"),f=e("../visuals/visualization").Visualization,b=e("../level/disabledMap").DisabledMap,v=e("../git/gitShim").GitShim,k=e("../commands"),w=e("../views/multiView").MultiView,y=e("../views").CanvasTerminalHolder,C=e("../views").ConfirmCancelTerminal,z=e("../views").NextLevelConfirm,A=e("../react_views/LevelToolbarView.jsx"),_=e("../graph/treeCompare"),D={"help level":/^help level$/,"start dialog":/^start dialog$/,"show goal":/^(show goal|goal|help goal)$/,"hide goal":/^hide goal$/,"show solution":/^show solution($|\s)/,objective:/^(objective|assignment)$/},x=r.genParseCommand(D,"processLevelCommand"),M=u.extend({initialize:function(e){(e=e||{}).level=e.level||{},this.level=e.level,this.gitCommandsIssued=[],this.solved=!1,this.wasResetAfterSolved=!1,this.initGoalData(e),this.initName(e),this.on("minimizeCanvas",this.minimizeGoal),this.on("resizeCanvas",this.resizeGoal),this.isGoalExpanded=!1,M.__super__.initialize.apply(this,[e]),this.startOffCommand(),this.handleOpen(e.deferred),p.setIsSolvingLevel(!0)},getIsGoalExpanded:function(){return this.isGoalExpanded},handleOpen:function(e){p.setIsSolvingLevel(!0),e=e||i.defer(),h.getShouldDisableLevelInstructions()?setTimeout((function(){e.resolve()}),100):!this.level.startDialog||this.testOption("noIntroDialog")?setTimeout((function(){e.resolve()}),1.2*this.getAnimationTime()):new w(Object.assign({},c.getStartDialog(this.level),{deferred:e}))},objectiveDialog:function(e,t,o){if(!(o=void 0===o?this.level:o)||!o.startDialog)return e.set("error",new m.GitError({msg:c.str("no-start-dialog")})),void t.resolve();var i=$.extend({},c.getStartDialog(o));i.childViews=i.childViews.slice(-1),new w(Object.assign(i,{deferred:t})),t.promise.then((function(){e.set("status","finished")}))},startDialog:function(e,t){if(!this.level.startDialog)return e.set("error",new m.GitError({msg:c.str("no-start-dialog")})),void t.resolve();this.handleOpen(t),t.promise.then((function(){e.set("status","finished")}))},getEnglishName:function(){return this.level.name.en_US},initName:function(){var e=c.getName(this.level);this.levelToolbar=a.createElement(A,{name:e,onGoalClick:this.toggleGoal.bind(this),onObjectiveClick:this.toggleObjective.bind(this),parent:this}),n.render(this.levelToolbar,document.getElementById("levelToolbarMount"))},initGoalData:function(e){if(!this.level.goalTreeString||!this.level.solutionCommand)throw new Error("need goal tree and solution")},takeControl:function(){s.getEventBaton().stealBaton("processLevelCommand",this.processLevelCommand,this),M.__super__.takeControl.apply(this)},releaseControl:function(){s.getEventBaton().releaseBaton("processLevelCommand",this.processLevelCommand,this),M.__super__.releaseControl.apply(this)},startOffCommand:function(){var e=this.options.command.get("method");h.getShouldDisableLevelInstructions()?s.getEventBaton().trigger("commandSubmitted","hint; show goal"):this.testOption("noStartCommand")||"importLevelNow"===e||s.getEventBaton().trigger("commandSubmitted","hint; delay 2000; show goal")},initVisualization:function(e){this.mainVis=new f({el:e.el||this.getDefaultVisEl(),treeString:e.level.startTree})},initGoalVisualization:function(){var e=_.onlyMainCompared(this.level);return this.goalCanvasHolder=new y({text:e?c.str("goal-only-main"):void 0,parent:this}),this.goalVis=new f({el:this.goalCanvasHolder.getCanvasLocation(),containerElement:this.goalCanvasHolder.getCanvasLocation(),treeString:this.level.goalTreeString,noKeyboardInput:!0,smallCanvas:!0,isGoalVis:!0,levelBlob:this.level,noClick:!0}),this.goalVis.customEvents.on("drag",function(e,t){Math.abs(t.position.left)<.4*$(window).width()?$("#goalPlaceholder").is(":visible")||($("#goalPlaceholder").show(),this.mainVis.myResize()):$("#goalPlaceholder").is(":visible")&&($("#goalPlaceholder").hide(),this.mainVis.myResize())}.bind(this)),this.goalCanvasHolder},minimizeGoal:function(e,t){this.isGoalExpanded=!1,this.trigger("goalToggled"),this.goalVis.hide(),this.goalWindowPos=e,this.goalWindowSize=t,$("#goalPlaceholder").is(":visible")&&($("#goalPlaceholder").hide(),this.mainVis.myResize())},resizeGoal:function(){this.goalVis&&this.goalVis.myResize()},showSolution:function(t,o){var a=this.level.solutionCommand,n=function(){this.isShowingSolution=!0,this.wasResetAfterSolved=!0,s.getEventBaton().trigger("commandSubmitted",a),l.showLevelSolution(this.getEnglishName())}.bind(this),r=t.get("rawStr");if(this.testOptionOnString(r,"noReset")||(a="reset --forSolution; "+a),this.testOptionOnString(r,"force"))return n(),void t.finishWith(o);if(g.isLevelSolved(this.level.id))n(),t.finishWith(o);else{var m=i.defer(),u=c.getDialog(e("../dialogs/confirmShowSolution"))[0],d=new C({markdowns:u.options.markdowns,deferred:m});m.promise.then(n).fail((function(){t.setResult("")})).done((function(){setTimeout((function(){t.finishWith(o)}),d.getAnimationTime())}))}},toggleObjective:function(){s.getEventBaton().trigger("commandSubmitted","objective")},toggleGoal:function(){this.goalCanvasHolder&&this.goalCanvasHolder.inDom?this.hideGoal():this.showGoal()},showGoal:function(e,t){this.isGoalExpanded=!0,this.trigger("goalToggled"),this.showSideVis(e,t,this.goalCanvasHolder,this.initGoalVisualization),$(this.goalVis.el).offset().left>.5*$(window).width()&&($("#goalPlaceholder").show(),this.mainVis.myResize())},showSideVis:function(e,t,o,i){o&&o.inDom||(o=i.apply(this)),o.restore(this.goalWindowPos,this.goalWindowSize),setTimeout((function(){e&&e.finishWith(t)}),o.getAnimationTime())},hideGoal:function(e,t){this.isGoalExpanded=!1,this.trigger("goalToggled"),this.hideSideVis(e,t,this.goalCanvasHolder)},hideSideVis:function(e,t,o,i){var a=function(){e&&e.finishWith(t)};o&&o.inDom?(o.die(),setTimeout(a,o.getAnimationTime())):a()},initParseWaterfall:function(e){M.__super__.initParseWaterfall.apply(this,[e]),this.parseWaterfall.addFirst("parseWaterfall",x),this.parseWaterfall.addFirst("instantWaterfall",this.getInstantCommands()),e.level.disabledMap&&this.parseWaterfall.addFirst("instantWaterfall",new b({disabledMap:e.level.disabledMap}).getInstantCommands())},initGitShim:function(e){this.gitShim=new v({beforeCB:this.beforeCommandCB.bind(this),afterCB:this.afterCommandCB.bind(this),afterDeferHandler:this.afterCommandDefer.bind(this)})},undo:function(){this.gitCommandsIssued.pop(),M.__super__.undo.apply(this,arguments)},beforeCommandCB:function(e){this._treeBeforeCommand=this.mainVis.gitEngine.printTree()},afterCommandCB:function(e){this.doesCommandCountTowardsTotal(e)&&(this.gitCommandsIssued.push(e.get("rawStr")),this.undoStack.push(this._treeBeforeCommand))},doesCommandCountTowardsTotal:function(e){if(e.get("error"))return!1;var t=!1,o=k.commands.getCommandsThatCount();return Object.values(o).forEach((function(o){Object.values(o).forEach((function(o){t=t||o.test(e.get("rawStr"))}))})),t},afterCommandDefer:function(e,t){if(this.solved)return t.addWarning(c.str("already-solved")),void e.resolve();var o=this.mainVis.gitEngine.printTree();_.dispatchFromLevel(this.level,o)?this.levelSolved(e):e.resolve()},getNumSolutionCommands:function(){return this.level.solutionCommand.replace(/^;|;$/g,"").split(";").length},testOption:function(e){return this.options.command&&new RegExp("--"+e).test(this.options.command.get("rawStr"))},testOptionOnString:function(e,t){return e&&new RegExp("--"+t).test(e)},levelSolved:function(e){this.solved=!0,this.isShowingSolution||(p.setLevelSolved(this.level.id),l.levelSolved(this.getEnglishName())),this.hideGoal();var t=g.getNextLevel(this.level.id),o=this.gitCommandsIssued.length,a=this.getNumSolutionCommands(),n=this.testOption("noFinishDialog")||this.wasResetAfterSolved,r=this.wasResetAfterSolved;r||d.levelSolved();var c=1;switch(h.getNumLevelsSolved()){case 2:c=1.5;break;case 3:c=1.8;break;case 4:c=2.1;break;case 5:c=2.4}h.getNumLevelsSolved()>5&&(c=2.5);var m=null;if(r){var u=i.defer();u.resolve(),m=u.promise,s.getEventBaton().trigger("commandSubmitted","echo \"level solved! type in 'levels' to access the next level\"")}else d.changeIsAnimating(!0),m=this.mainVis.gitVisuals.finishAnimation(c),this.mainVis.originVis&&(m=m.then(this.mainVis.originVis.gitVisuals.finishAnimation(c)));n||(m=m.then((function(){return new z({nextLevel:t,numCommands:o,best:a}).getPromise()}))),m.then((function(){!n&&t&&(l.choseNextLevel(t.id),s.getEventBaton().trigger("commandSubmitted","level "+t.id))})).fail((function(){})).done((function(){d.changeIsAnimating(!1),e.resolve()}))},die:function(){n.unmountComponentAtNode(document.getElementById("levelToolbarMount")),this.hideGoal(),this.mainVis.die(),this.releaseControl(),this.clear(),delete this.commandCollection,delete this.mainVis,delete this.goalVis,delete this.goalCanvasHolder,p.setIsSolvingLevel(!1)},getInstantCommands:function(){var e=function(){var e=c.getHint(this.level);return e&&e.length?e:c.str("no-hint")}.bind(this);return[[/^help$|^\?$/,function(){throw new m.CommandResult({msg:c.str("help-vague-level")})}],[/^hint$/,function(){throw new m.CommandResult({msg:e()})}]]},reset:function(e,t){this.gitCommandsIssued=[];var o=e?e.get("rawStr"):"";this.testOptionOnString(o,"forSolution")||(this.isShowingSolution=!1),this.solved&&(this.wasResetAfterSolved=!0),this.solved=!1,M.__super__.reset.apply(this,arguments)},buildLevel:function(e,t){this.exitLevel(),setTimeout((function(){s.getSandbox().buildLevel(e,t)}),1.5*this.getAnimationTime())},importLevel:function(e,t){this.exitLevel(),setTimeout((function(){s.getSandbox().importLevel(e,t)}),1.5*this.getAnimationTime())},startLevel:function(e,t){this.exitLevel(),setTimeout((function(){s.getSandbox().startLevel(e,t)}),1.5*this.getAnimationTime())},exitLevel:function(e,t){this.die(),e&&t&&(setTimeout((function(){e.finishWith(t)}),this.getAnimationTime()),s.getEventBaton().trigger("levelExited"))},processLevelCommand:function(e,t){var o={"show goal":this.showGoal,"hide goal":this.hideGoal,"show solution":this.showSolution,"start dialog":this.startDialog,"help level":this.startDialog,objective:this.objectiveDialog}[e.get("method")];if(!o)throw new Error("woah we don't support that method yet",o);o.apply(this,[e,t])}});o.Level=M,o.regexMap=D},{"../actions/GlobalStateActions":49,"../actions/LevelActions":50,"../app":52,"../commands":53,"../dialogs/confirmShowSolution":55,"../git/gitShim":61,"../graph/treeCompare":65,"../intl":67,"../level/disabledMap":70,"../log":73,"../react_views/LevelToolbarView.jsx":82,"../sandbox/":85,"../stores/GlobalStateStore":87,"../stores/LevelStore":88,"../util":96,"../util/errors":93,"../views":106,"../views/multiView":108,"../visuals/visualization":119,q:29,react:39,"react-dom":33}],72:[function(e,t,o){var i=e("../git/commands"),a=e("../commands"),n=e("../sandbox/commands"),r=function(e){e=e||{},this.options=e,this.shortcutWaterfall=e.shortcutWaterfall||[a.commands.getShortcutMap()],this.instantWaterfall=e.instantWaterfall||[i.instantCommands,n.instantCommands]};r.prototype.initParseWaterfall=function(){e("../util").isBrowser()?this.parseWaterfall=this.options.parseWaterfall||[a.parse,n.parse,n.getOptimisticLevelParse(),n.getOptimisticLevelBuilderParse()]:this.parseWaterfall=[a.parse]},r.prototype.clone=function(){return new r({shortcutWaterfall:this.shortcutWaterfall.slice(),instantWaterfall:this.instantWaterfall.slice(),parseWaterfall:this.parseWaterfall.slice()})},r.prototype.getWaterfallMap=function(){return this.parseWaterfall||this.initParseWaterfall(),{shortcutWaterfall:this.shortcutWaterfall,instantWaterfall:this.instantWaterfall,parseWaterfall:this.parseWaterfall}},r.prototype.addFirst=function(e,t){if(!e||!t)throw new Error("need to know which!!!");this.getWaterfallMap()[e].unshift(t)},r.prototype.addLast=function(e,t){this.getWaterfallMap()[e].push(t)},r.prototype.expandAllShortcuts=function(e){return this.shortcutWaterfall.forEach((function(t){e=this.expandShortcut(e,t)}),this),e},r.prototype.expandShortcut=function(e,t){return Object.keys(t).forEach((function(o){var i=t[o];Object.keys(i).forEach((function(t){var a=i[t].exec(e);a&&(e=o+" "+t+" "+e.slice(a[0].length))}))})),e},r.prototype.processAllInstants=function(e){this.instantWaterfall.forEach((function(t){this.processInstant(e,t)}),this)},r.prototype.processInstant=function(e,t){t.forEach((function(t){var o=t[0].exec(e);o&&t[1](o)}))},r.prototype.parseAll=function(e){this.parseWaterfall||this.initParseWaterfall();var t=!1;return this.parseWaterfall.forEach((function(o){var i=o(e);i&&(t=i)}),this),t},o.ParseWaterfall=r},{"../commands":53,"../git/commands":60,"../sandbox/commands":84,"../util":96}],73:[function(e,t,o){var i=function(e,t,o){window._gaq=window._gaq||[],window._gaq.push(["_trackEvent",e,t,o])};o.viewInteracted=function(e){i("views","interacted",e)},o.showLevelSolution=function(e){i("levels","showedLevelSolution",e)},o.choseNextLevel=function(e){i("levels","nextLevelChosen",e)},o.levelSelected=function(e){i("levels","levelSelected",e)},o.levelSolved=function(e){i("levels","levelSolved",e)},o.commandEntered=function(e){i("commands","commandEntered",e)}},{}],74:[function(e,t,o){var i=e("../intl"),a=(e("../git/commands"),e("../util/errors")),n=(a.CommandProcessError,a.GitError),r=(a.Warning,a.CommandResult,{commit:{regex:/^hg +(commit|ci)($|\s)/,options:["--amend","-A","-m"],delegate:function(e,t){return t.getOptionsMap()["-A"]&&t.addWarning(i.str("hg-a-option")),{vcs:"git",name:"commit"}}},status:{regex:/^hg +(status|st) *$/,dontCountForGolf:!0,execute:function(e,t){throw new n({msg:i.str("hg-error-no-status")})}},export:{regex:/^hg +export($|\s)/,dontCountForGolf:!0,delegate:function(e,t){return t.mapDotToHead(),{vcs:"git",name:"show"}}},graft:{regex:/^hg +graft($|\s)/,options:["-r"],delegate:function(e,t){return t.acceptNoGeneralArgs(),t.prependOptionR(),{vcs:"git",name:"cherrypick"}}},log:{regex:/^hg +log($|\s)/,options:["-f"],dontCountForGolf:!0,delegate:function(e,t){var o=t.getOptionsMap();if(t.acceptNoGeneralArgs(),!o["-f"])throw new n({msg:i.str("hg-error-log-no-follow")});return t.mapDotToHead(),{vcs:"git",name:"log"}}},bookmark:{regex:/^hg (bookmarks|bookmark|book)($|\s)/,options:["-r","-f","-d"],delegate:function(e,t){var o,a,r=t.getOptionsMap(),s=t.getGeneralArgs(),c={vcs:"git"};if(r["-m"]&&r["-d"])throw new n({msg:i.todo("-m and -d are incompatible")});if(r["-d"]&&r["-r"])throw new n({msg:i.todo("-r is incompatible with -d")});if(r["-m"]&&r["-r"])throw new n({msg:i.todo("-r is incompatible with -m")});return s.length+(r["-r"]?r["-r"].length:0)+(r["-d"]?r["-d"].length:0)===0?(c.name="branch",c):(r["-d"]?(r["-D"]=r["-d"],delete r["-d"],c.name="branch"):r["-r"]?(o=(s=t.getGeneralArgs())[0],a=r["-r"][0],c.name="branch",t.setGeneralArgs([o,a])):s.length>0?(t.setOptionsMap({"-b":[s[0]]}),c.name="checkout",t.setGeneralArgs([])):c.name="branch",c)}},rebase:{regex:/^hg +rebase($|\s+)/,options:["-d","-s","-b"],execute:function(e,t){var o=function(){throw new n({msg:i.str("git-error-options")})},a=t.getOptionsMap();if(a["-d"]&&a["-s"]||!a["-d"]&&a["-s"],a["-b"]||(a["-b"]=["."]),t.setOptionsMap(a),t.mapDotToHead(),(a=t.getOptionsMap())["-d"]){var r=a["-d"][0]||o(),s=a["-b"][0];e.hgRebase(r,s)}else o()}},update:{regex:/^hg +(update|up)($|\s+)/,options:["-r"],delegate:function(e,t){return t.appendOptionR(),{vcs:"git",name:"checkout"}}},backout:{regex:/^hg +backout($|\s+)/,options:["-r"],delegate:function(e,t){return t.prependOptionR(),{vcs:"git",name:"revert"}}},histedit:{regex:/^hg +histedit($|\s+)/,delegate:function(e,t){var o=t.getGeneralArgs();return t.validateArgBounds(o,1,1),t.setOptionsMap({"-i":o}),t.setGeneralArgs([]),{vcs:"git",name:"rebase"}}},pull:{regex:/^hg +pull($|\s+)/,delegate:function(e,t){return{vcs:"git",name:"pull"}}},summary:{regex:/^hg +(summary|sum) *$/,delegate:function(e,t){return{vcs:"git",name:"branch"}}}});o.commandConfig=r},{"../git/commands":60,"../intl":67,"../util/errors":93}],75:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../git").Commit,r=e("../git").Branch,s=e("../git").Tag,c=e("../models/commandModel").Command,l=e("../util/constants").TIME,m=e("../intl"),u=a.Collection.extend({model:n}),d=a.Collection.extend({model:c}),h=a.Collection.extend({model:r}),p=a.Collection.extend({model:s}),g=a.Model.extend({defaults:{collection:null},initialize:function(e){e.collection.bind("add",this.addCommand,this),this.buffer=[],this.timeout=null},addCommand:function(e){this.buffer.push(e),this.touchBuffer()},touchBuffer:function(){this.timeout||this.setTimeout()},setTimeout:function(){this.timeout=setTimeout(function(){this.sipFromBuffer()}.bind(this),l.betweenCommandsDelay)},popAndProcess:function(){for(var e=this.buffer.shift(0);e.get("error")&&this.buffer.length;)e=this.buffer.shift(0);e.get("error")?this.clear():this.processCommand(e)},processCommand:function(t){t.set("status","processing");var o=i.defer();o.promise.then(function(){this.setTimeout()}.bind(this));var a=t.get("eventName");if(!a)throw new Error("I need an event to trigger when this guy is parsed and ready");var n=e("../app");if(!n.getEventBaton().getNumListeners(a)){var r=e("../util/errors");return t.set("error",new r.GitError({msg:m.str("error-command-currently-not-supported")})),void o.resolve()}n.getEventBaton().trigger(a,t,o)},clear:function(){clearTimeout(this.timeout),this.timeout=null},sipFromBuffer:function(){this.buffer.length?this.popAndProcess():this.clear()}});o.CommitCollection=u,o.CommandCollection=d,o.BranchCollection=h,o.TagCollection=p,o.CommandBuffer=g},{"../app":52,"../git":63,"../intl":67,"../models/commandModel":76,"../util/constants":90,"../util/errors":93,backbone:1,q:29}],76:[function(e,t,o){var i=e("backbone"),a=e("../util/errors"),n=e("../level/parseWaterfall").ParseWaterfall,r=e("../stores/LevelStore"),s=e("../intl"),c=a.CommandProcessError,l=a.GitError,m=a.Warning,u=a.CommandResult,d=i.Model.extend({defaults:{status:"inqueue",rawStr:null,result:"",createTime:null,error:null,warnings:null,parseWaterfall:new n,generalArgs:null,supportedMap:null,options:null,method:null},initialize:function(){this.initDefaults(),this.validateAtInit(),this.on("change:error",this.errorChanged,this),this.get("error")&&this.errorChanged(),this.parseOrCatch()},initDefaults:function(){this.set("generalArgs",[]),this.set("supportedMap",{}),this.set("warnings",[])},replaceDotWithHead:function(e){return e.replace(/\./g,"HEAD")},appendOptionR:function(){var e=this.getOptionsMap()["-r"]||[];this.setGeneralArgs(this.getGeneralArgs().concat(e))},prependOptionR:function(){var e=this.getOptionsMap()["-r"]||[];this.setGeneralArgs(e.concat(this.getGeneralArgs()))},mapDotToHead:function(){var e=this.getGeneralArgs(),t=this.getOptionsMap();e=e.map((function(e){return this.replaceDotWithHead(e)}),this);var o={};Object.keys(t).forEach((function(e){var i=t[e];o[e]=Object.values(i).map((function(e){return this.replaceDotWithHead(e)}),this)}),this),this.setGeneralArgs(e),this.setOptionsMap(o)},deleteOptions:function(e){var t=this.getOptionsMap();e.forEach((function(e){delete t[e]}),this),this.setOptionsMap(t)},getGeneralArgs:function(){return this.get("generalArgs")},setGeneralArgs:function(e){this.set("generalArgs",e)},setOptionsMap:function(e){this.set("supportedMap",e)},getOptionsMap:function(){return this.get("supportedMap")},acceptNoGeneralArgs:function(){if(this.getGeneralArgs().length)throw new l({msg:s.str("git-error-no-general-args")})},argImpliedHead:function(e,t,o,i){this.validateArgBounds(e,t,o,i),this.impliedHead(e,t)},oneArgImpliedHead:function(e,t){this.argImpliedHead(e,0,1,t)},twoArgsImpliedHead:function(e,t){this.argImpliedHead(e,1,2,t)},threeArgsImpliedHead:function(e,t){this.argImpliedHead(e,2,3,t)},oneArgImpliedOrigin:function(e){this.validateArgBounds(e,0,1),e.length||e.unshift("origin")},twoArgsForOrigin:function(e){this.validateArgBounds(e,0,2)},impliedHead:function(e,t){e.length==t&&e.push("HEAD")},validateArgBounds:function(e,t,o,i){var a=void 0===i?"git "+this.get("method"):this.get("method")+" "+i+" ";if(a="with "+a,e.lengtho)throw new l({msg:s.str("git-error-args-many",{upper:String(o),what:a})})},validateAtInit:function(){if(null===this.get("rawStr"))throw new Error("Give me a string!");this.get("createTime")||this.set("createTime",(new Date).toString())},setResult:function(e){this.set("result",e)},finishWith:function(e){this.set("status","finished"),e.resolve()},addWarning:function(e){this.get("warnings").push(e),this.set("numWarnings",this.get("numWarnings")?this.get("numWarnings")+1:1)},parseOrCatch:function(){this.expandShortcuts(this.get("rawStr"));try{this.processInstants()}catch(e){return a.filterError(e),void this.set("error",e)}this.parseAll()||this.set("error",new c({msg:s.str("git-error-command-not-supported",{command:this.get("rawStr")})}))},errorChanged:function(){var e=this.get("error");e&&(e instanceof c||e instanceof l?this.set("status","error"):e instanceof u?this.set("status","finished"):e instanceof m&&this.set("status","warning"),this.formatError())},formatError:function(){this.set("result",this.get("error").getMsg())},expandShortcuts:function(e){e=this.get("parseWaterfall").expandAllShortcuts(e),this.set("rawStr",e)},processInstants:function(){var e=this.get("rawStr");if(!e.length)throw new u({msg:""});this.get("parseWaterfall").processAllInstants(e)},parseAll:function(){var e=this.get("rawStr");const t=r.getAliasMap();for(var o=0;othis.clearOldCommands()),this)}componentWillUnmount(){for(var e=0;et.clientHeight||window.innerHeight","show commands","show solution","show goal"];throw new d({msg:t.join("\n")})}],[/^alias (\w+)="(.+)"$/,function(e){const t=e[1],o=e[2];throw l.addToAliasMap(t,o),new d({msg:'Set alias "'+t+'" to "'+o+'"'})}],[/^unalias (\w+)$/,function(e){const t=e[1];throw l.removeFromAliasMap(t),new d({msg:'Removed alias "'+t+'"'})}],[/^locale (\w+)$/,function(e){throw c.changeLocale(e[1]),new d({msg:a.str("locale-command",{locale:e[1]})})}],[/^flip$/,function(){throw u.changeFlipTreeY(!m.getFlipTreeY()),e("../app").getEvents().trigger("refreshTree"),new d({msg:a.str("flip-tree-command")})}],[/^disableLevelInstructions$/,function(){throw u.disableLevelInstructions(),new d({msg:a.todo("Level instructions disabled")})}],[/^refresh$/,function(){throw e("../app").getEvents().trigger("refreshTree"),new d({msg:a.str("refresh-tree-command")})}],[/^rollup (\d+)$/,function(t){throw e("../app").getEvents().trigger("rollupCommands",t[1]),new d({msg:"Commands combined!"})}],[/^echo "(.*?)"$|^echo (.*?)$/,function(e){var t=e[1]||e[2];throw new d({msg:t})}],[/^show +commands$/,function(e){var t=g(),o=n.commands.getOptionMap(),i={};Object.keys(o).forEach((function(e){var t=o[e];Object.keys(t).forEach((function(o){var a=t[o];a&&(i[e+" "+o]=Object.keys(a).filter((e=>e.length>1)))}))}));var r=[a.str("show-all-commands"),"
"];throw Object.keys(t).forEach((function(e){r.push(e),i[e]&&i[e].forEach((e=>r.push("    "+e)))})),new d({msg:r.join("\n")})}]],p={"reset solved":/^reset solved($|\s)/,help:/^help( +general)?$|^\?$/,reset:/^reset( +--forSolution)?$/,delay:/^delay (\d+)$/,clear:/^clear($|\s)/,"exit level":/^exit level($|\s)/,sandbox:/^sandbox($|\s)/,level:/^level\s?([a-zA-Z0-9]*)/,levels:/^levels($|\s)/,mobileAlert:/^mobile alert($|\s)/,"build level":/^build +level\s?([a-zA-Z0-9]*)$/,"export tree":/^export +tree$/,importTreeNow:/^importTreeNow($|\s)/,importLevelNow:/^importLevelNow($|\s)/,"import tree":/^import +tree$/,"import level":/^import +level$/,undo:/^undo($|\s)/,"share permalink":/^share( +permalink)?$/},g=function(){var t=Object.assign({},e("../level").regexMap,p),o=n.commands.getRegexMap();return Object.keys(o).forEach((function(e){var i=o[e];Object.keys(i).forEach((function(o){var a=i[o];t[e+" "+o]=a}))})),["mobileAlert"].forEach((function(e){delete t[e]})),t};o.getAllCommands=g,o.instantCommands=h,o.parse=i.genParseCommand(p,"processSandboxCommand"),o.getOptimisticLevelParse=function(){return i.genParseCommand(e("../level").regexMap,"processLevelCommand")},o.getOptimisticLevelBuilderParse=function(){return i.genParseCommand(e("../level/builder").regexMap,"processLevelBuilderCommand")}},{"../actions/GlobalStateActions":49,"../actions/LocaleActions":51,"../app":52,"../commands":53,"../intl":67,"../level":71,"../level/builder":69,"../stores/GlobalStateStore":87,"../stores/LevelStore":88,"../stores/LocaleStore":89,"../util":96,"../util/constants":90,"../util/errors":93}],85:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../util"),r=e("../intl"),s=e("../app"),c=e("../util/errors"),l=e("../visuals/visualization").Visualization,m=e("../level/parseWaterfall").ParseWaterfall,u=(e("../level/disabledMap").DisabledMap,e("../models/commandModel").Command),d=e("../git/gitShim").GitShim,h=e("../actions/LevelActions"),p=e("../stores/LevelStore"),g=e("../views"),f=(g.ModalTerminal,g.ModalAlert,e("../views/builderViews")),b=e("../views/multiView").MultiView,v=a.View.extend({tagName:"div",initialize:function(e){e=e||{},this.options=e,this.initVisualization(e),this.initCommandCollection(e),this.initParseWaterfall(e),this.initGitShim(e),this.initUndoStack(e),e.wait||this.takeControl()},getDefaultVisEl:function(){return $("#mainVisSpace")[0]},getAnimationTime:function(){return 1050},initVisualization:function(e){this.mainVis=new l({el:e.el||this.getDefaultVisEl()})},initUndoStack:function(e){this.undoStack=[]},initCommandCollection:function(e){this.commandCollection=s.getCommandUI().commandCollection},initParseWaterfall:function(e){this.parseWaterfall=new m},initGitShim:function(e){this.gitShim=new d({beforeCB:this.beforeCommandCB.bind(this),afterCB:this.afterCommandCB.bind(this)})},takeControl:function(){s.getEventBaton().stealBaton("commandSubmitted",this.commandSubmitted,this),s.getEventBaton().stealBaton("processSandboxCommand",this.processSandboxCommand,this),s.getEventBaton().stealBaton("levelExited",this.levelExited,this),this.insertGitShim()},releaseControl:function(){s.getEventBaton().releaseBaton("commandSubmitted",this.commandSubmitted,this),s.getEventBaton().releaseBaton("processSandboxCommand",this.processSandboxCommand,this),s.getEventBaton().releaseBaton("levelExited",this.levelExited,this),this.releaseGitShim()},releaseGitShim:function(){this.gitShim&&this.gitShim.removeShim()},insertGitShim:function(){this.gitShim&&this.mainVis.customEvents.on("gitEngineReady",(function(){this.gitShim.insertShim()}),this)},beforeCommandCB:function(e){this._treeBeforeCommand=this.mainVis.gitEngine.printTree()},afterCommandCB:function(e){this.pushUndo()},pushUndo:function(){this.mainVis.gitEngine.printTree()!==this._treeBeforeCommand&&this.undoStack.push(this._treeBeforeCommand)},undo:function(e,t){var o=this.undoStack.pop();if(!o)return e.set("error",new c.GitError({msg:r.str("undo-stack-empty")})),void t.resolve();this.mainVis.reset(o),setTimeout((function(){e.finishWith(t)}),this.mainVis.getAnimationTime())},commandSubmitted:function(e){s.getEvents().trigger("commandSubmittedPassive",e),n.splitTextCommand(e,(function(e){this.commandCollection.add(new u({rawStr:e,parseWaterfall:this.parseWaterfall}))}),this)},startLevel:function(t,o){var a=(t.get("regexResults")||[])[1]||"",n=p.getLevel(a);if(!n)return t.addWarning(r.str("level-no-id",{id:a})),s.getEventBaton().trigger("commandSubmitted","levels"),t.set("status","error"),void o.resolve();this.hide(),this.clear();var c=i.defer(),l=e("../level").Level;this.currentLevel=new l({level:n,deferred:c,command:t}),c.promise.then((function(){t.finishWith(o)}))},buildLevel:function(t,o){this.hide(),this.clear();var a=i.defer(),n=e("../level/builder").LevelBuilder,r=(t.get("regexResults")||[])[1]||!1;this.levelBuilder=new n({deferred:a,editLevel:r}),a.promise.then((function(){t.finishWith(o)}))},exitLevel:function(e,t){e.addWarning(r.str("level-cant-exit")),e.set("status","error"),t.resolve()},showLevels:function(e,t){var o=i.defer();s.getLevelDropdown().show(o,e),o.promise.done((function(){e.finishWith(t)}))},sharePermalink:function(e,t){var o=JSON.stringify(this.mainVis.gitEngine.exportTree()),i="https://learngitbranching.js.org/?NODEMO&command=importTreeNow%20"+escape(o);e.setResult(r.todo("Here is a link to the current state of the tree: ")+"\n"+i),e.finishWith(t)},resetSolved:function(e,t){if("reset solved --confirm"!==e.get("regexResults").input)return e.set("error",new c.GitError({msg:"Reset solved will mark each level as not yet solved; because this is a destructive command, please pass in --confirm to execute"})),void e.finishWith(t);h.resetLevelsSolved(),e.addWarning(r.str("solved-map-reset")),e.finishWith(t)},processSandboxCommand:function(e,t){var o={"reset solved":this.resetSolved,undo:this.undo,"help general":this.helpDialog,help:this.helpDialog,reset:this.reset,delay:this.delay,clear:this.clear,"exit level":this.exitLevel,level:this.startLevel,sandbox:this.exitLevel,levels:this.showLevels,mobileAlert:this.mobileAlert,"build level":this.buildLevel,"export tree":this.exportTree,"import tree":this.importTree,importTreeNow:this.importTreeNow,"import level":this.importLevel,importLevelNow:this.importLevelNow,"share permalink":this.sharePermalink}[e.get("method")];if(!o)throw new Error("no method for that wut");o.apply(this,[e,t])},hide:function(){this.mainVis.hide()},levelExited:function(){this.show()},show:function(){this.mainVis.show()},importLevelNow:function(t,o){var a=t.get("regexResults")||[];if(a.length<2)return t.set("error",new c.GitError({msg:r.str("git-error-options")})),void t.finishWith(o);var n=a.input.replace(/importLevelNow\s+/g,""),s=e("../level").Level;try{var l=JSON.parse(unescape(n)),m=i.defer();this.currentLevel=new s({level:l,deferred:m,command:t}),this.hide(),m.promise.then((function(){t.finishWith(o)}))}catch(e){throw t.set("error",new c.GitError({msg:"Something went wrong "+String(e)})),e}t.finishWith(o)},importTreeNow:function(e,t){var o=e.get("regexResults")||[];o.length<2&&(e.set("error",new c.GitError({msg:r.str("git-error-options")})),e.finishWith(t));var i=o.input.replace(/importTreeNow\s+/g,"");try{this.mainVis.gitEngine.loadTreeFromString(i)}catch(t){e.set("error",new c.GitError({msg:String(t)}))}e.finishWith(t)},importTree:function(e,t){new f.MarkdownPresenter({previewText:r.str("paste-json"),fillerText:" "}).deferred.promise.then(function(e){try{this.mainVis.gitEngine.loadTree(JSON.parse(e))}catch(e){this.mainVis.reset(),new b({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that JSON! Here is the error:","",String(e)]}}]})}}.bind(this)).fail((function(){})).done((function(){e.finishWith(t)}))},importLevel:function(t,o){new f.MarkdownPresenter({previewText:r.str("paste-json"),fillerText:" "}).deferred.promise.then(function(a){var n=e("../level").Level;try{var r=JSON.parse(a),s=i.defer();this.currentLevel=new n({level:r,deferred:s,command:t}),this.hide(),s.promise.then((function(){t.finishWith(o)}))}catch(e){new b({childViews:[{type:"ModalAlert",options:{markdowns:["## Error!","","Something is wrong with that level JSON, this happened:","",String(e)]}}]}),t.finishWith(o)}}.bind(this)).fail((function(){t.finishWith(o)})).done()},exportTree:function(e,t){var o=JSON.stringify(this.mainVis.gitEngine.exportTree(),null,2);new b({childViews:[{type:"MarkdownPresenter",options:{previewText:r.str("share-tree"),fillerText:o,noConfirmCancel:!0}}]}).getPromise().then((function(){e.finishWith(t)})).done()},clear:function(e,t){s.getEvents().trigger("clearOldCommands"),e&&t&&e.finishWith(t)},mobileAlert:function(e,t){alert(r.str("mobile-alert")),e.finishWith(t)},delay:function(e,t){var o=parseInt(e.get("regexResults")[1],10);setTimeout((function(){e.finishWith(t)}),o)},reset:function(e,t){this.mainVis.reset(),this.initUndoStack(),setTimeout((function(){e.finishWith(t)}),this.mainVis.getAnimationTime())},helpDialog:function(t,o){new b({childViews:r.getDialog(e("../dialogs/sandbox"))}).getPromise().then(function(){t.finishWith(o)}.bind(this)).done()}});o.Sandbox=v},{"../actions/LevelActions":50,"../app":52,"../dialogs/sandbox":58,"../git/gitShim":61,"../intl":67,"../level":71,"../level/builder":69,"../level/disabledMap":70,"../level/parseWaterfall":72,"../models/commandModel":76,"../stores/LevelStore":88,"../util":96,"../util/errors":93,"../views":106,"../views/builderViews":103,"../views/multiView":108,"../visuals/visualization":119,backbone:1,q:29}],86:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("../dispatcher/AppDispatcher"),n=e("events").EventEmitter,r=i.ActionTypes,s="lgb_CommandHistory",c=[];try{c=JSON.parse(localStorage.getItem(s)||"[]")||[]}catch(e){}var l=Object.assign({},n.prototype,i.StoreSubscribePrototype,{getMaxHistoryLength:function(){return 100},getCommandHistoryLength:function(){return c.length},getCommandHistory:function(){return c.slice(0)},dispatchToken:a.register((function(e){var t=e.action,o=!1;switch(t.type){case r.SUBMIT_COMMAND:c.unshift(String(t.text)),c.length>100&&(c=c.slice(0,10)),function(){try{localStorage.setItem(s,JSON.stringify(c))}catch(e){}}(),o=!0;case r.CHANGE_FLIP_TREE_Y:}o&&l.emit(i.CHANGE_EVENT)}))});t.exports=l},{"../constants/AppConstants":54,"../dispatcher/AppDispatcher":59,events:4}],87:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("../dispatcher/AppDispatcher"),n=e("events").EventEmitter,r=i.ActionTypes,s=!1,c=!1,l=0,m=!1,u=!1,d=Object.assign({},n.prototype,i.StoreSubscribePrototype,{getIsAnimating:function(){return s},getIsSolvingLevel:function(){return u},getFlipTreeY:function(){return c},getNumLevelsSolved:function(){return l},getShouldDisableLevelInstructions:function(){return m},dispatchToken:a.register((function(e){var t=e.action,o=!1;switch(t.type){case r.SET_IS_SOLVING_LEVEL:u=t.isSolvingLevel,o=!0;break;case r.CHANGE_IS_ANIMATING:s=t.isAnimating,o=!0;break;case r.CHANGE_FLIP_TREE_Y:c=t.flipTreeY,o=!0;break;case r.LEVEL_SOLVED:l++,o=!0;break;case r.DISABLE_LEVEL_INSTRUCTIONS:m=!0,o=!0}o&&d.emit(i.CHANGE_EVENT)}))});t.exports=d},{"../constants/AppConstants":54,"../dispatcher/AppDispatcher":59,events:4}],88:[function(e,t,o){"use strict";var i=e("../constants/AppConstants"),a=e("../dispatcher/AppDispatcher"),n=e("events").EventEmitter,r=e("../../levels").levelSequences,s=e("../../levels").sequenceInfo,c=e("../util"),l=i.ActionTypes,m="solvedMap",u="aliasMap",d={},h={},p=[];if(c.isBrowser())f=window.localStorage;else var g={},f={setItem:function(e,t){g[e]=t||""},getItem:function(e){return e in g?g[e]:null},removeItem:function(e){delete g[e]},get length(){return Object.keys(g).length},key:function(e){return Object.keys(g)[e]||null}};try{h=JSON.parse(f.getItem(m)||"{}")||{}}catch(e){console.warn("local storage failed",e)}function b(){try{f.setItem(m,JSON.stringify(h))}catch(e){console.warn("local storage failed on set",e)}}function v(){try{return JSON.parse(f.getItem(u)||"{}")||{}}catch(e){return{}}}Object.keys(r).forEach((function(e){var t=r[e];if(p.push(e),!t||!t.length)throw new Error("no empty sequences allowed");t.forEach((function(t,o){!function(e){e=e||{},["name","goalTreeString","solutionCommand"].forEach((function(t){if(void 0===e[t])throw console.log(e),new Error("I need this field for a level: "+t)}))}(t);var i=e+String(o+1),a=Object.assign({},t,{index:o,id:i,sequenceName:e});d[i]=a,r[e][o]=a}))}));var k=Object.assign({},n.prototype,i.StoreSubscribePrototype,{getAliasMap:v,addToAliasMap:function(e,t){const o=v();o[e]=t,f.setItem(u,JSON.stringify(o))},removeFromAliasMap:function(e){const t=v();delete t[e],f.setItem(u,JSON.stringify(t))},getSequenceToLevels:function(){return r},getSequences:function(){return Object.keys(r)},getLevelsInSequence:function(e){if(!r[e])throw new Error("that sequence name "+e+" does not exist");return r[e]},getSequenceInfo:function(e){return s[e]},getLevel:function(e){return d[e]},getNextLevel:function(e){if(!d[e])return console.warn("that level doesn't exist!!!"),null;var t=d[e],o=t.sequenceName,i=r[o],a=t.index+1;if(a":">",'"':""","'":"'","/":"/"};t.exports=function(e){return(""+e).replace(/[&<>"'\/]/g,(function(e){return i[e]}))}},{}],95:[function(e,t,o){function i(e){this.eventMap={},this.options=e||{}}i.prototype.stealBaton=function(e,t,o){if(!e)throw new Error("need name");if(!t)throw new Error("need func!");var i=this.eventMap[e]||[];i.push({func:t,context:o}),this.eventMap[e]=i},i.prototype.sliceOffArgs=function(e,t){for(var o=[],i=e;i0&&!e.length||t(e)}))},o.genParseCommand=function(e,t){return function(o){var i,a;return Object.keys(e).forEach((function(t){var n=e[t].exec(o);n&&(i=t,a=n)})),!!i&&{toSet:{eventName:t,method:i,regexResults:a}}}},o.readDirDeep=function(e){var t=[];return i(e).forEach((function(i){var r=n(e,i);a(r).isDirectory()?t.push(...o.readDirDeep(r)):t.push(r)})),t}},{"../util/constants":90,"../util/escapeString":94,fs:3,path:21}],97:[function(e,t,o){"use strict";t.exports=function(e){var t={};for(var o in e)e.hasOwnProperty(o)&&(t[o]=o);return t}},{}],98:[function(e,t,o){e("backbone");var i=e("../app"),a=function(e){return{37:"left",38:"up",39:"right",40:"down",27:"esc",13:"enter"}[e]};function n(e){this.events=e.events,this.aliasMap=e.aliasMap||{},e.wait||this.listen()}n.prototype.listen=function(){this.listening||(this.listening=!0,i.getEventBaton().stealBaton("docKeydown",this.keydown,this))},n.prototype.mute=function(){this.listening=!1,i.getEventBaton().releaseBaton("docKeydown",this.keydown,this)},n.prototype.keydown=function(e){var t=e.which||e.keyCode,o=a(t);void 0!==o&&this.fireEvent(o,e)},n.prototype.fireEvent=function(e,t){e=this.aliasMap[e]||e,this.events.trigger(e,t)},n.prototype.passEventBack=function(e){i.getEventBaton().passBatonBackSoft("docKeydown",this.keydown,this,[e])},o.KeyboardListener=n,o.mapKeycodeToKey=a},{"../app":52,backbone:1}],99:[function(e,t,o){o.mock=function(e){var t={},o=function(){};for(var i in e.prototype)t[i]=o;return t}},{}],100:[function(e,t,o){o.joinClasses=function(e){return e.join(" ")}},{}],101:[function(e,t,o){t.exports=function(e,t){var o=!1;return function(){o||(e.apply(this,arguments),o=!0,setTimeout((function(){o=!1}),t))}}},{}],102:[function(e,t,o){var i=!0;o.detectZoom=function(){return window.outerWidth&&window.innerWidth?window.outerWidth/window.innerWidth:(i&&(console.warn("Can't detect zoom level correctly :-/"),i=!1),1)}},{}],103:[function(e,t,o){var i=e("underscore"),a=e("q"),{marked:n}=e("marked"),r=e("../views"),s=e("../util/throttle"),c=r.ModalTerminal,l=r.ContainedBase,m=l.extend({tagName:"div",className:"textGrabber box vertical",template:i.template($("#text-grabber").html()),initialize:function(e){e=e||{},this.JSON={helperText:e.helperText||"Enter some text"},this.container=e.container||new c({title:"Enter some text"}),this.render(),e.initialText&&this.setText(e.initialText),e.wait||this.show()},getText:function(){return this.$("textarea").val()},setText:function(e){this.$("textarea").val(e)}}),u=l.extend({tagName:"div",className:"markdownGrabber box horizontal",template:i.template($("#markdown-grabber-view").html()),events:{"keyup textarea":"keyup"},initialize:function(e){if(e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj&&(e.fillerText=e.fromObj.options.markdowns.join("\n")),this.JSON={previewText:e.previewText||"Preview",fillerText:e.fillerText||"## Enter some markdown!\n\n\n"},this.container=e.container||new c({title:e.title||"Enter some markdown"}),this.render(),!e.withoutButton){var t=a.defer();t.promise.then(this.confirmed.bind(this)).fail(this.cancelled.bind(this)).done();new r.ConfirmCancelView({deferred:t,destination:this.getDestination()})}this.updatePreview(),e.wait||this.show()},confirmed:function(){this.die(),this.deferred.resolve(this.getRawText())},cancelled:function(){this.die(),this.deferred.resolve()},keyup:function(){this.throttledPreview||(this.throttledPreview=s(this.updatePreview.bind(this),500)),this.throttledPreview()},getRawText:function(){return this.$("textarea").val()},exportToArray:function(){return this.getRawText().split("\n")},getExportObj:function(){return{markdowns:this.exportToArray()}},updatePreview:function(){var e=this.getRawText(),t=n(e);this.$("div.insidePreview").html(t)}}),d=l.extend({tagName:"div",className:"markdownPresenter box vertical",template:i.template($("#markdown-presenter").html()),initialize:function(e){(e=e||{},this.deferred=e.deferred||a.defer(),this.JSON={previewText:e.previewText||"Here is something for you",fillerText:e.fillerText||"# Yay"},this.container=new c({title:"Check this out..."}),this.render(),e.noConfirmCancel)||new r.ConfirmCancelView({destination:this.getDestination()}).deferred.promise.then(function(){this.deferred.resolve(this.grabText())}.bind(this)).fail(function(){this.deferred.reject()}.bind(this)).done(this.die.bind(this));this.show()},grabText:function(){return this.$("textarea").val()}}),h=l.extend({tagName:"div",className:"demonstrationBuilder box vertical",template:i.template($("#demonstration-builder").html()),events:{"click .testButton":"testView"},initialize:function(e){if(e=e||{},this.deferred=e.deferred||a.defer(),e.fromObj){var t=e.fromObj.options;e=Object.assign({},e,t,{beforeMarkdown:t.beforeMarkdowns.join("\n"),afterMarkdown:t.afterMarkdowns.join("\n")})}this.JSON={},this.container=new c({title:"Demonstration Builder"}),this.render(),this.beforeMarkdownView=new u({container:this,withoutButton:!0,fillerText:e.beforeMarkdown,previewText:"Before demonstration Markdown"}),this.beforeCommandView=new m({container:this,helperText:"The git command(s) to set up the demonstration view (before it is displayed)",initialText:e.beforeCommand||"git checkout -b bugFix"}),this.commandView=new m({container:this,helperText:"The git command(s) to demonstrate to the reader",initialText:e.command||"git commit"}),this.afterMarkdownView=new u({container:this,withoutButton:!0,fillerText:e.afterMarkdown,previewText:"After demonstration Markdown"});var o=a.defer();new r.ConfirmCancelView({deferred:o,destination:this.getDestination()});o.promise.then(this.confirmed.bind(this)).fail(this.cancelled.bind(this)).done()},testView:function(){new(0,e("../views/multiView").MultiView)({childViews:[{type:"GitDemonstrationView",options:this.getExportObj()}]})},getExportObj:function(){return{beforeMarkdowns:this.beforeMarkdownView.exportToArray(),afterMarkdowns:this.afterMarkdownView.exportToArray(),command:this.commandView.getText(),beforeCommand:this.beforeCommandView.getText()}},confirmed:function(){this.die(),this.deferred.resolve(this.getExportObj())},cancelled:function(){this.die(),this.deferred.resolve()},getInsideElement:function(){return this.$(".insideBuilder")[0]}}),p=l.extend({tagName:"div",className:"multiViewBuilder box vertical",template:i.template($("#multi-view-builder").html()),typeToConstructor:{ModalAlert:u,GitDemonstrationView:h},events:{"click .deleteButton":"deleteOneView","click .testButton":"testOneView","click .editButton":"editOneView","click .testEntireView":"testEntireView","click .addView":"addView","click .saveView":"saveView","click .cancelView":"cancel"},initialize:function(e){e=e||{},this.deferred=e.deferred||a.defer(),this.multiViewJSON=e.multiViewJSON||{},this.JSON={views:this.getChildViews(),supportedViews:Object.keys(this.typeToConstructor)},this.container=new c({title:"Build a MultiView!"}),this.render(),this.show()},saveView:function(){this.hide(),this.deferred.resolve(this.multiViewJSON)},cancel:function(){this.hide(),this.deferred.resolve()},addView:function(e){var t=e.target,o=$(t).attr("data-type"),i=a.defer(),n=new(0,this.typeToConstructor[o])({deferred:i});i.promise.then(function(){var e={type:o,options:n.getExportObj()};this.addChildViewObj(e)}.bind(this)).fail((function(){})).done()},testOneView:function(t){var o=t.target,i=$(o).attr("data-index"),a=this.getChildViews()[i];new(0,e("../views/multiView").MultiView)({childViews:[a]})},testEntireView:function(){new(0,e("../views/multiView").MultiView)({childViews:this.getChildViews()})},editOneView:function(e){var t=e.target,o=$(t).attr("data-index"),i=$(t).attr("data-type"),n=a.defer(),r=new this.typeToConstructor[i]({deferred:n,fromObj:this.getChildViews()[o]});n.promise.then(function(){var e={type:i,options:r.getExportObj()},t=this.getChildViews();t[o]=e,this.setChildViews(t)}.bind(this)).fail((function(){})).done()},deleteOneView:function(e){var t=e.target,o=$(t).attr("data-index"),i=this.getChildViews(),a=i.slice(0,o).concat(i.slice(o+1));this.setChildViews(a),this.update()},addChildViewObj:function(e,t){var o=this.getChildViews();o.push(e),this.setChildViews(o),this.update()},setChildViews:function(e){this.multiViewJSON.childViews=e},getChildViews:function(){return this.multiViewJSON.childViews||[]},update:function(){this.JSON.views=this.getChildViews(),this.renderAgain()}});o.MarkdownGrabber=u,o.DemonstrationBuilder=h,o.TextGrabber=m,o.MultiViewBuilder=p,o.MarkdownPresenter=d},{"../util/throttle":101,"../views":106,"../views/multiView":108,marked:19,q:29,underscore:47}],104:[function(e,t,o){var i=e("backbone");const{getAllCommands:a}=e("../sandbox/commands");var n=e("../app"),r=e("../stores/CommandLineStore"),s=e("../actions/CommandLineActions"),c=e("../log"),l=e("../util/keyboard");const m=Object.keys(a()),u=["levels","help","show solution","reset","import level"],d=u.concat(m.map((e=>u.indexOf(e)>0?null:e)).filter((e=>!!e)));var h=i.View.extend({initialize:function(){n.getEvents().on("commandSubmittedPassive",this.addToCommandHistory,this),this.index=-1,this.commandParagraph=this.$("#prompt p.command")[0],this.focus(),n.getEvents().on("rollupCommands",this.rollupCommands,this),n.getEventBaton().stealBaton("keydown",this.onKeyDown,this),n.getEventBaton().stealBaton("keyup",this.onKeyUp,this),this.updatePrompt(" ")},events:{"blur #commandTextField":"hideCursor","focus #commandTextField":"showCursor"},blur:function(){this.hideCursor()},focus:function(){this.$("#commandTextField").focus(),this.showCursor()},hideCursor:function(){this.toggleCursor(!1)},showCursor:function(){this.toggleCursor(!0)},toggleCursor:function(e){$(this.commandParagraph).toggleClass("showCursor",e)},onKeyDown:function(e){var t=e.target;const o=document.querySelector("#shadow"),i=t.value,a=i.split(";"),n=a[a.length-1].replace(/\s\s+/g," ").replace(/^\s/,"");if(o.innerHTML="",n.length)for(const e of d)if(e.startsWith(n)){o.innerHTML=(i+e.replace(n,"")).replace(/ /g," ");break}9===e.keyCode&&(e.preventDefault(),o.innerHTML&&(t.value=o.innerHTML.replace(/ /g," "))),this.updatePrompt(t)},onKeyUp:function(e){this.onKeyDown(e);var t={enter:function(){this.submit()}.bind(this),up:function(){this.commandSelectChange(1)}.bind(this),down:function(){this.commandSelectChange(-1)}.bind(this)},o=l.mapKeycodeToKey(e.which||e.keyCode);void 0!==t[o]&&(e.preventDefault(),t[o](),this.onKeyDown(e))},badHtmlEncode:function(e){return e.replace(/&/g,"&").replace(/"+this.badHtmlEncode(a)+''+this.badHtmlEncode(r)+""+this.badHtmlEncode(s)+"";this.commandParagraph.innerHTML=c,n.getEvents().trigger("commandScrollDown")},commandSelectChange:function(e){if(this.index+=e,this.index>=r.getCommandHistoryLength()||this.index<0)return this.clear(),void(this.index=-1);var t=r.getCommandHistory()[this.index];this.setTextField(t)},setTextField:function(e){this.$("#commandTextField").val(e)},clear:function(){this.setTextField("")},submit:function(){var e=this.$("#commandTextField").val().replace("\n","");this.clear(),this.submitCommand(e),this.index=-1},rollupCommands:function(e){var t=r.getCommandHistory().slice(1,Number(e)+1);t.reverse();var o="";t.forEach((function(e){o+=e+";"}),this),s.submitCommand(o)},addToCommandHistory:function(e){(e.length&&-1===this.index||e.length&&-1!==this.index&&r.getCommandHistory()[this.index]!==e)&&(s.submitCommand(e),c.commandEntered(e))},submitCommand:function(e){n.getEventBaton().trigger("commandSubmitted",e)}});o.CommandPromptView=h},{"../actions/CommandLineActions":48,"../app":52,"../log":73,"../sandbox/commands":84,"../stores/CommandLineStore":86,"../util/keyboard":98,backbone:1}],105:[function(e,t,o){var i=e("underscore"),a=e("q"),n=e("backbone"),{marked:r}=e("marked"),s=e("../util"),c=e("../intl"),l=e("../util/keyboard").KeyboardListener,m=e("../models/commandModel").Command,u=e("../views").ModalTerminal,d=e("../views").ContainedBase,h=e("../visuals/visualization").Visualization,p=e("../git/headless"),g=d.extend({tagName:"div",className:"gitDemonstrationView box horizontal",template:i.template($("#git-demonstration-view").html()),events:{'click div.command > p.uiButton:not([target="reset"])':"positive",'click div.command > p.uiButton[target="reset"]':"onResetButtonClick"},initialize:function(e){e=e||{},this.options=e,this.JSON=Object.assign({beforeMarkdowns:["## Git Commits","","Awesome!"],command:"git commit",afterMarkdowns:["Now you have seen it in action","","Go ahead and try the level!"]},e);var t=function(e){return r(e.join("\n"))};this.JSON.beforeHTML=t(this.JSON.beforeMarkdowns),this.JSON.afterHTML=t(this.JSON.afterMarkdowns),this.container=new u({title:e.title||c.str("git-demonstration-title")}),this.render(),this.checkScroll(),this.navEvents=Object.assign({},n.Events),this.navEvents.on("positive",this.positive,this),this.navEvents.on("negative",this.negative,this),this.navEvents.on("onResetButtonClick",this.onResetButtonClick,this),this.keyboardListener=new l({events:this.navEvents,aliasMap:{enter:"positive",right:"positive",left:"negative"},wait:!0}),this.visFinished=!1,this.initVis(),e.wait||this.show()},receiveMetaNav:function(e,t){e.navEvents.on("positive",this.positive,this),this.metaContainerView=t},checkScroll:function(){this.$("div.demonstrationText").children().toArray().map((function(e){return e.clientHeight})).reduce((function(e,t){return e+t}))'+c.str("finish-dialog-finished")+" (ノ^_^)ノ (ノ^_^)ノ (ノ^_^)ノ

",t=Object.assign({},t,{markdown:a,_dangerouslyInsertHTML:o}),A.__super__.initialize.apply(this,[t])}}),_=n.View.extend({initialize:function(e){this.grabBatons(),this.modalAlert=new C({markdowns:this.markdowns}),this.modalAlert.show()},grabBatons:function(){s.getEventBaton().stealBaton(this.eventBatonName,this.batonFired,this)},releaseBatons:function(){s.getEventBaton().releaseBaton(this.eventBatonName,this.batonFired,this)},finish:function(){this.releaseBatons(),this.modalAlert.die()}}),D=_.extend({initialize:function(e){this.eventBatonName="windowSizeCheck",this.markdowns=["## That window size is not supported :-/","Please resize your window back to a supported size","","(and of course, pull requests to fix this are appreciated :D)"],D.__super__.initialize.apply(this,[e])},batonFired:function(e){e.w>l.VIEWPORT.minWidth&&e.h>l.VIEWPORT.minHeight&&this.finish()}}),x=_.extend({initialize:function(e){if(!e||!e.level)throw new Error("need level");this.eventBatonName="zoomChange",this.markdowns=["## That zoom level of "+e.level+" is not supported :-/","Please zoom back to a supported zoom level with Ctrl + and Ctrl -","","(and of course, pull requests to fix this are appreciated :D)"],x.__super__.initialize.apply(this,[e])},batonFired:function(e){e<=l.VIEWPORT.maxZoom&&e>=l.VIEWPORT.minZoom&&this.finish()}}),M=h.extend({tagName:"div",className:"canvasTerminalHolder box flex1",template:i.template($("#terminal-window-bare-template").html()),events:{"click div.wrapper":"onClick"},initialize:function(e){e=e||{},this.parent=e.parent,this.minHeight=e.minHeight||200,this.destination=$("body"),this.JSON={title:e.title||c.str("goal-to-reach"),text:e.text||c.str("hide-goal")},this.render(),this.inDom=!0,this.$terminal=this.$el.find(".terminal-window-holder").first(),this.$terminal.height(.8*$(window).height()),this.$terminal.draggable({cursor:"move",handle:".toolbar",containment:"#interfaceWrapper",scroll:!1}),$(window).on("resize",u(this.recalcLayout.bind(this),300)),e.additionalClass&&this.$el.addClass(e.additionalClass)},getAnimationTime:function(){return 700},onClick:function(){this.die()},die:function(){this.minimize(),this.inDom=!1,setTimeout(function(){this.tearDown()}.bind(this),this.getAnimationTime())},minimize:function(){this.parent.trigger("minimizeCanvas",{left:this.$terminal.css("left"),top:this.$terminal.css("top")},{width:this.$terminal.css("width"),height:this.$terminal.css("height")}),this.$terminal.animate({height:"0px",opacity:0},this.getAnimationTime())},restore:function(e,t){var o=this;e=e||{top:this.$terminal.css("top"),left:this.$terminal.css("left")},t=t||{width:this.$terminal.css("width"),height:this.$terminal.css("height")},this.$terminal.css({top:e.top,left:e.left,width:t.width,height:"0px",opacity:"0"}),this.$terminal.animate({height:t.height,opacity:1},this.getAnimationTime(),(function(){o.recalcLayout()}))},recalcLayout:function(){var e=this.parent,t=0,o=0,i=0,a=this.$terminal.outerWidth(),n=this.$terminal.outerHeight(),r=this.$terminal.offset().left,s=this.$terminal.offset().top,c=$(window).width()-(r+a),l=$(window).height()-(s+n),m=.75*$(window).height(),u=.95*$(window).height();s<0&&(o=-s),r<0&&(t=-r),c<0&&(t=c),l<0&&(o=l),nu&&(i=u-n),r=Math.max(r+t,0),s=Math.max(s+o,0),n=Math.max(n+i,m),this.$terminal.animate({right:c+"px",top:s+"px",height:n+"px"},this.getAnimationTime(),(function(){e.trigger("resizeCanvas")}))},getCanvasLocation:function(){return this.$("div.inside")[0]}});o.BaseView=h,o.GeneralButton=b,o.ModalView=w,o.ModalTerminal=y,o.ModalAlert=C,o.ContainedBase=f,o.ConfirmCancelView=v,o.LeftRightView=k,o.ZoomAlertWindow=x,o.ConfirmCancelTerminal=z,o.WindowSizeAlertWindow=D,o.CanvasTerminalHolder=M,o.NextLevelConfirm=A}).call(this)}).call(this,e("_process"))},{"../app":52,"../dialogs/nextLevel":57,"../intl":67,"../log":73,"../util/constants":90,"../util/debounce":91,"../util/keyboard":98,"../util/throttle":101,_process:22,backbone:1,marked:19,q:29,underscore:47}],107:[function(e,t,o){var i=e("underscore"),a=(e("q"),e("backbone")),n=e("../stores/LocaleStore"),r=e("../util"),s=e("../util/debounce"),c=e("../intl"),l=e("../log"),m=e("../util/keyboard").KeyboardListener,u=e("../app"),d=e("../stores/LevelStore"),h=e("../views").ModalTerminal,p=e("../views").ContainedBase,g=e("../views").BaseView,f=e("../../levels"),b=p.extend({tagName:"div",className:"levelDropdownView box vertical",template:i.template($("#level-dropdown-view").html()),events:{"click div.levelDropdownTab":"onTabClick"},initialize:function(e){e=e||{};var t=r.parseQueryString(window.location.href);this.JSON={selectedTab:t.defaultTab||"main",tabs:[{id:"main",name:c.str("main-levels-tab")},{id:"remote",name:c.str("remote-levels-tab")}]},this.navEvents=Object.assign({},a.Events),this.navEvents.on("clickedID",s(this.loadLevelID.bind(this),300,!0)),this.navEvents.on("negative",this.negative,this),this.navEvents.on("positive",this.positive,this),this.navEvents.on("left",this.left,this),this.navEvents.on("right",this.right,this),this.navEvents.on("up",this.up,this),this.navEvents.on("down",this.down,this),this.keyboardListener=new m({events:this.navEvents,aliasMap:{esc:"negative",enter:"positive"},wait:!0}),this.sequences=d.getSequences(),this.sequenceToLevels=d.getSequenceToLevels(),this.container=new h({title:c.str("select-a-level")});var o=this;n.subscribe((function(){o.render.apply(o)})),d.subscribe((function(){o.render()})),this.render(),e.wait||this.show()},render:function(){this.container.updateTitle(c.str("select-a-level")),this.updateTabNames([c.str("main-levels-tab"),c.str("remote-levels-tab")]),b.__super__.render.apply(this,arguments),this.buildSequences()},onTabClick:function(e){var t=e.target||e.srcElement,o=$(t).attr("data-id");o!==this.JSON.selectedTab&&(this.selectedTab=o,this.updateTabTo(o))},updateTabTo:function(e){this.JSON.selectedTab=e,this.render(),this.selectedID&&(this.selectedSequence=this.getSequencesOnTab()[0],this.selectedIndex=0,this.updateSelectedIcon())},updateTabNames:function(e){for(var t=0;t=o.length&&this.getTabIndex()+1=0?(this.switchToTabIndex(this.getTabIndex()-1),this.selectedIndex=0):this.selectedIndex=this.wrapIndex(this.selectedIndex+e,this.getCurrentSequence()),this.updateSelectedIcon()},right:function(){this.turnOnKeyboardSelection()||this.leftOrRight(1)},up:function(){this.turnOnKeyboardSelection()||(this.selectedSequence=this.getPreviousSequence(),this.downOrUp())},down:function(){this.turnOnKeyboardSelection()||(this.selectedSequence=this.getNextSequence(),this.downOrUp())},downOrUp:function(){this.selectedIndex=this.boundIndex(this.selectedIndex,this.getCurrentSequence()),this.deselectIconByID(this.selectedID),this.updateSelectedIcon()},turnOnKeyboardSelection:function(){return!this.selectedID&&(this.selectFirst(),!0)},turnOffKeyboardSelection:function(){this.selectedID&&(this.deselectIconByID(this.selectedID),this.selectedID=void 0,this.selectedIndex=void 0,this.selectedSequence=void 0)},getTabIndex:function(){return this.JSON.tabs.map((function(e){return e.id})).indexOf(this.JSON.selectedTab)},switchToTabIndex:function(e){var t=this.JSON.tabs[e].id;this.updateTabTo(t)},wrapIndex:function(e,t){return e=(e=e>=t.length?0:e)<0?t.length-1:e},boundIndex:function(e,t){return e=(e=e>=t.length?t.length-1:e)<0?0:e},getSequencesOnTab:function(){return this.sequences.filter((function(e){return f.getTabForSequence(e)===this.JSON.selectedTab}),this)},getNextSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e+1,this.getSequencesOnTab());return this.getSequencesOnTab()[t]},getPreviousSequence:function(){var e=this.getSequenceIndex(this.selectedSequence),t=this.wrapIndex(e-1,this.getSequencesOnTab());return this.getSequencesOnTab()[t]},getSequenceIndex:function(e){var t=this.getSequencesOnTab().indexOf(e);if(t<0)throw new Error("didnt find");return t},getIndexForID:function(e){return d.getLevel(e).index},selectFirst:function(){var e=this.sequenceToLevels[this.getSequencesOnTab()[0]][0].id;this.selectIconByID(e),this.selectedIndex=0,this.selectedSequence=this.getSequencesOnTab()[0]},getCurrentSequence:function(){return this.sequenceToLevels[this.selectedSequence]},getSelectedID:function(){return this.sequenceToLevels[this.selectedSequence][this.selectedIndex].id},selectIconByID:function(e){this.toggleIconSelect(e,!0)},deselectIconByID:function(e){this.toggleIconSelect(e,!1)},toggleIconSelect:function(e,t){this.selectedID=e,$("#levelIcon-"+e).toggleClass("selected",t),this.seriesViews.forEach((function(t){-1!==t.levelIDs.indexOf(e)&&t.updateAboutForLevelID(e)}),this)},negative:function(){this.hide()},testOption:function(e){return this.currentCommand&&new RegExp("--"+e).test(this.currentCommand.get("rawStr"))},show:function(e,t){this.currentCommand=t,this.updateSolvedStatus(),this.showDeferred=e,this.keyboardListener.listen(),b.__super__.show.apply(this)},hide:function(){this.showDeferred&&this.showDeferred.resolve(),this.showDeferred=void 0,this.keyboardListener.mute(),this.turnOffKeyboardSelection(),b.__super__.hide.apply(this)},loadLevelID:function(e){if(!this.testOption("noOutput")){u.getEventBaton().trigger("commandSubmitted","level "+e);var t=d.getLevel(e).name.en_US;l.levelSelected(t)}this.hide()},updateSolvedStatus:function(){this.seriesViews.forEach((function(e){e.updateSolvedStatus()}),this)},buildSequences:function(){this.seriesViews=[],this.getSequencesOnTab().forEach((function(e){this.seriesViews.push(new v({destination:this.$el,name:e,navEvents:this.navEvents}))}),this)}}),v=g.extend({tagName:"div",className:"seriesView box flex1 vertical",template:i.template($("#series-view").html()),events:{"click a.levelIcon":"click","mouseenter a.levelIcon":"enterIcon"},initialize:function(e){this.name=e.name||"intro",this.navEvents=e.navEvents,this.info=d.getSequenceInfo(this.name),this.levels=d.getLevelsInSequence(this.name),this.levelIDs=[];var t=null;this.levels.forEach((function(e){null===t&&(t=this.formatLevelAbout(e.id)),this.levelIDs.push(e.id)}),this),this.destination=e.destination,this.JSON={displayName:c.getIntlKey(this.info,"displayName"),about:c.getIntlKey(this.info,"about")||" ",levelInfo:t,ids:this.levelIDs},this.render(),this.updateSolvedStatus()},updateSolvedStatus:function(){this.$("a.levelIcon").each((function(e,t){var o=$(t).attr("data-id");$(t).toggleClass("solved",d.isLevelSolved(o))}))},getEventID:function(e){var t=e.target;return $(t).attr("data-id")},setAbout:function(e){this.$("p.levelInfo").text(e)},enterIcon:function(e){var t=this.getEventID(e);this.updateAboutForLevelID(t)},updateAboutForLevelID:function(e){this.setAbout(this.formatLevelAbout(e))},formatLevelAbout:function(e){var t=d.getLevel(e);return this.getLevelNumberFromID(e)+": "+c.getName(t)},getLevelNumberFromID:function(e){return e.replace(/[^0-9]/g,"")},click:function(e){var t=this.getEventID(e);this.navEvents.trigger("clickedID",t)}});o.LevelDropdownView=b},{"../../levels":121,"../app":52,"../intl":67,"../log":73,"../stores/LevelStore":88,"../stores/LocaleStore":89,"../util":96,"../util/debounce":91,"../util/keyboard":98,"../views":106,backbone:1,q:29,underscore:47}],108:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../views").LeftRightView,r=e("../views").ModalAlert,s=e("../views/gitDemonstrationView").GitDemonstrationView,c=e("../views/builderViews").MarkdownPresenter,l=e("../util/keyboard").KeyboardListener,m=e("../util/debounce"),u=a.View.extend({tagName:"div",className:"multiView",navEventDebounce:550,deathTime:700,typeToConstructor:{ModalAlert:r,GitDemonstrationView:s,MarkdownPresenter:c},initialize:function(e){e=e||{},this.childViewJSONs=e.childViews||[{type:"ModalAlert",options:{markdown:"Woah wtf!!"}},{type:"GitDemonstrationView",options:{command:"git checkout -b side; git commit; git commit"}},{type:"ModalAlert",options:{markdown:"Im second"}}],this.deferred=e.deferred||i.defer(),this.childViews=[],this.currentIndex=0,this.navEvents=Object.assign({},a.Events),this.navEvents.on("negative",this.getNegFunc(),this),this.navEvents.on("positive",this.getPosFunc(),this),this.navEvents.on("quit",this.finish,this),this.navEvents.on("exit",this.finish,this),this.keyboardListener=new l({events:this.navEvents,aliasMap:{left:"negative",right:"positive",enter:"positive",esc:"quit"}}),this.render(),e.wait||this.start()},onWindowFocus:function(){},getAnimationTime:function(){return 700},getPromise:function(){return this.deferred.promise},getPosFunc:function(){return m(function(){this.navForward()}.bind(this),this.navEventDebounce,!0)},getNegFunc:function(){return m(function(){this.navBackward()}.bind(this),this.navEventDebounce,!0)},lock:function(){this.locked=!0},unlock:function(){this.locked=!1},navForward:function(){if(!this.locked)return this.currentIndex===this.childViews.length-1?(this.hideViewIndex(this.currentIndex),void this.finish()):void this.navIndexChange(1)},navBackward:function(){0!==this.currentIndex&&this.navIndexChange(-1)},navIndexChange:function(e){this.hideViewIndex(this.currentIndex),this.currentIndex+=e,this.showViewIndex(this.currentIndex)},hideViewIndex:function(e){this.childViews[e].hide()},showViewIndex:function(e){this.childViews[e].show()},finish:function(){this.keyboardListener.mute(),this.childViews.forEach((function(e){e.die()})),this.deferred.resolve()},start:function(){this.showViewIndex(this.currentIndex)},createChildView:function(e){var t=e.type;if(!this.typeToConstructor[t])throw new Error('no constructor for type "'+t+'"');return new this.typeToConstructor[t](Object.assign({},e.options,{wait:!0}))},addNavToView:function(e,t){var o=new n({events:this.navEvents,destination:e.getDestination(),showLeft:0!==t,lastNav:t===this.childViewJSONs.length-1});e.receiveMetaNav&&e.receiveMetaNav(o,this)},render:function(){this.childViewJSONs.forEach((function(e,t){var o=this.createChildView(e);this.childViews.push(o),this.addNavToView(o,t)}),this)}});o.MultiView=u},{"../util/debounce":91,"../util/keyboard":98,"../views":106,"../views/builderViews":103,"../views/gitDemonstrationView":105,backbone:1,q:29}],109:[function(e,t,o){e("../util/errors").GitError;var i=e("underscore"),a=e("q"),n=e("backbone"),r=e("../views").ModalTerminal,s=e("../views").ContainedBase,c=e("../views").ConfirmCancelView,l=e("../intl");e("jquery-ui/ui/widget"),e("jquery-ui/ui/scroll-parent"),e("jquery-ui/ui/data"),e("jquery-ui/ui/widgets/mouse"),e("jquery-ui/ui/ie"),e("jquery-ui/ui/widgets/sortable"),e("jquery-ui/ui/plugin"),e("jquery-ui/ui/safe-active-element"),e("jquery-ui/ui/safe-blur"),e("jquery-ui/ui/widgets/draggable");var m=s.extend({tagName:"div",template:i.template($("#interactive-rebase-template").html()),initialize:function(e){this.deferred=e.deferred,this.rebaseMap={},this.entryObjMap={},this.options=e,this.rebaseEntries=new d,e.toRebase.reverse(),e.toRebase.forEach((function(e){var t=e.get("id");this.rebaseMap[t]=e,this.entryObjMap[t]=new u({id:t}),this.rebaseEntries.add(this.entryObjMap[t])}),this),this.container=new r({title:l.str("interactive-rebase-title")}),this.render(),this.show(),e.aboveAll&&$("#canvasHolder").css("display","none")},restoreVis:function(){$("#canvasHolder").css("display","inherit")},confirm:function(){this.die(),this.options.aboveAll&&this.restoreVis();var e=[];this.$("ul.rebaseEntries li").each((function(t,o){e.push(o.id)}));var t=[];e.forEach((function(e){this.entryObjMap[e].get("pick")&&t.unshift(this.rebaseMap[e])}),this),t.reverse(),this.deferred.resolve(t),this.$el.html("")},render:function(){var e={num:Object.keys(this.rebaseMap).length,solutionOrder:this.options.initialCommitOrdering},t=this.container.getInsideElement();this.$el.html(this.template(e)),$(t).append(this.el);var o=this.$("ul.rebaseEntries");this.rebaseEntries.each((function(e){new h({el:o,model:e})}),this),o.sortable({axis:"y",placeholder:"rebaseEntry transitionOpacity ui-state-highlight",appendTo:"parent"}),this.makeButtons()},cancel:function(){this.hide(),this.options.aboveAll&&this.restoreVis(),this.deferred.resolve([])},makeButtons:function(){var e=a.defer();e.promise.then(function(){this.confirm()}.bind(this)).fail(function(){this.cancel()}.bind(this)).done(),new c({destination:this.$(".confirmCancel"),deferred:e,disableCancelButton:!!this.options.aboveAll})}}),u=n.Model.extend({defaults:{pick:!0},toggle:function(){this.set("pick",!this.get("pick"))}}),d=n.Collection.extend({model:u}),h=n.View.extend({tagName:"li",template:i.template($("#interactive-rebase-entry-template").html()),toggle:function(){this.model.toggle(),this.listEntry.toggleClass("notPicked",!this.model.get("pick"))},initialize:function(e){this.render()},render:function(){this.$el.append(this.template(this.model.toJSON())),this.listEntry=this.$el.children(":last"),this.listEntry.delegate("#toggleButton","click",function(){this.toggle()}.bind(this))}});o.InteractiveRebaseView=m},{"../intl":67,"../util/errors":93,"../views":106,backbone:1,"jquery-ui/ui/data":8,"jquery-ui/ui/ie":9,"jquery-ui/ui/plugin":10,"jquery-ui/ui/safe-active-element":11,"jquery-ui/ui/safe-blur":12,"jquery-ui/ui/scroll-parent":13,"jquery-ui/ui/widget":14,"jquery-ui/ui/widgets/draggable":15,"jquery-ui/ui/widgets/mouse":16,"jquery-ui/ui/widgets/sortable":17,q:29,underscore:47}],110:[function(e,t,o){e("backbone");var i=e("q"),a=e("./index").Animation,n=e("./index").PromiseAnimation,r=e("../../util/constants").GRAPHICS,s={},c=function(e,t){var o=1*r.defaultAnimationTime,i=2*o;return{animation:function(){e.refreshTree(o),t.setBirth(),t.parentInFront(),e.visBranchesFront(),t.animateUpdatedPosition(i,"bounce"),t.animateOutgoingEdges(o)},duration:Math.max(o,i)}};s.genCommitBirthAnimation=function(e,t,o){if(!e)throw new Error("Need animation queue to add closure to!");var i=t.get("visNode"),n=c(o,i);e.add(new a({closure:n.animation,duration:n.duration}))},s.genCommitBirthPromiseAnimation=function(e,t){var o=e.get("visNode");return new n(c(t,o))},s.highlightEachWithPromise=function(e,t,o){return t.forEach(function(t){e=e.then(function(){return this.playHighlightPromiseAnimation(t,o)}.bind(this))}.bind(this)),e},s.playCommitBirthPromiseAnimation=function(e,t){var o=this.genCommitBirthPromiseAnimation(e,t);return o.play(),o.getPromise()},s.playRefreshAnimationAndFinish=function(e,t){var o=new n({closure:function(){e.refreshTree()}});o.play(),t.thenFinish(o.getPromise())},s.genRefreshPromiseAnimation=function(e){return new n({closure:function(){e.refreshTree()}})},s.playRefreshAnimationSlow=function(e){var t=r.defaultAnimationTime;return this.playRefreshAnimation(e,2*t)},s.playRefreshAnimation=function(e,t){var o=new n({duration:t,closure:function(){e.refreshTree(t)}});return o.play(),o.getPromise()},s.refreshTree=function(e,t){e.add(new a({closure:function(){t.refreshTree()}}))},s.genHighlightPromiseAnimation=function(e,t){var o=t.get("visBranch")||t.get("visNode")||t.get("visTag");if(!o)throw console.log(t),new Error("could not find vis object for dest obj");var i=e.get("visNode");return new n(function(e,t){var o=.66*r.defaultAnimationTime*2;return{animation:function(){e.highlightTo(t,o,"easeInOut")},duration:1.5*o}}(i,o))},s.playHighlightPromiseAnimation=function(e,t){var o=this.genHighlightPromiseAnimation(e,t);return o.play(),o.getPromise()},s.getDelayedPromise=function(e){var t=i.defer();return setTimeout(t.resolve,e||1e3),t.promise},s.delay=function(e,t){t=t||r.defaultAnimationTime,e.add(new a({closure:function(){},duration:t}))},o.AnimationFactory=s},{"../../util/constants":90,"./index":111,backbone:1,q:29}],111:[function(e,t,o){var i=e("q"),a=e("backbone"),n=e("../../actions/GlobalStateActions"),r=e("../../util/constants").GRAPHICS,s=a.Model.extend({defaults:{duration:r.defaultAnimationTime,closure:null},validateAtInit:function(){if(!this.get("closure"))throw new Error("give me a closure!")},initialize:function(e){this.validateAtInit()},run:function(){this.get("closure")()}}),c=a.Model.extend({defaults:{animations:null,index:0,callback:null,defer:!1,promiseBased:!1},initialize:function(e){this.set("animations",[]),e.callback||console.warn("no callback")},thenFinish:function(e,t){e.then(function(){this.finish()}.bind(this)),e.fail((function(e){throw console.log("uncaught error",e),e})),this.set("promiseBased",!0),t&&t.resolve()},add:function(e){if(!(e instanceof s))throw new Error("Need animation not something else");this.get("animations").push(e)},start:function(){this.set("index",0),n.changeIsAnimating(!0),this.next()},finish:function(){n.changeIsAnimating(!1),this.get("callback")()},next:function(){var e=this.get("animations"),t=this.get("index");if(t>=e.length)this.finish();else{var o=e[t],i=o.get("duration");o.run(),this.set("index",t+1),setTimeout(function(){this.next()}.bind(this),i)}}}),l=a.Model.extend({defaults:{deferred:null,closure:null,duration:r.defaultAnimationTime},initialize:function(e){if(!e.closure&&!e.animation)throw new Error("need closure or animation");this.set("closure",e.closure||e.animation),this.set("duration",e.duration||this.get("duration")),this.set("deferred",e.deferred||i.defer())},getPromise:function(){return this.get("deferred").promise},play:function(){this.get("closure")(),setTimeout(function(){this.get("deferred").resolve()}.bind(this),this.get("duration"))},then:function(e){return this.get("deferred").promise.then(e)}});l.fromAnimation=function(e){return new l({closure:e.get("closure"),duration:e.get("duration")})},o.Animation=s,o.PromiseAnimation=l,o.AnimationQueue=c},{"../../actions/GlobalStateActions":49,"../../util/constants":90,backbone:1,q:29}],112:[function(e,t,o){var i=e("q"),a=e("../intl"),n=e("../util/constants").GRAPHICS,r=e("../util/debounce"),s=e("../stores/GlobalStateStore"),c=e("../visuals/visNode").VisNode,l=e("../visuals/visBranch").VisBranch,m=e("../visuals/visBranch").VisBranchCollection,u=e("../visuals/visTag").VisTag,d=e("../visuals/visTag").VisTagCollection,h=e("../visuals/visEdge").VisEdge,p=e("../visuals/visEdge").VisEdgeCollection;function g(t){t=t||{},this.options=t,this.visualization=t.visualization,this.commitCollection=t.commitCollection,this.branchCollection=t.branchCollection,this.tagCollection=t.tagCollection,this.visNodeMap={},this.visEdgeCollection=new p,this.visBranchCollection=new m,this.visTagCollection=new d,this.commitMap={},this.rootCommit=null,this.branchStackMap=null,this.tagStackMap=null,this.upstreamBranchSet=null,this.upstreamTagSet=null,this.upstreamHeadSet=null,this.paper=t.paper,this.gitReady=!1,this.branchCollection.on("add",this.addBranchFromEvent,this),this.branchCollection.on("remove",this.removeBranch,this),this.tagCollection.on("add",this.addTagFromEvent,this),this.tagCollection.on("remove",this.removeTag,this),this.deferred=[],this.flipFraction=.65;var o=e("../app"),i=this;this._onRefreshTree=function(){i.refreshTree()},o.getEvents().on("refreshTree",this._onRefreshTree,this)}g.prototype.defer=function(e){this.deferred.push(e)},g.prototype.deferFlush=function(){this.deferred.forEach((function(e){e()}),this),this.deferred=[]},g.prototype.resetAll=function(){this.visEdgeCollection.toArray().forEach((function(e){e.remove()}),this),this.visBranchCollection.toArray().forEach((function(e){e.remove()}),this),this.visTagCollection.toArray().forEach((function(e){e.remove()}),this),Object.values(this.visNodeMap).forEach((function(e){e.remove()}),this),this.visEdgeCollection.reset(),this.visBranchCollection.reset(),this.visTagCollection.reset(),this.visNodeMap={},this.rootCommit=null,this.commitMap={}},g.prototype.tearDown=function(){this.resetAll(),this.paper.remove(),e("../app").getEvents().removeListener("refreshTree",this._onRefreshTree)},g.prototype.assignGitEngine=function(e){this.gitEngine=e,this.initHeadBranch(),this.deferFlush()},g.prototype.getVisualization=function(){return this.visualization},g.prototype.initHeadBranch=function(){this.addBranchFromEvent(this.gitEngine.HEAD)},g.prototype.getScreenPadding=function(){var e=s.getFlipTreeY()?3:1.5;return{widthPadding:1.5*n.nodeRadius,topHeightPadding:n.nodeRadius*e,bottomHeightPadding:5*n.nodeRadius}},g.prototype.getPosBoundaries=function(){return this.gitEngine.hasOrigin()?{min:0,max:.5}:this.gitEngine.isOrigin()?{min:.5,max:1}:{min:0,max:1}},g.prototype.getFlipPos=function(){var e=this.getPosBoundaries(),t=e.min,o=e.max;return this.flipFraction*(o-t)+t},g.prototype.getIsGoalVis=function(){return!!this.options.isGoalVis},g.prototype.getLevelBlob=function(){return this.visualization.options.levelBlob||{}},g.prototype.toScreenCoords=function(e){if(!this.paper.width)throw new Error("being called too early for screen coords");var t,o,i,a,n=this.getScreenPadding(),r=function(e,t,o){return o+e*(t-2*o)}(e.x,this.paper.width,n.widthPadding),c=(t=e.y,o=this.paper.height,i=n.topHeightPadding,a=n.bottomHeightPadding,i+t*(o-a-i));return s.getFlipTreeY()&&(c=this.paper.height-c),{x:r,y:c}},g.prototype.animateAllAttrKeys=function(e,t,o,a){var r=i.defer(),s=function(i){i.animateAttrKeys(e,t,o,a)};this.visBranchCollection.each(s),this.visEdgeCollection.each(s),this.visTagCollection.each(s),Object.values(this.visNodeMap).forEach(s);var c=void 0!==o?o:n.defaultAnimationTime;return setTimeout((function(){r.resolve()}),c),r.promise},g.prototype.finishAnimation=function(e){if(!(e=e||1))throw new Error("need speed by time i finish animation "+e);var t=i.defer(),o=i.defer(),r=n.defaultAnimationTime,s=n.nodeRadius,c=a.str("solved-level"),l=null,m=function(){(l=this.paper.text(this.paper.width/2,this.paper.height/2,c)).attr({opacity:0,"font-weight":500,"font-size":"32pt","font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",stroke:"#000","stroke-width":2,fill:"#000"}),l.animate({opacity:1},r)}.bind(this);return t.promise.then(function(){return this.animateAllAttrKeys({exclude:["circle"]},{opacity:0},1.1*r/e)}.bind(this)).then(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:2*s},1.5*r/e)}.bind(this)).then(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{r:.75*s},.5*r/e)}.bind(this)).then(function(){return m(),this.explodeNodes(e)}.bind(this)).then(function(){return this.explodeNodes(e)}.bind(this)).then(function(){return this.animateAllAttrKeys({exclude:["arrow","rect","path","text"]},{},1.25*r)}.bind(this)).then(function(){return l.animate({opacity:0},r,void 0,void 0,(function(){l.remove()})),this.animateAllAttrKeys({},{})}.bind(this)).then((function(){o.resolve()})).fail((function(e){console.warn("animation error "+e)})).done(),t.resolve(),o.promise},g.prototype.explodeNodes=function(e){var t=i.defer(),o=[];Object.values(this.visNodeMap).forEach((function(t){o.push(t.getExplodeStepFunc(e))}));var a=setInterval((function(){var e=[];if(o.forEach((function(t){t()&&e.push(t)})),!e.length)return clearInterval(a),void t.resolve();o=e}),1/40);return t.promise},g.prototype.animateAllFromAttrToAttr=function(e,t,o){var i=function(i){var a=i.getID();o.includes(a)||e[a]&&t[a]&&i.animateFromAttrToAttr(e[a],t[a])};this.visBranchCollection.each(i),this.visEdgeCollection.each(i),this.visTagCollection.each(i),Object.values(this.visNodeMap).forEach(i)},g.prototype.genSnapshot=function(){this.fullCalc();var e={};return Object.values(this.visNodeMap).forEach((function(t){e[t.get("id")]=t.getAttributes()}),this),this.visBranchCollection.each((function(t){e[t.getID()]=t.getAttributes()}),this),this.visEdgeCollection.each((function(t){e[t.getID()]=t.getAttributes()}),this),this.visTagCollection.each((function(t){e[t.getID()]=t.getAttributes()}),this),e},g.prototype.refreshTree=function(e){this.gitReady&&this.gitEngine.rootCommit&&(this.fullCalc(),this.animateAll(e))},g.prototype.refreshTreeHarsh=function(){this.fullCalc(),this.animateAll(0)},g.prototype.animateAll=function(e){this.zIndexReflow(),this.animateEdges(e),this.animateNodePositions(e),this.animateRefs(e)},g.prototype.fullCalc=function(){this.calcTreeCoords(),this.calcGraphicsCoords()},g.prototype.calcTreeCoords=function(){if(!this.rootCommit)throw new Error("grr, no root commit!");this.calcUpstreamSets(),this.calcBranchStacks(),this.calcTagStacks(),this.calcDepth(),this.calcWidth()},g.prototype.calcGraphicsCoords=function(){this.visBranchCollection.each((function(e){e.updateName()})),this.visTagCollection.each((function(e){e.updateName()}))},g.prototype.calcUpstreamSets=function(){this.upstreamBranchSet=this.gitEngine.getUpstreamBranchSet(),this.upstreamHeadSet=this.gitEngine.getUpstreamHeadSet(),this.upstreamTagSet=this.gitEngine.getUpstreamTagSet()},g.prototype.getCommitUpstreamBranches=function(e){return this.branchStackMap[e.get("id")]},g.prototype.getBlendedHuesForCommit=function(e){var t=this.upstreamBranchSet[e.get("id")];if(!t)throw new Error("that commit doesn't have upstream branches!");return this.blendHuesFromBranchStack(t)},g.prototype.blendHuesFromBranchStack=function(e){var t=[];return e.forEach((function(e){var o=e.obj.get("visBranch").get("fill");if("hsb"!==o.slice(0,3)){var i=Raphael.color(o);o=(o="hsb("+String(i.h)+","+String(i.l))+","+String(i.s)+")"}t.push(o)})),function(e){var t=0,o=0,i=0,a=0,n=e.length;e.forEach((function(e){var n=e.split("(")[1];n=(n=n.split(")")[0]).split(","),i+=parseFloat(n[1]),a+=parseFloat(n[2]);var r=parseFloat(n[0])*Math.PI*2;t+=Math.cos(r),o+=Math.sin(r)})),t/=n,o/=n,i/=n,a/=n;var r=Math.atan2(o,t)/(2*Math.PI);r<0&&(r+=1);return"hsb("+String(r)+","+String(i)+","+String(a)+")"}(t)},g.prototype.getCommitUpstreamStatus=function(e){if(!this.upstreamBranchSet)throw new Error("Can't calculate this yet!");var t=e.get("id"),o=this.upstreamBranchSet,i=this.upstreamHeadSet,a=this.upstreamTagSet;return o[t]?"branch":a[t]?"tag":i[t]?"head":"none"},g.prototype.calcTagStacks=function(){var e=this.gitEngine.getTags(),t={};e.forEach((function(e){var o=e.target.get("id");t[o]=t[o]||[],t[o].push(e),t[o].sort((function(e,t){var o=e.obj.get("id"),i=t.obj.get("id");return o.localeCompare(i)}))})),this.tagStackMap=t},g.prototype.calcBranchStacks=function(){var e=this.gitEngine.getBranches(),t={};e.forEach((function(e){var o=e.target.get("id");t[o]=t[o]||[],t[o].push(e),t[o].sort((function(e,t){var o=e.obj.get("id"),i=t.obj.get("id");return"main"==o||"main"==i?"main"==o?-1:1:o.localeCompare(i)}))})),this.branchStackMap=t},g.prototype.calcWidth=function(){this.maxWidthRecursive(this.rootCommit);var e=this.getPosBoundaries();this.assignBoundsRecursive(this.rootCommit,e.min,e.max)},g.prototype.maxWidthRecursive=function(e){var t=0;e.get("children").forEach((function(o){if(o.isMainParent(e)){var i=this.maxWidthRecursive(o);t+=i}}),this);var o=Math.max(1,t);return e.get("visNode").set("maxWidth",o),o},g.prototype.assignBoundsRecursive=function(e,t,o){var i=(o+t)/2;if(e.get("visNode").get("pos").x=i,0!==e.get("children").length){var a=o-t,n=0,r=e.get("children");r.forEach((function(t){t.isMainParent(e)&&(n+=t.get("visNode").getMaxWidthScaled())}),this);var s=t;r.forEach((function(t,o){if(t.isMainParent(e)){var i=t.get("visNode").getMaxWidthScaled()/n*a,r=s,c=r+i;this.assignBoundsRecursive(t,r,c),s=r+i}}),this)}},g.prototype.calcDepth=function(){var e=this.calcDepthRecursive(this.rootCommit,0);e>15&&console.warn("graphics are degrading from too many layers");var t=this.getDepthIncrement(e);Object.values(this.visNodeMap).forEach((function(e){e.setDepthBasedOn(t,this.getHeaderOffset())}),this)},g.prototype.animateNodePositions=function(e){Object.values(this.visNodeMap).forEach((function(t){t.animateUpdatedPosition(e)}),this)},g.prototype.addBranchFromEvent=function(e,t,o){var i=function(){this.addBranch(e)}.bind(this);this.gitEngine&&this.gitReady?i():this.defer(i)},g.prototype.addBranch=function(e){var t=new l({branch:e,gitVisuals:this,gitEngine:this.gitEngine});this.visBranchCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(function(){t.genGraphics(this.paper)}.bind(this))},g.prototype.addTagFromEvent=function(e,t,o){var i=function(){this.addTag(e)}.bind(this);this.gitEngine&&this.gitReady?i():this.defer(i)},g.prototype.removeTag=function(e,t,o){var i=function(){var t;this.visTagCollection.each((function(o){o.get("tag")==e&&(t=o)}),!0),t.remove(),this.removeVisTag(t)}.bind(this);this.gitEngine&&this.gitReady?i():this.defer(i)},g.prototype.addTag=function(e){var t=new u({tag:e,gitVisuals:this,gitEngine:this.gitEngine});this.visTagCollection.add(t),this.gitReady?t.genGraphics(this.paper):this.defer(function(){t.genGraphics(this.paper)}.bind(this))},g.prototype.removeVisBranch=function(e){this.visBranchCollection.remove(e)},g.prototype.removeVisTag=function(e){this.visTagCollection.remove(e)},g.prototype.removeVisNode=function(e){delete this.visNodeMap[e.getID()]},g.prototype.removeVisEdge=function(e){this.visEdgeCollection.remove(e)},g.prototype.animateRefs=function(e){this.visBranchCollection.each((function(t){t.animateUpdatedPos(e)}),this),this.visTagCollection.each((function(t){t.animateUpdatedPos(e)}),this)},g.prototype.animateEdges=function(e){this.visEdgeCollection.each((function(t){t.animateUpdatedPath(e)}),this)},g.prototype.getMinLayers=function(){return this.options.smallCanvas?2:7},g.prototype.getDepthIncrement=function(e){return e=Math.max(e,this.getMinLayers()),(1-this.getHeaderOffset())/e},g.prototype.shouldHaveHeader=function(){return this.gitEngine.isOrigin()||this.gitEngine.hasOrigin()},g.prototype.getHeaderOffset=function(){return this.shouldHaveHeader()?.05:0},g.prototype.calcDepthRecursive=function(e,t){e.get("visNode").setDepth(t);var o=e.get("children"),i=t;return o.forEach((function(e){var o=this.calcDepthRecursive(e,t+1);i=Math.max(o,i)}),this),i},g.prototype.canvasResize=function(e,t){this.resizeFunc||this.genResizeFunc(),this.resizeFunc(e,t)},g.prototype.genResizeFunc=function(){this.resizeFunc=r(function(e,t){this.refreshTree()}.bind(this),200,!0)},g.prototype.addNode=function(e,t){this.commitMap[e]=t,t.get("rootCommit")&&(this.rootCommit=t);var o=new c({id:e,commit:t,gitVisuals:this,gitEngine:this.gitEngine});return this.visNodeMap[e]=o,this.gitReady&&o.genGraphics(this.paper),o},g.prototype.addEdge=function(e,t){var o=this.visNodeMap[e],i=this.visNodeMap[t];if(!o||!i)throw new Error("one of the ids in ("+e+", "+t+") does not exist");var a=new h({tail:o,head:i,gitVisuals:this,gitEngine:this.gitEngine});this.visEdgeCollection.add(a),this.gitReady&&a.genGraphics(this.paper)},g.prototype.zIndexReflow=function(){this.visNodesFront(),this.visBranchesFront(),this.visTagsFront()},g.prototype.visNodesFront=function(){Object.values(this.visNodeMap).forEach((function(e){e.toFront()}))},g.prototype.visBranchesFront=function(){this.visBranchCollection.each((function(e){e.nonTextToFront(),e.textToFront()})),this.visBranchCollection.each((function(e){e.textToFrontIfInStack()}))},g.prototype.visTagsFront=function(){this.visTagCollection.each((function(e){e.nonTextToFront(),e.textToFront()})),this.visTagCollection.each((function(e){e.textToFrontIfInStack()}))},g.prototype.drawTreeFromReload=function(){this.gitReady=!0,this.deferFlush(),this.calcTreeCoords()},g.prototype.drawTreeFirstTime=function(){this.gitReady=!0,this.calcTreeCoords(),Object.values(this.visNodeMap).forEach((function(e){e.genGraphics(this.paper)}),this),this.visEdgeCollection.each((function(e){e.genGraphics(this.paper)}),this),this.visBranchCollection.each((function(e){e.genGraphics(this.paper)}),this),this.visTagCollection.each((function(e){e.genGraphics(this.paper)}),this),this.zIndexReflow()},o.GitVisuals=g},{"../app":52,"../intl":67,"../stores/GlobalStateStore":87,"../util/constants":90,"../util/debounce":91,"../visuals/visBranch":115,"../visuals/visEdge":116,"../visuals/visNode":117,"../visuals/visTag":118,q:29}],113:[function(e,t,o){var i=e("backbone").Model.extend({removeKeys:function(e){e.forEach((function(e){this.get(e)&&this.get(e).remove()}),this)},animateAttrKeys:function(e,t,o,i){e=Object.assign({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var a=this.getAttributes();e.include.forEach((function(e){a[e]=Object.assign({},a[e],t)})),e.exclude.forEach((function(e){delete a[e]})),this.animateToAttr(a,o,i)}});o.VisBase=i},{backbone:1}],114:[function(e,t,o){var i=e("backbone").Model.extend({removeKeys:function(e){e.forEach((function(e){this.get(e)&&this.get(e).remove()}),this)},getNonAnimateKeys:function(){return["stroke-dasharray"]},getIsInOrigin:function(){return!!this.get("gitEngine")&&this.get("gitEngine").isOrigin()},animateToAttr:function(e,t,o){if(0!==t){var i=void 0!==t?t:this.get("animationSpeed"),a=o||this.get("animationEasing");this.setAttr(e,!1,i,a)}else this.setAttr(e,!0)},setAttrBase:function(e,t,o,i,a){e.forEach((function(e){o?this.get(e).attr(t[e]):(this.get(e).stop(),this.get(e).animate(t[e],i,a),this.getNonAnimateKeys().forEach((function(o){t[e]&&void 0!==t[e][o]&&this.get(e).attr(o,t[e][o])}),this)),t.css&&$(this.get(e).node).css(t.css)}),this)},animateAttrKeys:function(e,t,o,i){e=Object.assign({},{include:["circle","arrow","rect","path","text"],exclude:[]},e||{});var a=this.getAttributes();e.include.forEach((function(e){a[e]=Object.assign({},a[e],t)})),e.exclude.forEach((function(e){delete a[e]})),this.animateToAttr(a,o,i)}});o.VisBase=i},{backbone:1}],115:[function(e,t,o){var i=e("backbone"),a=e("../util/constants").GRAPHICS,n=e("../visuals/visBase").VisBase,r=e("../graph/treeCompare"),s=function(){var e=Math.random();return"hsb("+String(e)+",0.6,1)"},c=n.extend({defaults:{pos:null,text:null,rect:null,arrow:null,isHead:!1,flip:1,fill:a.rectFill,stroke:a.rectStroke,"stroke-width":a.rectStrokeWidth,offsetX:4.75*a.nodeRadius,offsetY:0,arrowHeight:14,arrowInnerSkew:0,arrowEdgeHeight:6,arrowLength:14,arrowOffsetFromCircleX:10,vPad:5,hPad:5,animationSpeed:a.defaultAnimationTime,animationEasing:a.defaultEasing},validateAtInit:function(){if(!this.get("branch"))throw new Error("need a branch!")},getID:function(){return this.get("branch").get("id")},initialize:function(){if(this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),!this.gitEngine)throw new Error("asd wtf");this.get("branch").set("visBranch",this);var e=this.get("branch").get("id");"HEAD"==e?(this.set("isHead",!0),this.set("flip",-1),this.refreshOffset(),this.set("fill",a.headRectFill)):"main"!==e&&this.set("fill",s())},getCommitPosition:function(){var e=this.gitEngine.getCommitFromRef(this.get("branch")),t=e.get("visNode");return this.set("flip",this.getFlipValue(e,t)),this.refreshOffset(),t.getScreenCoords()},getDashArray:function(){return this.get("gitVisuals").getIsGoalVis()?this.getIsLevelBranchCompared()?"":"--":""},getIsGoalAndNotCompared:function(){return!!this.get("gitVisuals").getIsGoalVis()&&!this.getIsLevelBranchCompared()},getIsLevelBranchCompared:function(){if(this.getIsMain())return!0;var e=this.get("gitVisuals").getLevelBlob();return!r.onlyMainCompared(e)},getIsMain:function(){return"main"==this.get("branch").get("id")},getFlipValue:function(e,t){var o=this.get("gitVisuals").getFlipPos(),i=t.get("pos").x>o;return"C0"===e.get("id")?-1:this.get("isHead")?i?this.isBranchStackEmpty()?-1:1:this.isBranchStackEmpty()?1:-1:i?-1:1},refreshOffset:function(){var e=4.75*a.nodeRadius;1===this.get("flip")?(this.set("offsetY",-33),this.set("offsetX",e-10)):(this.set("offsetY",33),this.set("offsetX",e-10))},getArrowTransform:function(){return 1===this.get("flip")?"t-2,-20R-35":"t2,20R-35"},getBranchStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getBranchStackArray(),t=-1;return e.forEach((function(e,o){e.obj==this.get("branch")&&(t=o)}),this),t},getBranchStackLength:function(){return this.get("isHead")?1:this.getBranchStackArray().length},isBranchStackEmpty:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return!e||0===e.length},getCommitID:function(){var e=this.get("branch").get("target");return"branch"===e.get("type")&&(e=e.get("target")),e.get("id")},getBranchStackArray:function(){var e=this.gitVisuals.branchStackMap[this.getCommitID()];return void 0===e?(this.gitVisuals.calcBranchStacks(),this.getBranchStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getBranchStackIndex();return{x:e.x+this.get("flip")*this.get("offsetX"),y:e.y+t*a.multiBranchY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=(this.get("flip"),this.getTextSize());return{x:e.x-.5*t.w-this.get("hPad"),y:e.y-.5*t.h-this.get("vPad")}},getArrowPath:function(){var e=function(e,t,o){return{x:e.x+t,y:e.y+o}},t=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},o=this.get("flip"),i=e(this.getCommitPosition(),o*this.get("arrowOffsetFromCircleX"),0),a=e(i,o*this.get("arrowLength"),-this.get("arrowHeight")),n=e(i,o*this.get("arrowLength"),this.get("arrowHeight")),r=e(a,o*this.get("arrowInnerSkew"),this.get("arrowEdgeHeight")),s=e(n,o*this.get("arrowInnerSkew"),-this.get("arrowEdgeHeight")),c=e(r,49*o,0),l=e(s,49*o,0),m="";return m+="M"+t(c)+" ",[r,a,i,n,s,l].forEach((function(e){m+="L"+t(e)+" "}),this),m+="z"},getTextSize:function(){var e=function(e){return e.w||(e.w=75),e.h||(e.h=20),e},t=this.get("text").node;if(this.get("isHead")){var o=t.getBoundingClientRect();return e({w:o.width,h:o.height})}var i=0;return this.getBranchStackArray().forEach((function(e){i=Math.max(i,function(e){var t=e.get("text")?e.get("text").node:null;return null===t?0:t.getBoundingClientRect().width}(e.obj.get("visBranch")))})),e({w:i,h:t.getBoundingClientRect().height})},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad");return{w:e.w+2*t,h:e.h+2*o}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad"),i=this.getBranchStackLength();return{w:e.w+2*t,h:e.h*i*1.1+2*o}},getIsRemote:function(){return this.get("branch").getIsRemote()},getName:function(){var e=this.get("branch").getName(),t=this.get("branch")===this.gitEngine.HEAD.get("target"),o=this.getIsRemote(),i=this.gitEngine.getIsHg();return"HEAD"===e&&i&&(e="."),e+(!t||this.getIsInOrigin()||o?"":"*")},nonTextToFront:function(){this.get("arrow").toFront(),this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){0!==this.getBranchStackIndex()&&this.get("text").toFront()},getFill:function(){return this.get("isHead")||1==this.getBranchStackLength()||0!==this.getBranchStackIndex()?this.get("fill"):this.gitVisuals.blendHuesFromBranchStack(this.getBranchStackArray())},remove:function(){this.removeKeys(["text","arrow","rect"]),this.gitVisuals.removeVisBranch(this)},handleModeChange:function(){},genGraphics:function(e){var t=this.getTextPosition(),o=this.getName(),i=e.text(t.x,t.y,String(o));i.attr({"font-size":14,"font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",opacity:this.getTextOpacity()}),this.set("text",i);var a=this.getAttributes(),n=this.getRectPosition(),r=this.getRectSize(),s=e.rect(n.x,n.y,r.w,r.h,8).attr(a.rect);this.set("rect",s);var c=this.getArrowPath(),l=e.path(c).attr(a.arrow);this.set("arrow",l);["text","rect","arrow"].forEach((function(e){$(this.get(e).node).css(a.css)}),this),this.attachClickHandlers(),s.toFront(),i.toFront()},attachClickHandlers:function(){this.get("gitVisuals").options.noClick||[this.get("rect"),this.get("text"),this.get("arrow")].forEach((function(e){e.click(this.onClick.bind(this))}),this)},shouldDisableClick:function(){return this.get("isHead")&&!this.gitEngine.getDetachedHead()},onClick:function(){if(!this.shouldDisableClick()){var t="git checkout "+this.gitEngine.resolveNameNoPrefix(this.get("branch"));e("../app").getEventBaton().trigger("commandSubmitted",t)}},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:0!==this.getBranchStackIndex()?0:1},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getIsGoalAndNotCompared()?0===this.getBranchStackIndex()?.7:.3:1},getStrokeWidth:function(){return this.getIsGoalAndNotCompared()?this.get("stroke-width")/5:this.get("stroke-width")},getAttributes:function(){var e=this.getTextOpacity();this.updateName();var t=this.getTextPosition(),o=this.getRectPosition(),i=this.getRectSize(),a=this.getArrowPath(),n=this.getDashArray();return{css:{cursor:this.shouldDisableClick()?"auto":"pointer"},text:{x:t.x,y:t.y,opacity:e},rect:{x:o.x,y:o.y,width:i.w,height:i.h,opacity:this.getNonTextOpacity(),fill:this.getFill(),stroke:this.get("stroke"),"stroke-dasharray":n,"stroke-width":this.getStrokeWidth()},arrow:{path:a,opacity:this.getNonTextOpacity(),fill:this.getFill(),stroke:this.get("stroke"),transform:this.getArrowTransform(),"stroke-dasharray":n,"stroke-width":this.getStrokeWidth()}}},animateUpdatedPos:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},setAttr:function(e,t,o,i){this.setAttrBase(["text","rect","arrow"],e,t,o,i)}}),l=i.Collection.extend({model:c});o.VisBranchCollection=l,o.VisBranch=c,o.randomHueString=s},{"../app":52,"../graph/treeCompare":65,"../util/constants":90,"../visuals/visBase":114,backbone:1}],116:[function(e,t,o){var i=e("backbone"),a=e("../util/constants").GRAPHICS,n=e("../visuals/visBase").VisBase,r=e("../stores/GlobalStateStore"),s=n.extend({defaults:{tail:null,head:null,animationSpeed:a.defaultAnimationTime,animationEasing:a.defaultEasing},validateAtInit:function(){["tail","head"].forEach((function(e){if(!this.get(e))throw new Error(e+" is required!")}),this)},getID:function(){return this.get("tail").get("id")+"."+this.get("head").get("id")},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.get("tail").get("outgoingEdges").push(this)},remove:function(){this.removeKeys(["path"]),this.gitVisuals.removeVisEdge(this)},genSmoothBezierPathString:function(e,t){var o=e.getScreenCoords(),i=t.getScreenCoords();return this.genSmoothBezierPathStringFromCoords(o,i)},genSmoothBezierPathStringFromCoords:function(e,t){var o=r.getFlipTreeY()?-1:1,i=function(e){return String(Math.round(e.x))+","+String(Math.round(e.y))},n=function(e,t,i){return i=i||a.curveControlPointOffset,{x:e.x,y:e.y+o*i*t}},s=function(e,t,i){return{x:e.x+t,y:e.y+o*i}};e=n(e,-1,this.get("tail").getRadius()),t=n(t,1,1.15*this.get("head").getRadius());var c="";c+="M"+i(e)+" ",c+="C",c+=i(n(e,-1))+" ",c+=i(n(t,1))+" ",c+=i(t);var l=a.arrowHeadSize||10;return c+=" L"+i(s(t,-l,l)),c+=" L"+i(s(t,l,l)),c+=" L"+i(t),c+="C",c+=i(n(t,1))+" ",c+=i(n(e,-1))+" ",c+=i(e)},getBezierCurve:function(){return this.genSmoothBezierPathString(this.get("tail"),this.get("head"))},getStrokeColor:function(){return a.visBranchStrokeColorNone},setOpacity:function(e){e=void 0===e?1:e,this.get("path").attr({opacity:e})},genGraphics:function(e){var t=this.getBezierCurve(),o=e.path(t).attr({"stroke-width":a.visBranchStrokeWidth,stroke:this.getStrokeColor(),"stroke-linecap":"round","stroke-linejoin":"round",fill:this.getStrokeColor()});o.toBack(),this.set("path",o)},getOpacity:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("tail")),t={branch:1,tag:1,head:a.edgeUpstreamHeadOpacity,none:a.edgeUpstreamNoneOpacity};if(void 0===t[e])throw new Error("bad stat");return t[e]},getAttributes:function(){return{path:{path:this.getBezierCurve(),opacity:this.getOpacity()}}},animateUpdatedPath:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},animateToAttr:function(e,t,o){0!==t?(this.get("path").toBack(),this.get("path").stop(),this.get("path").animate(e.path,void 0!==t?t:this.get("animationSpeed"),o||this.get("animationEasing"))):this.get("path").attr(e.path)}}),c=i.Collection.extend({model:s});o.VisEdgeCollection=c,o.VisEdge=s},{"../stores/GlobalStateStore":87,"../util/constants":90,"../visuals/visBase":114,backbone:1}],117:[function(e,t,o){e("backbone");var i=e("../util/constants").GRAPHICS,a=e("../visuals/visBase").VisBase,n=a.extend({defaults:{depth:void 0,maxWidth:null,outgoingEdges:null,circle:null,text:null,id:null,pos:null,radius:null,commit:null,animationSpeed:i.defaultAnimationTime,animationEasing:i.defaultEasing,fill:i.defaultNodeFill,"stroke-width":i.defaultNodeStrokeWidth,stroke:i.defaultNodeStroke},getID:function(){return this.get("id")},validateAtInit:function(){if(!this.get("id"))throw new Error("need id for mapping");if(!this.get("commit"))throw new Error("need commit for linking");this.get("pos")||this.set("pos",{x:Math.random(),y:Math.random()})},initialize:function(){this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),this.set("outgoingEdges",[])},setDepth:function(e){this.set("depth",Math.max(this.get("depth")||0,e))},setDepthBasedOn:function(e,t){if(void 0===this.get("depth"))throw new Error("no depth yet!");this.get("pos").y=this.get("depth")*e+t},getMaxWidthScaled:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit")),t={branch:1,tag:1,head:.3,none:.1};if(void 0===t[e])throw new Error("bad stat");return t[e]*this.get("maxWidth")},toFront:function(){this.get("circle").toFront(),this.get("text").toFront()},getOpacity:function(){var e={branch:1,tag:1,head:i.upstreamHeadOpacity,none:i.upstreamNoneOpacity},t=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));if(void 0===e[t])throw new Error("invalid status");return e[t]},getTextScreenCoords:function(){return this.getScreenCoords()},getAttributes:function(){var e=this.getScreenCoords(),t=this.getTextScreenCoords(),o=this.getOpacity(),a=this.getIsInOrigin()?i.originDash:"";return{circle:{cx:e.x,cy:e.y,opacity:o,r:this.getRadius(),fill:this.getFill(),"stroke-width":this.get("stroke-width"),"stroke-dasharray":a,stroke:this.get("stroke")},text:{x:t.x,y:t.y,opacity:o}}},animatePositionTo:function(e,t,o){var i=this.getAttributes(),a=e.getAttributes();i.circle=a.circle,i.text=a.text,this.animateToAttr(i,t,o)},highlightTo:function(e,t,o){var i=e.get("fill"),a={circle:{fill:i,stroke:i,"stroke-dasharray":"","stroke-width":5*this.get("stroke-width")},text:{}};this.animateToAttr(a,t,o)},animateUpdatedPosition:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},animateToSnapshot:function(e,t,o){e[this.getID()]&&this.animateToAttr(e[this.getID()],t,o)},setAttr:function(e,t,o,i){this.setAttrBase(["text","circle"],e,t,o,i)},animateToAttr:function(e,t,o){a.prototype.animateToAttr.apply(this,arguments);var i=void 0!==t?t:this.get("animationSpeed");o||this.get("animationEasing");"bounce"==o&&e.circle&&void 0!==e.circle.cx&&e.text&&void 0!==e.text.x&&(this.get("circle").animate(e.circle.cx,i,"easeInOut"),this.get("text").animate(e.text.x,i,"easeInOut"))},getScreenCoords:function(){var e=this.get("pos");return this.gitVisuals.toScreenCoords(e)},getRadius:function(){return this.get("radius")||i.nodeRadius},getParentScreenCoords:function(){return this.get("commit").get("parents")[0].get("visNode").getScreenCoords()},setBirthPosition:function(){var e=this.getParentScreenCoords();this.get("circle").attr({cx:e.x,cy:e.y,opacity:0,r:0}),this.get("text").attr({x:e.x,y:e.y,opacity:0})},setBirthFromSnapshot:function(e){var t=e[this.get("commit").get("parents")[0].get("visNode").getID()];this.get("circle").attr({opacity:0,r:0,cx:t.circle.cx,cy:t.circle.cy}),this.get("text").attr({opacity:0,x:t.text.x,y:t.text.y});var o={x:t.circle.cx,y:t.circle.cy};this.setOutgoingEdgesBirthPosition(o)},setBirth:function(){this.setBirthPosition(),this.setOutgoingEdgesBirthPosition(this.getParentScreenCoords())},setOutgoingEdgesOpacity:function(e){this.get("outgoingEdges").forEach((function(t){t.setOpacity(e)}))},animateOutgoingEdgesToAttr:function(e,t,o){this.get("outgoingEdges").forEach((function(t){var o=e[t.getID()];t.animateToAttr(o)}),this)},animateOutgoingEdges:function(e,t){this.get("outgoingEdges").forEach((function(o){o.animateUpdatedPath(e,t)}),this)},animateOutgoingEdgesFromSnapshot:function(e,t,o){this.get("outgoingEdges").forEach((function(i){var a=e[i.getID()];i.animateToAttr(a,t,o)}),this)},setOutgoingEdgesBirthPosition:function(e){this.get("outgoingEdges").forEach((function(t){var o=t.get("head").getScreenCoords(),i=t.genSmoothBezierPathStringFromCoords(e,o);t.get("path").stop(),t.get("path").attr({path:i,opacity:0})}),this)},parentInFront:function(){this.get("commit").get("parents")[0].get("visNode").toFront()},getFontSize:function(e){return e.length<3?12:e.length<5?10:8},getFill:function(){var e=this.gitVisuals.getCommitUpstreamStatus(this.get("commit"));return"head"==e?i.headRectFill:"tag"==e||"none"==e?i.orphanNodeFill:this.gitVisuals.getBlendedHuesForCommit(this.get("commit"))},attachClickHandlers:function(){if(!this.get("gitVisuals").options.noClick){var t="git checkout "+this.get("commit").get("id"),o=e("../app");[this.get("circle"),this.get("text")].forEach((function(e){e.click((function(){o.getEventBaton().trigger("commandSubmitted",t)})),$(e.node).css("cursor","pointer")}))}},setOpacity:function(e){e=void 0===e?1:e;["circle","text"].forEach((function(t){this.get(t).attr({opacity:e})}),this)},remove:function(){this.removeKeys(["circle"],["text"]);var e=this.get("text");e&&e.remove(),this.gitVisuals.removeVisNode(this)},removeAll:function(){this.remove(),this.removeAllEdges()},removeAllEdges:function(){this.get("outgoingEdges").forEach((function(e){e.remove()}),this)},getExplodeStepFunc:function(e){if(!e)throw new Error("need speed by now");var t=this.get("circle"),o=20/e,i=Math.PI+1*Math.random()*Math.PI,a=.2*e,n=.01*e,r=o*Math.cos(i),s=o*Math.sin(i),c=t.attr("cx"),l=t.attr("cy"),m=this.gitVisuals.paper.width,u=this.gitVisuals.paper.height-t.attrs.r,d=.8/e;return function(){return((c+=1*(r-=n*r))<0||c>m)&&(r=d*-r,c=c<0?0:m),((l+=1*(s+=1*a-n*s))<0||l>u)&&(s=d*-s,l=l<0?0:u),t.attr({cx:c,cy:l}),!(r*r+s*s<.1&&Math.abs(l-u)<=.1)}},makeCircle:function(e){var t=this.getScreenCoords();return e.circle(t.x,t.y,this.getRadius()).attr(this.getAttributes().circle)},makeText:function(e){var t=this.getTextScreenCoords();return e.text(t.x,t.y,String(this.get("id")))},genGraphics:function(){var e=this.gitVisuals.paper,t=this.makeCircle(e),o=this.makeText(e);o.attr({"font-size":this.getFontSize(this.get("id")),"font-weight":"bold","font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",opacity:this.getOpacity()}),this.set("circle",t),this.set("text",o),this.attachClickHandlers()}});o.VisNode=n},{"../app":52,"../util/constants":90,"../visuals/visBase":114,backbone:1}],118:[function(e,t,o){var i=e("backbone"),a=e("../util/constants").GRAPHICS,n=e("../visuals/visBase").VisBase,r=e("../graph/treeCompare"),s=n.extend({defaults:{pos:null,text:null,rect:null,isHead:!1,fill:a.tagFill,stroke:a.tagStroke,"stroke-width":a.tagStrokeWidth,offsetX:a.nodeRadius,offsetY:a.nodeRadius,vPad:4,hPad:4,animationSpeed:a.defaultAnimationTime,animationEasing:a.defaultEasing},validateAtInit:function(){if(!this.get("tag"))throw new Error("need a Tag!")},getID:function(){return this.get("tag").get("id")},initialize:function(){if(this.validateAtInit(),this.gitVisuals=this.get("gitVisuals"),this.gitEngine=this.get("gitEngine"),!this.gitEngine)throw new Error("asd wtf");this.get("tag").set("visTag",this)},getCommitPosition:function(){return this.gitEngine.getCommitFromRef(this.get("tag")).get("visNode").getScreenCoords()},getDashArray:function(){return this.get("gitVisuals").getIsGoalVis()?this.getIsLevelTagCompared()?"":"--":""},getIsGoalAndNotCompared:function(){return!!this.get("gitVisuals").getIsGoalVis()&&!this.getIsLevelTagCompared()},getIsLevelTagCompared:function(){var e=this.get("gitVisuals").getLevelBlob();return!r.onlyMainCompared(e)},getTagStackIndex:function(){if(this.get("isHead"))return 0;var e=this.getTagStackArray(),t=-1;return e.forEach((function(e,o){e.obj==this.get("tag")&&(t=o)}),this),t},getTagStackLength:function(){return this.get("isHead")?1:this.getTagStackArray().length},isTagStackEmpty:function(){var e=this.gitVisuals.tagStackMap[this.getCommitID()];return!e||0===e.length},getCommitID:function(){return this.get("tag").get("target").get("id")},getTagStackArray:function(){var e=this.gitVisuals.tagStackMap[this.getCommitID()];return void 0===e?(this.gitVisuals.calcTagStacks(),this.getTagStackArray()):e},getTextPosition:function(){var e=this.getCommitPosition(),t=this.getTagStackIndex();return{x:e.x+this.get("offsetX"),y:e.y+t*a.multiTagY+this.get("offsetY")}},getRectPosition:function(){var e=this.getTextPosition(),t=this.getTextSize();return{x:e.x-this.get("hPad"),y:e.y-.5*t.h-this.get("vPad")}},getTextSize:function(){var e,t=this.get("text").node,o=0;return this.getTagStackArray().forEach((function(e){o=Math.max(o,function(e){var t=e.get("text")?e.get("text").node:null;return null===t?0:t.getBoundingClientRect().width}(e.obj.get("visTag")))})),(e={w:o,h:t.getBoundingClientRect().height}).w||(e.w=75),e.h||(e.h=20),e},getSingleRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad");return{w:e.w+2*t,h:e.h+2*o}},getRectSize:function(){var e=this.getTextSize(),t=this.get("vPad"),o=this.get("hPad"),i=this.getTagStackLength();return{w:e.w+2*t,h:e.h*i+2*o}},getIsRemote:function(){return this.get("tag").getIsRemote()},getName:function(){var e=this.get("tag").getName();this.getIsRemote(),this.gitEngine.getIsHg();return e},nonTextToFront:function(){this.get("rect").toFront()},textToFront:function(){this.get("text").toFront()},textToFrontIfInStack:function(){0!==this.getTagStackIndex()&&this.get("text").toFront()},remove:function(){this.removeKeys(["text","rect"]),this.gitVisuals.removeVisTag(this)},handleModeChange:function(){},genGraphics:function(e){var t=this.getTextPosition(),o=this.getName(),i=e.text(t.x,t.y,String(o));i.attr({"font-size":14,"font-family":"Menlo, Monaco, Consolas, 'Droid Sans Mono', monospace",opacity:this.getTextOpacity(),"text-anchor":"start"}),this.set("text",i);var a=this.getAttributes(),n=this.getRectPosition(),r=this.getRectSize(),s=e.rect(n.x,n.y,r.w,r.h,8).attr(a.rect);this.set("rect",s);["text","rect"].forEach((function(e){$(this.get(e).node).css(a.css)}),this),this.attachClickHandlers(),s.toFront(),i.toFront()},attachClickHandlers:function(){this.get("gitVisuals").options.noClick||[this.get("rect"),this.get("text")].forEach((function(e){e.click(this.onClick.bind(this))}),this)},shouldDisableClick:function(){return this.get("isHead")&&!this.gitEngine.getDetachedHead()},onClick:function(){if(!this.shouldDisableClick()){var t="git checkout "+this.get("tag").get("id");e("../app").getEventBaton().trigger("commandSubmitted",t)}},updateName:function(){this.get("text").attr({text:this.getName()})},getNonTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:0!==this.getTagStackIndex()?0:1},getTextOpacity:function(){return this.get("isHead")?this.gitEngine.getDetachedHead()?1:0:this.getIsGoalAndNotCompared()?0===this.getTagStackIndex()?.7:.3:1},getStrokeWidth:function(){return this.getIsGoalAndNotCompared()?this.get("stroke-width")/5:this.get("stroke-width")},getAttributes:function(){var e=this.getTextOpacity();this.updateName();var t=this.getTextPosition(),o=this.getRectPosition(),i=this.getRectSize(),a=this.getDashArray();return{css:{cursor:this.shouldDisableClick()?"auto":"pointer"},text:{x:t.x,y:t.y,opacity:e},rect:{x:o.x,y:o.y,width:i.w,height:i.h,opacity:this.getNonTextOpacity(),fill:this.get("fill"),stroke:this.get("stroke"),"stroke-dasharray":a,"stroke-width":this.getStrokeWidth()}}},animateUpdatedPos:function(e,t){var o=this.getAttributes();this.animateToAttr(o,e,t)},animateFromAttrToAttr:function(e,t,o,i){this.animateToAttr(e,0),this.animateToAttr(t,o,i)},setAttr:function(e,t,o,i){this.setAttrBase(["text","rect"],e,t,o,i)}}),c=i.Collection.extend({model:s});o.VisTagCollection=c,o.VisTag=s,o.randomHueString=function(){var e=Math.random();return"hsb("+String(e)+",0.7,1)"}},{"../app":52,"../graph/treeCompare":65,"../util/constants":90,"../visuals/visBase":114,backbone:1}],119:[function(e,t,o){(function(t){(function(){var i=e("backbone"),a=e("../models/collections"),n=a.CommitCollection,r=a.BranchCollection,s=a.TagCollection,c=e("../util/eventBaton").EventBaton,l=e("../visuals").GitVisuals,m=i.View.extend({initialize:function(e){e=e||{},this.options=e,this.customEvents=Object.assign({},i.Events),this.containerElement=e.containerElement;var o=this,a=e.containerElement||$("#canvasHolder")[0];new Raphael(a,200,200,(function(){var i=this;t.nextTick((function(){o.paperInitialize(i,e)}))}))},paperInitialize:function(o,i){this.treeString=i.treeString,this.paper=o;var a=e("../app");this.eventBaton=i.noKeyboardInput?new c({noInput:!0}):a.getEventBaton(),this.commitCollection=new n,this.branchCollection=new r,this.tagCollection=new s,this.gitVisuals=new l({commitCollection:this.commitCollection,branchCollection:this.branchCollection,tagCollection:this.tagCollection,paper:this.paper,noClick:this.options.noClick,isGoalVis:this.options.isGoalVis,smallCanvas:this.options.smallCanvas,visualization:this});var m=e("../git").GitEngine;this.gitEngine=new m({collection:this.commitCollection,branches:this.branchCollection,tags:this.tagCollection,gitVisuals:this.gitVisuals,eventBaton:this.eventBaton}),this.gitEngine.init(),this.gitVisuals.assignGitEngine(this.gitEngine),this.myResize(),$(window).on("resize",(()=>this.myResize())),this.$el.parents(".ui-draggable").on("drag",function(e,t){this.customEvents.trigger("drag",e,t),this.myResize()}.bind(this)),this.gitVisuals.drawTreeFirstTime(),this.treeString&&this.gitEngine.loadTreeFromString(this.treeString),this.options.zIndex&&this.setTreeIndex(this.options.zIndex),this.shown=!1,this.setTreeOpacity(0),t.nextTick(this.fadeTreeIn.bind(this)),this.customEvents.trigger("gitEngineReady"),this.customEvents.trigger("paperReady")},clearOrigin:function(){delete this.originVis},makeOrigin:function(e){return this.originVis=new m(Object.assign({},this.options,{noKeyboardInput:!0,noClick:!0,treeString:e.treeString})),this.originVis.customEvents.on("paperReady",function(){var e=$(this.paper.canvas).css("z-index");this.originVis.setTreeIndex(e)}.bind(this)),this.originVis},originToo:function(e,t){if(this.originVis){var o=function(){this.originVis[e].apply(this.originVis,t)}.bind(this);this.originVis.paper?o():this.originVis.customEvents.on("paperReady",o)}},setTreeIndex:function(e){$(this.paper.canvas).css("z-index",e),this.originToo("setTreeIndex",arguments)},setTreeOpacity:function(e){0===e&&(this.shown=!1),$(this.paper.canvas).css("opacity",e),this.originToo("setTreeOpacity",arguments)},getAnimationTime:function(){return 300},fadeTreeIn:function(){this.shown=!0,this.paper&&($(this.paper.canvas).animate({opacity:1},this.getAnimationTime()),this.originToo("fadeTreeIn",arguments))},fadeTreeOut:function(){this.shown=!1,this.paper&&this.paper.canvas&&$(this.paper.canvas).animate({opacity:0},this.getAnimationTime()),this.originToo("fadeTreeOut",arguments)},hide:function(){this.fadeTreeOut(),setTimeout(function(){$(this.paper.canvas).css("visibility","hidden")}.bind(this),this.getAnimationTime()),this.originToo("hide",arguments)},show:function(){$(this.paper.canvas).css("visibility","visible"),setTimeout(this.fadeTreeIn.bind(this),10),this.originToo("show",arguments),this.myResize()},showHarsh:function(){$(this.paper.canvas).css("visibility","visible"),this.setTreeOpacity(1),this.originToo("showHarsh",arguments),this.myResize()},resetFromThisTreeNow:function(e){this.treeString=e;var t=this.getOriginInTreeString(e);if(t){var o=this.gitEngine.printTree(t);this.originToo("resetFromThisTreeNow",[o])}},getOriginInTreeString:function(e){return JSON.parse(unescape(e)).originTree},reset:function(e){var t=e||this.treeString;if(this.setTreeOpacity(0),t?this.gitEngine.loadTreeFromString(t):this.gitEngine.defaultInit(),this.fadeTreeIn(),this.originVis)if(t){var o=this.getOriginInTreeString(t);this.originToo("reset",[JSON.stringify(o)])}else this.originToo("reset",arguments)},tearDown:function(e){e=e||{},this.gitEngine.tearDown(),this.gitVisuals.tearDown(),delete this.paper,this.originToo("tearDown",arguments)},die:function(){this.fadeTreeOut(),setTimeout(function(){this.shown||this.tearDown({fromDie:!0})}.bind(this),this.getAnimationTime()),this.originToo("die",arguments)},myResize:function(){if(this.paper){var e=this.el,t=e.getBoundingClientRect(),o=t.width,i=t.height;if(this.containerElement)$(this.paper.canvas).css({position:"absolute"});else{var a=this.$el.offset().left,n=this.$el.offset().top;$(this.paper.canvas).css({position:"absolute",left:a+"px",top:n+"px"})}this.paper.setSize(o,i),this.gitVisuals.canvasResize(o,i),this.originToo("myResize",arguments)}}});o.Visualization=m}).call(this)}).call(this,e("_process"))},{"../app":52,"../git":63,"../models/collections":75,"../util/eventBaton":95,"../visuals":112,_process:22,backbone:1}],120:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C7","id":"main"},"bugWork":{"target":"C2","id":"bugWork"}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',solutionCommand:"git branch bugWork main^^2^",startTree:'{"branches":{"main":{"target":"C7","id":"main"}},"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":["C2"],"id":"C5"},"C6":{"parents":["C4","C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Multiple parents",zh_CN:"两个 parent 节点",fr_FR:"Parents multiples",de_DE:"Mehrere Vorgänger",ja:"複数の親",es_AR:"Múltiples padres",es_MX:"Múltiples padres",es_ES:"Múltiples padres",pt_BR:"Múltiplos pais",gl:"Múltiples pais",zh_TW:"多個 parent commit",ru_RU:"Здоровая семья, или несколько родителей",ko:"다수의 부모",uk:"Декілька батьків",vi:"Nhiều cha lắm mẹ",sl_SI:"Več Staršev",ta_IN:"ஒன்றுக்கு மேற்ப்பட்ட துவக்க கிலைகள்",it_IT:"Genitori multipli",pl:"Wielu rodziców"},hint:{en_US:"Use `git branch bugWork` with a target commit to create the missing reference.",de_DE:"Nutze `git branch bugWork` mit einem Ziel-Commit um die fehlende Referenz zu erstellen.",ja:"`git branch bugWork`を対象のコミットと組み合わせて使い、欠如しているリファレンスを作成しましょう",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_MX:"Use `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`。",ru_RU:"`git branch bugWork` на нужном коммите поможет создать нужную ссылку.",ko:"`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요",uk:'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання',vi:"Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định",sl_SI:"Uporabi `git branch bugWork` s ciljnim commitom za ustvarjanje manjkajoče reference.",ta_IN:"`git branch bugWork` பயன்படுத்தி தேவைப்படும் கமிட்டுடன் இழந்த இணைப்பை உருவாக்குக.",it_IT:"Scrivi `git branch bugWork` con un commit per creare il riferimento mancante.",pl:"Użyj `git branch bugWork` na docelowym commicie, aby utworzyć brakującą referencję."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Specifying Parents","","Like the `~` modifier, the `^` modifier also accepts an optional number after it.","","Rather than specifying the number of generations to go back (what `~` takes), the modifier on `^` specifies which parent reference to follow from a merge commit. Remember that merge commits have multiple parents, so the path to choose is ambiguous.","",'Git will normally follow the "first" parent upwards from a merge commit, but specifying a number with `^` changes this default behavior.',"","Enough talking, let's see it in action.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have a merge commit. If we checkout `main^` without the modifier, we will follow the first parent after the merge commit. ","","(*In our visuals, the first parent is positioned directly above the merge commit.*)"],afterMarkdowns:["Easy -- this is what we are all used to."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now let's try specifying the second parent instead..."],afterMarkdowns:["See? We followed the other parent upwards."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["The `^` and `~` modifiers can make moving around a commit tree very powerful:"],afterMarkdowns:["Lightning fast!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Even crazier, these modifiers can be chained together! Check this out:"],afterMarkdowns:["The same movement as before, but all in one command."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Put it to practice","","To complete this level, create a new branch at the specified destination.","","Obviously it would be easy to specify the commit directly (with something like `C6`), but I challenge you to use the modifiers we talked about instead!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Vorgänger ansteuern","","Wie der Operator `~` akzeptiert auch der Operator `^` eine optionale Anzahl.","","Anstatt der Anzahl von Schritten, die zurückgegangen werden soll (das ist das, was man bei `~` angibt), bezeichnet die Anzahl nach `^` welchem Vorgänger bei einem Merge-Commit gefolgt werden soll. Du erinnerst dich, dass ein Merge-Commit mehrere Vorgänger hat; es gilt also aus diesen auszuwählen.","",'Normalerweise folgt Git dem "ersten" Vorgänger des Merge-Commit, aber durch Angabe einer Zahl nach dem `^` lässt sich dieses Verhalten ändern.',"","Aber genug gequatscht, schauen wir es uns in Aktion an.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier sehen wir einen Merge-Commit. Wenn wir einen Checkout von `main^` ohne Zahl machen, wird Git auf den ersten Vorgänger des Commits zurückgehen. ","","*(In unserer Darstellung befindet sich der erste Vorgänger direkt über dem Merge-Commit.)*"],afterMarkdowns:["Simpel -- so kennen wir das."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jetzt versuchen wir mal stattdessen den zweiten Vorgänger anzugeben ..."],afterMarkdowns:["Gesehen? Wir gehen zu dem anderen Vorgänger zurück."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Die Operatoren `^` und `~` geben uns eine Menge Möglichkeiten für das Navigieren durch den Commit-Baum:"],afterMarkdowns:["Bämm!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Noch abgefahrener: Die beiden Operatoren können verkettet werden. Aufgepasst:"],afterMarkdowns:["Gleicher Ablauf wie zuvor, nur alles in einem Befehl."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Setzen wir's um","","Erstelle einen neuen Branch an dem angegebenen Ziel, um diesen Level abzuschließen.","","Es ist natürlich möglich den Commit einfach direkt anzugeben (also mit sowas wie `C6`), aber ich fordere dich heraus stattdessen die relativen Operatoren zu benutzen!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Détermine les parents","","Comme le symbole `~`, le symbole `^` accepte un numéro après lui.","","Au lieu d'entrer le nombre de générations à remonter (ce que `~` fait), le symbole `^` détermine quel parent est à remonter. Attention, un merge commit a deux parents ce qui peut porter à confusion.","",'Normalement Git suit le "premier" parent pour un commit/merge, mais avec un numéro après `^` le comportement par défaut est modifié.',"","Assez de bla bla, passons à l'action",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous avons un commit/merge. Si nous faisons checkout `main^` sans le symbole, on obtient le premier parent suivant ce commit. ","","(*Dans notre vue, le premier parent se situe juste au dessus du merge.*)"],afterMarkdowns:["Facile -- c'est ce que nous faisons tout le temps."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous allons spécifier le deuxième parent à la place."],afterMarkdowns:["Vous voyez ? Nous suivons le second parent."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Les symboles `^` et `~` permettent de se déplacer de façon très efficace :"],afterMarkdowns:["Boum, vitesse du tonnerre !"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Encore plus fou, ces symboles peuvent être enchainés ! Regardez cela :"],afterMarkdowns:["Le même résultat, mais en une seule commande."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Un peu de pratique","","Pour réussir le niveau, créez une nouvelle branche à la destination indiquée.","","Évidement ce serait plus rapide de spécifier le commit (C6 par exemple), mais faites-le plutôt avec les symboles de déplacement dont nous venons de parler !"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 选择 parent 提交记录","","操作符 `^` 与 `~` 符一样,后面也可以跟一个数字。","","但是该操作符后面的数字与 `~` 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个 parent 提交。还记得前面提到过的一个合并提交有两个 parent 提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。","","Git 默认选择合并提交的“第一个” parent 提交,在操作符 `^` 后跟一个数字可以改变这一默认行为。","","废话不多说,举个例子。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这里有一个合并提交记录。如果不加数字修改符直接切换到 `main^`,会回到第一个 parent 提交记录。","","(*在我们的图示中,第一个 parent 提交记录是指合并提交记录正上方的那个提交记录。*)"],afterMarkdowns:["这正是我们都已经习惯的方法。"],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在来试试选择另一个 parent 提交……"],afterMarkdowns:["看见了吧?我们回到了另外一个 parent 提交上。"],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用 `^` 和 `~` 可以自由地在提交树中移动,非常给力:"],afterMarkdowns:["快若闪电!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["更厉害的是,这些操作符还支持链式操作!试一下这个:"],afterMarkdowns:["和前面的结果一样,但只用了一条命令。"],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 课后小练习","","要完成此关,在指定的目标位置创建一个新的分支。","","很明显可以简单地直接使用提交记录的哈希值(比如 `C6`),但我要求你使用刚刚讲到的相对引用修饰符!"]}}]},es_AR:{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. Recordá 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:["Acá tenemos un commit de merge. Si hacemos checkout de `main^`, 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 algo habitual."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Más loco aún, ¡estos modificadores pueden encadenarse entre sí! Mirá 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 main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Ponelo en práctica","","Para completar este nivel, creá 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."]}}]},es_MX:{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:["Acá tenemos un commit de merge. Si hacemos checkout de `main^`, 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 main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Más loco aún, ¡Éstos 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 main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Pongámoslo 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."]}}]},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 `main^`, 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 main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; 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 main; 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 main; 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:[{type:"ModalAlert",options:{markdowns:["### Especificando pais","","Assim como o modificador `~`, o modificador `^` também aceita um número opcional depois dele.","","Em vez de especificar o número de gerações a voltar (que é o que o `~` faz), o modificador no `^` especifica qual referência de pai a ser seguida a partir de um commit de merge. Lembre-se que commits de merge possuem múltiplos pais, então o caminho a seguir é ambíguo.","",'O Git normalmente subirá o "primeiro" pai de um commit de merge, mas especificar um número após o `^` muda esse comportamento padrão.',"","Basta de conversa, vejamos o operador em ação.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui temos um commit de merge. Se fizermos checkout em `main^` sem especificar um número, vamos seguir o primeiro pai acima do commit de merge. ","","(*Em nossa visualização, o primeiro pai é aquele diretamente acima do commit de merge.*)"],afterMarkdowns:["Fácil -- isso é aquilo com o que já estamos acostumados."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora vamos, em vez disso, especificar o segundo pai..."],afterMarkdowns:["Viu? Subimos para o outro pai."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Os modificadores `^` e `~` podem tornar a movimentação ao redor da árvore de commits muito poderosa:"],afterMarkdowns:["Rápido como a luz!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ainda mais louco, esses modificadores podem ser encadeados em conjunto! Veja só:"],afterMarkdowns:["O mesmo movimento que o anterior, mas tudo em um único comando."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Coloque em prática","","Para completar este nível, crie um novo ramo no destino especificado.","","Obviamente seria mais fácil especificar o commit diretamente (com algo como `C6`), mas em vez disso eu desafio você a usar os modificadores sobre os quais falamos!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Especificando pais","","Tanto o modificador `~`, como o modificador `^` aceptan un número opcional despois del.","","Mellor que especificar o número de commits que percorrer cara atrás (que é o que o `~` fai), o modificador sobre `^` especifica qué referencia do pai vai ser seguida dende o commit con merge. Lembra qué os commits do merge teñen varios pais, entón o camiño a seguir é ambiguo.","",'Git normalmente seguirá ó "primeiro" pai de un commit de merge, pero especificando un número co `^` muda o comportamento do pai.',"","Xa chega de faladoiros, vexamos o comando en acción.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí temos un commit do merge. Se fixéramos checkout en `main^` sen especificar un número, imos seguir ó primeiro pai enriba do commit do merge. ","","(*Na nosa vista, o primeiro pai é aquel directamente enriba do commit do merge.*)"],afterMarkdowns:["Sinxelo, eso é aquelo co que xa estamos acostumados."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora imos, en vez de iso, especificar o segundo pai..."],afterMarkdowns:["¿Viches? Subimos para o outro pai."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Os modificadores `^` e `~` pódense mover ao redor da árbore de commits con moito poder:"],afterMarkdowns:["Rápido coma a luz!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aínda máis tolo, eses modificadores poden ser encadeados en conxunto! Olla ahí:"],afterMarkdowns:["O mesmo movemento feito antes, pero feito nun só comando."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Pono na práctica","","Para completar este nível, crea unha nova rama no destino especificado.","","Obviamente sería máis sinxelo especificar o commit diretamente (algo como `C6`), pero en vez de facer eso, ¡podes usar os modificadores dos que falamos!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["### 選擇 parent commit","","和 `~` 符號一樣,`^` 符號的後面也可以接一個(可選的)數字。","","這不是用來指定往上回去幾代(`~` 的作用),`^` 後面所跟的數字表示我要選擇哪一個 parent commit。還記得一個 merge commit 可以有多個 parent commit 吧,所以當我們要選擇走到哪一個 parent commit 的時候就會比較麻煩了。","",'git 預設會選擇 merge commit 的"第一個" parent commit,使用 `^` 後面接一個數字可以改變這個預設的行為。',"","廢話不多說,舉一個例子。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡有一個 merge commit。如果後面不加數字的話會直接切換到`main^`,也就是說會回到第一個 parent commit。","","(*在我們的圖示中,第一個 parent commit 是指 merge commit 正上方的那一個 parent commit。*)"],afterMarkdowns:["簡單吧!這就是預設的情況。"],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在來試試選擇第二個 parent commit..."],afterMarkdowns:["看到了嗎?我們回到了第二個 parent commit。"],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用`^`和`~`可以自由在 commit tree 中移動:"],afterMarkdowns:["簡直就像是電光石火!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["再瘋狂點,這些符號可以被連在一起!試一下這個:"],afterMarkdowns:["和前面的結果一樣,但只用了一條指令。"],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 練習一下","","要完成這一關,在指定的目標位置上面建立一個新的 branch。","","很明顯可以直接使用 commit 的 hash 值(比如 `C6`),但我要求你使用剛剛講到的相對引用的符號!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Определение родителей","","Так же как тильда (~), каретка (^) принимает номер после себя.","","Но в отличие от количества коммитов, на которые нужно откатиться назад (как делает `~`), номер после `^` определяет, на какого из родителей мерджа надо перейти. Учитывая, что мерджевый коммит имеет двух родителей, просто указать ^ нельзя.","",'Git по умолчанию перейдёт на "первого" родителя коммита, но указание номера после `^` изменяет это поведение.',"","Посмотрим, как это работает.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вот мерджевый коммит. Если мы перейдём на `main^` без номера, то попадём на первого родителя.","","(*На нашей визуализации первый родитель находится прямо над коммитом*)"],afterMarkdowns:["Просто - прямо как мы любим."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Теперь попробуем перейти на второго родителя."],afterMarkdowns:["Вот. Мы на втором родительском коммите."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Модификаторы `^` и `~` сильно помогают перемещаться по дереву коммитов:"],afterMarkdowns:["Быстро как Флэш!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Более того, эти модификаторы можно применять вместе. Например, так:"],afterMarkdowns:["Сделаем то же самое, что перед этим, только в одну команду."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### На практике","","Чтобы пройти этот уровень, создай ветку в указанном месте.","","Очевидно, что (в данном случае) будет проще указать коммит напрямую, но для того, чтобы закрепить пройденное, используй модификаторы, о которых мы говорили выше."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### 親の指定","","`~`修飾子と同じように、`^`修飾子も後に任意の番号を置くことができます。","","指定した数だけ遡る(これは`~`の場合の機能)のではなく、`^`はマージコミットからどの親を選択するかを指定できます。マージコミットは複数の親で構成されるので、選択する経路が曖昧であることを覚えておいてください。","","Gitは通常、マージコミットから「一つ目」の親、マージされた側のブランチの親を選びます。しかし、`^`で数を指定することでこのデフォルトの動作を変えることができます。","","では、実際の動作を見ていきましょう。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["ここに、マージコミットがあります。もし、指定無しに`main^`でチェックアウトした場合、私たちは一番目の親に移動することになります。","","(*私たちのツリーでは、一番目の親はマージコミットのちょうど上に位置しています。*)"],afterMarkdowns:["簡単ですね -- これがデフォルトの動作になります。"],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["それでは代わりに二つ目の親を指定してみます"],afterMarkdowns:["見ましたか?私たちは他の親に移ることができました。"],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`^`修飾子と`~`修飾子は、コミット履歴を辿るのを強力に補助してくれます:"],afterMarkdowns:["超高速ですね!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["より素晴らしいことに、これらの修飾子は連鎖させることができます!これを見てください:"],afterMarkdowns:["前と同じ移動ですが、なんと一つのコマンドでできています。"],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 練習課題","","このレベルをクリアするためには、まず新しいブランチを指定したように作成します。","","明らかに直接コミットを指定した方が(`C6`というように)簡単ですが、私は今まで述べたような修飾子を使う方法で挑戦してもらいたいと思います。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### 부모를 선택하기","","`~` 수식처럼 `^` 수식 또한 뒤에 숫자를 추가 할 수 있습니다.","","몇개의 세대를 돌아갈지 정하는 것 대신(`~`의 기능) `^`수식은 병합이된 커밋에서 어떤 부모를 참조할지 선택할 수 있습니다. 병합된 커밋들은 다수의 부모를 가지고 있다는것을 기억하시나요? 어떤 부모를 선택할지 예측할 수가 없습니다.","",'Git은 보통 병합된 커밋에서 "첫" 부모를 따라갑니다. 하지만 `^`수식을 숫자와 함께 사용하면 앞의 디폴트 동작대로가 아닌 다른 결과가 나타납니다.',"","이만 줄이고, 직접 확인해봅시다.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 병합된 커밋이 있습니다. 우리가 `main`를 수식없이 체크아웃한다면 병합된 커밋의 첫 부모를 따라 올라갈 것입니다. ","","(*화면에서는 첫 부모는 병합된 커밋 바로 위에 위치해 있습니다.*)"],afterMarkdowns:["간단하죠 -- 우리한테 익숙한 모습입니다."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["자 이제 두번째 부모를 선택해봅시다..."],afterMarkdowns:["보이나요? 다른 부모를 선택해 올라갔습니다."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`^`수식과 `~`수식을 이용해 커밋트리에서 효과적으로 움직일 수 있습니다.:"],afterMarkdowns:["빛처럼 빠르게 말이죠!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["더 대단한것은 이 수식들은 같이 사용할 수 있다는 겁니다! 확인해봅시다:"],afterMarkdowns:["앞과 같은 움직임이지만 하나의 명령으로 표현되었습니다."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### 직접 확인해봅시다","","이 레벨을 완료하기 위해서 정해진 목적지에 새 브랜치를 생성하세요.","","물론 커밋을 직접 특정지어주면 아주 쉽겠지만(`C6`과 같이), 수식을 익혀볼겸 배운것을 사용해 도전해 봅시다!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Вибираємо Попередників","","Так само як і модифікатор `~`, модифікатор `^` також приймає необов’язкове число після нього.","","Замість того, щоб вказувати кількість генерацій щоб переміститись назад (те що робить `~`), число після `^` вказує на яке батьківське посилання мерджу потрібно перейти. Зауважте що так як мерджевий коміт має декілька батьків, використання '^' без числа є неоднозначним.","",'Git зазвичай перейде на "першого" з батьків вверх з мерджевого коміту, але вказання числа після `^` змінює цю поведінку. ',"","Годі ляси точити, перевірмо як це працює в дії.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ось ми маємо мерджевий коміт. Якщо зробимо checkout `main^` без числа, ми потрапимо на першого з предків ","","(*В нашій візуалізації перший предок знаходиться прямо над мерджевим комітом*)"],afterMarkdowns:["Легко -- те до чого ми всі звикли."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер спробуймо натомість вказати другого батька..."],afterMarkdowns:["Бачиш? Ми перейшли до другого батька вверх."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Модифікатори `^` та `~` дозволяють легко пересуватися деревом комітів:"],afterMarkdowns:["Супер швидко!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Більше того, ці модифікатори можна використовувати разом! Заціни:"],afterMarkdowns:["Те саме, що й перед цим, але однією командою."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Практика","","Щоб завершити цей рівень, створи нову гілку на вказаному місці.","","Очевидно, що в данному випадку досить легко вказати коміт напряму (щось на зразок checkout `C6`), але для закріплення матеріалу використай модифікатори, про які ми щойно говорили!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Tìm về cội nguồn","","Cũng giống ký hiệu `~`, ta cũng có thể thêm số theo sau ký hiệu `^`.","","Nhưng mà không giống như (`~`) con số theo sau là số lượng thế hệ commit, con số theo sau `^` chỉ định commit cha từ commit merge. Hãy nhớ rằng commit merge có nhiều cha, cho nên chọn cha nào cũng khá là mơ hồ.","",'Thông thường thì sẽ chọn cha "đầu tiên" từ commit merge, nhưng nếu sau dấu `^` có một con số thì cách hành xử sẽ khác đi.',"","Không nói dông dài nữa, làm thử một ví dụ nào.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ở đây ta có 1 commit merge. Nếu ta dùng lệnh `main^` mà không bổ nghĩa cho nó, ta sẽ đi ngược lên commit cha đầu tiên của merge commit. ","","(*Trong hình minh họa bên trái thì commit cha đầu tiên được xếp thẳng hàng ngay phía trên của commit merge.*)"],afterMarkdowns:["Dễ dàng -- đó là cách mà ta thường làm."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào bây giờ hãy chỉ định commit cha thứ hai thử..."],afterMarkdowns:["Thấy chứ? Ta đã leo lên commit cha khác lúc trước."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dùng bổ ngữ `^` và `~` cho ta khả năng di chuyển trên cây lịch sử:"],afterMarkdowns:["Nhanh như chớp!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Thâm chí còn ghê gớm hơn khi ta kết hợp chúng với nhau! Hãy xem thử:"],afterMarkdowns:["Cùng con đường như lúc trước, nhưng chỉ cần 1 dòng lệnh."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Áp dụng thực hành nào","","Để hoàn thành cấp độ này, hãy tạo ra một nhánh mới ở vị trí chỉ định.","","Dùng cách chỉ định trực tiếp commit (như là dùng `C6` chẳng hạn) thì dễ quá, nhưng thử thách ở đây là dùng các bổ ngữ đã học ở trên!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Določanje Staršev","","Tako kot `~` modifikator, tudi `^` modifikator sprejme opcijsko število na koncu.","","Raje kot podajanje števila generacij, za katere se hočemo premakniti nazaj (kot pri `~`), modifikator `^` pove kateremu staršu oz. njegovi referenci naj sledi iz merge commita. Zapomni si, da imajo merge commiti več staršev, zato je pot nejasna.","",'Git bo ponavadi sledil "prvemu" staršu navzgor po merge commitu, ampak določitev števila s `^` spremeni privzeto obnašanje.',"","Dovolj govorjenja, poglejmo stvar v akciji.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tukaj imamo merge commit. Če checkoutamo `main^` brez modifikatorjev, bomo sledili prvem staršu po merge commitu. ","","(* V naši vizualizaciji, je postavljen prvi starš direktno nad merge commitom.)"],afterMarkdowns:["Enostavno -- tega smo vsi navajeni."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sedaj pa poizkusimo določiti raje drugega starša ..."],afterMarkdowns:["Vidiš? Sledili smo drugemu staršu navzgor."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Modifikatorja `^` in `~` naredita sprehajanje po drevesu zelo učinkovito:"],afterMarkdowns:["Bliskovito!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Še bolj noro, te modifikatorji so lahko povezani skupaj! Poglej to:"],afterMarkdowns:["Isto gibanje kot prej, ampak vse z enim ukazom."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Preizkusi v praksi","","Za dokončanje te stopnje, ustvari nov brench na določeni destinaciji.","","Seveda bi bilo lažje izbrati commit direktno (npr. s `C6`), ampak te izzivam, da namesto tega poizkusiš z modifikatorji o katerih smo govorili!"]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["### துவக்க கிலையை குறிக்க","","`~` மாற்றியை போல, `^` மாற்றியும் தேவைப்படின் உள்ளீடாக ஒரு எண்யை ஏற்றுக்கொள்ளும், ஆனால் அது கட்டாயம் அல்ல.","","அந்த எண் (`~` போல்) முந்தய கிளை இணைப்புகளுக்கு பின்னோக்கி செல்வதை குறிக்காமல், தற்ப்போதிய கமிட் எந்த கிளை துவக்கத்துடன் இணைக்க வேண்டுமோ அதனை `^`-இன் உள்ளீடு குறிக்கிரது. தொகுப்பு கமிட்கள் ஒன்றுக்கும் மேற்ப்பட்ட மூல கிளைகளை கொண்டு இருக்கும் எனவே இது குழப்பமானதாக இருக்கும்.","",'கிட் பொதுவாக தொகுப்பு கமிட்டில் இருந்து மேல் நோக்கி உள்ள "முதல்" கிளைக்கு பின் இணைப்பை உருவாக்கும், ஆனால் `^`-இற்க்கு கொடுக்கப்படு் உள்ளீட்டு எண் வேரு கிளை முனைப்புகளுடன் இணைக்கி உதவும்.',"","விவரங்கள் போதும், அதை செயலில் பார்ப்போம்.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இங்கே நாம்மிடன் ஒரு தொகுப்பு கமிட் உள்ளது. இப்போது நாம் checkout `main^` மட்டும் எந்த ஒரு எண்னும் குறிப்பிடாமல் கட்டலையிட்டால் அது கமிட்டின் நேரடி மூல கிளையுடன் இணைப்பை உருவாக்கும். ","","(*இங்குள்ள வரைபடத்தில், நேரடி மூழம் தொகுப்பு கமிட்டின் நேர் எதிர் திசையில் மேலக காட்ட பட்டுள்ளது.*)"],afterMarkdowns:["அது பரவாயில்லை -- இது நாம் அனைவரும் பழக்கமாகிவிட்டது."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது நாம் மாற்றாக இரண்டாவது துவக்க கிளையை குறிக்க செய்வோம்..."],afterMarkdowns:["கவனத்தீர்களா? நாம் அடுத்த கிளை மூழப்புள்ளியின் கீழ் இணைப்பை உருவாக்கி உள்ளொம்."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`^` மற்றும் `~` மாற்றிகள் கமிட் மர அமைப்பை சுலபமாக சுற்றி வர உதவுகின்றன:"],afterMarkdowns:["மின்னல் வேகம்!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["மேலும் ஒரு எளிய வழி, இந்த மாற்றிகளை நாம் இணைத்தும் பயன் படுத்தலாம்! இதைப்பாருங்க்:"],afterMarkdowns:["மேல் கண்ட அதே வழி மாற்றம்தான் ஆனால் அனைத்தும் ஒரே கட்டளையில்."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### இப்போது நீங்கள் பயிற்சி செய்யுங்கள்","","இந்த படி நிலையை நிரைவு செய்ய, குறிப்பிட்டபட்டுள்ள பிரிவில் ஒரு கிளையை உருவாக்குங்கள்.","","வெளிப்படையாக சொல்லப்போனால் (`C6` போன்று) நேரடியாக கிளையை குறிப்பிடமுடியுன், இருப்பினும் இந்த சவால் மேல் குறிப்பிட்ட மாற்றிகளை பயன் படுத்தும் வகையில் அமைக்க பட்டுள்ளது!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Określanie rodziców","","Podobnie jak modyfikator `~`, modyfikator `^` również przyjmuje po sobie opcjonalną liczbę.","","Zamiast określać liczbę pokoleń do cofnięcia się (co robi `~`), modyfikator `^` określa, do którego rodzica należy się odwołać po wykonaniu merge commita. Pamiętaj, że scalanie ma wielu rodziców, więc wybór ścieżki nie jest jednoznaczny.","",'Git zazwyczaj podąża za "pierwszym" rodzicem w górę od commitu scalającego, ale określenie liczby za pomocą `^` zmienia to domyślne zachowanie.',"","Dość gadania - zobaczmy, jak to działa.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutaj mamy merge commit. Jeśli checkoutujemy `main^` bez liczby na końcu, przejdziemy do pierwszego rodzica po merge commicie. ","","(*Na naszych wizualizacjach pierwszy rodzic jest umieszczony bezpośrednio nad commitem scalającym.*)"],afterMarkdowns:["Spokojnie - do tego wszyscy jesteśmy przyzwyczajeni."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A teraz spróbujmy określić drugiego rodzica..."],afterMarkdowns:["Spójrz. Przenieślismy się do drugiego rodzica."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Modyfikatory `^` i `~` mogą dodać supermoce do poruszania się po drzewie commitów:"],afterMarkdowns:["Co za prędkość!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jeszcze bardziej szalone jest to, że modyfikatory mogą być ze sobą łączone! Zobacz:"],afterMarkdowns:["Ten sam ruch co poprzednio, ale wszystko w jednym poleceniu."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Zastosuj to w praktyce","","Aby ukończyć ten poziom, utwórz nową gałąź w określonym miejscu docelowym.","","Oczywiście łatwo byłoby określić commit bezpośrednio (coś jak `C6`), ale spróbuj użyć modyfikatorów, o których mówiliśmy przed chwilą!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Speficicare i genitori","","Come il modificatore `~` , anche il modificatore `^` accetta un numero (opzionale) dopo di esso.","","Invece che specificare il numero di generazioni di cui tornare indietro (come accade con `~`), il modificatore `^` specifica quale genitore seguire partendo da un merge commit (di fusione). Ricorda che i merge commit hanno genitori multipli, quindi il percorso da seguire può essere ambiguo.","","Git normalmente segue il primo genitore partendo da un merge commit, ma specificando un numero con `^` cambia questo comportamento predefinito.","","Basta parlare, vediamolo in azione.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Qui abbiamo un merge commit. Se facciamo checkout `main^` senza modificatore, seguiremo il primo genitore dopo il merge commit. ","","(*Nell'immagine, il primo genitore è situato direttamente al di sopra al merge commit.*)"],afterMarkdowns:["Facile -- questo è quello a cui siamo abituati."],command:"git checkout main^",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora invece proviamo a specificare il secondo genitore..."],afterMarkdowns:["Vedi? Abbiamo seguito il secondo genitore verso l'alto."],command:"git checkout main^2",beforeCommand:"git checkout HEAD^; git commit; git checkout main; git merge C2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["I modificatori `^` e `~` riescono a farci muovere lungo l'albero dei commit in modo agevole:"],afterMarkdowns:["Super veloce!"],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 main; git merge C5; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ancora più sorprendente, questi modificatori possono essere concatenati tra loro! Dai un occhiata:"],afterMarkdowns:["Stessi passaggi di prima, ma tutto con un comando."],command:"git checkout HEAD~^2~2",beforeCommand:"git commit; git checkout C0; git commit; git commit; git commit; git checkout main; git merge C5; git commit"}},{type:"ModalAlert",options:{markdowns:["### Mettilo in pratica","","Per completare questo livello, crea un nuovo ramo alla destinazione specificata.","","Sarebbe facile specificare il commit direttamente (con qualcosa del tipo `C6`), ovvio, ma ti sfido invece a utilizare i modificatori di cui abbiamo parlato!"]}}]}}}},{}],121:[function(e,t,o){o.levelSequences={intro:[e("./intro/commits").level,e("./intro/branching").level,e("./intro/merging").level,e("./intro/rebasing").level],rampup:[e("./rampup/detachedHead").level,e("./rampup/relativeRefs").level,e("./rampup/relativeRefs2").level,e("./rampup/reversingChanges").level],move:[e("./rampup/cherryPick").level,e("./rampup/interactiveRebase").level],mixed:[e("./mixed/grabbingOneCommit").level,e("./mixed/jugglingCommits").level,e("./mixed/jugglingCommits2").level,e("./mixed/tags").level,e("./mixed/describe").level],advanced:[e("./rebase/manyRebases").level,e("./advanced/multipleParents").level,e("./rebase/selectiveRebase").level],remote:[e("./remote/clone").level,e("./remote/remoteBranches").level,e("./remote/fetch").level,e("./remote/pull").level,e("./remote/fakeTeamwork").level,e("./remote/push").level,e("./remote/fetchRebase").level,e("./remote/lockedMain").level],remoteAdvanced:[e("./remote/pushManyFeatures").level,e("./remote/mergeManyFeatures").level,e("./remote/tracking").level,e("./remote/pushArgs").level,e("./remote/pushArgs2").level,e("./remote/fetchArgs").level,e("./remote/sourceNothing").level,e("./remote/pullArgs").level]};var i=o.sequenceInfo={intro:{displayName:{en_US:"Introduction Sequence",de_DE:"Einführung",ja:"まずはここから",fr_FR:"Séquence d'introduction",es_AR:"Secuencia introductoria",es_MX:"Secuencia introductoria",es_ES:"Secuencia introductoria",pt_BR:"Sequência introdutória",gl:"Secuencia introductoria",zh_CN:"基础篇",zh_TW:"基礎篇",ko:"git 기본",ru_RU:"Введение",uk:"Вступ",vi:"Giới Thiệu Chuỗi Luyện Tập",sl_SI:"Uvodno Zaporedje",pl:"Wprowadzenie",it_IT:"Sequenza introduttiva",ta_IN:"அறிமுக தொடர் வரிசை"},about:{en_US:"A nicely paced introduction to the majority of git commands",de_DE:"Eine gut abgestimmte Einführung in die wichtigsten Git-Befehle",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_MX:"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 主要命令",zh_TW:"循序漸進地介紹 git 主要命令",ko:"git의 주요 명령어를 깔끔하게 알려드립니다",ru_RU:"Хорошо подобранное введение в основные команды git",uk:"Гарно підібране введення в основні команди git",vi:"Từng bước làm quen với phần lớn lệnh điều khiển Git",sl_SI:"Prijeten uvod v git ukaze",pl:"Krótkie wprowadzenie do większości poleceń Gita",it_IT:"Un'introduzione graduale ai principali comandi Git",ta_IN:"பெரும்பாலான கிட் கட்டளைகளுக்கு ஒரு நல்ல அறிமுகம்"}},rampup:{displayName:{en_US:"Ramping Up",de_DE:"Aufstieg",ja:"次のレベルに進もう",fr_FR:"Montée en puissance",es_AR:"Acelerando",es_MX:"Acelerando",es_ES:"Acelerando",pt_BR:"Acelerando",gl:"Alixeirando",zh_CN:"高级篇",zh_TW:"進階篇",ru_RU:"Едем дальше",uk:"Їдемо далі",ko:"다음 단계로",vi:"Tăng Tốc",sl_SI:"Prva Stopnička",pl:"Rozkręcenie",it_IT:"Diamoci dentro",ta_IN:"சற்று அதிகப்படுத்த"},about:{en_US:"The next serving of 100% git awesomes-ness. Hope you're hungry",de_DE:"Eine Portion Git-Wahnsinn zum Thema Navigation",ja:"更にgitの素晴らしさを堪能しよう",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_MX:"La próxima ración de 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 的超棒特性了,快来吧!",zh_TW:"接下來是 git 非常厲害的地方!相信你已經迫不及待了吧!",ru_RU:"Следующая порция абсолютной git-крутотенюшки. Проголодались?",uk:"Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли",ko:"git은 아주 멋져요. 왜 멋진지 알려드립니다",vi:"Tận hưởng khẩu phần tuyệt hảo của Git. Hi vọng bạn còn đói",sl_SI:"Naslednja porcija git izjemnosti. Upam, da si lačen",pl:"Następna porcja gita jest niesamowita. Mam nadzieję, że jesteś głodny",it_IT:"Porzione con il 100% di grandiosità Git, spero tu sia affamato",ta_IN:"அடித்தது கிட்டின் 100% அற்புதங்கள். நீங்கள் ஆர்வமாக உள்ளீர்கள் என்று நம்புகிறேன்"}},remote:{tab:"remote",displayName:{en_US:"Push & Pull -- Git Remotes!",de_DE:"Push & Pull -- entfernte Repositorys",ja:"Push及びPullコマンド -- Gitリモート",fr_FR:"Push & Pull -- Dépôts Git distants !",es_AR:"Push & Pull -- Git Remotes!",es_MX:"Push & Pull -- Repositorios remotos en Git (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 远程仓库!",zh_TW:"Push & Pull -- Git Remotes!",ru_RU:"Push & Pull - удалённые репозитории в Git!",uk:"Push & Pull -- віддалені репозиторії в Git!",ko:"Push & Pull -- Git 원격 저장소!",vi:"Push & Pull -- Git Remotes!",sl_SI:"Push & Pull -- Oddaljeni Git",pl:"Push & Pull -- Zdalne repozytoria",it_IT:"Push & Pull -- Git Remoto!",ta_IN:"Push & Pull -- கிட் Remotes!"},about:{en_US:"Time to share your 1's and 0's kids; coding just got social",fr_FR:"Il est le temps de partager vos 1 et vos 0 les enfants, le code vient de devenir social.",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; programar se volvió social!",es_MX:"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:"是时候分享你的代码了,让编码变得社交化吧",zh_TW:"是時候分享你的程式碼了",ru_RU:"Настало время поделиться своими единичками и нулями. Время коллективного программирования",uk:"Настав час поділитися своїми нулями та одиничками; соціальне програмування",ko:"내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!",vi:"Chia sẻ đứa con tinh thần '0' và '1' của bạn; mã đã đến với cộng đồng",sl_SI:"Čas za deljenje tvojih 1 in 0; kodiranje je pravkar postalo socialno",pl:"Czas podzielić się swoimi dziećmi 1 i 0; kodowanie właśnie stało się społeczne",it_IT:"Ragazzi è arrivato il momento di condividere i vostri 0 e 1; programmare diventa social",ta_IN:"உங்களின் 1'கள் மற்றும் 0'களை பகிர்வதற்கான நேரம் குழந்தைகளே; குறியிடுதல் (coding) பொது உடமை ஆக்க பட்டுள்ளது"}},remoteAdvanced:{tab:"remote",displayName:{en_US:"To Origin And Beyond -- Advanced Git Remotes!",de_DE:"Bis zum origin und noch weiter",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_MX:"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 远程仓库高级操作",zh_TW:"關於 origin 和其它 repo,git remote 的進階指令",ru_RU:"Через origin – к звёздам. Продвинутое использование Git Remotes",uk:"Через origin – до зірок. Прогресивне використання Git Remotes",ko:'"origin"그 너머로 -- 고급 Git 원격 저장소',vi:"Về Với Cội Nguồn Và Vươn Xa Hơn -- Git Remote Nâng Cao",sl_SI:"Do Origina In Naprej -- Napredni Oddaljeni Git",pl:"Do źródła i dalej -- zaawansowane zdalne repozytoria",it_IT:"Verso Origin e oltre -- Git Remoto Avanzato!",ta_IN:"ஆரம்பம் மற்றும் அதர்க்கு மேல் -- மேம்பட்ட கிட் ரிமோட்டுகள்!"},about:{en_US:"And you thought being a benevolent dictator would be fun...",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_MX:"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:"做一名仁慈的独裁者一定会很有趣……",zh_TW:"而且你會覺得做一個仁慈的獨裁者會很有趣...",de_DE:"Git Remotes für Fortgeschrittene",ru_RU:"Весело было быть всесильным мудрым правителем...",uk:"А ти думав, що бути всесильним диктатором весело...",ko:"자비로운 독재자가 되는게 재밌을 줄 알았겠지만...",vi:"Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui...",sl_SI:"In ti si mislil, da je biti dobronamerni diktator zabavno ...",pl:"A myślałeś, że bycie życzliwym dyktatorem byłoby fajne...",it_IT:"E tu credevi che essere un dittatore benevolo fosse divertente...",ta_IN:"நீங்கள் ஒரு அக்கரை உள்ள சர்வாதிகாரியாக இருப்பது வேடிக்கையாக இருக்கும் என்று நினைத்தீர்களா..."}},move:{displayName:{en_US:"Moving Work Around",de_DE:"Code umherschieben",fr_FR:"Déplacer le travail",es_AR:"Moviendo el trabajo por ahí",es_MX:"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:"コードの移動",ko:"코드 이리저리 옮기기",zh_CN:"移动提交记录",zh_TW:"調整提交順序",ru_RU:"Перемещаем труды туда-сюда",uk:"Переміщуємо роботу туди-сюди",vi:"Di Chuyển Commit",sl_SI:"Premikanje Dela Naokrog",pl:"Przenoszenie pracy",it_IT:"Spostare il lavoro in giro",ta_IN:"வேலைகளை பகிர்ந்து கொள்வது"},about:{en_US:'"Git" comfortable with modifying the source tree :P',de_DE:"Gewöhn dich daran, den Git-Baum zu verändern",fr_FR:"Soyez à l'aise pour modifier l'arbre Git",es_AR:"Preparate para modificar el directorio fuente :P",es_MX:"Ponte cómodo al modificar el directorio fuente :P",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:"작업 트리를 수정하는건 식은죽 먹기지요 이제",ja:"話題のrebaseってどんなものだろう?って人にオススメ",zh_CN:"自由修改提交树",zh_TW:"自由修改提交樹",ru_RU:"Не стесняйтесь менять историю",uk:"Не соромимось змінювати історію",vi:'Dễ dàng chỉnh sửa cây lịch sử với "Git" :P',sl_SI:'Spretno "Git" premikanje po drevesu :P',pl:"Git dobrze radzi sobie z modyfikacją drzewa źródłowego :P",it_IT:'Modificare l\'albero con facilità. "GIT" ready :P',ta_IN:'"கிட்" மூல மரத்தை மாற்றுவதில் சிரந்தது :P'}},mixed:{displayName:{en_US:"A Mixed Bag",de_DE:"Ein Kessel Buntes",ja:"様々なtips",fr_FR:"Un assortiment",es_AR:"Bolsa de gatos",es_MX:"De todo un poco",es_ES:"Un poco de todo",pt_BR:"Sortidos",gl:"Todo mesturado",ko:"종합선물세트",zh_CN:"杂项",zh_TW:"活用 git 的指令",ru_RU:"Сборная солянка",uk:"Всяке",vi:"Vài Mẹo Linh Tinh",sl_SI:"Mešana Vreča",pl:"Po trochu wszystkiego",it_IT:"Un po' di tutto",ta_IN:"ஒரு கலப்பு பை"},about:{en_US:"A mixed bag of Git techniques, tricks, and tips",de_DE:"Eine bunte Mischung von Techniken, Tipps und Tricks",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_MX:"Un recopilatorio 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을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다",zh_CN:"Git 技术、技巧与贴士大集合",zh_TW:"git 的技術,招數與技巧",ru_RU:"Ассорти из приёмов работы с Git, хитростей и советов",uk:"Різні прийоми роботи з Git, хитрощі та поради",vi:"Các kỹ thuật, bí quyết, và mẹo vặt hữu ích",sl_SI:"Mešana vreča Git tehnik, trikov in nasvetov",pl:"Po trochu wszystkiego. Wskazówki i triki",it_IT:"Comandi Git assortiti, trucchi e consigli",ta_IN:"கிட் நுட்பங்கள், தந்திரங்கள் மற்றும் உதவிக்குறிப்புகளின் கலவையான பை"}},advanced:{displayName:{en_US:"Advanced Topics",de_DE:"Themen für Fortgeschrittene",ja:"上級トピック",fr_FR:"Sujets avancés",es_AR:"Temas avanzados",es_MX:"Temas avanzados",es_ES:"Temas avanzados",pt_BR:"Temas avançados",gl:"Temas avanzados",zh_CN:"高级话题",zh_TW:"進階主題",ru_RU:"Продвинутый уровень",uk:"Досвідчений рівень",ko:"고급 문제",vi:"Các Chủ Đề Nâng Cao",sl_SI:"Napredne Teme",pl:"Tematy zaawansowane",it_IT:"Argomenti avanzati",ta_IN:"மேம்பட்ட தலைப்புகள்"},about:{en_US:"For the truly brave!",de_DE:"... die nie ein Mensch zuvor gesehen hat.",ja:"勇気ある人のみ!",fr_FR:"Pour les plus courageux !",es_AR:"¡Para personas realmente valientes!",es_MX:"¡Para los verdaderos valientes!",es_ES:"¡Para los verdaderos valientes!",pt_BR:"Para os verdadeiros valentes!",gl:"¡Para os verdadeiros valerosos!",zh_CN:"只为真正的勇士!",zh_TW:"來成為真正的強者吧!",ru_RU:"Если ты смелый, ловкий, умелый – потренируйся тут",uk:"Для хоробрих",ko:"용기있는 도전자를 위해 준비한 문제입니다",vi:"Mạnh mẽ lên!",sl_SI:"Za resnično pogumne!",pl:"Dla naprawdę odważnych!",it_IT:"Per i più temerari!",ta_IN:"உண்மையிலேயே தைரியமானவர்களுக்கு!"}}};o.getTabForSequence=function(e){var t=i[e];return t.tab?t.tab:"main"}},{"./advanced/multipleParents":120,"./intro/branching":122,"./intro/commits":123,"./intro/merging":124,"./intro/rebasing":125,"./mixed/describe":126,"./mixed/grabbingOneCommit":127,"./mixed/jugglingCommits":128,"./mixed/jugglingCommits2":129,"./mixed/tags":130,"./rampup/cherryPick":131,"./rampup/detachedHead":132,"./rampup/interactiveRebase":133,"./rampup/relativeRefs":134,"./rampup/relativeRefs2":135,"./rampup/reversingChanges":136,"./rebase/manyRebases":137,"./rebase/selectiveRebase":138,"./remote/clone":139,"./remote/fakeTeamwork":140,"./remote/fetch":141,"./remote/fetchArgs":142,"./remote/fetchRebase":143,"./remote/lockedMain":144,"./remote/mergeManyFeatures":145,"./remote/pull":146,"./remote/pullArgs":147,"./remote/push":148,"./remote/pushArgs":149,"./remote/pushArgs2":150,"./remote/pushManyFeatures":151,"./remote/remoteBranches":152,"./remote/sourceNothing":153,"./remote/tracking":154}],122:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C1","id":"main"},"bugFix":{"target":"C1","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',solutionCommand:"git branch bugFix;git checkout bugFix",name:{en_US:"Branching in Git",de_DE:"Branches in Git",ja:"Gitのブランチ",ko:"Git에서 브랜치 쓰기",es_AR:"Brancheando en Git",es_MX:"Creando ramas 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",zh_CN:"Git Branch",zh_TW:"建立 git branch",ru_RU:"Ветвление в Git",uk:"Розгалуження в Git",vi:"Rẽ nhánh với Git",sl_SI:"Branchanje v Gitu",pl:"Rozgałęzienia w Gicie",it_IT:"Creare rami in Git",ta_IN:"கிட் கிளை நிருவாகம்",tr_TR:"Git'te Branch işlemleri"},hint:{en_US:'Make a new branch with "git branch " and check it out with "git checkout "',de_DE:'Lege mit "git branch [Branch-Name]" einen neuen Branch an und checke ihn mit "git checkout [Branch-Name]" 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_MX:'Crea una nueva rama con "git branch [nombre]" y sitúate en 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]"',zh_CN:"用 'git branch <分支名>' 来创建分支,用 'git checkout <分支名>' 来切换到分支",zh_TW:"用 'git branch [ branch 名稱]' 來建立 branch,用 'git checkout [ branch 名稱]' 切換到該 branch",ko:'"git branch [브랜치명]"으로 새 브랜치를 만들고, "git checkout [브랜치명]"로 그 브랜치로 이동하세요',ru_RU:'Создай новую ветку при помощи "git branch [name]" и перейди на неё при помощи "git checkout [name]"',uk:'Створи нову гілку за допомогою "git branch [ім’я]" й перейди на неї за допомогою "git checkout [ім’я]"',vi:'Tạo một nhánh mới với lệnh "git branch [ten-nhanh]" và chuyển sang đó với lệnh "git checkout [ten-nhanh]"',sl_SI:'Naredi nov branch z "git branch [ime-brancha]" in ga checkoutaj z "git checkout [ime-brancha]"',pl:'Utwórz nową gałąź za pomocą "git branch " i przełącz się na nią za pomocą "git checkout "',it_IT:'Crea un nuovo ramo con "git branch " e selezionalo con "git checkout "',ta_IN:'இப்போது "git branch " கட்டளையை கொண்டு புதிய கிளை ஒன்றை உருவாக்குக பின் "git checkout " கொண்டு அந்த கிளைக்கு தாவுக',tr_TR:'Yeni bir branch oluşturmak için "git branch " komutunu kullanın ve "git checkout " komutu ile bu branch\'e geçin.'},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Branches in Git are incredibly lightweight as well. They are simply pointers to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:","","```","branch early, and branch often","```","","Because there is no storage / memory overhead with making many branches, it's easier to logically divide up your work than have big beefy branches.","",'When we start mixing branches and commits, we will see how these two features combine. For now though, just remember that a branch essentially says "I want to include the work of this commit and all parent commits."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what branches look like in practice.","","Here we will create a new branch named `newImage`."],afterMarkdowns:["There, that's all there is to branching! The branch `newImage` now refers to commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try to put some work on this new branch. Hit the button below."],afterMarkdowns:["Oh no! The `main` branch moved but the `newImage` branch didn't! That's because we weren't \"on\" the new branch, which is why the asterisk (*) was on `main`."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's tell git we want to checkout the branch with","","```","git checkout ","```","","This will put us on the new branch before committing our changes."],afterMarkdowns:["There we go! Our changes were recorded on the new branch."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Note: In Git version 2.23, a new command called `git switch` was introduced to eventually replace `git checkout`, ","which is somewhat overloaded (it does a bunch of different things depending on the arguments). The lessons here will still use ","`checkout` instead of `switch` because the `switch` command is still considered experimental and the syntax may change in the future. ","However you can still try out the new `switch` command in this application, and also ",'learn more here.* ']}},{type:"ModalAlert",options:{markdowns:["Ok! You are all ready to get branching. Once this window closes,","make a new branch named `bugFix` and switch to that branch.","","By the way, here's a shortcut: if you want to create a new ","branch AND check it out at the same time, you can simply ","type `git checkout -b [yourbranchname]`."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches in Git","","Branches sind in Git extrem schlank. Sie sind einfach Verweise auf einen bestimmten Commit -- das ist alles. Es ist unter Git-Enthusiasten deshalb gängige Praxis, früh und oft Branches anzulegen.","","Da das Anlegen von Branches keinen Plattenplatz und Speicher verbraucht, liegt es nahe die Arbeit in kleine logische Häppchen aufzuteilen, anstatt mit wenigen großen, monolithischen Branches zu hantieren.","",'Wir werden sehen wie Commits und Branches zusammengehören, sobald wir anfangen mit beiden zu arbeiten. Bis hierhin merk dir einfach, dass ein Branch im Prinzip bedeutet "ich möchte die Arbeit, die in diesem Commit und seinen Vorgängern steckt, sichern".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir mal, wie Branches in der Praxis aussehen.","","Wir legen einen neuen Branch an und nennen ihn `issue`:"],afterMarkdowns:["Und das war's auch schon, mehr ist es nicht. Der Branch `issue` zeigt nun auf den Commit `C1`."],command:"git branch issue",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lass uns mal ein wenig auf dem neuen Branch arbeiten. Machen wir einen Commit:"],afterMarkdowns:['Oi! Der Branch `main` hat sich verändert, aber der Branch `issue` nicht. Das liegt daran, dass wir nicht "auf" dem neuen Branch waren, weshalb das Sternchen `*` auch hinter `main` steht.'],command:"git commit",beforeCommand:"git branch issue"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sagen wir Git also erst mal auf welchem Branch wir arbeiten wollen, und zwar mit","","```","git checkout ","```","","Das wird uns auf den neuen Branch bringen bevor wir unsere Änderungen committen."],afterMarkdowns:["Und fertig! Unsere Änderungen wurden im neuen Branch gespeichert."],command:"git checkout issue; git commit",beforeCommand:"git branch issue"}},{type:"ModalAlert",options:{markdowns:["Cool! Jetzt bist du soweit, selbst Branches anzulegen. Wenn dieses Fenster geschlossen wurde, leg einen neuen Branch namens `bugFix` an und schalte auf diesen um."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitのブランチ","","Gitではコミットだけでなく、ブランチもまた信じられないほど軽量です。ブランチとは単に特定のコミットを指示したポインタにしか過ぎません。Gitの達人が決まってこう言うのは、そのためです:","","```","早めに、かつ頻繁にブランチを切りなさい","```","","どれほど多くのブランチを作ってもストレージやメモリを全然使わないので、ブランチを肥大化させるよりも論理的に分割していく方が簡単なのです。","","ブランチとコミットをあわせて使い始めると、これら2つの機能がどのように連動して機能するかがわかるでしょう。ここではとりあえず、ブランチは基本的には「あるコミットとその親のコミットたちを含めた全てのコミット」のことを呼ぶと覚えておいてください。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["では実際にブランチがどのようなものかを見ていきましょう。","","`newImage`という名前の新しいブランチを切ってみることにします。"],afterMarkdowns:["以上。必要な手順はこれだけです。いま作成された`newImage`ブランチは`C1`コミットを指しています。"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["この新しいブランチに何か変更を加えてみましょう。次のボタンを押してください。"],afterMarkdowns:["あらら、`newImage`ではなくて`main`ブランチが移動してしまいました。これは、私たちが`newImage`のブランチ上で作業していなかったためです。どのブランチで作業しているかは、アスタリスク(*)がついてるかどうかで分かります。"],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["今度は作業したいブランチ名をgitに伝えてみましょう。","","```","git checkout [ブランチ名]","```","","このようにして、コミットする前に新しいブランチへと作業ブランチを移動することができます。"],afterMarkdowns:["できましたね。今度は新しいブランチに対して変更を記録することができました。"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["はい、これでもうどんなブランチでも切れますね。このウィンドウを閉じて、","`bugFix`という名前のブランチを作成し、そのブランチをチェックアウトしてみましょう。"]}}]},es_AR:{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:","","```","brancheá temprano, y brancheá seguido","```","","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 esencialmente dice "Quiero incluir el trabajo de este commit y todos su ancestros".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos cómo se ven las ramas en práctica.","","Acá vamos a crear una rama nueva llamada `newImage`."],afterMarkdowns:["Ahí está, ¡eso es todo lo que hay que hacer para branchear! 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. Apretá el botón de acá abajo."],afterMarkdowns:['¡Uh, no! ¡La rama `main` avanzó, pero `newImage` no! Eso es porque no estábamos "en" la rama nueva, y por eso el asterisco (*) estaba en `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Digámosle a git que queremos checkoutear esa rama con","","```","git checkout [name]","```","","Esto va a situarnos en esa rama antes de commitear 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:["¡Ok! Ya podés manejar ramas. Cuando se cierre esta ventana,","creá una nueva rama llamada `bugFix` y cambiate a ella."]}}]},es_MX:{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:","","```","ramifica temprano, y ramifica seguido","```","","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 recuerda que una rama esencialmente dice "Quiero incluir el trabajo de este commit y todos su ancestros".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos cómo se ven las ramas en práctica.","","Acá vamos a crear una rama nueva llamada `newImage`."],afterMarkdowns:["Ahí está, ¡eso es todo lo que hay que hacer para ramificar! La rama `newImage` ahora hace 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 que se encuentra debajo."],afterMarkdowns:['¡Uh, no! ¡La rama `main` avanzó, pero `newImage` no! Eso es porque no estábamos "en" la rama nueva, y por eso el asterisco (*) estaba en `main`.'],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 nos situará en esa rama antes de hacer commit a 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:["¡Ok! Ya estás listo para manejar ramas. Cuando se cierre esta ventana,","crea una nueva rama llamada `bugFix` y cámbiate a ella."]}}]},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 `main` avanzó, pero `newImage` no! Eso es porque no estábamos "en" la rama nueva, y por eso el asterisco (*) estaba en `main`.'],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:[{type:"ModalAlert",options:{markdowns:["## Ramos no Git","","Ramos no Git também são incrivelmente leves. Eles são simplesmente referências a um commit específico -- e nada mais. É por isso que muitos entusiastas do Git entoam o mantra:","","```","ramifique cedo, ramifique sempre","```","","Devido a não existir sobrecarga de armazenamento / memória associada à criação de ramos, é mais fácil dividir logicamente o seu trabalho do que ter ramos grandes e gordos.","",'Quando começarmos a misturar ramos e commits, vamos ver como esses dois recursos combinam bem. Por enquanto, só lembre que um ramo diz essencialmente "Quero incluir o trabalho deste commit e de todos os seus ancestrais".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos como os ramos funcionam na prática.","","Aqui vamos criar um novo ramo chamado `newImage`."],afterMarkdowns:["Veja, é só isso que você tem que fazer para ramificar! O ramo `newImage` agora se refere ao commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos tentar colocar algum trabalho neste novo ramo. Clique no botão abaixo."],afterMarkdowns:['Ah não! O ramo `main` se moveu mas o `newImage` não! Isso é porque o novo ramo não era o "ativo", e é por isso que o asterisco (*) estava no `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos contar ao git que queremos fazer checkout no ramo com:","","```","git checkout [nome]","```","","Isso vai nos situar no ramo antes de commitarmos nossas mudanças."],afterMarkdowns:["Aqui vamos nós! Nossas mudanças foram gravadas no novo ramo."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Vocês estão todos prontos para ramificar. Assim que esta janela fechar,","crie um novo ramo chamado `bugFix` e mude para esse ramo."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas en Git","","As Ramas en Git son tamén increiblemente liviás. Elas sinxelamente son referencias a un mesmo commit específico, e nada máis. É por iso que moitos entusiastas do Git entonan o mantra:","","```","ramifica cedo, ramifica sempre","```","","Debido a non existir sobrecarga de memoria facendo moitas ramas, é máis sinxelo dividir a lóxica do teu traballo en ramas que ter unha enorme.","",'Cando comezamos a mesturar ramas e commits imos ver como eses dous recursos combínanse ben. Por agora lembra que unha rama esencialmente di "Quero incluír o traballo deste commit e de todos os seus ancestros".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos cómo as ramas funcionan na práctica.","","Aquí imos crear unha nova rama chamada `newImage`."],afterMarkdowns:["Mira, solo tes que poñer eso para crear unha rama! A rama `newImage` agora apunta ó commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos intentar colocar algún traballo nesta nova rama. Pincha no botón de abaixo."],afterMarkdowns:['¡Bueno home! A rama `main` moveuse pero a rama `newImage` non! Eso é porque a nova rama non era a "actual", e é por iso que o asterisco (*) ficaba na rama `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ímoslle decir a Git que nos queremos mover á rama con:","","```","git checkout [nome]","```","","Esto vainos levar á rama que tiñamos antes de facer os nosos cambios."],afterMarkdowns:["¡Imos alá! Os nosos cambios foron grabados na nova rama."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["¡Ok! Estas preparado para facer ramas. Así que podes pechar a ventá,","crear unha rama chamada `bugFix` e moverte para esa rama.","","Inda así, hai un atallo: se ti quixeras crear unha nova ","rama e moverte a ela ó mesmo tempo, ti podes escribir simplemente ","`git checkout -b [a-tua- rama]`."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches Git","","Les branches sous Git sont incroyablement légères. Elles sont simplement des références sur un commit spécifique -- rien de plus. C'est pourquoi beaucoup d'enthousiastes répètent en cœur :","","```","des branches le plus tôt possible, et des branches souvent","```","","Parce qu'il n'y a pas de surcoût (stockage/mémoire) associé aux branches, il est facile de diviser son travail en de nombreuses branches plutôt que d'avoir quelques grosses branches.","","Nous verrons comment les branches et les commits interagissent quand nous les utiliserons ensemble. Pour l'instant, souvenez-vous qu'une branche est un moyen d'exprimer \"Je veux inclure le contenu de ce commit et de tous les commits parents.\""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Regardons à quoi ressemblent les branches en pratique.","","Nous allons nous positionner (checkout) dans une nouvelle branche appellée `newImage`."],afterMarkdowns:["Et voilà, c'est tout ! La branche `newImage` se réfère désormais au commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Travaillons maintenant dans cette branche. Appuyez sur le bouton ci-dessous."],afterMarkdowns:["Oh non! La branche `main` a bougé mais pas la branche `newImage` ! C'est parce que nous n'étions pas \"sur\" la nouvelle branche, comme indiqué par l'astérisque (*) sur `main`."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Indiquons à Git que nous voulons nous positionner sur la branche avec ","","```","git checkout [nom]","```","","Cela nous positionne sur la nouvelle branche avant de faire un commit avec nos modifications."],afterMarkdowns:["C'est parti ! Nos modifications ont été enregistrées sur la nouvelle branche."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Vous êtes fin prêt pour faire des branches. Après la fermeture de cette fenêtre,","faites une nouvelle branche nommée `bugFix` et positionnez-vous sur cette branche."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branch",""," Git 的分支也非常轻量。它们只是简单地指向某个提交纪录 —— 仅此而已。所以许多 Git 爱好者传颂:","","```","早建分支!多用分支!","```","","这是因为即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。","","在将分支和提交记录结合起来后,我们会看到两者如何协作。现在只要记住使用分支其实就相当于在说:“我想基于这个提交以及它所有的 parent 提交进行新的工作。”"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们通过实际操作来看看分支是什么样子的。","","接下来,我们将要创建一个到名为 `newImage` 的分支。"],command:"git branch newImage",afterMarkdowns:["看到了吗,创建分支就是这么容易!新创建的分支 `newImage` 指向的是提交记录 `C1`。"],beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在咱们试着往新分支里提交一些东西。点击下面的按钮"],command:"git commit",afterMarkdowns:["哎呀!为什么 `main` 分支前进了,但 `newImage` 分支还待在原地呢?!这是因为我们没有“在”这个新分支上,看到 `main` 分支上的那个星号(*)了吗?这表示当前所在的分支是 `main`。"],beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在咱们告诉 Git 我们想要切换到新的分支上","","```","git checkout ","```","","下面的命令会让我们在提交修改之前先切换到新的分支上"],command:"git checkout newImage; git commit",afterMarkdowns:["这就对了!我们的修改已经保存到新的分支里了。"],beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*注意:在 Git 2.23 版本中,引入了一个名为 `git switch` 的新命令,最终会取代 `git checkout`,因为 `checkout` 作为单个命令有点超载(它承载了很多独立的功能)。","由于现在很多人还无法使用 `switch`,本次课程仍然使用 `checkout` 而不是 `switch`,",'但是如果你想尝试一下新命令,我们的应用也是支持的!并且你可以从这里学到更多关于新命令的内容。*']}},{type:"ModalAlert",options:{markdowns:["OK,你们都已经准备好使用分支了。当前窗口关闭后,","创建一个名为 `bugFix` 的新分支,然后切换过去。","","对了,有个更简洁的方式:如果你想创建一个新的分支同时切换到新创建的分支的话,可以通过 `git checkout -b ` 来实现。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git 的 branch",""," git 的 branch 非常不佔空間。它們只是一個指向某個 commit 的 reference,就這麼簡單。所以許多 git 的愛好者會建議:","","```","早點建立 branch!經常建立 branch!","```","","因為建立 branch 不怎麼會佔用到硬碟空間或者是記憶體,所以你可以把你目前的工作分成好幾個 branch,這比只用一個 branch 要來的好。","","同時使用 branch 和 commit 時,我們待會可以看到兩者如何配合。現在,只要記住使用 branch 其實就是在說:「我想要包含這一次的 commit 以及它的所有 parent 的 commit。」"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["舉一個例子來看看 branch 到底是什麼。","","這裡,我們建立一個名稱為 `newImage` 的新的 branch。"],command:"git branch newImage",afterMarkdowns:["看吧!這就是建立 branch 所需的操作啦! `newImage` branch 現在指向 commit `C1`。"],beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在讓我們這個新的 branch 做一些操作。點擊下面的按鈕。"],command:"git commit",afterMarkdowns:["太奇怪了啦! `main` branch 前進了,但 `newImage` branch 沒有前進!這是因為我們沒有「在」這個新的 branch 上,這也是為什麼星號(*)會在 `main` 上。"],beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用如下指令告訴 git 我們想要切換到新的 branch","","```","git checkout [name]","```","","這可以讓我們在 commit 之前切換到新的 branch。"],command:"git checkout newImage; git commit",afterMarkdowns:["太好了!新的 branch 已經記錄了我們的修改。"],beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["好啦,你已經準備好使用 branch 了。當目前的視窗關閉後,","建立一個叫 `bugFix` 的新的 branch,然後切換過去。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 브랜치","","깃의 브랜치도 놀랍도록 가볍습니다. 브랜치는 특정 커밋에 대한 참조(reference)에 지나지 않습니다. 이런 사실 때문에 수많은 Git 애찬론자들이 자주 이렇게 말하곤 합니다:","","```","브랜치를 서둘러서, 그리고 자주 만드세요","```","","브랜치를 많이 만들어도 메모리나 디스크 공간에 부담이 되지 않기 때문에, 여러분의 작업을 커다른 브랜치로 만들기 보다, 작은 단위로 잘게 나누는 것이 좋습니다.","",'브랜치와 커밋을 같이 쓸 때, 어떻게 두 기능이 조화를 이루는지 알아보겠습니다. 하지만 우선은, 단순히 브랜치를 "하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역"이라고 기억하시면 됩니다.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["브랜치가 어떤 것인지 연습해보죠.","","`newImage`라는 브랜치를 살펴보겠습니다."],afterMarkdowns:["저 그림에 브랜치의 모든 것이 담겨있습니다! 브랜치 `newImage`가 커밋 `C1`를 가리킵니다"],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["이 새로운 브랜치에 약간의 작업을 더해봅시다. 아래 버튼을 눌러주세요"],afterMarkdowns:["앗! `main` 브랜치가 움직이고, `newImage` 브랜치는 이동하지 않았네요! 그건 우리가 새 브랜치 위에 있지 않았었기 때문입니다. 별표(*)가 `main`에 있었던 것이죠."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["아래의 명령으로 새 브랜치로 이동해 봅시다.","","```","git checkout [브랜치명]","```","","이렇게 하면 변경분을 커밋하기 전에 새 브랜치로 이동하게 됩니다."],afterMarkdowns:["이거죠! 이제 우리의 변경이 새 브랜치에 기록되었습니다!"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["좋아요! 이제 직접 브랜치 작업을 연습해봅시다. 이 창을 닫고,","`bugFix`라는 새 브랜치를 만드시고, 그 브랜치로 이동해보세요"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ветвление в Git","","Ветки в Git, как и коммиты, невероятно легковесны. Это просто ссылки на определённый коммит — ничего более. Вот почему многие фанаты Git повторяют мантру","","```","делай ветки сразу, делай ветки часто","```","","Так как создание множества веток никак не отражается на памяти или жестком диске, удобнее и проще разбивать свою работу на много маленьких веток, чем хранить все изменения в одной огромной ветке.","","Чуть позже мы попробуем использовать ветки и коммиты, и вы увидите, как две эти возможности сочетаются. Можно сказать, что созданная ветка хранит изменения текущего коммита и всех его родителей."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, что такое ветки на практике","","Создадим здесь новую ветку с именем newImage."],afterMarkdowns:["Вот и всё, ребята! Ветка newImage теперь указывает на коммит C1."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Теперь попробуем сделать некоторые изменения в этой ветке. Для этого нажми кнопку ниже."],afterMarkdowns:["О-оу! Ветка main сдвинулась, тогда как ветка newImage - нет! Всё из-за того, что мы не переключились на новую ветку, а остались в старой, о чём говорит звёздочка около ветки main."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Сообщим Git, что хотим выбрать ветку","","```","git checkout [name]","```","","Эта команда перенесёт нас на новую ветку в момент, когда мы ещё не коммитили изменения"],afterMarkdowns:["Вот так! Наши изменения записаны уже в новую ветку"],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ну что ж, теперь ты готов к работе с ветками. Как только это окно закроется,","создай ветку с именем bugFix и переключись на неё.","","Кстати вот тебе совет, ты можешь создать новую ветку и переключиться на неё","с помощью одной команды: ```git checkout -b [yourbranchname]```."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Гілки в Git","","Гілки в Git також є дивовижно легкими. Вони є просто посиланнями на конкретний коміт, нічого більше. Через це багато Git-ентузіастів повторюють мантру:","","```","роби гілки завчасно, роби гілки часто","```","","Через те, що сворення нових гілок ніяк не впливає на використання пам’яті чи дискового простору, набагато простіше розділити свою роботу на кілька логічно зв’язаних по функціоналу гілок, ніж працювати з величезними гілками.","","Коли ми почнемо використовувати гілки та коміти, ми побачимо, як вони поєднуються між собою. Але зараз просто запам’ятай, що гілка просто зберігає роботу теперішнього коміту і всіх його попередників."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте на практиці подивимось, як виглядають гілки в Git.","","Зараз ми створимо нову гілку `newImage`."],afterMarkdowns:["Ось і все, що треба знати про гілки. Гілка `newImage` тепер посилається на коміт `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте спробуємо додати якусь інформацію до цієї нової гілки. Натисни кнопку внизу."],afterMarkdowns:['От халепа! Гілка `main` просунулася вперед, але гілка `newImage` — ні! Це тому, що ми були не "на новій гілці". Через це зірочка (*) була поруч з `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте вкажемо Git, що ми хочемо перейти на нову гілку за допомогою","","```","git checkout [ім’я]","```","","Ця команда перекине нас на нову гілку до того, як ми закомітимо наші зміни."],afterMarkdowns:["Ось і все! Наші зміни були записані в нову гілку."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Тепер ти готовий до створення гілок. Як тільки це вікно пропаде, ","зроби нову гілку з назвою `bugFix` та перейди на неї."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh Git","","Nhánh trong Git cũng nhẹ đến không ngờ. Chúng chỉ đơn giản là các con trỏ đến commit -- không hơn. Đó là lý do các con chiên Git hay niệm chú:","","```","rẽ nhánh sớm, rẽ nhánh thường xuyên","```","","Bởi vì chẳng tốn bao nhiêu bộ nhớ cho việc rẽ nhánh cả và nó dễ dàng phân chia công việc hơn là có một cái nhánh to tổ chảng.","",'Khi bạn trộn lẫn commit và nhánh, bạn sẽ thấy chúng kết hợp với nhau thế nào. Hãy nhớ về cơ bản nhánh muốn nói "Tôi muốn thành quả trong commit này và tất cả cha ông của nó"']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào hãy xem nhánh trong Git hoạt động thế nào.","","Giờ chúng ta tạo một nhánh mới tên là `newImage`."],afterMarkdowns:["Đó, rẽ nhánh là thế đó! Nhánh `newImage` giờ đã tham chiếu đến commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào cùng thử thêm nội dung vào nhánh mới này nào. Hãy bấm nút bên dưới."],afterMarkdowns:['Ồ không! Nhánh `main` đã di chuyển nhưng nhánh `newImage` thì không! Đó là do ta không "nằm trên" nhánh mới, đó là tại sao dấu hoa thị (*) nằm trên nhánh `main`.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào cùng bảo Git chuyển ta sang nhánh khác với lệnh","","```","git checkout ","```","","Lệnh này sẽ chuyển ta sang nhánh mới trước khi commit."],afterMarkdowns:["Đó! Thay đổi của ta đã được lưu sang nhánh mới."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Note: Ở phiên bản Git 2.23, một câu lệnh mới được giới thiệu mang tên `git switch`, mục đích là để thay thế cho lệnh `git checkout`, ","vì lệnh cũ có quá nhiều tham số, mỗi tham số truyền vào sẽ thực hiện nhiều thứ khác nhau. Bài học này vẫn sẽ sử dụng ","`checkout` thay vì `switch`, vì lệnh `switch` hiện vẫn đang trong giai đoạn thử nghiệm và cú pháp có thể thay đổi trong tương lai. ","Mặc dù vậy, bạn vẫn có thể thử dùng câu lệnh `switch` ở ứng dụng này, và ",'tìm hiểu thêm tại đây.* ']}},{type:"ModalAlert",options:{markdowns:["Được rồi! Bạn đã sẵn sàng để tập rẽ nhánh rồi. Khi cửa sổ này đóng lại,","tạo một nhánh mới tên là `bugFix` và chuyển sang nhánh đó.","","Tiện thể, có đường tắt đấy: nếu bạn muốn tạo nhánh mới ","VÀ đồng thời chuyển sang luôn, bạn chỉ cần ","gõ `git checkout -b [yourbranchname]`."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branches","","Tudi branchi v Gitu so izredno majhni. To so preprosto kazalci na določen commit -- nič več. Zato veliko Git navdušencev ponavlja:","","```","branchaj zgodaj in branchaj pogosto","```","","Ker ustvarjanje večih branchev ne porablja dodatnega spomina ali prostora, je lažje logično razdeliti svoje delo kot imeti velike branche.","",'Ko začnemo mešati branche in commite, bomo videli kako se te dve funkcionalnosti dopolnjujeta. Za zdaj si zapomni samo to, da branch ubistvu pomeni "Hočem vključiti delo tega commita in commite vseh njegovih staršev."']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo kako branchi izgledajo v praksi.","","Tu bomo ustvarili nov branch imenovan `newImage`."],afterMarkdowns:["Tako, to je vsa umetnost branchanja! Branch poimenovan `newImage` se sedaj nanaša na commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poizkusimo dodati nekaj dela na ta nov branch. Pristisni gumb spodaj."],afterMarkdowns:['O ne! `main` branch se je premaknil ampak `newImage` branch se pa ni! To je zato, ker nismo bili "na" novem branchu, kot smo lahko videli z označeno zvezdico (*) na `main` branchu.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Povejmo gitu, da želimo checkoutat branch z","","```","git checkout ","```","","To nas bo postavilo na nov branch pred commitanjem sprememb."],afterMarkdowns:["Tako je! Naše sprememebe so zabeležene na novem branchu."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["Ok! Pripravljen si, da začneš branchat. Ko se to okno zapre, ","ustvari nov branch z imenom `bugFix` in preklopi na ta branch.","","Mimogrede, tu je bližnjica: če hočeš narediti nov ","branch IN ga hkrati checkoutati, lahko enostavno ","natipkaš `git checkout -b [imeTvojegaBrancha]`."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branch","","Gałęzie w Gicie zajmują niezwykle mało zasobów. Są po prostu wskaźnikami do konkretnego commita. Dlatego, wielu entuzjastów Gita przestrzega mantry:","","```","twórz gałęzie wcześnie i często","```","","W polskim nazewnictwie stosuje się wymiennie nazwę branch oraz gałąź. Natomiast commit (zatwierdzenie) stosuje się tylko w różnych odmienionych formach, np. commita, commitów itp.","","Tworzenie wielu gałęzi nie wiąże się z żadnymi dodatkowymi kosztami, więc warto dzielić swoją pracę na pojedyńcze funkcjonalności i bug-fixy.","",'Kiedy zaczniemy mieszać gałęzie i commity, zobaczymy, jak łączą się te dwie funkcje. Na razie jednak pamiętaj, że branch zasadniczo mówi: "Chcę uwzględnić pracę tego commita oraz wszystkie poprzednie commity".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak wyglądają gałęzie w praktyce.","","Tutaj utworzymy nową gałąź o nazwie `myBranch`."],afterMarkdowns:["To wszystko o rozgałęzianiu! Gałąź `myBranch` odnosi się teraz do commita `C1`."],command:"git branch myBranch",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spróbujmy trochę popracować nad tą nową gałęzią.\nKliknij przycisk poniżej."],afterMarkdowns:['O nie! Gałąź `main` uległa zmianie, a gałąź `myBranch` nie! To dlatego, że nie byliśmy "w" nowej gałęzi, co podpowiada gwiazdka (*) przy `main`'],command:"git commit",beforeCommand:"git branch myBranch"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Powiedzmy gitowi, z którą gałęzią chcemy pracować","","```","git checkout ","```","","Spowoduje to przeniesienie nas do nowej gałęzi przed wprowadzeniem zmian."],afterMarkdowns:["Gotowe! Nasze zmiany zostały zarejestrowane w nowej gałęzi."],command:"git checkout myBranch; git commit",beforeCommand:"git branch myBranch"}},{type:"ModalAlert",options:{markdowns:["*Uwaga: w wersji 2.23 Gita zostało wprowadzono nowe polecenie o nazwie \n`git switch`, które zastępuje polecenie `git checkout`, ","które jest nieco przeciążone (robi wiele oddzielnych rzeczy zależnie od argumentów). Tutaj będziemy omawiać tylko","`git checkout`, ponieważ wciąż jest to najczęściej stosowane polecenie.",'Mimo to, możesz wypróbować funkcjonalność `switch` sam. Aplikacja jest na to gotowa! Dowiedz się wiecej.* ']}},{type:"ModalAlert",options:{markdowns:["Okej, teraz możesz samodzielnie zacząć tworzyć gałęzie.","Po zamknięciu tego okna stwórz nową gałąź o nazwie `bugFix` i przełącz się na nią.","","Przy okazji, oto skrót: jeśli chcesz stworzyć","nową gałąź ORAZ się na nią przełączyć,","użyj `git checkout -b `."]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["## கிட் கிளைகள்","","கிட் கிளைகள் மிகவும் இலகுவானவை. அவை ஒரு குரிப்பிட்ட கமிட்டினை சுட்டி காட்டும் ஒரு இணைப்பு குறியீடு மட்டும்தான். இதனால்தான் பல கிட் ஆர்வலர்கள் உச்சரிக்கும் மந்திரம்:","","```","மாற்றம் செய்யும் முன்பே கிளையை உருவாக்குங்ள், அடிக்கடி தேவை என்றால் மேலும் கிளைகளை உருவாக்குங்கள்.","```","","ஏன் என்றால் புதிய கிளைகளை உருவாகுவது சேமிப்புபலுவோ / நினைவக மேலான்மை பலுவோ முற்றிலும் இல்லை, பெரிய பல்வேரு மற்றங்களை கொண்ட பலுமிக்க கிளைகளைக் காட்டிலும் உங்கள் வேலையை தர்க்கமாக சிரு சிரு கிளைகளக பிரிப்பது எளிது.","",'கிளைகள் மற்றும் கமிட்டுகளை கொண்ட கலவை உருவாக்கும் போது இவை இரண்டின் இனக்கத்தினை விவாதிப்போம். தற்ப்போது, கிளை உருவாக்குதல் என்பதை "இந்த கமிட்டுடன் இதர்க்கு முன் இருந்த அனைத்து கமிட்டுகளையும் தொகுக்க விரும்புகிறேன்." என்பதாக கருதலாம்.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது நாம் ஒரு கிளை எப்படி இருக்கும் என்பதை பயிற்ச்சி செய்து பார்க்கலாம்.","","இங்கு `newImage` என்ற பதிய கிளை ஒன்றை உருவாக்குவோம்."],afterMarkdowns:["அவ்வலவு தான், `newImage` என்ற புதிய கிளை தயாராகி விட்டது மேலும் அது `C1` என்ற கிட்டை மூலமாக குறிக்கும்படி உள்ளது."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது அதில் சில மாற்றங்களை இணைப்போம். கீலே உள்ள பித்தேனை அமுக்கவும்."],afterMarkdowns:['அடடா! `newImage`க்கு மாறாக `main` கிளை முன்னேறி உள்ளது! ஏன் என்றால் நாம் "அந்த" புதிய கிளையில் இல்ல, அதனால்தான் நட்சத்திரக் குறி (*) `main` மேலுள்ளது.'],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது நாம் கிட்டை கிளை தாவ சொல்லுவோம்.","","```","git checkout ","```","","புதிய மாற்றங்களை கமிட் செய்யும் முன்பு இது நம்மை புதிய கிளைக்கு மாற்றும்."],afterMarkdowns:["அவ்வலவுதான்! நமது மாற்றங்கள் புதிய கிளையின் பதிவு செய்ய பட்டுள்ளது."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*குறிப்பு: கிட் 2.23 முதல், `git switch` என்ற புதிய கட்டளை `git checkout`க்கு மாற்றாக அறிமுகம் செய்ய பட்டுள்ளது, ","ஏன் என்றால் அது ஒரே கட்டளையில் அதிகப்படியான வேளைகளை செய்கிறது (சொல்லப்போனால் அது கொத்தாக பல தனிப்பட்ட செயல்களை செய்கின்றது). ","இன்னு பலர் `switch` பயன்படுத்த வழி இல்லாததால் இங்குள்ள பாடங்கள் இன்னும் `switch`க்கு பதில் `checkout` பயன்படுத்து கின்றது. ",'இருப்பினும் இந்த செயலியில் நீங்கள் `switch`ஐ முயற்சிக்க விரும்பினால் செய்யலாம்! மேலும் விவரங்களுக்கு.* ']}},{type:"ModalAlert",options:{markdowns:["சரி! நீங்கள் இப்போது கிட் கிளை உருவாக்க தயார். இந்த திரை மூடப்பட்டவுடன்,","`bugFix` எனும் கிளை உருவாக்கி அந்த கிளைக்கு மாறவும்.","","சொல்லபோனால், இதற்க்கு ஒரு குறுக்குவழி உள்ளது: ஒரு புதிய கிளையை உருவாக்கி ","உடனெ அதற்க்கு மாற, நீங்கள்","`git checkout -b [yourbranchname]` என கட்டளையிட்டால் போதும்."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami Git","","Anche i rami in Git sono incredibilmente leggeri. Sono semplicemente puntatori a uno specifico commit -- nulla di più. Questo è il motivo per cui gli appassionati di Git predicano:","","```","ramifica presto, e ramifica spesso","```","","Poiché non c'è un sovraccarico della memoria nel fare molti rami, è più semplice suddividere il lavoro piuttosto che avere rami enormi.","",'Quando inizieremo a mischiare rami e commit, vedremo come queste caratteristiche si combinano. Per ora, però, ricorda che un ramo essenzialmente dice "Voglio includere il lavoro di questo commit e tutti i commit del genitore".']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo nella pratica cosa sono i rami.","","Qui creeremo un nuovo ramo di nome `newImage`."],afterMarkdowns:["Ecco, questa è la divisione in rami! Il ramo `newImage` ora punta al commit `C1`."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Proviamo ad aggiungere un po' di lavoro su questo nuovo ramo. Premi il pulsante qua sotto."],afterMarkdowns:["Oh no! Il ramo `main` si è spostato ma il ramo `newImage` no! Questo perché non eravamo sul nuovo ramo, infatti l'asterisco (*) era su `main`."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diciamo a Git che vogliamo selezionare il ramo con","","```","git checkout ","```","","Questo ci metterà sul nuovo ramo prima di fare un nuovo commit."],afterMarkdowns:["Ecco qua! I cambiamenti sono stati memorizzati sul nuovo ramo."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Nota: In Git versione 2.23, è stato introdotto un nuovo comando, `git switch`, per sostituire `git checkout`, ","che è sovraccaricato di funzionalità (fa un sacco di cose diverse). Queste lezioni usano comunque ","`checkout` invece che `switch` perché molti non hanno ancora accesso a `switch`, ma quest'app supporta comunque il comando ",'se sei curioso di provarlo! Potete scoprire di piu qui.* ']}},{type:"ModalAlert",options:{markdowns:["Ok! Ora sei pronto a lavorare con i rami. Dopo che questa finestra si chiude,","crea un nuovo ramo `bugFix` e passa su quel ramo.","","Comunque, c'è una scorciatoia: se vuoi creare un nuovo ","ramo E selezionarlo in un solo passaggio, puoi semplicemente ","digitare `git checkout -b [yourbranchname]`."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Branch'leri","","Git'teki branch'ler (dallar), son derece hafif ve sadece belirli bir commit'e işaret eden işaretçilerdir - fazlası değil. -- İşte bu nedenle birçok Git tutkunu şunu söyler:","","```","erken branch'le, sık sık branchle","```","","Git'te birçok branch oluşturmanın depolama/bellek açısından herhangi bir fazlalığı yoktur, bu nedenle işinizi mantıklı bir şekilde bölmek daha kolay ve akıllıca olacaktır.","","Branch'leri ve commit'leri birleştirmeye başladığımızda, bu iki özelliğin nasıl bir araya geldiğini göreceğiz. Şimdilik sadece unutmayın ki bir branch, temelde \"Bu commit'te yaptığım çalımanının ve diğer tüm üst düzey commit'leri dahil etmek istiyorum.\" der."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pratikte branch'ler nasıl işliyor görelim.","","Burada `newImage` adında bir branch oluşturuyoruz."],afterMarkdowns:["İşte bu kadar şimdi `newImage` branch'i `C1` commit'ine işaret ediyor."],command:"git branch newImage",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Şimdi bu branch'te biraz çalışma yapalım, aşağıdaki düğmeye tıklayın."],afterMarkdowns:["Oh hayır! `main` branch'i hareket etti ama `newImage` branch'i etmedi! Bu, yeni branch \"üzerinde\" olmadığımız için meydana geldi, ki (*) işaretinin `main` üzerinde olması da bunu göstermektedir."],command:"git commit",beforeCommand:"git branch newImage"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Git'e aşağıdaki komut ile başka bir branch'e geçmek istediğimizi söyleyelim","","```","git checkout ","```","","Bu değişikliklerimizi commit'lemeden önce bizi yeni branch'e yönlendirecek."],afterMarkdowns:["İşte bu! Değişikliklerimiz yeni branch'te kaydedildi."],command:"git checkout newImage; git commit",beforeCommand:"git branch newImage"}},{type:"ModalAlert",options:{markdowns:["*Not: Git'in 2.23 sürümünde, `git checkout`'un yerine geçmek üzere `git switch` adında yeni bir komut tanıtıldı, ","Bu komut, bazı argümanlara bağlı olarak bir dizi farklı işlem yapabilmektedir. ","Buradaki dersler hala `switch` yerine `checkout` kullanılarak anlatılacaktır, çünkü switch komutu hala deneysel kabul ediliyor ve sözdizisi ","gelecekte değişebilir. Bununla birlikte, bu uygulamada yeni `switch` komutunu deneyebilir ve ayrıca daha fazla bilgi için buraya bakabilirsiniz. ",'git switch.* ']}},{type:"ModalAlert",options:{markdowns:["Hazırsınız! Şimdi branch oluşturmaya başlayabilirsiniz. Bu pencere kapanır kapanmaz,","`bugFix` adında yeni bir branch oluşturun ve bu branch'e geçin.","","Bu arada, size bir kısayol: Eğer yeni bir branch oluşturmak ve ","aynı anda bu branch'e geçmek isterseniz, sadece ","`git checkout -b [yourbranchname]` komutunu kullanabilirsiniz."]}}]}}}},{}],123:[function(e,t,o){o.level={name:{en_US:"Introduction to Git Commits",de_DE:"Einführung in Git Commits",es_AR:"Introducción a los commits de Git",es_MX:"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",ja:"Gitのコミット",ko:"Git 커밋 소개",zh_CN:"Git Commit",zh_TW:"介紹 git commit ",ru_RU:"Знакомство с Git Commit ",uk:"Знайомство з комітами в Git",vi:"Giới thiệu về Git Commit",sl_SI:"Uvod v Git Commit",pl:"Wprowadzenie do commitów Gita",it_IT:"Introduzione ai commit in Git",ta_IN:"கிட் கமிட்கள் ஒரு அறிமுகம்",tr_TR:"Git Commit'e Giriş"},goalTreeString:'{"branches":{"main":{"target":"C3","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}',solutionCommand:"git commit;git commit",startTree:'{"branches":{"main":{"target":"C1","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}',hint:{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_MX:"¡Simplemente escribe '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 !",zh_CN:"执行两次 'git commit' 就可以过关了!",zh_TW:"輸入兩次 'git commit' 就可以完成!",ja:"'git commit'コマンドを2回打てば完成!",ko:"'git commit'이라고 두 번 치세요!",ru_RU:"Попробуй дважды выполнить команду 'git commit' ;)",uk:"Спробуй двічі виконати команду 'git commit' ;)",vi:"Đơn giản là cứ gõ 'git commit' 2 lần",sl_SI:"Preprosto dvakrat vpiši 'git commit' in zaključi!",pl:"Aby zakończyć, wystarczy dwukrotnie wpisać 'git commit'!",it_IT:"Digita 'git commit' due volte per finire!",ta_IN:"இந்த நிலையை நிரைவு செய்ய 'git commit' என்று இரண்டு முறை தட்டச்சு செய்க!",tr_TR:"Bölümü bitirmek için sadece iki kere 'git commit' yazmanız yeterlidir."},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","A commit in a git repository records a snapshot of all the (tracked) files in your directory. It's like a giant copy and paste, but even better!","",'Git wants to keep commits as lightweight as possible though, so it doesn\'t just blindly copy the entire directory every time you commit. It can (when possible) compress a commit as a set of changes, or a "delta", from one version of the repository to the next.',"","Git also maintains a history of which commits were made when. That's why most commits have ancestor commits above them -- we designate this with arrows in our visualization. Maintaining history is great for everyone working on the project!","","It's a lot to take in, but for now you can think of commits as snapshots of the project. Commits are very lightweight and switching between them is wicked fast!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see what this looks like in practice. On the right we have a visualization of a (small) git repository. There are two commits right now -- the first initial commit, `C0`, and one commit after that `C1` that might have some meaningful changes.","","Hit the button below to make a new commit."],afterMarkdowns:["There we go! Awesome. We just made changes to the repository and saved them as a commit. The commit we just made has a parent, `C1`, which references which commit it was based off of."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Go ahead and try it out on your own! After this window closes, make two commits to complete the level."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Ein Commit in einem Git-Repository speichert eine Abbildung aller Dateien in deinem Projektverzeichnis. Es ist wie ein riesiges Kopieren und Einfügen, nur besser.","","Allerdings will Git die Commits so schlank wie möglich halten, also kopiert es nicht einfach stur das ganze Verzeichnis jedes Mal wenn du committest. Es kann (wenn möglich) Commits als Menge von Änderungen zusammenpacken, von einer Version des Repositorys zur nächsten.","","Außerdem führt Git ein Protokoll darüber, welche Commits wann gemacht wurden, und welcher auf welchen folgt. Deshalb werden die Commits hier mit ihrem Vorgänger über sich gezeigt -- wir verwenden Pfeile zur Darstellung der Beziehung. Dieses Protokoll zu haben ist eine tolle Sache für jeden, der an einem Projekt arbeitet.","","Das war jetzt eine Menge Neues, aber vorerst kannst du dir Commits einfach als Abbildungen des Projekts vorstellen. Commits sind sehr ressourcenschonend, und zwischen ihnen wechseln geht superschnell!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Mal sehen wie das in der Praxis ist. Rechts sehen wir ein (kleines) Git-Repository. Es gibt aktuell zwei Commits -- den initialen, `C0`, und den danach, `C1`, der irgendwelche Änderungen enthält.","","Klick die Schaltfläche unten um einen neuen Commit zu erzeugen:"],afterMarkdowns:["Fertig. Klasse! Wir haben gerade Änderungen gemacht und als Commit im Repository gespeichert. Der Commit, den wir gerade gemacht haben, hat den Vorgänger `C1`; der verweist wiederum auf den Commit, auf dem er basiert: `C0`."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Probier das Committen gleich mal aus! Mach zwei Commits um den Level abzuschließen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitのコミット","コミットによって、ディレクトリ中の全てのファイルのスナップショットを記録します。巨大なコピー&ペーストのようなものですが、実際にはそれよりずっと良いものです。","","Gitではコミットを可能な限り軽量に保つために、コミット毎にフォルダ全体をコピーしません。実際にはGitは、コミットを直前のバージョンから一つ先のバージョンへの「変更の固まり」あるいは「差分」として記録します。後で出てきますが、ほとんどのコミットが親を持っているのはそういう理由からです。","","リポジトリをcloneする時には、内部動作としてはコミットの差分をたどって全ての変更を取得しています。cloneした時に以下のような表示が出るのは:","","`resolving deltas`(訳:差分を解決中)","","このためです。","","もっと説明したいところですが、しばらくはコミットをスナップショットのようなものだと考えてください。コミットは非常に軽量であり、コミット間の移動も非常に高速です。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["これがどういうことか、動きを見ていきましょう。図には(小さな)gitリポジトリが描かれています。コミットが2つあります -- `C0`という名前の初回のコミットがあり、`C1`という名前の次のコミットが続きます。これは何か意味のある変更かもしれません。","","下のボタンを押下して新しいコミットを作ってみましょう。"],afterMarkdowns:["できました! 良いですね。いまリポジトリに新しい変更が加えられ、1つのコミットとして保存されました。作成したコミットには親がいて、このコミットの出発点となった`C1`を指しています。"],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["実際に手を動かしてみましょう。このウィンドウを閉じたら、試しに2回コミットをしてみましょう。"]}}]},es_AR:{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 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!","","Hay un montón en lo que ahondar, pero por ahora podés 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 ahora: 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 hacer un nuevo commit."],afterMarkdowns:["¡Ahí 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 que se basó este."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["¡Dale, intentalo vos ahora! Cuando se cierre esta ventana, hacé dos commits para completar el nivel."]}}]},es_MX:{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 commit. 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!","","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 ahora: 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 hacer un nuevo commit."],afterMarkdowns:["¡Ahí 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 que se basó este."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["¡Vamos, inténtalo ahora! Cuando se cierre esta ventana, haz dos commits para completar el nivel."]}}]},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:[{type:"ModalAlert",options:{markdowns:["## Commits no Git","Um commit em um repositório git registra uma fotografia (snapshot) de todos os arquivos no seu diretório. É como um _grande_ copy&paste, mas ainda melhor!","",'O Git tem por objetivo manter os commits tão leves quanto possível, de forma que ele não copia cegamente o diretório completo toda vez que você commita. Ele pode (quando possível) comprimir um commit como um conjunto de mudanças (ou um _"delta"_) entre uma versão do seu repositório e a seguinte.',"","O Git também mantém um histórico de quando ocorreu cada commit. É por isso que a maioria dos commits tem ancestrais acima de si -- que indicamos usando setas na nossa visualização. Manter a história é ótimo para todos que trabalham no projeto!","","Há muito para aprender, mas por enquanto pense nos commits como snapshots do seu projeto. Os commits são muito leves, e mudar de um para outro é extremamente rápido!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos o que isso significa na prática. À direita, temos uma visualização de um (pequeno) repositório git. Há dois commits no momento: o commit inicial, `C0`, e um commit que se segue, `C1`, que poderia conter algumas mudanças interessantes.","","Clique no botão abaixo para fazer um novo commit."],afterMarkdowns:["Aí vamos nós! Incrível. Acabamos de fazer mudanças no repositório e as guardamos como um commit. O commit que acabamos de criar tem um pai, `C1`, que referencia em qual commit ele se baseou."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Vamos lá, tente você agora! Quando esta janela se fechar, faça dois commits para completar o nível."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits en Git","Un commit nun repositorio de git rexistra unha fotografía (snapshot) de tódolos arquivos no seu directorio. É coma un copy&paste xigante, ¡pero todavía mellor!","",'Git quere gardar os commits o máis pequenos posíbel, por iso non copia directamente o directorio completo sempre que fas un commit. El pode (cando é posíbel) comprimir nun commit un conxunto de cambios (ou un _"delta"_) entre unha versión do teu respositorio e o seguinte.',"","Git tamén garda un histórico de cando se fixo cada cambio. Por iso a maioría dos commits teñen ancestros enriba deles, e nos indicámolos con frechas na nosa visualización. ¡Manter a historia é óptimo para tódolos que traballan no proxecto!","","Hai moito que aprender, pero por agora podes pensar que os commits son fotos do teu proxecto. Os commits son liviáns, e cambiar dun para o outro é extremadamente rápido!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos o que iso significa na práctica. Á dereita, temos unha visualización dun (pequeno) repositorio de git. Hai dous commits por agora: o commit inicial, `C0`, e un commit que lle segue, `C1`, que podería ter algúns cambios interesantes.","","Pincha no botón de abaixo para facer un novo commit."],afterMarkdowns:["¡Alá imos! Mi ma!. Fixemos cambios no repositorio e gardámolos nun commit. O commit que creaches ten un pai, `C1`, que é unha referencia do commit no que se basea."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Alá imos. ¡Inténtao ti agora! Cando se peche a ventá, fai dous commits para completar o nivel."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits Git","Un commit dans un dépôt Git (repository) enregistre une image (snapshot) de tous les fichiers du répertoire. Comme un Copier-Coller géant, mais en bien mieux !","","Git fait en sorte que les commits soient aussi légers que possible donc il ne recopie pas tout le répertoire à chaque commit. En fait, Git n'enregistre que l'ensemble des changements (\"delta\") depuis la version précédente du dépôt. C'est pour cette raison que la plupart des commits ont un commit parent -- ainsi que nous le verrons plus tard.","",'Pour cloner un dépôt, il faut décompresser ("résoudre") tous ces deltas. C\'est la raison pour laquelle la commande écrit :',"","`resolving deltas`","","lorsque l'on clone un dépôt.","","C'est beaucoup à absorber, mais pour l'instant vous pouvez considérer les commits comme des snapshots du projet. Les commits sont très légers et passer de l'un à l'autre est très rapide !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons à quoi cela ressemble en pratique. Sur la droite, on peut visualiser un (petit) dépôt Git. Il y a pour l'instant deux commits -- le premier commit initial, `C0`, et un commit suivant `C1` qui aurait des changements significatifs.","","Appuyez sur le bouton ci-dessous pour faire un nouveau commit."],afterMarkdowns:["C'est parti ! Super. Nous venons de faire des modifications sur le dépôt et de sauvegarder celles-ci dans un commit. Ce commit que nous venons de faire a un parent, `C1`, qui référence le commit sur lequel il est basé."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Allez-y et essayez par vous-même ! Après la fermeture de cette fenêtre, faites deux commits pour terminer ce niveau."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 커밋","커밋은 Git 저장소에 여러분의 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것입니다. 디렉토리 전체를 복사하여 붙여넣는것과 유사하지만, 훨씬 유용한 방법입니다!","",'Git은 가능한 한 커밋을 가볍게 유지하고자 하기때문에, 커밋할 때마다 디렉토리 전체를 복사하진 않습니다. 각 커밋은 저장소의 이전 버전과 다음 버전의 변경내역("delta"라고도 함)을 저장합니다. 그래서 대부분의 커밋이 그 커밋 위의 부모 커밋을 가리킵니다. -- 다음 화면에서 곧 살펴보게 될 것입니다.',"","저장소를 복제(clone)하려면 모든 변경분(delta)를 풀어내야 하는데, 이 때문에 명령행 결과로 아래 문구를 볼 수 있습니다.","","`resolving deltas`","","알아야 할 것이 꽤 많습니다만, 일단은 커밋을 프로젝트의 스냅샷들로 생각하면 충분합니다. 커밋은 매우 가볍고 커밋 사이의 전환도 매우 빠르다는 것을 기억해주세요!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["연습할 때 어떻게 보이는지 확인해봅시다. 오른쪽 화면에 git 저장소를 그림으로 표현해 놓았습니다. 현재 두번 커밋한 상태입니다 -- 첫번째 커밋으로 `C0`, 그 다음으로 `C1`이라는 어떤 의미있는 변화가 있는 커밋이 있습니다.","","아래 버튼을 눌러 새로운 커밋을 만들어보세요."],afterMarkdowns:["이렇게 보입니다! 멋지죠. 우리는 방금 저장소 내용을 변경해서 하나의 커밋으로 저장했습니다. 방금 만든 커밋은 부모는 `C1`이고, 어떤 커밋을 기반으로 변경된 것인지를 가리킵니다."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["계속해서 직접 한번 해보세요! 이 창을 닫고, 커밋을 두 번 하면 다음 레벨로 넘어갑니다."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commit","Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!","","Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。","","Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有 parent 节点的原因 —— 我们会在图示中用箭头来表示这种关系。对于项目组的成员来说,维护提交历史对大家都有好处。","","关于提交记录太深入的东西咱们就不再继续探讨了,现在你可以把提交记录看作是项目的快照。提交记录非常轻量,可以快速地在这些提交记录之间切换!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们来实际操作一下,看看提交记录是怎样的。右边展示了一个(小型)Git 代码库。当前有两个提交记录 —— 初始提交 `C0` 和其后可能包含某些有用修改的提交 `C1`。","","点击下面的按钮创建一个新的提交记录。"],afterMarkdowns:["好了!非常棒!我们刚才修改了代码库,并把这些修改保存成了一个提交记录 `C2`。`C2` 的 parent 节点是 `C1`, parent 节点是当前提交中变更的基础。"],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["接下来自己试一试吧。当前窗口关闭后,完成两次提交就可以过关!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git commit","一個 commit 在 git repo 中會記錄目錄下所有文件的快照。感覺像是大量的複製和貼上,但 git 的速度更快!","",'git 希望 commit 儘可能地不占空間,所以每次進行 commit 的時候,它不會單純地複製整個目錄。實際上它把每次 commit 視為從目前的版本到下一個版本的變化量,或者說一個 "(delta)"。',"","git 會保存 commit 的歷史紀錄,所以,絕大部分的 commit 的上面都會有 parent commit,在我們的圖形表示中,箭頭方向表示從 parent commit 到所對應的 child commit,保存這樣子的一個歷史紀錄是非常有用的。","","要學的東西有很多,但現在你可以把 commit 當作是當下的 project 的快照。commit 不佔空間且可以快速切換!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在實例中學習 commit。右邊是一個(小)git repository。當前有兩個 commit,一開始的 commit `C0` 以及 `C1` 這一個 commit 來表示之後可能的一些修改。","","點擊下面的按鈕生成新的 commit。"],command:"git commit",afterMarkdowns:["看吧!很厲害!我們對於文件做了一些修改,並且把這些修改表示成一個 commit。剛剛做的 commit `C2` 有一個 parent commit `C1`,代表此次修改是從那裡過來的。"],beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["接下來你可以隨便測試。當目前的視窗關閉之後,輸入兩次 commit 就可以過關!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Коммиты в GIT","Коммит в git репозитории хранит снимок всех файлов в директории. Почти как огромная копия, только лучше","","Git пытается быть лёгким и быстрым насколько это только возможно, так что он не просто слепо копирует всю директорию каждый раз, а ужимает (когда это возможно) коммит в набор изменений или «дельту» между текущей версией и предыдущей.","","Также Git хранит всю историю о том, когда какой коммит был сделан. Вот почему большинство коммитов имеют предков - мы указываем на предков стрелками при визуализации. Поддержка истории коммитов более чем важна для всех, кто работает над проектом!","","Можно ещё долго рассказывать о коммитах, но для простоты будем считать их полными снимками проекта. Коммиты очень легки, так что переключение между ними происходит предельно быстро!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, как это выглядит на практике. Справа расположена визуализация небольшого git репозитория. Сейчас в нём два коммита: первый, исходный коммит С0 и один коммит С1 после него, содержащий изменения.","","Нажми на кнопку, чтобы совершить коммит"],afterMarkdowns:["Отлично. Мы только что внесли изменения в репозиторий и сохранили их как коммит. У коммита, который мы только что сделали, есть родитель, С1, который указывает на предыдущий коммит."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Пора попробовать! После того, как это окно закроется, сделай два коммита, чтобы пройти этот уровень."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Коміти в Git","Коміт в Git репозиторії зберігає моментальну копію всіх файлів в поточній директорії. Це як гігантська копіпаста, тільки краще.","",'Git намагається зберігати коміти якнайпростіше й ефективніше, тому він не просто копіює всю директорію при кожному коміті. Він може стиснути коміт в набір правок чи "дельту" між двома версіями репозиторію.',"","Git також зберігає історію коли і ким був створений той чи інший коміт. Тому більшість комітів мають комітів-предків, що знаходяться вище в ієрархії — ми це зображуємо стрілочками в нашій візуалізації. Історія — це необхідна річ для кожного, хто працює з конкретним проектом.","","Тут є багато над чим подумати, але наразі ти можеш уявляти коміти як моментальні знімки проекту. Коміти майже невагомі й перемикання між ними дуже швидке."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давай подивимось, як це виглядає на практиці. Справа зображена візуалізація маленького Git-репозиторію. Наразі ми бачимо два коміти: початковий коміт `C0`, та наступний коміт `C1`, який містить якісь змістовні зміни.","","Натисни кнопку нижче, щоб створити новий коміт."],afterMarkdowns:["Чудово. Ми щойно зробили деякі зміни з репозиторієм і зберегли їх як новий коміт. Цей коміт має предка `C1`, який вказує на коміт, з якого він був створений."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Спробуй сам. Після того як це вікно закриється, зроби два коміти, щоб пройти цей рівень."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Một commit trong một Git repository (kho chứa) lưu trữ một ảnh chụp của tất cả các file trong thư mục của bạn. Như kiểu copy và paste cỡ bự, thậm chí còn tốt hơn thế!","",'Thế nhưng Git muốn giữ cho các commit nhẹ hết mức có thể, cho nên Git không copy tất cả thư mục một cách mù quáng mỗi khi bạn commit. Nó có thể (khi khả dĩ) nén commit như một tập hợp các thay đổi, hay là một "bản so sánh", giữa một phiên bản kho chứa Git với phiên bản tiếp theo.',"","Đồng thời Git cũng lưu trữ lịch sử commit nào được tạo ra lúc nào. Đó là tại sao hầu hết các commit có commit tổ tiên phía trên nó -- chúng tôi đã hình tượng hóa mối quan hệ này bằng các mũi tên. Trong cộng tác nhóm thì việc gìn giữ lịch sử là rất có ích!","","Có vẻ là hơi nhiều lý thuyết rồi, bây giờ bạn chỉ cần hiểu các commit là các lát cắt của dự án. Các commit rất nhẹ nên việc chuyển qua lại giữa chúng thì nhanh vô cùng!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Thử thực hành chút nào. Ở bên phải chúng ta có mô tả một kho Git (nhỏ). Hiện tại đang có 2 commit, một là commit khởi nguyên `C0`, và một commit sau đó `C1` có thể đã có một vài thay đổi.","","Bấm nút bên dưới để tạo một commit mới."],afterMarkdowns:["Đúng rồi! Tuyệt vời. Bạn vừa tạo thay đổi cho kho chứa và lưu vào commit. Cái commit bạn vừa tạo nó có cha, là `C1` đấy, có thể hiểu commit vừa được tạo dựa trên commit cũ hơn là C1."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Nào bây giờ thì thử tự làm bài tập nào! Sau khi đóng cửa sổ này, tạo ra 2 commit để hoàn thành cấp độ."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Commit v git repozitoriju zabeleži stanje vseh datotek v tvoji mapi. Deluje kot tak velik 'Izreži in Prilepi', vendar še bolje!","",'Git hoče commite ohraniti majhne kot se le da, tako da ne skopira vsakič kar vseh datotek ob commitu. Lahko (kadar je možno) stisne commit le kot množico sprememb oziroma kot "delto" sprememb med eno in drugo različico v repozitoriju.',"","Git vodi tudi zgodovino o tem, kdaj je bil kateri commit narejen. Zato ima večina commitov nad seboj svoje prednike -- to je v vizualizaciji predstavljeno s puščicami. Vzdrževanje zgodovine je uporabno za vse, ki delajo na projektu!","","Veliko je za dojeti na začetku, ampak za zdaj si lahko predstavljaš commite kot posnetek projekta v določenem času. Commiti so zelo majhni in prehajanje med njimi je noro hitro!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo kako to izgleda v praksi. Na desni imamo vizualizacijo (majhnega) git repozitorija. Trenutno imamo dva commita -- prvi začetni commit, `C0`, in še en commit za tem, `C1`, ki ima lahko pomembne spremembe.","","Pritisni gumb spodaj, da narediš nov commit."],afterMarkdowns:["Tako ja! Super. Pravkar smo naredili spremembe v repozitoriju in jih shranili kot commit. Commit, ki smo ga naredili ima starša, `C1`, ki nam pove iz katerega commita smo izhajali."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Čas je, da poizkusiš sam! Ko se to okno zapre, naredi dva commita, da dokončaš to stopnjo."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commity Gita","`commit` w repozytorium Gita rejestruje migawkę wszystkich (śledzonych) plików w twoim katalogu. To jak gigantyczne kopiowanie i wklejanie, ale jeszcze lepsze!","",'Git stara się, aby commity były tak lekkie, jak to tylko możliwe, więc nie kopiuje na ślepo całego katalogu za każdym razem, gdy zatwierdzasz zmiany. Możesz (jeśli to możliwe) skompresować commita jako zestaw zmian (lub _"delta"_) między jedną wersją w repozytorium a następną.',"","Git przechowuje również całą historię, kiedy dokonano każdego zatwierdzenia. Dlatego większość commitów ma na sobie zmiany przodków -- oznaczamy to strzałkami w naszej wizualizacji. Zachowanie historii to świetna funkcja dla wszystkich, którzy pracują nad projektem!","",'To sporo do zapamiętania, ale na razie możesz myśleć o commitach jako "rewizjach" albo migawkach projektu. Są bardzo lekkie, a przełączanie się między nimi jest niesamowicie szybkie!']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak to wygląda w praktyce. Po prawej stronie mamy wizualizację (małego) repozytorium Gita. Istnieją dwa zatwierdzenia:\n początkowy commit `C0`, a następnie po nim commit `C1`, który może mieć kilka interesujących zmian.","","Kliknij przycisk poniżej, aby dodać nowego commita."],afterMarkdowns:["Gotowe! Niesamowite. Właśnie wprowadziliśmy zmiany w repozytorium i zapisaliśmy je jako commita. Commit, który właśnie wykonaliśmy, ma rodzica `C1`, który odnosi się do commitu, na którym się opierał."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Śmiało, wypróbuj to! Po zamknięciu tego okna wykonaj dwa commity, aby ukończyć poziom."]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["## கிட் கமிட்கள்","கிட் கமிட் உங்கள் கோப்பகத்தில் உள்ள கண்காணிக்கப்பட்ட (tracked) கோப்புகளை கிட் களஞ்சியத்தில் ஒரு நகலாக பதிவு செய்கின்றது. ஆனால் இது முழு நகல் எடுத்து ஒட்டுவதை விட சிறந்தது!","",'கிட் கமிட்களை முடிந்தவரை இலகுவாக இருக்கும்படி செய்கின்றது, எனவே நீங்கள் ஒவ்வொரு முறை கமிட் செய்யும் போதும் கிட் கோப்பகங்களை கண்மூடித்தனமாக நகலெடுக்காது. அது (முடிந்தால்) கமிட்களை சுருக்கப்பட்ட மாற்றங்களின் தொகுப்பாகவோ, அல்லது களஞ்சியத்தில் ஏற்க்கனவே உள்ள பதிப்பின் "வேறுபாட்டை" மட்டும் கண்க்கிட்டோ சேமிக்க செயிகிறது.',"","மேலும் கிட் கமிட்கள் எப்போது செய்யப்படுகிறது என்பதன் வரலாற்றையும் பராமரிக்கிறது. அதனால் தான் பெரும்பான்மையான கமிட்கள் முன்பு பதிவிட்ட கமிட்களை பின் தொடருகின்றன -- நமது வரைபடங்கள் அதனை அம்பு குறியீடுகளாக காட்டு கின்றன. வரலாற்றைப் பராமரிப்பது கணினிதிட்டத்தில் பணிபுரியும் அனைவருக்கும் உதவியாக இருக்கும்!","","புரிந்து கொள்ள நிறைய இருக்கிறது, ஆனால் இப்போதைக்கு நீங்கள் கமிட்களை திட்டத்தின் பிரதியாக நினைக்கலாம். கமிட்டுகள் மிகவும் இலகுவானவை மேலும் அவற்றுக்கிடையே மாறுவது மிகவும் எளிமையானது!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இது நடைமுறையில் எப்படி இருக்கும் என்று பார்ப்போம். இங்கு வலதுபுறத்தில் ஒரு (சிறிய) கிட் களஞ்சியத்தின் காட்சிப்படுத்தல் உள்ளது. இப்போது அதில் இரண்டு கமிட்கள் உள்ளன -- முதல் கமிட், `C0`, மற்றும் மேலும் இரண்டாவதாக `C1` அதில் சில பயண்னுள்ள மாற்றங்கள் இருக்கலாம்.","","புதிய கமிட் செய்ய கீழே உள்ள பொத்தானை அழுத்தவும்."],afterMarkdowns:["அவ்வலவுதான்! அருமை. நாம் களஞ்சியத்தில் மாற்றங்களைச் செய்து கமிட்டாக சேமித்துள்ளோம். இப்போது செய்த கமிட்டிர்க்கு `C1` மூலமாக உள்ளது, அது அதனுடைய மூலத்தை தொடர்ந்து உள்ளது."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["இப்போது இந்த திரை மூடிய பிறகு நீங்கள் முயற்சி செய்யுங்கள்!, இந்த நிலையை நிரைவு செய்ய இரண்டு கமிட்டுகள் செய்யுங்கள்."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commits","Un commit in git memorizza un'instantanea di tutti i file (tracciati) della cartella di lavoro. È come un enorme copia-incolla, ma migliore!","",'Git conserva i commit nel modo più leggero possibile, perciò non copia ciecamente l\'intera cartella per ogni commit. Può (ove possibile) comprimere un commit come un insieme di cambiamenti, o "delta", da una versione alla successiva del repository.',"","Git memorizza anche la storia di tutti i commit effettuati. Questo è il motivo per cui molti commit hanno genitori sopra di essi -- questo viene rappresentato con delle frecce nelle nostre spiegazioni. Conoscere la storia è utilissimo per tutti quelli che collaborano ad un progetto!","","C'è tanto da sapere, ma per ora pensa ai commit come a delle instantanee del progetto. I commit sono leggerissimi e si può passare da uno all'altro in un battibaleno!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamolo in pratica. Sulla destra abbiamo l'immagine di un (piccolo) repository git. Ci sono due commit -- il primo commit, `C0`, e un altro dopo, `C1`, che potrebbe avere modifiche importanti.","","Premi il pulsante qua sotto per eseguire un nuovo commit."],afterMarkdowns:["Ecco qua! Fantastico. Abbiamo modificato il repository e salvato con un commit. Il commit che abbiamo creato ha un genitore, `C1`, che ci indica su chi è basato il nostro commit."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Vai avanti e prova da solo! Dopo che questa finestra si chiude, crea due commit per completare il livello."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Commit'leri","Git commit'leri, projenizin tüm (izlenen) dosyalarının anlık bir fotoğrafını çeker. Düşünün ki bu, büyük bir kopyala-yapıştır işlemi gibi, ama işte burada daha eğlenceli bir olay var!","","Git, commit'leri hafif tutmak ister, bu yüzden her seferinde sırf her şeyi körü körüne kopyalamaz. Mümkün olduğunda, bir commit'i değişikliklerin seti olarak sıkıştırabilir veya bir sürümün bir sonraki sürüme olan farkını, yani bir \"delta\"yı yakalayabilir.","","Git aynı zamanda hangi commit'lerin ne zaman yapıldığını da kayıt altında tutar. İşte bu yüzden çoğu commit, üstünde atası olan başka commit'lerle gelir - bu görselde oklarla belirtilir. Tarih tutmak, projede çalışan herkes için harika bir şeydir!","","İlk bakışta karmaşık gelebilir, ama şimdilik commit'leri projenizin anlık fotoğrafları gibi düşünün. Commit'ler hafiftir ve aralarında çok hızlı geçiş yapılabilir!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bakalım bu pratikte nasıl görünüyor. Sağ tarafta, (küçük) bir git deposunun görselleştirmesini görüyorsunuz. Şu anda iki commit var - ilk başlangıç commit'i, `C0`, ve ondan sonra gelen anlamlı değişiklikler içerebilecek bir commit olan `C1`.","","Yeni bir commit için aşağıdaki düğmeye tıklayın."],afterMarkdowns:["İşte bu! Harika. Depoya değişiklikler yaptık ve onları bir commit olarak kaydettik. Yeni yaptığımız commit'in bir atası var, `C1`, bu da commit'imizin ne üzerine inşa edildiğini gösteren bir referans içerir."],command:"git commit",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Şimdi sıra sende! Bu pencere kapanır kapanmaz, seviyeyi tamamlamak için iki commit yap."]}}]}}}},{}],124:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C4","id":"main"},"bugFix":{"target":"C2","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","C2"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"}}',solutionCommand:"git checkout -b bugFix;git commit;git checkout main;git commit;git merge bugFix",name:{en_US:"Merging in Git",de_DE:"Mergen in Git",es_AR:"Mergeando en Git",es_MX:"Haciendo merge 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",ko:"Git에서 브랜치 합치기(Merge)",ja:"ブランチとマージ",zh_CN:"Git Merge",zh_TW:"git 中的 merge",ru_RU:"Слияния веток в Git",uk:"Злиття гілок в Git",vi:"Gộp nhánh trong Git",sl_SI:"Merganje v Gitu",pl:"Merge w Gicie",it_IT:"Fusione in Git",ta_IN:"கிட்டில் இணைத்தல்",tr_TR:"Git'te Merge işlemleri"},hint:{en_US:"Remember to commit in the order specified (bugFix before main)",de_DE:"Denk dran in der angegebenen Reihenfolge zu committen (erst bugFix, dann main)",ja:"指示された順番でコミットすること(mainの前にbugFixで)",es_AR:"Acordate de commitear en el orden especificado (bugFix antes de main)",es_MX:"Acuérdate de hacer commit en el orden especificado (bugFix antes de main)",es_ES:"Acuérdate de hacer commit en el orden especificado (bugFix antes de main)",pt_BR:"Lembre-se de commitar na ordem especificada (bugFix antes de main)",gl:"Lembrate de facer commit na orde específica (bugFix antes de main)",fr_FR:"Pensez à faire des commits dans l'ordre indiqué (bugFix avant main)",zh_CN:"要按目标窗口中指定的顺序进行提交(bugFix 先于 main)",zh_TW:"記住按指定的順序 commit(bugFix 比 main 優先)",ko:"말씀드린 순서대로 커밋해주세요 (bugFix에 먼저 커밋하고 main에 커밋)",ru_RU:"Не забудь делать коммиты в правильном порядке (сначала bugFix, потом main)",uk:"Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім main)",vi:"Nhớ là commit theo đúng thứ tự (bugFix trước main)",sl_SI:"Zapomni si, da je potrebno commitati v pravilnem vrstnem redu (bugfix pred main)",pl:"Pamiętaj, aby commitować w określonej kolejności (bugFix przed main)",it_IT:"Ricorda di effettuare i commit nell'ordine specificato (bugFix prima di main)",ta_IN:"bugFix முன் main என்ற கொடுக்கப்பட்ட வரிசையில் கட்டலை இடுவதை கருத்தில் கொள்க",tr_TR:"Belirlenen sırada commit etmeyi unutmayın (main'den önce bugFix)"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches and Merging","","Great! We now know how to commit and branch. Now we need to learn some kind of way of combining the work from two different branches together. This will allow us to branch off, develop a new feature, and then combine it back in.","",'The first method to combine work that we will examine is `git merge`. Merging in Git creates a special commit that has two unique parents. A commit with two parents essentially means "I want to include all the work from this parent over here and this one over here, *and* the set of all their parents."',"","It's easier with visuals, let's check it out in the next view."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches; each has one commit that's unique. This means that neither branch includes the entire set of \"work\" in the repository that we have done. Let's fix that with merge.","","We will `merge` the branch `bugFix` into `main`."],afterMarkdowns:["Woah! See that? First of all, `main` now points to a commit that has two parents. If you follow the arrows up the commit tree from `main`, you will hit every commit along the way to the root. This means that `main` contains all the work in the repository now.","","Also, see how the colors of the commits changed? To help with learning, I have included some color coordination. Each branch has a unique color. Each commit turns a color that is the blended combination of all the branches that contain that commit.","","So here we see that the `main` branch color is blended into all the commits, but the `bugFix` color is not. Let's fix that..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's merge `main` into `bugFix`:"],afterMarkdowns:["Since `bugFix` was an ancestor of `main`, git didn't have to do any work; it simply just moved `bugFix` to the same commit `main` was attached to.","","Now all the commits are the same color, which means each branch contains all the work in the repository! Woohoo!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following steps:","","* Make a new branch called `bugFix`","* Checkout the `bugFix` branch with `git checkout bugFix`","* Commit once","* Go back to `main` with `git checkout`","* Commit another time","* Merge the branch `bugFix` into `main` with `git merge`","",'*Remember, you can always re-display this dialog with "objective"!*']}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches und Mergen","","Super! Wir wissen jetzt, wie man committet und einen Branch anlegt. Jetzt müssen wir nur noch rauskriegen, wie man die Arbeit, die in verschiedenen Branches steckt, zusammenführen kann. Dann können wir einen neuen Branch erstellen, darin ein neues Feature entwickeln, und das dann in den ursprünglichen Branch integrieren.","",'Die einfachste Methode, mit der man Branches zusammenführen kann, ist `git merge`. Das Mergen erzeugt in git einen speziellen Commit, der zwei Vorgänger hat. Ein solcher Commit bedeutet im Prinzip "ich möchte alle Arbeit von dem Vorgänger hier und dem dort *und* allen ihren jeweiligen Vorgängern miteinander kombinieren".',"","Grafisch dargestellt ist es einfacher zu verstehen, lass es uns mal ansehen."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir zwei Branches; jeder besteht jeweils aus einem eigenen Commit. Das bedeutet, dass keiner der beiden Branches alle Inhalte des gesamten Repositorys kennt. Das werden wir mit einem Merge ändern.","","Wir werden den Branch `bugFix` in `main` integrieren."],afterMarkdowns:["Wow! Hast du das gesehen? Zunächst mal zeigt `main` jetzt auf einen Commit mit zwei Vorgängern. Wenn du den beiden Pfeilen immer weiter folgst, kommst du an jedem Commit im Repository vorbei. Das heißt `main` enthält jetzt alles, was es im Repository gibt.","","Siehst du außerdem wie sich die Farben der Commits verändert haben? Um die Vorgänge zu verdeutlichen hab ich etwas Farbe ins Spiel gebracht. Jeder Branch hat seine eindeutige Farbe. Jeder Merge Commit bekommt als Farbe eine Mischung aus den Farben seiner Vorgänger.","","Wir sehen also, dass die Farbe des Branch `main` in alle Commits gemischt wurde, die von `bugFix` aber nicht. Ändern wir das ..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Mergen wir `main` in `bugFix`:"],afterMarkdowns:["Da `bugFix` ein Vorgänger von `main` war, musste git hier kaum etwas tun; es verschiebt `bugFix` einfach auf den Commit, auf den auch `main` zeigt.","","Jetzt haben alle Commits dieselbe Farbe, das heißt jeder Branch enthält die Informationen des gesamten Repositorys! Juhu!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Führe folgendes aus, um diesen Level zu schaffen:","","* Lege einen neuen Branch `bugFix` an","* Checke `bugFix` aus mittels `git checkout bugFix`","* Mach einen Commit","* Geh mit `git checkout` zum `main` zurück","* Mach noch einen Commit","* Merge den Branch `bugFix` in `main` mit `git merge`","","*Denk dran, du kannst diese Meldung mit dem Befehl `objective` so oft anzeigen, wie du willst!*"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## ブランチとマージ","","いい調子ですね。これまでにコミットとブランチについて学びました。そろそろ2つのブランチを1つにまとめるやり方について見ていきましょう。これができれば新しい機能の開発のために新しいブランチを切って、開発が終わったら変更を元のブランチへ統合することができるようになります。","","はじめに紹介するのは、`git merge`を使ったマージのやり方です。mergeコマンドによって、2つの独立した親を持つ特別なコミットを作ることができます。2つの親を持つコミットが持つ意味とは、「全く別々の場所にいる2つの親(*かつ*、それらの親の祖先全て)が持つ全ての変更を含んでいますよ」ということです。","","見てみた方が早いので、次の画面で確認してみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["それぞれ別のコミットを指している2つのブランチがあります。変更が別々のブランチに分散していて統合されていないケースです。これをマージで1つにまとめてみましょう。","","`bugFix`ブランチを`main`ブランチにマージしてみます。"],afterMarkdowns:["わあ、見ましたか?まず初めに、`main`ブランチが2つのコミットを親に持つ新しいコミットを指してますね。`main`から親をたどっていくと、最も古いコミットにたどり着くまでに全てのコミットを含んでいる様が確認できます。これで、全ての変更を含む`main`が完成しました。","","色がどう変わったかにも注目して下さい。学習を助けるために、ブランチ毎に色をつけています。それぞれのブランチは自分の色を持っていて、どのブランチから派生して出てくるか次第でコミットごとの色が決まります。","","今回のコミットには`main`ブランチの色が使われました。しかし`bugFix`ブランチの色がまだ変わってないようなので、これを変えてみましょう。"],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`main`ブランチを`bugFix`ブランチにマージしてみます。"],afterMarkdowns:["`bugFix`ブランチは`main`ブランチの派生元だったので、gitは実際大したことはしていません。`bugFix`ブランチを指していたポインタを`main`が指していたコミットへと移動させただけです。","","これで全てのコミットが同じ色になりました。つまり、リポジトリの中の全ての変更をそれぞれのブランチが持ったことになります。やったね!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["以下の作業で理解度の確認をしてみましょう:","","* `bugFix`という名前で新しいブランチを切る","* `git checkout bugFix`コマンドで`bugFix`ブランチに切り替える","* 一回だけコミット","* `git checkout`で`main`へ戻る","* もう1回コミットする","* `git merge`コマンドを使って、`bugFix`ブランチを`main`ブランチへとマージする","",'*注:"objective"コマンドでこのヘルプにいつでも戻ってこれます*']}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mergeando ramas","","¡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 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"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Acá 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 `main`."],afterMarkdowns:["¡Wooow! ¿Viste eso? Primero que nada, `main` ahora apunta a un commit que tiene dos padres. Si seguís las flechas por el árbol de commits empezando desde `main` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `main` 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, incluí 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 acá vemos que el color de la rama `main` 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 main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Mergeemos `main` a `bugFix`:"],afterMarkdowns:["Como `bugFix` era un ancestro de `main`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `main`.","","Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Wiii!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, seguí estos pasos:","","* Creá una nueva rama, llamada `bugFix`","* Checkouteá la rama `bugFix` usando `git checkout bugFix`","* Hacé un commit","* Volvé a `main` con `git checkout`","* Hacé otro commit","* Mergeá la rama `bugFix` a `main` usando `git merge`","",'*Acordate: siempre podés volver a ver este mensaje tipeando "objective"!*']}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mezclando ramas","","¡Genial! Ya sabemos cómo hacer 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`. Mezclar 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"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Acá tenemos dos ramas y cada una tiene un commit único. Esto significa que ninguna de las ramas incluye "todo el trabajo" que hay en nuestro repositorio. Hagamos una mezcla para solucionar eso.',"","Vamos a `merge`(mezclar) la rama `bugFix` a `main`."],afterMarkdowns:["¡Wooow! ¿Viste eso? Primero que nada, `main` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `main` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `main` 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, incluí 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 acá vemos que el color de la rama `main` 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 main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Merge (mezclemos) `main` a `bugFix`:"],afterMarkdowns:["Como `bugFix` era un ancestro de `main`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `main`.","","Ahora todos los commits son del mismo color, lo que significa que cada rama contiene todo el trabajo que hay en el repositorio. ¡Súper!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, sigue estos pasos:","","* Crea una nueva rama, llamada `bugFix`","* Cambia a la rama `bugFix` usando `git checkout bugFix`","* Haz un commit","* Vuelve a `main` con `git checkout`","* Haz otro commit","* Haz un merge de la rama `bugFix` a `main` usando `git merge`","",'*Recuerda: siempre puedes volver a ver este mensaje usando el comando "objective"!*']}}]},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 `main`."],afterMarkdowns:["¡Caramba! ¿Viste eso? Antes de nada, `main` ahora apunta a un commit que tiene dos padres. Si sigues las flechas por el árbol de commits empezando desde `main` vas a cruzarte con cada commit del repositorio hasta llegar a la raíz. Esto significa que `main` 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 `main` 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 main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hagamos merge de `main` a `bugFix`:"],afterMarkdowns:["Como `bugFix` era un ancestro de `main`, git no tuvo que hacer ningún trabajo; simplemente movió `bugFix` al mismo commit al que estaba anexado `main`.","","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 main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; 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 `main` con `git checkout`","* Crea otro commit","* Haz merge de la rama `bugFix` a `main` usando `git merge`","",'*Recuerda: siempre puedes volver a ver este mensaje escribiendo "objective"!*']}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches e Merge","","Ótimo! Agora sabemos como commitar e criar ramos. Agora precisamos aprender uma forma de combinar o trabalho de dois ramos diferentes. Isso nos permitirá ramificar, desenvolver um novo recurso, e então combiná-lo de volta.","",'O primeiro método para combinar trabalho que vamos examinar é o `git merge`. O merge do Git cria um commit especial que possui dois pais únicos. Um commit com dois pais essencialmente significa "Quero incluir todo o trabalho deste pai aqui com o daquele outro pai ali, *e* com o do conjunto de todos os seus ancestrais."',"","É mais fácil com uma visualização, vamos ver logo a seguir."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Aqui nós temos dois ramos; cada um tem um commit que é único. Isso significa que nenhum ramo inclui o conjunto do "trabalho" que foi realizado no repositório. Vamos consertar isso com um merge.',"","Vamos juntar o ramo `bugFix` no `main`."],afterMarkdowns:["Uau! Viu isso? Antes de tudo, o `main` agora aponta para um commit que possui dois pais. Se você seguir as setas subindo a árvore de commits a partir do `main`, você será capaz de encontrar, ao longo do caminho até a raiz, qualquer um dos commits. Isso significa que o `main` contém todo o trabalho realizado no repositório até o momento.","","Além disso, viu como as cores dos commits mudaram? Para ajudá-lo a aprender, eu incluí uma legenda. Cada ramo tem uma cor única. Cada commit tem a cor resultante da mistura das cores de todos os ramos que o contém.","","Aqui vemos que a cor do ramo `main` está misturada em todos os commits, mas a cor do `bugFix` não está. Vamos corrigir isso..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos juntar o `main` no `bugFix`:"],afterMarkdowns:["Como o `bugFix` é um ancestral do `main`, o git não teve trabalho nenhum; ele só precisou mover o `bugFix` para o mesmo commit do `main`.","","Agora todos os commits possuem a mesma cor, o que significa que ambos os ramos contém todo o trabalho realizado no repositório! Eba!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, faça o seguinte:","","* Crie um novo ramo chamado `bugFix`","* Faça checkout no ramo `bugFix` com `git checkout bugFix`","* Faça um commit","* Volte ao `main` com `git checkout`","* Faça um novo commit","* Junte o ramo `bugFix` no `main` com `git merge`","",'*Lembre-se, você pode sempre mostrar esta mensagem novamente com o comando "objective"!*']}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas e merges","","¡Xenial! Agora sabemos como facer commits e crear ramas. Agora precisamos aprender unha forma de combinar o traballo de dúas ramas diferentes. Iso permitiríanos ramificar, facer un novo cambio, e entón mesturalo de volta.","",'O primeiro comando para mesturar o traballo que imos ver é `git merge`. O merge de Git crea un commit especial que ten dous pais únicos. Un commit con dous pais significa "Quero incluír todo o traballo deste pai cos cambios do outro pai, *e* o conxunto de tódolos ancestros."',"","É máis doado con unha visualización, ímolo ver na seguinte vista."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Aquí nos temos dúas ramas; cada unha ten un commit que é único. Isto significa que ningunha rama inclúe o conxunto de "traballo" feito no noso repositorio. Imos arranxar esto cun merge.',"","Imos xuntar a rama `bugFix` na `main`."],afterMarkdowns:["¡Uah! ¿Viches? Antes de todo, `main` agora apunta a un commit que ten dous pais. Se ti sigues as frechas subindo a árbore de commits a partir de `main`, serás capaz de ver tódolos commits ata a raíz, calquera de eles. Isto significa que a rama `main` contén todo o traballo realizado no repositorio ata ese momento.","","Ademáis, ¿viches como cambiaron as cores dos commits? Para axudarte a aprender, hai unha lenda. Cada rama ten unha única cor. Cada commit ten a cor resultante de mesturar as cores de tódalas ramas que contén.","","Aquí vemos que a rama `main` está mesturada en todos os commits, pero a cor da rama `bugFix` non o está. Imos arranxar eso..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos mesturar a rama `main` en `bugFix`:"],afterMarkdowns:["Como o `bugFix` é un ancestro de `main`, o git non ten traballo que facer; el só ten que mover o punteiro de `bugFix` para o mesmo commit que `main`.","","Agora tódolos commits teñen a mesma cor, o que significa que ambas ramas teñen o mesmo traballo no repositorios! Iepa!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, fai o seguinte:","","* Crea unha nova ramara chamada `bugFix`","* Fai checkout da rama `bugFix` con `git checkout bugFix`","* Fai un commit","* Volve á rama `main` con `git checkout`","* Fai un novo commit","* Xunta a rama `bugFix` en `main` con `git merge`","",'¡Recorda, podes amosar esta mensaxe novamente co comando "objective"!']}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches et Merges","","Super ! Nous savons désormais comment faire des commits et des branches. Maintenant nous devons apprendre comment combiner ensemble les contenus de deux branches différentes. Ceci nous permettra de créer une nouvelle branche, développer une nouvelle fonctionnalité sur cette dernière, puis intégrer cette fonctionnalité en combinant le contenu de cette branche de développement à la branche d'origine (main par exemple).","","La première méthode que nous allons voir pour combiner le contenu de deux branches est `git merge`. Faire un 'merge' avec Git crée un commit spécial qui a deux parents. Un commit avec deux parents indique en susbtance \"Je veux inclure le contenu de ce parent et le contenu de cet autre parent, *et* l'ensemble de leurs parents.\"","","C'est plus facile en visualisant, regardons dans la vue suivante."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici nous avons deux branches ; chacune a un commit qui lui est propre. Cela signifie qu'aucune des deux branches n'inclut la totalité du \"travail\" qui a été fait dans le dépôt. Arrangeons-cela avec merge.","","Nous allons `merge` («fusionner») la branche `bugFix` dans `main`."],afterMarkdowns:["Youhou ! Vous avez vu ça ? Pour commencer, `main` pointe maintenant sur un commit qui a deux parents. Si vous remontez l'enchaînement des flèches depuis `main`, vous allez passez par tous les commits jusqu'à la racine. Cela signifie que `main` contient maintenant tout le travail du dépôt.","","Par ailleurs, avez-vous remarqué les nouvelles couleurs des commits ? Pour faciliter l'apprentissage, j'ai inclus une certaine logique dans la coloration. Chaque branche a une unique couleur. Chaque commit est de la couleur de toutes les branches qui le contiennent.","","Ici nous voyons que la couleur de `main` est intégrée à tous les commits, sauf ceux de `bugFix`. Réparons cela..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Faisons un merge de `main` dans `bugFix` :"],afterMarkdowns:["Puisque `bugFix` était un ancêtre de `main`, Git n'avait aucun travail à effectuer; il a simplement déplacé `bugFix` au même commit auquel `main` est attaché.","","Maintenant tous les commits sont de la même couleur, ce qui indique que chaque branche contient tout le contenu du dépôt ! Woohoo !"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, effectuez les opérations suivantes :","","* Faites une nouvelle branche appelée `bugFix`","* Positionnez-vous sur la branche `bugFix` avec `git checkout bugFix`","* Faites un commit","* Retournez sur la branche `main` (commande `git checkout`)","* Faites un nouveau commit","* Fusionnez la branche `bugFix` dans `main` avec `git merge`","",'*Rappelez-vous que vous pouvez à tout moment réafficher ces indications avec "objective" !*']}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 分支与合并","","太好了! 我们已经知道如何提交以及如何使用分支了。接下来咱们看看如何将两个分支合并到一起。就是说我们新建一个分支,在其上开发某个新功能,开发完成后再合并回主线。","","咱们先来看一下第一种方法 —— `git merge`。在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个 parent 节点。翻译成自然语言相当于:“我要把这两个 parent 节点本身及它们所有的祖先都包含进来。”","","通过图示更容易理解一些,咱们到下一页看一下。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我们准备了两个分支,每个分支上各有一个独有的提交。这意味着没有一个分支包含了我们修改的所有内容。咱们通过合并这两个分支来解决这个问题。","","我们要把 `bugFix` 合并到 `main` 里"],command:"git merge bugFix",afterMarkdowns:["哇哦!看见了吗?首先,`main` 现在指向了一个拥有两个 parent 节点的提交记录。假如从 `main` 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 `main` 包含了对代码库的所有修改。↓↓↓","","还有,看见各个提交记录的颜色变化了吗?为了帮助学习理解,我引入了颜色搭配。每个分支都有不同的颜色,而每个提交记录的颜色是所有包含该提交记录的分支的颜色混合之后的颜色。","","所以,`main` 分支的颜色被混入到所有的提交记录,但 `bugFix` 没有。下面咱们让它也改变一下颜色。"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们再把 `main` 分支合并到 `bugFix`:"],command:"git checkout bugFix; git merge main",afterMarkdowns:["因为 `main` 继承自 `bugFix`,Git 什么都不用做,只是简单地把 `bugFix` 移动到 `main` 所指向的那个提交记录。","","现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!大功告成!"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["要想通过这一关,需要以下几步:","","* 创建新分支 `bugFix`","* 用 `git checkout bugFix` 命令切换到该分支","* 提交一次","* 用 `git checkout main` 切换回 `main`","* 再提交一次","* 用 `git merge` 把 `bugFix` 合并到 `main`","","* 你随时都可以用“objective”命令来打开这个对话框!*"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## branch 以及 merge","","太好了! 我們已經知道怎麼使用 commit 和 branch 了。接下來要學的一招是如何合併(merge)兩個不同 branch 的工作。這讓我們可以建立一個新的 branch ,並且在上面開發新功能,然後合併回 main branch。","","`git merge` 是我們要學習 merge 的第一個方法。該 merge 會產生一個特殊的 commit,它包含兩個唯一 parent commit。一個 commit 如果有兩個 parent commit 的話,那就表示:「我想把這兩個 parent commit 本身及它們的 所有的 parent commit 都包含進來。」","","有圖有真相,看看下面的圖就明白了。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在這裡,我們有兩個 branch:各自都有一個唯一的 commit。這意味著沒有一個 branch 包含我們對文件的所有修改。讓我們 merge 這兩個 branch 來解決這個問題。","","我們要 merge `bugFix` 到 `main` "],command:"git merge bugFix",afterMarkdowns:["哇!看見了沒有?首先,`main` 現在指向一個 commit,這個 commit 有兩個 parent commit。假如從 `main` 開始沿著箭頭向上走,在到達起點的路上會經過所有的 commit。這說明了現在 `main` 紀錄了對文件的所有修改。","","還有,看見各個 commit 的顏色變化了嗎?為了幫助學習,我混合了顏色。每個 branch 都有特定的顏色。每個 commit 的顏色都變成了含有此 commit 的所有 branch 的混合色。","","所以,`main` branch 的顏色被混入到所有的 commit,但 `bugFix` 沒有。接下來就改一下這裡吧。"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們 merge `main` branch 到 `bugFix` 吧。"],command:"git checkout bugFix; git merge main",afterMarkdowns:["因為 `bugFix` branch只是 `main` branch 的 parent,git 什麼都不用做,只是簡單地把 `bugfix` branch 移動到 `main` 指向的 commit。","","現在所有的 commit 的顏色都是一樣的啦,這表示每一個 branch 都包含了所有文件的修改!太厲害了啦!"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["想完成這一關,執行以下的操作:","","* 建立新的 branch,叫做 `bugFix` ","* 用 `git checkout bugFix` 切換到 `bugFix` branch","* commit 一次","* 用 `git checkout` 切換回 `main` branch","* 再 commit 一次","* 用 `git merge` 將 `bugFix` merge 到 `main`","",'*記住,你可以用 "objective" 指令來重新顯示這個對話框!*']}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 브랜치와 합치기(Merge)","","좋습니다! 지금까지 커밋하고 브랜치를 만드는 방법을 알아봤습니다. 이제 두 별도의 브랜치를 합치는 몇가지 방법을 알아볼 차례입니다. 이제부터 배우는 방법으로 브랜치를 따고, 새 기능을 개발 한 다음 합칠 수 있게 될 것입니다.","",'처음으로 살펴볼 방법은 `git merge`입니다. Git의 합치기(merge)는 두 개의 부모(parent)를 가리키는 특별한 커밋을 만들어 냅니다. 두개의 부모가 있는 커밋이라는 것은 "한 부모의 모든 작업내역과 나머지 부모의 모든 작업, *그리고* 그 두 부모의 모든 부모들의 작업내역을 포함한다"라는 의미가 있습니다. ',"","그림으로 보는게 이해하기 쉬워요. 다음 화면을 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기에 브랜치가 두 개 있습니다. 각 브랜치에 독립된 커밋이 하나씩 있구요. 그 말은 이 저장소에 지금까지 작업한 내역이 나뉘어 담겨 있다는 얘기입니다. 두 브랜치를 합쳐서(merge) 이 문제를 해결해 볼까요?","","`bugFix` 브랜치를 `main` 브랜치에 합쳐(merge) 보겠습니다."],afterMarkdowns:["보셨어요? 우선, `main`가 두 부모가 있는 커밋을 가리키고 있습니다. ","","또, 커밋들의 색이 바뀐 것을 눈치 채셨나요? 이해를 돕기위해 색상으로 구분해 표현했습니다. 각 브랜치는 그 브랜치만의 색상으로 그렸습니다. 브랜치가 합쳐지는 커밋의 경우에는, 그 브랜치들의 색을 조합한 색상으로 표시 했습니다.","","그런식으로 여기에 `bugFix`브랜치 쪽을 제외한 나머지 커밋만 `main` 브랜치의 색으로 칠해져 있습니다. 이걸 고쳐보죠..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["이제 `main` 브랜치에 `bugFix`를 합쳐(merge) 봅시다:"],afterMarkdowns:["`bugFix`가 `main`의 부모쪽에 있었기 때문에, git이 별다른 일을 할 필요가 없었습니다; 간단히 `bugFix`를 `main`가 붙어 있는 커밋으로 이동시켰을 뿐입니다.","","짜잔! 이제 모든 커밋의 색이 같아졌고, 이는 두 브랜치가 모두 저장소의 모든 작업 내역을 포함하고 있다는 뜻입니다."],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["아래 작업을 해서 이 레벨을 통과하세요:","","* `bugFix`라는 새 브랜치를 만듭니다","* `git checkout bugFix`를 입력해 `bugFix` 브랜치로 이동(checkout)합니다.","* 커밋 한 번 하세요","* `git checkout` 명령어를 이용해 `main`브랜치로 돌아갑니다","* 커밋 또 하세요","* `git merge` 명령어로 `bugFix`브랜치를 `main`에 합쳐 넣습니다.","",'*아 그리고, "objective" 명령어로 이 안내창을 다시 볼 수 있다는 것을 기억해 두세요!*']}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ветки и слияния","","Ок! Мы уже знаем, как создавать ветки и коммитить наши изменения. Теперь надо понять, как объединять изменения из двух разных веток. Очень удобно создать ветку, сделать свою часть работы в ней и потом объединить изменения из своей ветки с общими.","","Первый способ объединения изменений, который мы рассмотрим - это `git merge` - слияние или просто мердж. Слияния в Git создают особый вид коммита, который имеет сразу двух родителей. Коммит с двумя родителями обычно означает, что мы хотим объединить изменения из одного коммита с другим коммитом и всеми их родительскими коммитами.","","Слишком запутанно =) На схеме всё проще и понятнее."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Вот у нас две ветки, каждая содержит по одному уникальному коммиту. Это означает, что ни одна из веток не содержит полный набор "работ", выполненных в этом репозитории. Можно исправить эту ситуацию, выполнив слияние.',"","Мы сделаем `merge` ветки `bugFix` в ветку `main`."],afterMarkdowns:["Что мы видим? Во-первых, ветка `main` теперь указывает на коммит, у которого два родителя. Если проследовать по стрелкам от этого коммита, вы пройдёте через каждый коммит в дереве прямиком к началу. Это означает, что теперь в ветке `main` содержатся все изменения репозитория.","","Во-вторых, обрати внимание, как изменились цвета коммитов. Мы ввели цветовую дифференциацию, чтобы помочь пониманию. У каждой ветки — свой цвет. Каждый коммит становится того цвета, какого его ветка. Если в нём изменения сразу двух веток - он становится цветом, смешанным из цветов родительских веток.","","И вот мы видим, что цвет ветки `main` подмешан к каждому коммиту, а ветки `bugFix` - нет. Это можно поправить."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Смерджим ветку `main` в ветку `bugFix`."],afterMarkdowns:["Так как ветка `bugFix` была предшественницей `main`, Git не делал ничего, только сдвинул `bugFix` на тот же коммит, где находится `main`","","Теперь все коммиты одного цвета, что означает, что каждая ветка содержит все изменения репозитория! Поздравляем!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, сделай следующее:","","* Создай новую ветку под названием `bugFix`","* Переключись на новую ветку `bugFix` командой `git checkout bugFix`","* Сделай один коммит","* Вернись на ветку `main` при помощи `git checkout`","* Сделай ещё один коммит","* Слей ветку `bugFix` с веткой `main` при помощи `git merge`","",'* Если что-то пошло не так - можешь подглядеть в эту шпаргалку командой "objective"!*']}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Гілки та їх Злиття","","Чудово! Ми знаємо як комітити та створювати гілки. Тепер потрібно навчитися в якийсь спосіб поєднувати інфу з двох чи більше гілок. Це дозволить нам відгілкуватись, зробити нову фічу, й потім інтегрувати її назад.","","Перший спосіб об’єднувати робочу інфу з яким ми розберемось це `git merge`. Команда merge (злити) в Git створює спеціальний коміт який має двох унікальних батьків. Коміт з двома батьками в приниципі просто значить що в нього включена інфа з обох батьків і всіх їх попередників.","","Це простіше сприймається візуально, тому розберемо це в наступному слайді"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Тут ми маємо дві гілки; кожна з них містить унікальний коміт. Це означає що жодна з них не містить повного набору "робочої інфи" в цьому репозиторії. Давайте зіллємо всю інфу докупи за допомогою merge.',"","Ми `змержимо` гілку `bugFix` в `main`."],afterMarkdowns:["Нічого собі! Ви це бачили? По-перше, `main` тепер вказує на коміт з двома батьками. Якщо ти піднімешся вверх з цього коміту по дереву, починаючи з `main`, на шляху ти зустрінеш кожен коміт аж до кореневого. Це означає що гілка `main` тепер містить всю інфу в цьому репозиторії.","","А ти помітив як змінилися кольори комітів? Для кращого розуміння процесу я додав певну кольорову диференціацію. Кожен бранч виділено окремим кольором. Колір кожного коміту це суміш кольорів всіх гілок що місять цей коміт.","","Тож ми бачимо що колір гілки `main` містять всі коміти, але не колір `bugFix`. Давайте виправимо це..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давай змержимо `main` в `bugFix`:"],afterMarkdowns:["Так як `bugFix` є нащадком `main`, git'у не потрібно нічого робити; він просто пересунув `bugFix` на тей самий коміт, на якому знаходиться `main`.","","Тепер всі коміти одного кольору, що означає що кожен бранч включає в собі всю корисну інфу яка є в цьому репозиторії! Ура!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень виконай наступні кроки:","","* Зроби нову гілку (branch) з назвою `bugFix`","* Перейди на гілку `bugFix` за допомогою `git checkout bugFix`","* Зроби один коміт","* Повернись до `main` за допомогою `git checkout`","* Зроби ще один коміт","* Змерджи (злий) гілку `bugFix` в `main` за допомогою `git merge`","",'*Не забувай, ти можеш завжди повернутися до цього діалогу за допомогою "objective"!*']}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh và gộp nhánh","","Tuyệt! Ta đã biết làm sao để commit và tạo nhánh. Giờ ta cần học cách để tập hợp thành quả của 2 nhánh khác biệt lại với nhau. Đây sẽ là cách để ta phân tách để phát triển chức năng, rồi sau đó hợp nhất nó trở lại.","",'Cách đầu tiên để hợp nhất thành quả cần xem xét đến là lệnh `git merge`. Merge trong Git là tạo ra một commit đặc biệt mà có 2 người cha độc nhất. Một commit mà có 2 cha căn bản nghĩa là "Tôi muốn có thành quả của ông này và ông kia nữa, *và* tất cả ông cha của họ."',"","Trực quan thì dễ hiểu hơn, sang trang tiếp theo nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Ở đây ta có 2 nhánh; mỗi nhánh có 1 commit độc nhất. Có nghĩa là chẳng nhánh nào có đủ "thành quả" trong kho chứa của ta cả. Sửa nó bằng merge nào.',"","Ta sẽ `merge` nhánh `bugFix` vào `main`."],afterMarkdowns:["Wao! Thấy chứ? Trước tiên, `main` giờ đã trỏ đến commit có 2 cha. Nếu bạn lần theo mũi tên lên trên từ `main`, bạn sẽ gặp tất cả các commit lên đến commit gốc. Có nghĩa là `main` giờ đã chứa tất cả thành quả trong kho.","","Đồng thời, bạn thấy màu commit thay đổi chứ? Để bạn dễ học hơn, tôi đã phối hợp một số bảng màu. Mỗi nhánh có một màu duy nhất. Mỗi commit mang màu pha trộn của tất cả nhánh chứa nó.","","Vì vậy, ở đây chúng ta thấy rằng màu nhánh `main` được pha trộn vào tất cả các commit, nhưng màu `bugFix` thì không. Hãy sửa nó nào..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy gộp nhánh `main` vào `bugFix` nào:"],afterMarkdowns:["Vì `bugFix` là bậc cha ông của `main`, Git chẳng phải làm gì cả; nó đơn giản chỉ chuyển `bugFix` vào commit mà `main` đang trỏ tới.","","Giờ thì tất cả commit đã có cùng màu, nghĩa là mỗi nhánh đã chứa tất cả thành quả trong kho! Ồ hố!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, hãy làm theo các bước bên dưới:","","* Tạo một nhánh mới tên là `bugFix`","* Chuyển sang nhánh `bugFix` với `git checkout bugFix`","* Commit một lần","* Trở về `main` với `git checkout`","* Commit một lần nữa","* Gộp nhánh `bugFix` vào `main` với `git merge`","",'*Nhớ rằng, bạn luôn luôn có thể bật lại hộp thoại này với lệnh "objective"!*']}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branchi in Merganje","","Odlično! Sedaj znamo commitati in branchati. Naslednja stvar je, da se naučimo združiti delo iz dveh različnih branchev. To nam bo omogočilo, da naredimo branch, razvijemo novo funkcionalnost in jo združimo nazaj.","",'Prva metoda za združevanje dela, ki jo bomo preučili je `git merge`. Merganje v Gitu naredi poseben commit, ki ima dva edinstvena starša. Commit z dvema staršema v bistvu pomeni "Hočem vključiti vso delo iz tega starša tukaj in iz tega tu *ter* vse delo iz njunih staršev".',"","Vizualizacija je enostavnejša, poglejmo v naslednjem oknu."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Tu imamo dva brancha; vsak ima en commit, ki je unikaten. To pomeni, da noben branch v repozitorju nima vsega "dela". Pa popravimo to z mergeom.',"","Sedaj bomo `mergeali` branch `bugFix` v `main`."],afterMarkdowns:["Woah! Si videl to? `main` sedaj kaže na commit, ki ima dva starša. Če slediš puščicam po drevesu commitov iz `main`, boš našel vsak commit po poti do roota. To pomeni, da `main` sedaj vsebuje vso delo iz repozitorija.","","Opaziš tudi, kako so se barve commitov spremenile? V pomoč pri učenju, sem vključil še nekaj barvne pomoči. Vsak branch ima svojo barvo. Vsak commit spremeni barvo v kombinirano barvo vseh branchev, ki imajo ta commit.","","Torej tukaj vidimo, da je `main` branch barva zmešana v vseh commitih, `bugFix` barva pa ne. Popravimo to ..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zmergajmo sedaj `main` v `bugFix`:"],afterMarkdowns:["Ker je `bugFix` bil prednik `main`, git ni rabil storiti ničesar; preprosto je premaknil `bugFix` v isti commit, kamer kaže `main`.","","Sedaj so vsi commiti iste barve, kar pomeni, da vsak branch vsebuje vse delo v repozitoriju!! Woohoo!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Da zaključiš to stopnjo, naredi naslednje korake:","","* Naredi novi branch `bugFix`","* Checkoutaj `bugFix` branch z `git checkout bugFix`","* Enkrat commitaj","* Pojdi nazaj na `main` z `git checkout`","* Še enkrat commitaj","* Mergeaj branch `bugFix` v `main` z `git merge`","",'*Pomni, vedno lahko spet pogledaš ta dialog z "objective"!*']}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Łączenie gałęzi","","Świetnie! Już wiemy, jak dodawać commity oraz jak tworzyć gałęzie (czyli branche). Teraz musimy się nauczyć, jak połączyć pracę dwóch różnych gałęzi. Stwórzmy nową gałąź, wprowadźmy nową funkcjonalność, a następnie połączmy gałęzie.","",'Pierwszą metodą scalania (łączenia) gałęzi, której zamierzamy użyć, jest `git merge` (w Polsce możesz spotkać się z takimi określeniami jak merge\'owanie albo usłyszeć o merdżowaniu). Połączenie to tworzy w Git specjalny commit, który ma dwoje różnych rodziców. Commit z dwojgiem rodziców zasadniczo oznacza: "Chcę uwzględnić całą pracę tych rodziców *oraz* wszystkich ich przodków".',"","Zaraz zobaczysz, jak to wygląda i łatwiej będzie ci wszystko zrozumieć."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Mamy tutaj dwie gałęzie. Każda z nich ma po jednym unikalnym commicie. Oznacza to, że żadna z nich nie zawiera "całej pracy", którą wykonaliśmy w naszym repozytorium. Naprawmy to!.',"","Użyjmy `git merge`, aby połączyć branche `bugFix` oraz `main`."],afterMarkdowns:['Łał! Widzisz to? Teraz "main" wskazuje na commit, który ma dwoje rodziców. Jeśli podążasz za strzałkami w górę drzewa źródłowego od `main`, trafisz na każdy commit po drodze do korzenia. Oznacza to, że `main` zawiera teraz całą pracę w repozytorium.',"","Zobacz też, jak zmieniły się kolory commitów. Aby pomóc Ci w nauce, dołączyłem kilka konwencji kolorów. Każdy branch ma swój własny kolor. Kolor każdego commita to mieszanka kolorów wszystkich gałęzi, które commitujesz","","Tutaj widzimy, że kolor gałęzi `main` jest składową kolorów wszystkich commitów, ale kolor gałęzi `bugFix` już nie. Naprawmy to..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Połączmy gałąź `main` z gałęzią `bugFix`:"],afterMarkdowns:["Ponieważ `bugFix` był przodkiem gałęzi `main`, git nie musiał wykonywać żadnej pracy. Po prostu przeniósł branch `bugFix` do tego samego commita, do którego dołączony był `main`.","","Teraz wszystkie commity mają ten sam kolor, co oznacza, że każda gałąź zawiera całą pracę znajdującą się w repozytorium! Super!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, wykonaj następujące czynności:","","* Stwórz nową gałąź o nazwie `bugFix`","* Przełącz się na gałąź `bugFix`, używając polecenia `git checkout bugFix`","* Zrób jeden commit","* Wróć do gałęzi `main` za pomocą polecenia `git checkout`","* Zrób kolejny commit","* Połącz gałąź `bugFix` z gałęzią `main`, używając polecenia `git merge`","",'*Pamiętaj: zawsze możesz zobaczyć tę wiadomość ponownie, wpisując "objective"!*']}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["## கிளைகள் மற்றும் ஒருங்கினைத்தல் இணைத்தல்","","நன்று! நமக்கு இப்போது கமிட் மற்றும் கிளை பிறித்தில் பற்றி தெரியும். இப்போது நாம் இரண்டு வெவ்வேறு கிளைகளிலிருந்து மாற்றங்களை ஒன்றிணைக்கும் வழியை கற்றுக்கொள்ள வேண்டும். இது நம்மை கிளை பிரிக்கவும், அதில் புதிய அம்சத்தை உருவாக்கி, பின்னர் அதை மீண்டும் இணைக்கவும் உதவும்.","",'நாம் முதலில் `git merge` எப்படி இணைப்பதற்கான வேலையை செய்கிறது என்பதை காண்போம். Gitஇல் ஒருங்கினைக்க இரண்டு கிளைகளின் மாற்றங்களை இணைத்து ஒரு சிற்ப்பு கமிட் உருவாக்க படும். அது "நான் மாற்றத்தினை முதல் கிளேயில் இருந்தும் மற்ற சில மாற்றங்களை அடுத்த கிளையில் இருந்தும் *மேலும்* அவற்றின் மூலங்களையும் இணைத்து ஒரே தொகுப்பாக உருவாக்க விரும்புகிறைன்." என சொல்வதை போன்றதுபோன்றது',"","காட்சிகள் மூலம் இதை எளிதாக புறிந்து கொள்ள முடியும், அடுத்த பகுதியில் அதைப் பார்ப்போம்."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['இங்கே இரண்டு கிளைகள் உள்ளன; ஒவ்வொன்றும் தனித்துவமான ஒரு மாற்றத்துடன் கமிட் கொண்டுள்ளன. இதன் பொருள் என்னவென்றால், நாம் செய்த "மாற்றங்களின்" முழு தொகுப்பும் களஞ்சியத்தின் இரு கிளைகளிலும் இல்லை. அதை ஒன்றிணைப்பதன் மூலம் சரிசெய்வோம்.',"","`bugFix` கிளையை `main` உடன் இணைப்போம்(`merge`)."],afterMarkdowns:["ஓ! அதை பார்தீர்களா? முதலில், `main` இரண்டு பெற்றோர்களைக் கொண்ட ஒரு கமிட்டை சுட்டிக்காட்டுகிறது. `main` கமிட் மரத்திலிருந்து நீங்கள் அம்புகளைப் பின்தொடர்ந்தால், அனைத்து வழியாகவும் வேருக்கு செல்லும் வழியில் இணைவீர்கள். இதன் பொருள் என்னவென்றால், `main` இப்போது களஞ்சியத்தில் உள்ள அனைத்து மாற்றங்களையும் கொண்டுள்ளது.","","மேலும், கமிட்டுகளின் நிறங்கள் எவ்வாறு மாற்றப்பட்டன என்பதைப் பாருங்கள்? கற்றலுக்கு உதவ, நான் சில வண்ண ஒருங்கிணைப்பைச் சேர்த்துள்ளேன். ஒவ்வொரு கிளைக்கும் ஒரு தனித்துவமான நிறம் உள்ளது. ஒவ்வொரு கமிட்டும் அது உள்ள அனைத்து கிளைகளின் கலவையால் ஆன நிறமாக மாறும்.","","ஆகவே, `main` கிளையின் வண்ணம் அனைத்து கமிட்டுகளிலும் கலந்திருப்பதை இங்கே காண்கிறோம், ஆனால் `bugFix` நிறம் மட்டும் இல்லை. அதை சரிசெய்வோம்..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`main`-ஐ `bugFix` உடன் இணைப்போம்:"],afterMarkdowns:["`bugFix` என்பது `main`-இன் மூலக்கிளை என்பதால், கிட் எந்த வேலையும் செய்ய வேண்டியதில்லை; அது `main` இணைந்துள்ள அதே கமிட்டுடன் `bugFix`-ஐ சேர்த்துவிடுகின்றது.","","இப்போது அனைத்து கமிட்களும் ஒரே நிரத்தில் உள்ளது, அதாவது அனைத்து கிளைகளிலும் களஞ்சியத்தில் உள்ள அனைத்து மாற்றங்களும் உள்ளன! வூஹூ!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["இந்த நிலையை முடிக்க, பின்வரும் படிகளைச் செய்யுங்கள்:","","* `bugFix` என்ற புதிய கிளையை உருவாக்குங்கள்","* `git checkout bugFix` கொண்டு `bugFix` கிளைக்கு மாற்றி கொல்லுங்கள்","* ஒரு கமிட் செய்யுங்கள்","* மீண்டும் `main`-க்கு `git checkout` கட்டளைமூலம் மாறுங்கள்","* மீண்டும் ஒரு கமிட் செய்யுங்கள்","* இப்போது `bugFix`-ஐ `main` உடன் `git merge` இணைக்கலாம்","",'*நினைவில் கொள்ளுங்கள், இந்த உரையாடலை "குறிக்கோள்" கொண்டு நீங்கள் மீண்டும் காணலாம்!*']}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami e fusione","","Ottimo! Ora sappiamo come funzionano i commit e i rami. Adesso dobbiamo trovare il modo per unire il lavoro di due rami diversi. Questo ci permetterà di creare un nuovo ramo, aggiungere una nuova funzionalità, e poi riunire il tutto.","",'Il primo metodo che vediamo per unire il lavoro è `git merge` (fusione). La fusione in Git crea un commit speciale che possiede due genitori distinti. Un commit con due genitori significa "Voglio unire tutto il lavoro da questo e da quest\' altro genitore, *e anche* di tutti i loro genitori."',"","È più semplice con le immagini, vediamolo nella prossima schermata."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Qui abbiamo due rami; ognuno di essi ha un commit univoco. Ciò significa che nessuno dei rami contiene per intero il "lavoro" del repository. Sistemiamo le cose con una fusione.',"","Ora facciamo `merge` del ramo `bugFix` nel `main`."],afterMarkdowns:["WOW! Visto? Prima di tutto, `main` ora punta a un commit con due genitori. Se ripercorri l'albero dei commit dal `main`, potrai attraversare tutti i commit fino alla radice (root). Questo significa che `main` ora contiene tutto il lavoro del repository.","","Hai visto come è cambiato il colore del commit? Per imparare più facilmente, ho aggiunto i colori. Ogni ramo ha un colore univoco. Ogni (merge) commit ha un colore che è la combinazione dei colori dei rami che lo compongono.","","Qui vediamo che il colore del ramo `main` è la combinazione di tutti i commit , ma il colore di `bugFix` è diverso. Sistemiamolo..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Fondiamo `main` in `bugFix`:"],afterMarkdowns:["Visto che `bugFix` era un antenato di `main`, git non ha dovuto fare nulla di che; ha semplicemente spostato `bugFix` sullo stesso commit in cui era collegato `main`.","","Ora tutti i commit hanno lo stesso colore, il che significa che ogni ramo contiene tutto il lavoro del repository! WoWoWoW!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, esegui i seguenti passaggi:","","* Crea un nuovo ramo di nome `bugFix`","* Seleziona il ramo `bugFix` con il comando `git checkout bugFix`","* Esegui un commit","* Ritorna al ramo `main` con `git checkout`","* Esegui un nuovo commit","* Fondi il ramo `bugFix` nel `main` con `git merge`","",'*Ricorda, puoi sempre rivedere questa schermata digitando "objective"!*']}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch'ler ve Merge İşlemleri","","Harika! Nasıl commit yapılacağını ve branch oluşturulacağını öğrendik. Şimdi iki farklı branch'in çalışmasını birleştirmenin (merge) bir yolunu öğrenmemiz gerekiyor. Bu, yeni bir özellik geliştirmek için bir branch'i alacak ve sonra onu geri birleştirebilmemizi sağlayacak.","","Birleştirme işlemini inceleyeceğimiz ilk yöntem `git merge`'dir. Git'te birleştirme işlemi, iki benzersiz üst öğesi olan özel bir commit oluşturur. İki ata'sı olan bir commit, temelde \"Bu kaynak kodun bu noktadaki tüm çalışmasını ve diğer noktadaki kaynak kodun tüm çalışmasını *ve* tüm bu kaynak kodlarının üstündeki kaynak kodlarını dahil etmek istiyorum.\" anlamına gelir.","","Bu işlem görsellerle daha kolay anlaşılır, bir sonraki görünümde görelim."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["İşte iki branch'imiz var; her birinin benzersiz bir commit'i var. Bu, her iki branch'in de repo'da yaptığımız \"çalışmanın\" tamamını içermediği anlamına gelir. Birleştirme (merge) ile bunu düzeltebiliriz.","","`bugFix` branch'ini `main` ile `merge` edeceğiz."],afterMarkdowns:["Vay canına! Görüyor musunuz? İlk olarak, `main` artık iki ata'sı (Parent) olan bir commit'e işaret ediyor. `main` üzerinden commit ağacındaki okları takip ederseniz, köke giden yol boyunca her commit'e ulaşırsınız. Bu, `main`'in artık repo'nun tamamındaki tüm çalışmayı içerdiği anlamına gelir.","","Ayrıca, commit'lerim renklerinin nasıl değiştiğini gördünüz mü? Öğrenmenize yardımcı olmak için bazı renk koordinasyonları ekledik. Her branch'in kendine özgü bir rengi vardır. Her commit, kendisini içeren tüm branch'lerin karışık bir kombinasyonu olan bir renge dönüşür.","","Yani burada `main` branch'inin renginin tüm commit'lere karıştığını, ancak `bugFix` renginin karışmadığını görüyoruz. Şimdi bunu düzeltelim..."],command:"git merge bugFix",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hadi`main`'i `bugFix`'e merge'leyelim:"],afterMarkdowns:["`bugFix`, `main`'in atası olduğu için, git'in ekstra hiçbir iş yapmasına gerek kalmadı; sadece`bugFix`'i `main`'in bağlı olduğu aynı commit'e taşıdı.","","Artık tüm commit'ler aynı renk oldu, bu da her branch'in repo'daki tüm çalışmaları içerdiği anlamına geliyor! Yaşasın!"],command:"git checkout bugFix; git merge main",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit; git merge bugFix"}},{type:"ModalAlert",options:{markdowns:["Bu level'i tamamlamak için aşağıdaki adımları yapmanız gerekiyor:","","* `bugFix` adında yeni bir branch oluşturun","* `git checkout bugFix` komutu ile `bugFix` branch'ine geçin ","* bir commit atın","* `git checkout` komutu ile `main` branch'ine geri dönün ","* başka bir commit atın","* Ardından `git merge` komutu ile `bugFix`'i `main`'e merge edin","",'*Unutmayın, "objective" komutunu kullanılarak bu iletişim penceresini her zaman yeniden görüntüleyebilirsiniz!*']}}]}}}},{}],125:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22main%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22bugFix%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout -b bugFix;git commit;git checkout main;git commit;git checkout bugFix;git rebase main",name:{en_US:"Rebase Introduction",de_DE:"Einführung in Rebase",ja:"Rebaseの解説",es_AR:"Introducción a rebase",es_MX:"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",ko:"리베이스(rebase)의 기본",zh_CN:"Git Rebase",zh_TW:"介紹 rebase",ru_RU:"Введение в rebase",uk:"Знайомство з rebase",vi:"Giới thiệu về rebase",sl_SI:"Uvod v Rebase",it_IT:"Introduzione al rebase (ribasare)",pl:"Wprowadzenie do Rebase",tr_TR:"Rebase İşlemine Giriş"},hint:{en_US:"Make sure you commit from bugFix first",de_DE:"Geh vor dem committen sicher, dass du auf bugFix arbeitest",ja:"初めにbugFixを指した状態でコミットする",fr_FR:"Assurez-vous de bien faire votre commit sur bugFix en premier",es_AR:"Asegurate de commitear desde bugFix primero",es_MX:"Asegúrate de hacer commit 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 브랜치에서 먼저 커밋하세요",zh_CN:"先在 bugFix 分支上进行提交",zh_TW:"你要先在 bugFix branch 進行 commit",ru_RU:"Убедись, что сделал коммит в ветке bugFix",uk:"Впевнись, що зробив коміт в гілці bugFix",vi:"Hãy chắc chắn rằng bạn commit từ bugFix trước",sl_SI:"Prepričaj se, da si najprej commital bugFix.",it_IT:"Assicurati di fare prima il commit da bugFix",pl:"Upewnij się, że masz już commit z bugFix",tr_TR:"Önce bugFix'tencommit attığınıza emin olun"},disabledMap:{"git revert":!0},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'The second way of combining work between branches is *rebasing.* Rebasing essentially takes a set of commits, "copies" them, and plops them down somewhere else.',"","While this sounds confusing, the advantage of rebasing is that it can be used to make a nice linear sequence of commits. The commit log / history of the repository will be a lot cleaner if only rebasing is allowed.","","Let's see it in action..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have two branches yet again; note that the bugFix branch is currently selected (note the asterisk)","","We would like to move our work from bugFix directly onto the work from main. That way it would look like these two features were developed sequentially, when in reality they were developed in parallel.","","Let's do that with the `git rebase` command."],afterMarkdowns:["Awesome! Now the work from our bugFix branch is right on top of main and we have a nice linear sequence of commits.","",'Note that the commit C3 still exists somewhere (it has a faded appearance in the tree), and C3\' is the "copy" that we rebased onto main.',"","The only problem is that main hasn't been updated either, let's do that now..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now we are checked out on the `main` branch. Let's go ahead and rebase onto `bugFix`..."],afterMarkdowns:["There! Since `main` was an ancestor of `bugFix`, git simply moved the `main` branch reference forward in history."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["To complete this level, do the following","","* Checkout a new branch named `bugFix`","* Commit once","* Go back to main and commit again","* Check out bugFix again and rebase onto main","","Good luck!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Der zweite Weg um Inhalte aus verschiedenen Branches zu kombinieren ist `git rebase`. Rebasen nimmt im Prinzip eine Menge von Commits, "kopiert" sie und packt sie auf etwas anderes drauf.',"","Auch wenn das erst mal komisch klingt, liegt der Vorteil von Rebase darin, dass man es benutzen kann um hübsch lineare Abfolgen von Commits zu erhalten. Das Commit-Protokoll des Repositorys wird durch Rebase eine ganze Ecke einfacher aussehen, weil Merge Commits vermieden werden.","","Schauen wir's uns mal in Aktion an ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir wieder zwei Branches; wie du siehst ist `bugFix` aktuell ausgewählt (sieht man am `*`).","","Wir würden jetzt gerne unsere Arbeit aus `bugFix` direkt auf den `main` packen. Das Ergebnis wäre, dass alle aktuellen Änderungen in `main` auch im Branch `bugFix` sind.","","Das machen wir mit dem Befehl `git rebase`:"],afterMarkdowns:["Hammer! Was wir in `bugFix` gemacht haben ist jetzt oben auf `main` draufgepackt und wir haben eine schön lineare Abfolge von Commits bekommen.","",'Commit `C3` existiert immer noch irgendwo (deswegen ist er blass dargestellt) und `C3\'` ist die "Kopie" die wir auf den `main` gepackt haben.',"","Aber `main` ist jetzt nicht aktualisiert worden, lass uns das gerade noch nachholen ..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jetzt sind wir im `main`. Lass uns den mal auf `bugFix` rebasen ..."],afterMarkdowns:["So! Da `main` ein Vorgänger von `bugFix` war konnte Git hier einfach den Bezeichner `main` auf denselben Commit schieben, auf den auch `bugFix` zeigt."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level abzuschließen musst du folgendes tun:","","* Einen neuen Branch namens `bugFix` auschecken","* Einen Commit machen","* Zurück zum `main` wechseln und noch einmal committen","* `bugFix` auschecken und auf den `main` rebasen","","Viel Erfolg!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","ブランチを一つにまとめる方法として前回はマージを紹介しましたが、今回紹介するリベースを使うこともできます。リベースの動作は、マージするコミットのコピーをとって、どこかにストンと落とすというイメージです。","","ピンと来ないかもしれませんが、リベースのメリットは一本の連続したコミットに整形できることです。リベースだけ使っていると、コミットのログや履歴が非常にクリーンな状態に保たれます。","","早速実際にどう動くのかを見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["前回と同様の2つのブランチを考えます。仮にいまbugFixブランチをチェックアウトしているとします。(アスタリスクつきのもの)","","bugFixに入ってる作業内容をそのまま直接mainブランチ上の内容に移動したいとします。こうすることで、実際には並行して開発された2つの別々のブランチ上の機能のソースを、あたかも1本のブランチ上で連続して開発されていたかのように見せることができます。","","`git rebase`コマンドでそれをやってみましょう。"],afterMarkdowns:["できました!これでbugFixブランチの作業内容はmainブランチのすぐ先に移動したので、見た目が一本になってスッキリしました。","","気を付けてほしいのは、C3コミットはどこかに残ってるということ(ツリーの中で半透明にしてあります)、そしてC3'は(C1との接続が切れているC3の)コピーがmainブランチ上に作られているということです。","","一つ問題が残ってて、mainブランチがまだ最新化されていませんね。ちょっと直してみましょう。。"],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["mainブランチにチェックアウトしてあります。この状態からmainブランチを`bugFix`へとリベースしてみましょう。"],afterMarkdowns:["できた!`main`は`bugFix`の直前のコミットだったので、gitは単純に`main`ブランチのポインタを前に進めただけでした。"],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["以下の作業で理解度の確認をしてみましょう。","","* `bugFix`という名前の新しいブランチをチェックアウトする","* 一回だけコミット","* mainブランチに戻ってもう1回コミット","* bugFixをもう1回チェックアウトして、main上にリベース","","幸運を祈る!"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'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.","","Veámoslo en acción..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Acá tenemos dos ramas otra vez. Notar que la rama bugFix está actualmente seleccionada (tiene un asterisco)","","Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de main. 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 main, y tenemos una secuencia lineal de commits.","",'Notá que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3\' es la "copia" que rebaseamos sobre main.',"","El único problema es que main todavía no se actualizó, resolvámoslo ahora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ahora nos encontramos sobre la rama `main`. Avancemos y rebaseémosla sobre `bugFix`..."],afterMarkdowns:["¡Ahí está! Como `main` era un ancestro de `bugFix`, git simplemente movió la referencia de `main` hacia adelante en la historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, hacé lo siguiente:","","* Checkouteá una nueva rama llamada `bugFix`","* Commiteá una vez","* Volvé a main y commiteå de nuevo","* Checkoutá bugFix otra vez y rebaseala sobre main","","¡Éxitos!"]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'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 usas rebase.","","Veámoslo en acción..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Acá tenemos dos ramas otra vez. Nota que la rama bugFix está actualmente seleccionada (tiene un asterisco)","","Nos gustaría mover nuestro trabajo de bugFix directamente sobre el trabajo de main. 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 main, y tenemos una secuencia lineal de commits.","",'Notá que el commit C3 sigue existiendo en algún lado (aparece medio desvanecido en el árbol), y C3\' es la "copia" que rebaseamos sobre main.',"","El único problema es que main todavía no se actualizó, resolvámoslo ahora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ahora estamos parados sobre la rama `main`. Avancemos y rebaseémosla sobre `bugFix`..."],afterMarkdowns:["¡Ahí está! Como `main` era un ancestro de `bugFix`, git simplemente movió la referencia de `main` hacia adelante en la historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, haz lo siguiente:","","* Cámbiate a una nueva rama llamada `bugFix`","* Haz un commit de una vez","* Vuelve a main y haz commit de nuevo","* Cámbiate a la rama bugFix otra vez y rebaséala sobre main","","¡Éxitos!"]}}]},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 main. 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 main, 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 main.',"","El único problema es que main todavía no se actualizó, resolvámoslo ahora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ahora estamos parados sobre la rama `main`. Avancemos y hagamos rebase sobre `bugFix`..."],afterMarkdowns:["¡Ahí está! Como `main` era un ancestro de `bugFix`, git simplemente movió la referencia de `main` hacia adelante en la historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{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 main y crea otro commit","* Haz checkout en bugFix otra vez y haz rebase sobre main","","¡Misión cumplida!"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rebase no Git","",'A segunda forma de combinar trabalho entre ramos é o *rebase*. O rebase essencialmente pega um conjunto de commits, "copia" os mesmos, e os despeja em outro lugar.',"","Isso pode parecer confuso, mas a vantagem do rebase é que ele pode ser usado para construir uma sequência mais bonita e linear de commits. O registro de commits (história do repositório) ficará muito mais limpa se for utilizado apenas rebase em vez de merge.","","Vejamo-lo em ação..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui temos dois ramos novamente; note que o ramo bugFix está atualmente ativo (veja o asterisco)","","Queremos mover nosso trabalho do bugFix diretamente dentro do main. Desta forma, vai parecer que esses dois recursos foram desenvolvidos sequencialmente, quando na realidade foram feitos em paralelo.","","Vamos fazê-lo com o comando `git rebase`."],afterMarkdowns:["Incrível! Agora o trabalho do nosso ramo bugFix está logo após o do main, e temos uma linda sequência linear de commits.","",'Perceba que o commit C3 ainda existe em algum lugar (ele está clareado na árvore), e que o C3\' é a "cópia" que rebaseamos no main.',"","O único problema é que o main não foi atualizado também, vamos fazê-lo agora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora o ramo `main` está ativo. Vamos em frente, fazer rebase no `bugFix`..."],afterMarkdowns:["Aí está! Como o `main` era um ancestral do `bugFix`, o git simplesmente moveu a referência do ramo `main` para frente na história."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, faça o seguinte","","* Faça checkout de um novo branch chamado `bugFix`","* Faça um commit","* Volte ao main e faça um novo commit","* Faça checkout do bugFix novamente e faça rebase no main","","Boa sorte!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rebase en Git","",'A segunda forma de mesturar traballo entre ramas é o *rebase*. O rebase esencialmente pega un conxunto de commits, "copia" os commits, e os sitúa en outro lugar.',"","Esto pode paracer confuso, pero a vantaxe do rebase é que se pode usar para construír unha secuencia máis bonita e linial de commits. O rexisto de commits do repositorio estará máis limpo se só se permite facer rebases.","","Ímolo ver en acción..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí temos dúas ramas novamente; decátate de que a rama `bugFix` está seleccionada (olla ó asterisco)","","Queremos mover o noso traballo do `bugFix` directamente dentro da rama `main`. Desta forma, vai parecer que eses dous recursos foron editados secuencialmente, cando a realidade é que se fixeron en paralelo.","","Imos lanzar o comando `git rebase`."],afterMarkdowns:["¡Buah chorvo! Agora o traballo da nosa rama `bugFix` está seguida de main, e temos unha fermosa línea de commits.","",'Percibe que o commit `C3` aínda existe nalgún lugar (el está borrado na árbore), e que `C3\'` é a "copia" que rebasamos en main.',"","O único problema é que a rama main non foi actualizada tamén, ímolo facer agora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora a rama `main` está ativa. Continuamos facendo o rebase na `bugFix`..."],afterMarkdowns:["¡Xa está! Como `main` era um ancestro de `bugFix`, git simplemente moveu a referencia da rama `main` máis adiante na historia."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, fai o seguinte","","* Fai checkout de un novo branch chamado `bugFix`","* Fai un commit","* Regresa a main e fai un commit novamente","* Móvete á rama bugFix outra vez e fai rebase sobre main","","Boa sorte!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'La seconde façon de combiner les contenus de deux branches est *rebase*. Rebase prend un ensemble de commits, les "recopie", et les ajoute en bout de chaîne à un autre endroit.',"","Bien que cela puisse sembler compliqué, l'avantage de rebase est de permettre d'obtenir une simple séquence linéaire de commits. Les logs/l'historique du dépôt seront bien plus propres si seul rebase est autorisé (plutôt que merge).","","Voyons rebase en action…"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici nous avons encore une fois deux branches ; notez que nous sommes sur la branche bugFix (cf. l'astérisque)","","Nous voudrions transférer notre travail de la branche 'bugFix' directement sur le travail existant dans 'main'. Ainsi on aurait l'impression que ces deux travaux ont été développés séquentiellement alors qu'en réalité ils ont été réalisés en parallèle.","","Faisons cela avec la commande `git rebase`."],afterMarkdowns:["Super ! Désormais, le travail de la branche 'bugFix' est juste en haut de la branche 'main' et nous avons une belle séquence linéaire de commits.","","Notez que le commit C3 existe toujours quelque part (il est en grisé sur l'arbre), et C3' est la \"copie\" que nous avons créée sur main avec rebase.","","Le seul problème est que main n'a pas été mis à jour, faisons cela maintenant…"],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous sommes désormais positionnés sur la branche `main`. Continuons en faisant le rebase sur `bugFix`…","Et voilà ! Puisque `main` était un ascendant de `bugFix`, Git a simplement déplacé la référence de la branche `main` en avant dans le temps."],afterMarkdowns:["Voilà vous avez vu comment cela fonctionne","","Continuons et essayons ce niveau !"],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, faites les opérations suivantes","","* Positionnez-vous (checkout) sur une nouvelle branche nommée `bugFix`","* Faites un commit","* Retournez sur main et faites un nouveau commit","* Positionnez-vous à nouveau sur bugFix et faites un rebase sur main","","Bonne chance !"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","第二种合并分支的方法是 `git rebase`。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。","","Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。","","咱们还是实际操作一下吧……"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["还是准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)","","我们想要把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。","","咱们这次用 `git rebase` 实现此目标"],command:"git rebase main",afterMarkdowns:["怎么样?!现在 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。","","注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。","","现在唯一的问题就是 main 还没有更新,下面咱们就来更新它吧……"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在我们切换到了 `main` 上。把它 rebase 到 `bugFix` 分支上……"],command:"git rebase bugFix",afterMarkdowns:["好了!由于 `bugFix` 继承自 `main`,所以 Git 只是简单的把 `main` 分支的引用向前移动了一下而已。"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["要完成此关,执行以下操作:","","* 新建并切换到 `bugFix` 分支","* 提交一次","* 切换回 main 分支再提交一次","* 再次切换到 bugFix 分支,rebase 到 main 上","","祝你好运!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git rebase","",'*rebasing* 是 merge branch 的第二種方法。rebasing 就是取出一連串的 commit,"複製"它們,然後把它們接在別的地方。',"","雖然聽起來難以理解,rebasing 的優點是可以建立更線性的 commit history。假如只允許使用 rebasing 的話,則我們的 repo 中的 commit log 或者是 commit history 會更加簡潔好看。","","讓我們親身體會一下..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡,還是有兩個 branch;注意目前我們所在的 branch 是 bugFix(看那顆星啦)","","我們想要把在 bugfix 所做的修改直接移到 main branch上。使用 rebasing 的話,兩個 branch 看起來像是依序按順序進行修改,實際上它們的修改是平行進行的。","","用 `git rebase` 來實現吧"],command:"git rebase main",afterMarkdowns:["很厲害吧!現在 bugFix branch 上的工作在 main branch 的最前端,同時我們也得到了一個更加線性的 commit 順序。","",'注意,本來的 commit C3 沒有消失(在圖上面呈現陰影),而我們"複製" C3,將它的副本 C3\' 接在 main branch 的後面。',"","現在唯一的問題是 main branch 還沒有更新...我們接下來就更新它吧!"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在,切換到 `main` branch。接下來就把它 rebase 到 `bugFix` 上面吧..."],command:"git rebase bugFix",afterMarkdowns:["完成!因為 `main` branch 是 `bugFix` 的 parent,所以 git 只是把 `main` branch 往前移動到 `bugFix` 上。"],beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["想完成這一關,執行以下操作:","","* 建立 `bugFix` branch","* commit 一次","* 切換回 main branch 再 commit 一次","* 再次切換到 bugFix branch,接著 rebase bugFix 這個 branch 到 main branch 上","","祝你好運啦!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 리베이스(Rebase)","","브랜치끼리의 작업을 접목하는 두번째 방법은 *리베이스(rebase)*입니다. 리베이스는 기본적으로 커밋들을 모아서 복사한 뒤, 다른 곳에 떨궈 놓는 것입니다.","","조금 어렵게 느껴질 수 있지만, 리베이스를 하면 커밋들의 흐름을 보기 좋게 한 줄로 만들 수 있다는 장점이 있습니다. 리베이스를 쓰면 저장소의 커밋 로그와 이력이 한결 깨끗해집니다.","","어떻게 동작하는지 살펴볼까요..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 또 브랜치 두 개가 있습니다; bugFix브랜치가 현재 선택됐다는 점 눈여겨 보세요 (별표 표시)","","bugFix 브랜치에서의 작업을 main 브랜치 위로 직접 옮겨 놓으려고 합니다. 그렇게 하면, 실제로는 두 기능을 따로따로 개발했지만, 마치 순서대로 개발한 것처럼 보이게 됩니다.","","`git rebase` 명령어로 함께 해보죠."],afterMarkdowns:["오! 이제 `bugFix` 브랜치의 작업 내용이 `main`의 바로 위에 깔끔한 한 줄의 커밋으로 보이게 됐습니다.","","C3 커밋은 어딘가에 아직 남아있고(그림에서 흐려짐), C3'는 `main` 위에 올려 놓은 복사본입니다.","","`main`이 아직 그대로라는 문제가 남아있는데요, 바로 해결해보죠..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["우리는 지금 `main` 브랜치를 선택한 상태입니다. `bugFix` 브랜치쪽으로 리베이스 해보겠습니다..."],afterMarkdowns:["보세요! `main`이 `bugFix`의 부모쪽에 있었기 때문에, 단순히 그 브랜치를 더 앞쪽의 커밋을 가리키게 이동하는 것이 전부입니다."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["이하 작업을 하면 이번 레벨을 통과합니다","","* `bugFix`라는 새 브랜치를 만들어 선택하세요","* 커밋 한 번 합니다","* `main` 브랜치로 돌아가서 또 커밋합니다","* `bugFix`를 다시 선택하고 `main`에 리베이스 하세요","","화이팅!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","Второй способ объединения изменений в ветках - это *rebasing*. При ребейзе Git по сути копирует набор коммитов и переносит их в другое место.","","Несмотря на то, что это звучит достаточно непонятно, преимущество `rebase` в том, что c его помощью можно делать чистые и красивые линейные последовательности коммитов. История коммитов будет чище, если вы применяете `rebase`.","","Посмотрим, как это работает..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["У нас здесь снова две ветки. Обрати внимание, что выбрана ветка `bugFix` (отмечена звёздочкой)","","Хочется сдвинуть наши изменения из `bugFix` прямо на вершину ветки `main`. Благодаря этому всё будет выглядеть, как будто эти изменения делались последовательно, хотя на самом деле - параллельно.","","Применим `git rebase`."],afterMarkdowns:["Супер! Теперь изменения из `bugFix` находятся в конце ветки `main` и являют собой линейную последовательность коммитов.","",'Обрати внимание, что коммит С3 до сих пор существует где-то, а С3\' - это его "копия" в ветке `main`',"","Единственная проблема - ветка `main` не обновлена до последних изменений. Это легко исправить."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вот мы выбрали ветку `main`. Вперёд - сделаем rebase на `bugFix`."],afterMarkdowns:["Вуаля! Так как `main` был предком `bugFix`, git просто сдвинул ссылку на `main` вперёд."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, сделай следующее:","","* Переключись на ветку `bugFix`","* Сделай коммит","* Вернись на `main` и сделай коммит ещё раз","* Переключись на `bugFix` и сделай rebase на `main`","","Удачи!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Інший спосіб комбінування змін з різних бранчів називається *rebase*. Rebase по суті бере кілька комітів , "копіює" їх, й кладе їх в інше місце.',"","Це може звучати трохи незрозуміло, але основна перевага rebase в тому, що його використовують щоб створити зручну лінійну послідовність комітів. Коміт лог та історія будуть виглядати набагато чистіша, якщо користуватися лише rebase (а не merge)","","Спробуємо на практиці..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ми знову маємо дві гілки; зауваж, що наразі вибрана гілка bugFix (вважай зірочку)","","Ми хочемо перемістити наші зміни з гілки bugFix прямо до змін з гілки main. Тоді це буде виглядати наче ці зміни були додані одна за одною, хоча насправді вони були додані одночасно.","","Давайте зробимо це за допомогою команди `git rebase`."],afterMarkdowns:["Добре! Тепер зміни з гілки bugFix знаходяться прямо попереду змін з main й ми отримали зручну лінійну послідовність комітів.","",'Вважай що коміт C3 досі десь існує (в дереві він тьмяніший за решту), й C3\' це "копія" яку ми заребейсили в main.',"","Є лише одна проблема: гілка main також не була оновлена, давайте зробимо це наступним кроком..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер ми перейшли (checkout) до гілки `main`. Далі робимо rebase на `bugFix`..."],afterMarkdowns:["Вуаля! Так як `main` це предок `bugFix`, git просто просунув посилання гілки `main` вперед в історії."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, зроби наступне:","","* Зачекауть (checkout) новий бранч з назвою `bugFix`","* Зроби один коміт","* Повернись на main й зроби ще один коміт","* Зачекауть bugFix знову й заребейсь його на main","","Нехай щастить!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Cách thứ 2 để kết hợp thành quả của 2 nhánh là *rebase.* Rebase về căn bản là chọn một loạt các commit, "sao chép" chúng, và ném chúng sang chỗ khác.',"","Nghe có vẻ phức tạp, lợi thế của rebase là có thể tạo ra cây lịch sử thẳng tuột. Lịch sử commit nhìn sẽ gọn gàng hơn nhiều.","","Xem nó hoạt động thế nào nào..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giờ ta lại có 2 nhánh; để ý rằng nhánh bugFix đang được chọn (thấy dấu hoa thị chứ?)","","Ta muốn chuyển công việc từ bugFix trực tiếp sang main. Theo cách đó thì các chức năng nhìn có vẻ được phát triển tuần tự, trong khi thực tế chúng được phát triển song song.","","Dùng lệnh `git rebase` để thử nào."],afterMarkdowns:["Tuyệt vời! Giờ thành quả của nhánh bugFix nằm ngay trên main và ta có các commit nằm thẳng tuột.","",'Để ý rằng commit C3 vẫn nằm đâu đó (đã được làm mờ), và commit C3\' là bản "sao chép" mà ta dán lên nhánh main.',"","Vấn đề duy nhất bây giờ là nhánh main vẫn chưa được cập nhật, làm luôn cho nóng nào..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giờ thì ta đã chuyển sang nhánh `main`. Tiếp tục dán nó vào `bugFix` nào..."],afterMarkdowns:["Đó! Bởi vì `main` là cha ông của `bugFix`, Git đơn giản chuyển tham chiếu của nhánh `main` tiến lên."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, làm theo hướng dẫn sau","","* Chuyển sang nhánh mới tên là `bugFix`","* Commit một lần","* Quay về main và commit lần nữa","* Quay trở lại bugFix và rebase sang main","","Chúc may mắn!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Drugi način kombiniranja dela med branchi je *rebasing*. Rebasing vzame listo commitov, jih "skopira", nato pa jih položi nekam drugam.',"","To se morda sliši komplicirano, ampak prednost rebeasinga je, da se ga lahko uporabi za lepo linearno zaporedje commitov. Commit log / zgodovina repozitorija bo dosti lepša, če je dovoljeno le rebaseanje.","","Poglejmo to na primeru ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tu imamo spet dva brancha; trenutno izbran je branch bugFix (zvezdica).","","Radi bi prestavili naše delo iz bugFix direktno na delo iz masterja. Tako bi izgledalo, kot da sta bili ti dve funkcionalnosti razviti zaporedno, v resnici pa sta bili razviti vzporedno.","","Naredimo sedaj to z `git rebase` ukazom."],afterMarkdowns:["Super! Sedaj je naše delo iz bugFix brancha na vrhu masterja in imamo lepo zaporedje commitov.","",'Omenimo, da commit C3 še vedno obstaja nekje (v drevesu je zbledel), in C3\' je v bistvu "kopija", ki smo jo rebaseali na main.',"","Edini problem je, da tudi main ni bil posodobljen, naredimo to sedaj ..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sedaj smo checkoutani na `main` branchu. Pojdimo in rebaseajmo na `bugFix`..."],afterMarkdowns:["Tako! Ker je bil `main` prednik `bugFix`, je git enostavno premaknil `main` branch referenco naprej v zgodovini."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Da zaključiš to stopnjo, naredi naslednje:","","* Checkoutaj nov branch poimenovan `bugFix`","* Enkrat commitaj","* Pojdi nazaj na main in commitaj ponovno","* Ponovno checkoutaj bugFix in ga rebaseaj na main","","Srečno!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Drugim sposobem na łączenie naszej pracy z różnych gałęzi jest *rebase*. Rebase zasadniczo pobiera zestaw commitów, "kopiuje" je i wrzuca je gdzie indziej.',"","Chociaż brzmi to niejasno, zaletą rebase jest to, że można go użyć do stworzenia ładnej, liniowej sekwencji commitów. Rebase sprawi, że historia commitów w repozytorium będzie wyglądała na dużo prostszą, ponieważ nia ma wtedy commitów scalających.","","Sprawdźmy, jak to działa..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutaj znowu mamy dwie gałęzie. Zauważ, że gałąź bugFix jest aktualnie wybrana (zwróć uwagę, że ma gwiazdkę)","","Chcielibyśmy przenieść naszą pracę z gałęzi bugFix bezpośrednio na gałąź main. W ten sposób wyglądałoby to tak, jakby te dwa zadania były rozwijane sekwencyjnie, podczas gdy w rzeczywistości rozwijano je równolegle.","","Zróbmy to za pomocą polecenia `git rebase`."],afterMarkdowns:["Świetnie! Teraz nasz branch bugFix znajduje się tuż nad main i mamy ładną liniową sekwencję commitów.","",'Zauważ, że commit C3 nadal gdzieś istnieje (jest wyblakły w drzewie), a commit C3\' jest "kopią", którą przenosimy na main.',"","Jedynym problemem jest to, że `main` nie został jeszcze zaktualizowany. Zróbmy to teraz..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Znajdujemy się na gałęzi `main`. Przejdźmy dalej i zróbmy połączenie rebase z branchem `bugFix`..."],afterMarkdowns:["Gotowe! Ponieważ `main` był przodkiem `bugFix`, git po prostu przesunął odniesienie do `main` do przodu w historii."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, wykonaj następujące czynności:","","* Przejdź do nowej gałęzi o nazwie `bugFix`","* Zrób commit","* Wróć do gałęzi `main` i zrób kolejny commit","* Przejdź do `bugFix` i połącz za pomocą rebase z `main`","","Powodzenia!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","",'Il secondo modo per unire il lavoro tra rami è il *rebasing* (ribasare). Quando si ribasa vengono presi una serie di commit, vengono "copiati", e incollati da qualche parte.',"","Anche se sembra un sistema complesso, il vantaggio del rebasing è che può essere usato per creare una sequenza lineare di commit. Il log / storia dei commit del repository sarebbe molto più ordinata e comprensibile se fosse consentito solo il rebasing.","","Vediamolo in azione..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Anche qui abbiamo ancora due rami; prestate attenzione al fatto che il ramo selezionato è bugFix (notare l'asterisco*)","","Ora vogliamo spostare il nostro lavoro dal ramo bugFix direttamente sul ramo main. In questo modo sembrerà che i due lavori sono stati sviluppati in sequenza, quando in realtà sono stati sviluppati in parallelo.","","Vediamo il comando `git rebase` all'opera."],afterMarkdowns:["Fantastico! Ora il lavoro del ramo bugFix è sopra al main e abbiamo una sequenza lineare di commit.","",'Nota che il commit C3 continua ad esistere (messo in trasparenza), e C3\' è la "copia" che abbiamo ribasato sul main.',"","L'unico problema è che il main non è ancora stato aggiornato, facciamolo ora..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora il ramo selezionato è il main. Procediamo e facciamo rebase su `bugFix`..."],afterMarkdowns:["Ecco qua! Visto che main era un antenato di `bugFix`, git sposta semplicemente il riferimento al ramo `main` in avanti."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, esegui i seguenti passaggi","","* Crea un nuovo ramo di nome `bugFix`","* Crea un commit","* Torna al main e crea un nuovo commit","* Seleziona nuovamente bugFix e fai rebase sul main","","In bocca al lupo!"]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase","","Branch'ler arasında çalışmayı birleştirmenin ikinci yolu, *rebasing* (tekrar temele almak) işlemidir. Rebasing, temelde bir dizi commit'i alır, bunları \"kopyalar\" ve başka bir yere yerleştirir.","","Bu karmaşık gibi görünse de, rebasing'in avantajı, güzel bir doğrusal commit dizisi oluşturmak için kullanılabilmesidir. Yalnızca rebasing'e izin verildiğinde, repo commit kaydı / geçmişi çok daha temiz gözükebilmektedir.","","Nasıl çalıştığını görelim..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["İşte yine karşımızda iki branch'imiz var; bugFix branch'inin şu an seçili olduğuna dikkat edin (yıldız işareti ile belirtilmiş).","","BugFix branch'indeki çalışmamızı doğrudan main branch'indeki çalışmanın üzerine taşımak istiyoruz. Böylece bu iki özelliğin sırayla geliştirildiği görünürken, gerçekte eşzamanlı olarak geliştirildiği anlaşılacaktır.","","Hadi bunu `git rebase` komutuyla yapalım."],afterMarkdowns:["Harika! Şimdi bugFix branch'indeki çalışmamız doğrudan main'in üstünde ve güzel bir doğrusal commit dizimiz var.","","C3 commit'inin hala bir yerde bulunduğunu (ağaçta soluk bir görünümde olduğunu) ve C3'ün main üzerine yeniden temellendiği (rebase) ve bir \"kopya\" olduğunu unutmayın.","","Tek sorun, main'in henüz güncellenmemiş olması, hadi şimdi bunu yapalım..."],command:"git rebase main",beforeCommand:"git commit; git checkout -b bugFix C1; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Şu anda `main` branch'inde bulunuyoruz. Şimdi `bugFix` branch'ini yeniden temel alalım..."],afterMarkdowns:["İşte! main, bugFix'in atsı olduğu için, git sadece main dalının referansını tarihte ileri taşıdı."],command:"git rebase bugFix",beforeCommand:"git commit; git checkout -b bugFix C1; git commit; git rebase main; git checkout main"}},{type:"ModalAlert",options:{markdowns:["Bu seviyeyi tamamlamak için aşağıdaki adımları uygulamanız gerekiyor:","","* `bugFix` isminde yeni bir branch'e geçin","* Bir commit atın","* main'e geri dönün ve bir commit daha atın","* bugFix'e geri dönün ve main'e rebase atın","","Bol Şans!"]}}]}}}},{}],126:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main","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":{"main":{"target":"C2","id":"main","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"}}',onlyEvaluateAsserts:!0,goalAsserts:{bugfix:[function(e){return e.__num_commits_upstream>5}]},name:{en_US:"Git Describe",fr_FR:"Git describe",de_DE:"Git Describe",ja:"Git Describe",es_AR:"Git Describe",es_MX:"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ả)",sl_SI:"Git Describe",it_IT:"Git Describe",pl:"Git describe",tr_TR:"git describe"},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_MX:"Simplemente crea un commit en la rama bugFix cuando estés listo para continuar",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",sl_SI:"Commitaj enkrat na bugFix, ko boš pripravljen za nadaljevanje.",it_IT:"Fai un commit da bugFix per procedere",pl:"Scommituj raz na bugFix, żeby przejść dalej",tr_TR:"Hazır olduğunuzda bugFix üzerine sadece bir commit atmanız yeterlidir."},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 the computer of a coworker 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:"GitDemonstrationView",options:{beforeMarkdowns:["Let's look at a quick example. For this tree below:"],afterMarkdowns:["The command `git describe main` 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"}},{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:[{type:"ModalAlert",options:{markdowns:["### Git describe","","Parce ce que les tags sont de très bonnes références dans le code, Git a 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 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 :"],afterMarkdowns:["La commande`git describe main` 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"}},{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:[{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:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來看一個例子,對於下面的 tree:"],afterMarkdowns:["`git describe main` 會輸出:","","`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"}},{type:"ModalAlert",options:{markdowns:["`git describe` 就是這樣了!試著在這個關卡指定幾個位置來感受一下這個指令吧!","","當你完成的時候,只要一個 commit 就可以結束這個關卡,我們會給你一個免費贈品:P"]}}]},zh_CN:{childViews:[{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:"GitDemonstrationView",options:{beforeMarkdowns:["让我们来看一个例子,对于下面的提交树:"],afterMarkdowns:["`git describe main` 会输出:","","`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"}},{type:"ModalAlert",options:{markdowns:["`git describe` 就是这样了!试着在这个关卡指定几个位置来感受一下这个命令吧!","","当你准备进行下一关时,只要提交一次就可以通过这个关卡。算是我们送你的一个小礼物吧 :P"]}}]},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 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:"],afterMarkdowns:["El comando `git describe main` 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"}},{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 quieras, hacé un commit para terminar el nivel. Te estamos dando una gratis :P"]}}]},es_ES:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'Como los tags sirven genial como "marcas" en el código, git tiene un comando para _describir_ dónde estás relativo a la "marca" (es decir, al "tag") más cercana. Y ese comamndo se llama ¡`git describe`!',"","`git describe` puede ayudarte a saber dónde estás después de haberte 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 de debug) o cuando te sientas delante de la computadora de un compañero de trabajo que acaba de volver de 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 especificas ninguna referencia, git simplemente usa el commit en el que estás en ese momento (`HEAD`).","","La salida de ese comando se ve así:","","`__g`","","Donde `tag` es el tag más cercano en la historia, `numCommits` es a cuántos commits de ese tag estás, y `` es el hash del commit que está siendo descrito."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos un ejemplo rápido. Para este árbol de commits:"],afterMarkdowns:["El comando `git describe main` mostraría:","","`v1_2_gC2`","","Mientras que `git describe side` mostraría:","","`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:["¡Eso es prácticamente todo lo que hay sobre git describe! Prueba describiendo algunas _ubicaciones_ en este nivel para familiarizarte con el comando.","","Cuando estés listo, crea un commit para terminar el nivel. Te estamos dejando este nivel de regalo. :P"]}}]},es_ES:{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 sientas delante de la computadora de un compañero de trabajo que acaba de volver 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 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:["Veamos un ejemplo breve. Para este árbol de commits:"],afterMarkdowns:["El comando `git describe main` 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"}},{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"]}}]},pt_BR:{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:["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:["Vejamos um exemplo rápido. Para a árvore abaixo:"],afterMarkdowns:["O comando `git describe main` 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"}},{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"]}}]},gl:{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 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:["Vexamos un exemplo rápido. Para a árbore de abaixo:"],afterMarkdowns:["O comando `git describe main` 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"}},{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."]}}]},de_DE:{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:["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, wie viele 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äßig nur annotierte Tags. Um nicht annotierte Tags zu sehen, verwende bitte `git describe --tags`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns das schnell an einem Beispiel an. Für den folgenden Baum:"],afterMarkdowns:["Der Befehl `git describe main` 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"}},{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"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","","タグは、ソースリストの優秀な「アンカー(標識)」として作用するので、Gitには最も近く関係のある「アンカー」(タグの別名)を*記述するため*のコマンドがあります。そして、そのコマンドは`git describe`と呼ばれています!","","Gitの`describe`は、あなたが大量のコミットの中を移動するとき、今どこにいるかを知るのを助けてくれます(このような状況は、例えばあなたがデバッグ検索コマンドの一つ`git bisect`を走らせ終わった後や、同僚が休暇から帰ってきて自分の席に座るときに起こります)。"]}},{type:"ModalAlert",options:{markdowns:["Gitの`describe`は、以下の形式をとります:","","`git describe <参照>`","","`<参照>`には、Gitが解釈可能なコミットの参照表現(ブランチやタグの指定、コミットハッシュなど)をいれます。もし、何も入力しなかった場合、Gitは現在の位置のコミット(`HEAD`)を使います。","","コマンドの結果は以下のようになります:","","`<タグ>_<コミット数>_g<ハッシュ>`","","`<タグ>`には履歴の一番最新のタグ名が、`<コミット数>`にはそのタグから幾つのコミットがあったか、`<ハッシュ>`はそのコミットのハッシュがそれぞれ入ります。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["軽い例を見てみましょう。この木においての例は以下のようになります:"],afterMarkdowns:["コマンド`git describe main`の結果は以下のようになります:","","`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"}},{type:"ModalAlert",options:{markdowns:["`describe`によってGitの情報が簡潔に全て記述されます!このレベルでは、このコマンドの感触をつかむため幾つかの場所で`describe`をしてみてください。","","終わったら、最新のコミットに行き一度コミットを行えばこのレベルを終了することができます。この先では、いくつかの挑戦課題を用意しています :P"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","","Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает, как далеко текущее состояние от ближайшего тега. И эта команда называется `git describe`","","Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали `git bisect` или если вы недавно вернулись из отпуска =)"]}},{type:"ModalAlert",options:{markdowns:["Git describe выглядит примерно так:","","`git describe `","","Где `ref` — это что-либо, что указывает на конкретный коммит. Если не указать `ref`, то git будет считать, что указано текущее положение (`HEAD`).","","Вывод команды выглядит примерно так:","","`__g`","","Где `tag` – это ближайший тег в истории изменений, `numCommits` – это на сколько далеко мы от этого тега, а `hash` – это хеш коммита, который описывается."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим на простой пример. Для дерева, показанного ниже:"],afterMarkdowns:["Команда `git describe main` выведет:","","`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"}},{type:"ModalAlert",options:{markdowns:["Это, в общем-то, всё, что можно сказать про `git describe`. Попробуй выполнить команду на нескольких коммитах.","","Как только наиграешься, просто сделай один коммит, и уровень будет пройден."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'커밋 트리에서 태그가 훌륭한 "닻"역할을 하기 때문에, git에는 여러분이 가장 가까운 "닻(태그)"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!',"","Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다."]}},{type:"ModalAlert",options:{markdowns:["Git describe 는 다음의 형태를 가지고 있습니다:","","`git describe `","","``에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).","","명령어의 출력은 다음과 같은 형태로 나타납니다:","","`__g`","","`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. ``는 묘사하고있는 커밋의 해시를 나타냅니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["간단한 예제를 확인해 봅시다. 아래의 트리에서:"],afterMarkdowns:["`git describe main` 명령은 다음을 출력합니다:","","`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"}},{type:"ModalAlert",options:{markdowns:["이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.","","준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P"]}}]},uk:{childViews:[{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:"GitDemonstrationView",options:{beforeMarkdowns:["Розгляньмо короткий приклад. Для дерева нижче:"],afterMarkdowns:["Команда `git describe main` виведе:","","`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"}},{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 đến vị trí "mỏ neo" (thẻ) gần nhất. Và đó là `git describe`!',"","`git describe` 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 main` 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"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'Ker tagi služijo kot tako odlična "sidra" v kodi, ima git ukaz za *opis* kje si, relativno glede na najbližje "sidro" (aka tag). Temu ukazu se reče `git describe`!',"","Git describe se ti lahko pomaga orientirati, če si premikal veliko commitov naprej in nazaj po zgodovini; to se lahko zgodi, če si končal git bisekcijo (iskanje kot debuggiranje) ali če se usedeš za sodelavčev računalnik, ko je ravno prišel z dopusta."]}},{type:"ModalAlert",options:{markdowns:["Git describe izgleda takole:","","`git describe `","","Kjer je `` karkoli kar lahko git prepozna kot commit. Če ne podaš ref-a, git uporabi mesto, kjer si trenutno checkoutan (`HEAD`).","","Izpis ukaza je sledeč:","","`__g`","","Kjer je `tag` najbližji prednik v zgodovini, `numCommits` je število commitov oddaljenosti tag-a in `` je hash commita, ki ga opisujemo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo hiter primer. Za drevo spodaj:"],afterMarkdowns:["Bi ukaz `git describe main` izpisal:","","`v1_2_gC2`","","Ukaz `git describe side` pa bi vrnil:","","`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:["To je približno vse, kar se tiče git describe-a! Poizkusi za občutek opisati nekaj lokacij v tej stopnji.","","Ko si pripravljen, samo enkrat commitaj, da zaključiš stopnjo. Tole ti častimo :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git describe","",'Ponieważ znaczniki służą jako świetne "kotwice" w bazie kodu, git ma polecenie *opisujące*, gdzie jesteś w stosunku do najbliższej "kotwicy". I jest to `git describe`!',"","Polecenie `git describe` może pomóc ci zorientować się w sytuacji, gdy przesuniesz wiele commitów wstecz lub do przodu w historii; może się to zdarzyć po użyciu `git bisect` (na potrzeby debugowania) lub gdy siedzisz przy komputerze współpracownika, który właśnie wrócił z wakacji."]}},{type:"ModalAlert",options:{markdowns:["Git describe przyjmuje postać:","","`git describe `","","Gdzie `` jest czymkolwiek, co git może odnieść do commita. Jeśli nie podasz ``, git użyje aktualnie checkoutowanego miejsca (`HEAD`).","","Wynik polecenia wygląda następująco:","","`__g`","","`tag` jest znacznikiem najbliższego przodka w historii, `numCommits` jest liczbą commitów od tego znacznika, a `` jest haszem opisywanego commitu."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Przyjrzyjmy się krótkiemu przykładowi. Dla tego drzewa poniżej:"],afterMarkdowns:["polecenie `git describe main` dałoby wynik:","","`v1_2_gC2`","","a `git describe side` dałoby wynik:","","`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:["To w zasadzie wszystko, co musisz wiedzieć o `git describe`! Spróbuj opisać kilka miejsc na tym poziomie, aby wyczuć to polecenie.","","Kiedy zechesz przejść dalej, po prostu zrób jeden commit, aby ukończyć poziom. Masz to w gratisie :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe","",'Visto che i tag fungono da "ancore", si può usare il comando `git describe` per capire dove ci si trova in riferimento all\'"ancora" (tag) più vicina!',"","Git describe aiuta ad orientarti dopo che hai creato molti commit su per giù nell'albero; oppure dopo che hai concluso un git bisect (per ricercare bug) o quando utilizzi il computer di un collega che è appena tornato dalle vacanze."]}},{type:"ModalAlert",options:{markdowns:["Git describe ha questa forma:","","`git describe `","","Dove `` è qualunque cosa che può indicare un commit. Se non specifichi un ref, git farà riferimento alla tua posizione attuale (`HEAD`).","","L'output del comando sarà:","","`__g`","","Dove `tag` è il tag antenato più vicino, `numCommits` corrisponde al numero di commit tra ref e il tag, e `` è l'hash del commit che è descritto."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo un esempio semplice. In quest'albero:"],afterMarkdowns:["Il comando `git describe main` genera come output:","","`v1_2_gC2`","","Mentre `git describe side` genererà:","","`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:["Questo è più o meno quanto fa git describe! Prova questo comando in vari punti in questo livello per prendere confidenza.","","Quando hai finito, procedi e crea un commit per concludere il livello. Consideralo un omaggio della casa :P"]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Git Describe (Tanımla)","",'Etiketler kod tabanında harika "çekirdekler" olarak hizmet ettiği için, Git size en yakın "anchor\'a (etikete)" göre nerede olduğunuzu açıklamak için bir komut sunar. Bu komut `git describe` \'dır!',"","Git describe, birçok commit'i geriye veya ileriye doğru hareket ettikten sonra nerede bulunduğunuzun anlaşılmasına yardımcı olabilir; bu, bir hata ayıklama araması olan git bisect'i tamamladıktan sonra veya tatilden yeni dönen bir iş arkadaşının bilgisayarına oturduğunuzda karşınıza çıkabilir."]}}]}}}},{}],127:[function(e,t,o){o.level={compareOnlyMainHashAgnosticWithAsserts:!0,goalAsserts:{main:[function(e){return e.C4>e.C1}]},disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22main%22%7D%2C%22debug%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22debug%22%7D%2C%22printf%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22printf%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22bugFix%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i main --solution-ordering C4; git rebase bugFix main",startTree:'{"branches":{"main":{"target":"C1","id":"main"},"debug":{"target":"C2","id":"debug"},"printf":{"target":"C3","id":"printf"},"bugFix":{"target":"C4","id":"bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"}},"HEAD":{"target":"bugFix","id":"HEAD"}}',name:{ko:"딱 한 개의 커밋만 가져오기",en_US:"Grabbing Just 1 Commit",fr_FR:"Choisir seulement 1 commit",de_DE:"Einen Commit pflücken",es_AR:"Tomando un único commit",es_ES:"Tomando un único commit",es_MX:"Tomando un único commit",pt_BR:"Pegando um único commit",gl:"Escollendo un único commit",ja:"一つのコミットのみを取得",zh_CN:"只取一个提交记录",zh_TW:"只取一個 commit",ru_RU:"Выберем один коммит.",uk:"Вибираємо всього один коміт",vi:"Chỉ lấy 1 commit",sl_SI:"Izbiranje Samo Enega Commita",it_IT:"Prendi solo 1 Commit",pl:"Wzięcie tylko 1 commita",tr_TR:"Sadece 1 commit'i yakalamak"},hint:{en_US:"Remember, interactive rebase or cherry-pick is your friend here",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がクリアのカギです",ko:"대화식 리베이스(rebase -i)나 or 체리픽(cherry-pick)을 사용하세요",zh_CN:"你有两个朋友,cherry-pick 和 rebase -i",zh_TW:"記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助",ru_RU:"Не забывай, что интерактивный rebase и cherry-pick – это твои друзья!",uk:"Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!",vi:"Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick",sl_SI:"Pomni, interaktivni rebase ali cherry-pick sta tu tvoja prijatelja.",it_IT:"Ricorda, rebase interattivo o cherry-pick sono tuoi amici",pl:"Pamiętaj, że znasz już interaktywny rebase oraz cherry-pick",tr_TR:"Unutmayın interactive rebase ve cherry-pick buradaki en iyi dostlarınız."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Locally stacked commits","","Here's a development situation that often happens: I'm trying to track down a bug but it is quite elusive. In order to aid in my detective work, I put in a few debug commands and a few print statements.","","All of these debugging / print statements are in their own commits. Finally I track down the bug, fix it, and rejoice!","","Only problem is that I now need to get my `bugFix` back into the `main` branch. If I simply fast-forwarded `main`, then `main` would get all my debug statements which is undesirable. There has to be another way..."]}},{type:"ModalAlert",options:{markdowns:["We need to tell git to copy only one of the commits over. This is just like the levels earlier on moving work around -- we can use the same commands:","","* `git rebase -i`","* `git cherry-pick`","","To achieve this goal."]}},{type:"ModalAlert",options:{markdowns:["This is a later level so we will leave it up to you to decide which command you want to use, but in order to complete the level, make sure `main` receives the commit that `bugFix` references."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les commits empilés localement","","Voici une situation qui arrive souvent : j'ai un bug assez difficile à trouver et corriger. Pour localiser la source du problème je rajoute des commandes et prints de debug à travers le code.","","Tous ces debug se retrouvent dans une branche particulière. Je trouve le bug et le répare, comme toujours !","","Le problème c'est que je ne peux pas faire de merge ou rebase, car tous ces commits de debug seront dans le main. Il doit y avoir une autre façon..."]}},{type:"ModalAlert",options:{markdowns:["Pour réussir ce niveau, nous avons besoin de dire à Git quel commit particulier recopier. C'est comme pour le niveau précédent : nous pouvons utiliser les mêmes commandes :","","* `git rebase -i`","* `git cherry-pick`"]}},{type:"ModalAlert",options:{markdowns:["C'est un niveau avancé, donc à vous de choisir quelle commande utiliser, mais pour réussir ce niveau, assurez-vous que `main` reçoive le même commit que `bugFix` référence."]}}]},es_AR:{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 `main`. Si simplemente fast-forwardeo `main`, entonces `main` va a tener todos mis agregados de debugging, que es indeseado. 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 está en vos decidir cuál de los dos comandos querés usar, pero para completar el nivel asegurate de que `main` recibe el commit que `bugFix` referencia."]}}]},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 `main`. Si simplemente fast-forwardeo `main`, entonces `main` 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 `main` recibe el commit que `bugFix` referencia."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits localmente apilados","","Esta es una situación 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 depuración y algunas sentencias para imprimir el estado de mi sistema.","","Todas estas cosas de imprimir y depurar 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 `main`. Si simplemente fast-forwardeo `main`, entonces `main` va a tener todos mis agregados de depuración, 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 `main` recibe el commit que `bugFix` referencia."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits empilhados localmente","","Aqui está uma situação de acontece frequentemente com desenvolvedores: Estou tentando encontrar um bug, mas ele é escorregadio. Para auxiliar meu trabalho de detetive, eu coloco alguns comandos de debug e prints.","","Todos esses comandos de debug e mensagens estão em seus próprios ramos. Finalmente eu encontro o bug, corrijo, e me regozijo!","","O único problema é que agora eu preciso devolver o meu `bugFix` ao ramo `main`. Se eu simplesmente der um fast-forward no `main`, então o `main` terminará contendo todos os comandos de debug, o que é indesejável. Deve existir alguma outra forma..."]}},{type:"ModalAlert",options:{markdowns:["Precisamos dizer ao git para copiar somente um dos commits. Esta situação é exatamente a mesma dos níveis anteriores a respeito de como mover trabalho -- podemos usar os mesmos comandos:","","* `git rebase -i`","* `git cherry-pick`","","Para alcançar o objetivo."]}},{type:"ModalAlert",options:{markdowns:["Este é um nível avançado, então vamos deixar para você a decisão de qual comando usar, mas para completar este nível, certifique-se de que o `main` receba o commit referenciado por `bugFix`."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commits apilados localmente","","Aquí estamos nunha situación que acontece de cotio con desenvolvedores: Estou intentando atopar un erro, mais é escorredizo. Para axudar ó meu traballo de detective, eu coloco algúns comandos de debug e prints.","","¡Todos esos comandos de debug e mensaxes están nas súas ramas propias. Finalmente eu atopo o erro, arránxoo e reorganizo!","","O único problema é que agora eu preciso devolver o meu `bugFix` á rama `main`. Se eu fixera simplemente un fast-forward en `main`, entón o `main` rematará contendo tódolos comandos de debug, o que é indesexable. Debe existir algunha outra forma..."]}},{type:"ModalAlert",options:{markdowns:["Precisamos decirlle a git que copie só os commits que nos interesa. Esta situación é exatamente a mesma dos niveis anteriores respecto de como mover o traballo -- podemos usar os mesmos comandos:","","* `git rebase -i`","* `git cherry-pick`","","Para acadar o objetivo."]}},{type:"ModalAlert",options:{markdowns:["Este é un nivel avanzado, entón imos deixarche a decisión de qué comando empregar, pero para completar este nivel, asegurate de que a rama `main` colla o commit referenciado por `bugFix`."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Lokale Commit-Haufen","","Folgende Situation habe ich beim Entwickeln des Öfteren: Ich bin auf der Suche nach einem Bug, aber er ist echt schwer zu finden. Um ihm auf die Spur zu kommen schreibe ich mehrere Debug-Kommandos und print-Befehle in den Code.","","Die committe ich auch immer wieder, je weiter die Suche mich trägt; natürlich in einem lokalen Branch. Schließlich finde ich den Bug, fixe ihn und freue mich!","","Einziges Problem ist, dass ich diesen `bugFix` jetzt zurück in den `main` kriegen muss. Wenn ich einfach den `main` vorspule oder meinen Branch hinein merge, bekäme der `main` auch die ganzen Debug-Befehle, was nicht gewünscht ist. Das muss anders gehen ..."]}},{type:"ModalAlert",options:{markdowns:["Wir müssten Git sagen können, dass es nur einen Commit herüber kopieren soll. Das ist genauso wie die Level vorhin zum Code-Verschieben. Wir können dieselben Befehle benutzen:","","* `git rebase -i`","* `git cherry-pick`",""]}},{type:"ModalAlert",options:{markdowns:["Da dies ein späterer Level ist, überlasse ich es dir zu entscheiden, welchen Befehl du benutzen willst. Aber um das Level zu schaffen musst du irgendwie sicherstellen, dass `main` den Commit bekommt, auf den `bugFix` zeigt."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## ローカルに積み上がったコミット","","実際の開発ではこういうケースがよくあります:「バグの原因調査を試みているがバグの再現性がかなり低い。調査の補助のために、いくつかのデバッグ用の命令やprint文を差し込んでいる。」","","これらのデバッグ用のコードはバグ修正用のブランチにコミットされています。そしてついにバグの原因を突き止めて、修正した!やった!","","あとは`bugFix`ブランチを`main`ブランチに統合できればOK。そこで単純に`main`をfast-forwardすればよいかというと、それでは`main`ブランチの中にデバッグ用のコードも混入してしまいます。"]}},{type:"ModalAlert",options:{markdowns:["ここでGitの魔法が力を発揮します。解決のためにはいくつかの方法がありますが、最も素直な解決方法は2つあって:","","* `git rebase -i`","* `git cherry-pick`","","インタラクティブモードの(`-i`オプションつきの)rebaseによって、保持したいコミットと破棄したいコミットを選り分けることができます。コミットの順序を変更することも可能です。この方法は、一部の変更をどこかへやってしまいたい時に便利です。","","もう一方のcherry-pickを使うと、持っていきたいコミットを選んで`HEAD`の先にストンと落とすことができます。"]}},{type:"ModalAlert",options:{markdowns:["後半の章ですのでどう解決するかをもう自分で考えることができると思います。このレベルをクリアするためには、`bugFix`が持っているコミットを`main`ブランチが受け取る必要がある点には注意してください。"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 本地栈式提交","","来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。","","这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!","","最后就差把 `bugFix` 分支里的工作合并回 `main` 分支了。你可以选择通过 fast-forward 快速合并到 `main` 分支上,但这样的话 `main` 分支就会包含我这些调试语句了。你肯定不想这样,应该还有更好的方式……"]}},{type:"ModalAlert",options:{markdowns:["实际我们只要让 Git 复制解决问题的那一个提交记录就可以了。跟之前我们在“整理提交记录”中学到的一样,我们可以使用","","* `git rebase -i`","* `git cherry-pick`","","来达到目的。"]}},{type:"ModalAlert",options:{markdowns:["由于我们刚刚闯过类似的关卡,所以要不要再尝试一次就看你自己了。但是如果你想试一把的话,确保 `main` 分支能得到 `bugFix` 分支上的相关提交。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 在 local 的堆疊的 commit","","有一個經常發生的情況:我在追蹤一個有點棘手的 bug,但是它實在太難抓出來了,在不得已的情況下我加入了一些 debug 的指令,並且做了一些 commit。","","所有的這些 debug 的指令都只在 `bugFix` 這個 branch 裡面。最後我終於找到這個 bug,並且 fix 掉它,接著撒花慶祝一下!","","現在唯一的問題就是要把我在 `bugFix` branch 裡面所做的修改 merge 回 `main` branch。我可以簡單地透過 fast-forward 來 merge ,但這樣的話 `main` branch 就會包含這些含有 debug 指令的 commit 了。我相信一定有其它方法..."]}},{type:"ModalAlert",options:{markdowns:["我們需要告訴 git 只去複製其中一個 commit。 這種情況跟之前的關卡有一點類似,我們可以使用一樣的指令","","* `git rebase -i`","* `git cherry-pick`","","來完成這個目的。"]}},{type:"ModalAlert",options:{markdowns:["這一個關卡是比較後面的關卡,你可以隨意決定你要選擇使用哪個指令,但是 `bugFix` 所指向的那個 commit 一定要可以被 `main` branch 包含到。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 로컬에 쌓인 커밋들","","개발 중에 종종 이런 상황이 생깁니다: 눈에 잘 띄지 않는 버그를 찾아서 해결하려고, 어떤 부분의 문제인지를 찾기 위해 디버그용 코드와 화면에 정보를 프린트하는 코드 몇 줄 넣습니다. ","","디버깅용 코드나 프린트 명령은 그 브랜치에 들어있습니다. 마침내 버그를 찾아서 고쳤고, 원래 작업하는 브랜치에 합치면 됩니다!","","이제 `bugFix`브랜치의 내용을 `main`에 합쳐 넣으려 하지만, 한 가지 문제가 있습니다. 그냥 간단히 `main`브랜치를 최신 커밋으로 이동시킨다면(fast-forward) 그 불필요한 디버그용 코드들도 함께 들어가 버린다는 문제죠."]}},{type:"ModalAlert",options:{markdowns:["여기에서 Git의 마법이 드러납니다. 이 문제를 해결하는 여러가지 방법이 있습니다만, 가장 간단한 두가지 방법 아래와 같습니다:","","* `git rebase -i`","* `git cherry-pick`","","대화형 (-i 옵션) 리베이스(rebase)로는 어떤 커밋을 취하거나 버릴지를 선택할 수 있습니다. 또 커밋의 순서를 바꿀 수도 있습니다. 이 커맨드로 어떤 작업의 일부만 골라내기에 유용합니다.","","체리픽(cherry-pick)은 개별 커밋을 골라서 `HEAD`위에 떨어뜨릴 수 있습니다."]}},{type:"ModalAlert",options:{markdowns:["이번 레벨을 통과하기 위해 어떤 방법을 쓰시든 자유입니다만, `main`브랜치가 `bugFix` 브랜치의 커밋을 일부 가져오게 해주세요."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["Вот ситуация, которая часто случается при разработке: мы пытаемся отследить ошибку, но она не очень очевидна. Для того, чтобы достичь успеха на этом поприще, мы используем несколько команд для отладки и вывода","","Каждая отладочная команда (команды) вывода находится в своём коммите. В итоге мы нашли ошибку, исправили её и порадовались!","","Но проблема в том, что мы хотим добавить в `main` только исправление ошибки из ветки `bugFix`. Если мы воспользуемся простым fast-forward, то в `main` попадут также отладочные команды. Должен быть другой способ..."]}},{type:"ModalAlert",options:{markdowns:["Надо заставить git копировать только один из коммитов. Это почти как в предыдущем уровне – мы можем использовать уже известные нам команды: ","","* `git rebase -i`","* `git cherry-pick`","","Чтобы достичь желаемого результата."]}},{type:"ModalAlert",options:{markdowns:["В этом уровне тебе решать, какую команду использовать, но чтобы закончить уровень, убедись, что в ветку `main` попал коммит, на который ссылается `bugFix`."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Локально складені коміти","","Ось ситуація з життя рядового програміста: я намагаюся відслідкувати баг, але це не завжди вдається. Щоб допомогти собі, я додаю кілька дебаг-команд та ще кілька println'ів.","","Всі ці команди для відлагодження та виводу данних знаходяться в своїх власних комітах. Врешті-решт я знаходжу баг, фікшу його та щиро радію!","","От тільки лишається проблема, що потрібно мій фікс перенести з `bugFix` назад в гілку `main`. Якщо я просто зроблю фастфорвард (fast-forwarded) в `main`, тоді в `main` потраплять всі мої println'и, що є зайвим. Має бути інший шлях..."]}},{type:"ModalAlert",options:{markdowns:["Ми маємо сказати гіту скопіювати лише один коміт. Це все те ж саме, що й у попередніх рівнях, і ми можемо використати ті ж самі команди:","","* `git rebase -i`","* `git cherry-pick`","","для досягнення мети."]}},{type:"ModalAlert",options:{markdowns:["На цьому рівні тобі вирішувати якими командами користуватися, але щоб пройти цей рівень, впевнись що в `main` потрапить коміт, на який посилається `bugFix`."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit xếp chồng cục bộ","","Có tình huống thế này thường hay xảy ra trong quá trình phát triển: Tôi đang cố dò lỗi nhưng mà nó lại khá khó tìm. Để hỗ trợ cho việc này, tôi thêm vào vài dòng lệnh gỡ lỗi và lệnh in.","","Mấy lệnh gỡ lỗi và in này nằm yên trong commit của chúng. Cuối cùng thì tôi cũng tìm ra lỗi, gỡ xong, ngon rồi!","","Bây giờ thì lại phải đưa `bugFix` trở về nhánh `main`. Nếu mà đơn giản dùng fast-forwarded lên `main`, thì `main` lại có tất cả các lệnh gỡ lỗi kia, chẳng muốn chút nào. Phải có cách khác chứ nhỉ..."]}},{type:"ModalAlert",options:{markdowns:["Ta cần phải bảo Git chỉ sao chép 1 commit thôi. Điều này giống với cấp độ trước về điều chỉnh vị trí -- ta có thể dùng các câu lệnh tương tự:","","* `git rebase -i`","* `git cherry-pick`","","Để đạt được mục tiêu này."]}},{type:"ModalAlert",options:{markdowns:["Bây giờ là cấp độ cao hơn rồi nên bạn hãy tự quyết định nên dùng câu lệnh nào, nhưng để hoàn thành được cấp độ, hãy đàm bảo rằng `main` nhận được commit mà `bugFix` tham chiếu tới."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Lokalno naloženi commiti","","Tu je razvijalska situacija, ki se zgodi pogosto: Hočem najti bug, ampak se kar izmika. V pomoč mojemu detektivskemu delu, sem dodal nekaj ukazov za debuggiranje in izpis.","","Vsi te ukazi za debuggiranje / izpisovanje so v svojih commitih. Končno odkrijem bug, ga popravim in se veselim!","","Edini problem je, da morem sedaj spraviti moj `bugFix` nazaj v `main` branch. Če uporabim samo fast-forward na `masterju`, potem bi `main` vseboval vse moje debug vrstice, česar si ne želim. Mora obstajati še neka druga pot ..."]}},{type:"ModalAlert",options:{markdowns:["Gitu moramo povedati naj skopira čez samo en commit. To je podobno stopnjam prej, ko smo premikali delo okoli -- uporabimo lahko iste ukaze:","","* `git rebase -i`","* `git cherry-pick`","","da dosežemo ta cilj."]}},{type:"ModalAlert",options:{markdowns:["Tebi prepuščam, da se odločiš, kateri ukaz boš uporabil, da končaš stopnjo. Poskrbi samo, da `main` dobi commit na katerega kaže `bugFix` referenca."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Lokalnie nałożone commity","","Oto sytuacja, która często się zdarza podczas pisania kodu: próbuję wytropić buga, ale jest on nieuchwytny. Aby pomóc sobie w poszukiwaniach, dodaję kilka poleceń debugowania i kilka instrukcji print.","","Wszystkie te polecenia debugowania / drukowania znajdują się w osobnych commitach. W końcu namierzam błąd, naprawiam go i cieszę się!","","Jedynym problemem jest to, że teraz muszę przywrócić mój `bugFix` do gałęzi `main`. Jeśli po prostu zrobiłbym fast-foward `main`, wtedy `main` dostałby wszystkie moje deklaracje debugowania, a tego bym nie chciał. Musi być na to inny sposób..."]}},{type:"ModalAlert",options:{markdowns:["Musimy powiedzieć Gitowi, żeby skopiował tylko jeden z commitów. Dokładnie w ten sam sposób jak we wcześniejszych poziomach z przenoszeniem pracy -- używając tych samych poleceń:","","* `git rebase -i`","* `git cherry-pick`","","aby osiągnać ten cel."]}},{type:"ModalAlert",options:{markdowns:["Jest to wyższy poziom, więc pozostawimy ci decyzję, której komendy chcesz użyć, ale aby ukończyć poziom, upewnij się, że `main` otrzyma commit, do którego odwołuje się `bugFix`."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit impilati localmente","","Ecco una situazione che accade spesso in fase di sviluppo: Sto cercando di scovare un bug. Per aiutarmi nel mio lavoro di detective, inserisco alcuni comandi per il debug e alcune print per fare stampe.","","Questi comandi aggiunti per il debug vengono salvati con un commit loro dedicato. Finalmente riesco a beccare il bug, sistemo il tutto, e brindo!","","Ora l'unico problema è che devo salvare il lavoro di `bugFix` nel ramo `main`. Se eseguo un semplice fast-forwarded `main`, allora il `main` andrebbe a prendere anche tutto ciò che è stato aggiunto per il debug. Se solo ci fosse un altro modo..."]}},{type:"ModalAlert",options:{markdowns:["Dobbiamo dire a Git di fare la copia di un solo commit. Questo assomiglia a quanto visto in precedenza -- possiamo riusare gli stessi comandi:","","* `git rebase -i`","* `git cherry-pick`","","Per raggiungere l'obiettivo."]}},{type:"ModalAlert",options:{markdowns:["Questo è un livello più avanzato, lascerò a te la libertà di decidere quale comando usare, ma per concludere il livello, assicurati che `main` riceva il commit puntato da `bugFix`."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Yerel Olarak Birikmiş Commitler","","Şu sıkça karşılaşılan bir geliştirme senaryosudur: Bir hatayı izlemeye çalışıyorum, ancak bu hata oldukça belirsiz. Dedektiflik çalışmalarıma yardımcı olmak için bazı hata ayıklama komutları ve yazdırma ifadeleri eklerim.","","Bu hata ayıklama veya yazdırma ifadeleri, her biri kendi commit'lerine sahiptir. Sonunda hatayı bulurum, düzeltirim ve sevinirim!","","Tek sorun şu ki şimdi `bugFix` branch'imi `main` branch'imden almalıyım. Eğer sadece `main` branch'ini süratle ileri alırsam, `main` branch'i tüm hata ayıklama ifadelerimi alır ki bu istenmeyen bir durumdur. Bunun için başka bir yol bulunmalıdır..."]}},{type:"ModalAlert",options:{markdowns:["Git'e sadece bir commit'i kopyalamasını söylememiz gerekiyor. Bu, daha önce yaptığımız işleri taşımak için yaptığımız işlemler gibi, orada kullandığımız;","","* `git rebase -i`","* `git cherry-pick`","","komutlarını burada da kullanabiliriz."]}},{type:"ModalAlert",options:{markdowns:["Bu biraz daha ileri bir seviye olduğundan hangi komutu kullanmak istediğiniz size kalmış, ancak `main` branch'inin `bugFix` tarafından atılan ve `main`'e atıfta bulunan commit'i alması gerektiğini unutmayın."]}}]}}}},{}],128:[function(e,t,o){o.level={disabledMap:{"git cherry-pick":!0,"git revert":!0},compareOnlyMainHashAgnosticWithAsserts:!0,goalAsserts:{main:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22main%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%27%27%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C2%27%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i HEAD~2 --solution-ordering C3,C2;git commit --amend;git rebase -i HEAD~2 --solution-ordering C2'',C3';git rebase caption main",startTree:'{"branches":{"main":{"target":"C1","id":"main"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',name:{ko:"커밋들 갖고 놀기",en_US:"Juggling Commits",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",es_MX:"Malabareando con las confirmaciones",pt_BR:"Malabarismo com commits",gl:"Argallando cos commits",ja:"コミットをやりくりする",zh_CN:"提交的技巧 #1",zh_TW:"commit 的戲法",ru_RU:"Жонглируем коммитами",uk:"Жонглюємо комітами",vi:"Tung hứng commit",sl_SI:"Žongliranje s Commiti",it_IT:"Giocoliere di commit",pl:"Żonglowanie commitami",tr_TR:"Commit Hokkabazlığı"},hint:{en_US:"The first command is git rebase -i HEAD~2",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",ko:"첫번째 명령은 git rebase -i HEAD~2 입니다",zh_CN:"第一个命令是 `git rebase -i HEAD~2`",zh_TW:"第一個命令是 'git rebase -i HEAD~2'",ru_RU:"Первой командой должна быть git rebase -i HEAD~2",uk:"Перша команда має бути git rebase -i HEAD~2",vi:"Lệnh đầu tiên là git rebase -i HEAD~2",sl_SI:"Prvi ukaz je git rebase -i HEAD~2.",it_IT:"Il primo comando è git rebase -i HEAD~2",pl:"Pierwsze polecenie to: git rebase -i HEAD~2",tr_TR:"İlk komutunuz git rebase -i HEAD~2"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits","","Here's another situation that happens quite commonly. You have some changes (`newImage`) and another set of changes (`caption`) that are related, so they are stacked on top of each other in your repository (aka one after another).","","The tricky thing is that sometimes you need to make a small modification to an earlier commit. In this case, design wants us to change the dimensions of `newImage` slightly, even though that commit is way back in our history!!"]}},{type:"ModalAlert",options:{markdowns:["We will overcome this difficulty by doing the following:","","* We will re-order the commits so the one we want to change is on top with `git rebase -i`","* We will `git commit --amend` to make the slight modification","* Then we will re-order the commits back to how they were previously with `git rebase -i`","* Finally, we will move main to this updated part of the tree to finish the level (via the method of your choosing)","","There are many ways to accomplish this overall goal (I see you eye-ing cherry-pick), and we will see more of them later, but for now let's focus on this technique.","Lastly, pay attention to the goal state here -- since we move the commits twice, they both get an apostrophe appended. One more apostrophe is added for the commit we amend, which gives us the final form of the tree ","","That being said, I can compare levels now based on structure and relative apostrophe differences. As long as your tree's `main` branch has the same structure and relative apostrophe differences, I'll give full credit."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jongler avec les commits","","Voici une autre situation fréquente. Vous avez certains changements (`newImage`) et un autre groupe de changements (`caption`) qui sont reliés, ils sont donc empilés l'un sur l'autre dans votre dépôt Git (i.e. l'un après l'autre).","","La situation se complique lorsque vous devez faire une petite modification dans un commit antérieur. Dans ce cas, les configurations de `newImage` devront changer un peu, même si ce commit est loin dans notre historique !!"]}},{type:"ModalAlert",options:{markdowns:["Nous allons régler le problème en faisant ceci :","","* Nous allons réordonner les commits pour que celui que nous voulions changer soit sur le dessus `git rebase -i`","* Nous allons utiliser `git commit --amend` pour faire les petites modifications","* Nous allons réordonner les commits dans l'ordre original avec `git rebase -i`","* Pour finir, nous allons déplacer main vers la nouvelle tête de l'arbre (avec la méthode de votre choix)","","Il y a plusieurs façons d'atteindre ce but (cherry-pick semble très tentant), mais nous allons parler de cherry-pick plus tard, pour le moment concentrez-vous sur cette technique.","","Pour terminer, Faites attention à l'objectif -- puisque nous déplaçons les commits 2 fois, ils se retrouvent tous les deux avec une apostrophe. Une deuxième apostrophe est ajoutée sur le commit que nous modifions, ce qui nous donne la forme finale de l'arbre.","","Ceci étant dit, je peux comparer le résultat avec la structure et les différentes apostrophes. Tant que votre arbre `main` a la même structure et les différentes apostrophes le niveau sera considéré comme réussi."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Haciendo malabares con los commits","","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!"]}},{type:"ModalAlert",options:{markdowns:["Superaremos esta dificultad haciendo lo siguiente:","","* Vamos a reordenar los commits para que el que queremos cambiar quede arriba de todo con `git rebase -i`","* Vamos a hacer `git 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 main 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, prestá atención al estado final acá -- como movemos los commits dos veces, ambos quedan con un apóstrofe. El commit que corregimos tiene un apóstrofe extra, y así nos queda nuestro árbol final","","Habiendo dicho eso, puedo comparar los niveles basándome ahora en la estructura y las diferencias relativas de apóstrofes. Mientras que tu rama `main` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo."]}}]},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 `git 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 main 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 `main` tenga la misma estructura y diferencias relativas de apóstrofes, te voy a dar el puntaje completo."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabareando con las confirmaciones","","Esta es otra situación que sucede comúnmente. 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 las confirmaciones para que la que queremos cambiar quede arriba de las demás con `git rebase -i`","* Vamos a hacer `git commit --amend` para aplicar la ligera modificación","* Después vamos a reordenar las confirmaciones a como estaban con `git rebase -i`","* Finalmente, vamos a mover main a esta parte actualizada de nuestro árbol de confirmaciones 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 las confirmaciones dos veces, ambas 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 `main` tenga la misma estructura y diferencias relativas de apóstrofes te voy a dar el puntaje completo."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabarismo com commits","","Aqui está outra situação que acontece com bastante frequência. Você fez algumas mudanças (`newImage`), além de um outro conjunto de mudanças (`caption`) que são relacionadas, de forma que elas estão empilhadas uma após a outra no seu repositório.","","O complicado é que algumas vezes você precisa fazer uma pequena modificação em um commit mais antigo. Neste caso, o pessoal do design quer que modifiquemos um pouco as dimensões da imagem introduzida em `newImage`, apesar de esse commit estar mais para trás no nosso histórico!!"]}},{type:"ModalAlert",options:{markdowns:["Superaremos essa dificuldade fazendo o seguinte:","","* Reordenaremos os commits de forma que aquele que desejamos esteja no topo, com `git rebase -i`","* Usaremos o comando `git commit --amend` para fazer uma pequena modificação","* Vamos, então, reordenar os commits na mesma ordem que estavam anteriormente com `git rebase -i`","* Finalmente, moveremos o main para essa parte atualizada da árvore para finalizar o nível (usando o método de sua escolha)","","Há muitas formas de alcançar o objetivo final (eu vejo o cherry-pick passando pela sua mente), e veremos mais delas depois, mas por enquanto foquemos nesta técnica.","",'Por último, preste atenção no estado do "objetivo" aqui -- como nós movemos os commits duas vezes, ambos ficam com um apóstrofo. Um apóstrofo adicional é colocado no commit que sofreu o "amend", o que nos dá a forma final da árvore ',"","Tendo dito isto, posso avaliar a resposta baseado na estrutura e nas diferenças relativas de número de apóstrofos. Desde que o ramo `main` da sua árvore tenha a mesma estrutura, e o número de apóstrofos seja igual a menos de uma constante, darei a você todos os pontos para esta tarefa."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argallando cos commits","","Aquí está outra situación que acontece con bastante frecuencia. Estás facendo algúns cambios (`newImage`), separado do resto de cambios (`caption`) que están relacionados, deste xeito están apilados un enriba do outro no teu repositorio.","","O complicado é que ás veces, poida que precises facer unha pequena nota nun commit máis antigo. Neste caso, a persoa de deseño quere mudar un pouco as dimensións da imaxe introducida en `newImage`, a pesar de que ese commit está máis abaixo no noso histórico!!"]}},{type:"ModalAlert",options:{markdowns:["Superamos este problema facendo o seguinte:","","* Reordenaremos os commits seleccionando aqueles que desexamos que estén no cambio, con `git rebase -i`","* Empregaremos o comando `git commit --amend` para facer unha pequena modificación","* Imos, entón, reordear os commits na mesma orde na que estaban anteriormente con `git rebase -i`","* Finalmente, moveremos o main para esa parte atualizada da árbore e así finalizar o nivel (usando o método que máis che pete)","","Hai moitas formas de obter o obxectivo final (eu vexo o cherry-pick pasando pola túa cachola), e verémolo máis adiante, pero agora ímonos centrar nesta técnica.","",'Por último, preste atención no estado do "objectivo" aquí -- como movemos os commits dúas veces, ambos teñen o apóstrofo sumado. O apóstrofo engádese polo commit que nos correximos (amend), o cal danos a forma final da árbore.',"","Contado todo esto, a resposta valídase baseándose na estructura e nos diferentes apóstrofes. Cando a rama `main` teña a mesma estructura, e o número de apóstrofos sexa igual, obterás todos os puntos da tarefa."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jonglieren mit Commits","","Eine weitere häufig vorkommende Situation: Du hast einige Änderungen in `newImage` und weitere Änderungen in `caption`. Die Änderungen hängen voneinander ab, das heißt in diesem Fall `caption` ist ein Nachfolger von `newImage`.","","Nun kann es vorkommen, dass du einen früheren Commit verändern willst. In unserem Fall will die Design-Abteilung, dass die Abmessungen in `newImage` leicht verändert werden, obwohl das mitten in unserer History liegt!"]}},{type:"ModalAlert",options:{markdowns:["Um das zu schaffen gehen wir wie folgt vor:","","* Wir sortieren die Commits mit `git rebase -i` so um, dass der Commit, den wir ändern wollen, ganz oben liegt.","* Wir verändern den Commit mit `git commit --amend`.","* Dann sortieren wir die Commits mit einem erneuten `git rebase -i` wieder in die alte Reihenfolge.","* Schließlich aktualisieren wir den `main` auf das Ende unseres fertigen Baums, um diesen Level abzuschließen.","","Es gibt sehr viele Wege um das Endziel dieses Levels zu erreichen (ich sehe, du schielst auf `cherry-pick`) und wir werden uns später noch andere ansehen. Aber für's erste lass uns diese Methode ausprobieren.","","Beachte den geschilderten Zielzustand. Da wir die Commits zweimal umsortieren, bekommen sie jedes Mal ein Apostroph hinzugefügt (weil sie jedes Mal kopiert werden). Ein weiteres Apostroph entsteht durch den `git commit --amend`.","","Zu guter Letzt noch eine Bemerkung: Ich kann Level nur auf Struktur und Apostroph-Differenz prüfen. So lange wie dein `main` am Ende dieselbe Struktur und Apostroph-Differenz aufweist wie der Ziel-`main`, ist der Level bestanden."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## コミットをやりくりする","","開発中に頻繁に起こるケースをもう1つ考えます。ある変更(`newImage`)とまた別の変更(`caption`)があって、それらに依存関係があるとします。この一連の変更が一列に積み重なっているとします。","","ここでトリッキーなのは、以前のコミットに対して微修正をかけなければならないケースがあるということです。今回の教材でも、過去のコミットであるにも関わらず`newImage`ブランチに僅かな修正を加えるような設計の修正が入ったとしましょう。"]}},{type:"ModalAlert",options:{markdowns:["この困難な状況を、以下の手順で克服することを考えます:","","* `git rebase -i`を使って順番を変更する。これで、変更をかけたいコミットを一番先頭に持ってくる。","* `git commit --amend`コマンドで僅かな変更を行う","* `git rebase -i`コマンドを再度使って、先頭に持ってきていたコミットを元に戻す","* 最後に、レベルクリアのためにmainブランチを先頭に持ってくる","","クリアのための方法はいくつもありますが(cherry-pickを使うこともできます)、別の回答はまた後程の章で見ることにして、今回は上記の方法でやってみることにしましょう。","","最後に、ゴール時点での状態に気を付けてください。今回2回ほどコミットを動かしますから、コミットへのポインタにはアポストロフィ(')が追加されます。commit --amendコマンドの実行でできたコミットには更にもう1つのアポストロフィが追加されます。 "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 提交的技巧 #1","","接下来这种情况也是很常见的:你之前在 `newImage` 分支上进行了一次提交,然后又基于它创建了 `caption` 分支,然后又提交了一次。","","此时你想对某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 `newImage` 中图片的分辨率,尽管那个提交记录并不是最新的了。"]}},{type:"ModalAlert",options:{markdowns:["我们可以通过下面的方法来克服困难:","","* 先用 `git rebase -i` 将提交重新排序,然后把我们想要修改的提交记录挪到最前","* 然后用 `git commit --amend` 来进行一些小修改","* 接着再用 `git rebase -i` 来将他们调回原来的顺序","* 最后我们把 main 移到修改的最前端(用你自己喜欢的方法),就大功告成啦!","","当然完成这个任务的方法不止上面提到的一种(我知道你在看 cherry-pick 啦),之后我们会多点关注这些技巧啦,但现在暂时只专注上面这种方法。","最后有必要说明一下目标状态中的那几个`'` —— 我们把这个提交移动了两次,每移动一次会产生一个 `'`;而 C2 上多出来的那个是我们在使用了 amend 参数提交时产生的,所以最终结果就是这样了。","","也就是说,我在对比结果的时候只会对比提交树的结构,对于 `'` 的数量上的不同,并不纳入对比范围内。只要你的 `main` 分支结构与目标结构相同,我就算你通过。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## commit 的戲法","","下面這種情況也是經常出現的。例如你之前已經在 `newImage` branch 上做了一些 commit,然後又開了一個 branch 叫做 `caption` ,並且在上面做了一些相關的 commit ,因此它們看起來是一個接著一個的。","","有點棘手的就是有時候你又想在之前的 commit 裡面做一些修改。在這個例子裡面,我們要去稍微修改一下 `newImage` 所指向的 commit,儘管已經是之前的 commit 了 。"]}},{type:"ModalAlert",options:{markdowns:["為了克服這個困難,我們可以按照下面的方法來做:","","* 先用 `git rebase -i` 將 commit 重新排序,然後把我們想要修改的 commit 移到最前面","* 然後用 `git commit --amend` 來進行一些修改","* 接著再用 `git rebase -i` 來將他們按照最開始的順序重新排好","* 最後我們把 main 移到這個修改的最前端(用你自己喜歡的方法),就大功告成啦!","","當然還有許多方法可以完成這個任務(我知道你在想 cherry-pick 啦),之後我們會多點關注這些技巧啦,但現在暫時只注意上面這種方法。","","啊!最後還要提醒你一下最後所產生的 commit tree,因為我們把 commit 移動了兩次,所以會分別產生一個 apostrophe(單引號) commit。還有一個 apostrophe commit 是因為我們修改 commit 而加進來的。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 커밋들 갖고 놀기","","이번에도 꽤 자주 발생하는 상황입니다. `newImage`와 `caption` 브랜치에 각각의 변경내역이 있고 서로 약간 관련이 있어서, 저장소에 차례로 쌓여있는 상황입니다.","","때로는 이전 커밋의 내용을 살짝 바꿔야하는 골치아픈 상황에 빠지게 됩니다. 이번에는 디자인 쪽에서 우리의 작업이력(history)에서는 이미 한참 전의 커밋 내용에 있는 `newImage`의 크기를 살짝 바꿔 달라는 요청이 들어왔습니다."]}},{type:"ModalAlert",options:{markdowns:["이 문제를 다음과 같이 풀어봅시다:","","* `git rebase -i` 명령으로 우리가 바꿀 커밋을 가장 최근 순서로 바꾸어 놓습니다","* `git commit --amend` 명령으로 커밋 내용을 정정합니다","* 다시 `git rebase -i` 명령으로 이 전의 커밋 순서대로 되돌려 놓습니다","* 마지막으로, main을 지금 트리가 변경된 부분으로 이동합니다. (편하신 방법으로 하세요)","","이 목표를 달성하기 위해서는 많은 방법이 있는데요(체리픽을 고민중이시죠?), 체리픽은 나중에 더 살펴보기로 하고, 우선은 위의 방법으로 해결해보세요.","","최종적으로, 목표 결과를 눈여겨 보세요 -- 우리가 커밋을 두 번 옮겼기 때문에, 두 커밋 모두 따옴표 표시가 붙어있습니다. 정정한(amend) 커밋은 따옴표가 추가로 하나 더 붙어있습니다."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглируем коммитами","","Вот ещё одна ситуация, которая часто случается. Есть некоторые изменения (`newImage`) и другие изменения (`caption`), которые связаны так, что находятся друг поверх друга в репозитории.","","Штука в том, что иногда нужно внести небольшие изменения в более ранний коммит. В таком случае надо немного поменять `newImage`, несмотря на то, что коммит уже в прошлом!"]}},{type:"ModalAlert",options:{markdowns:["Преодолеть эти трудности можно следующим образом:","","* Переставить коммит так, чтобы нужный находился наверху при помощи `git rebase -i`","* Внести изменения при помощи `git commit --amend`","* Переставить всё обратно при помощи `git rebase -i`","* И наконец, переместить main на изменённую часть дерева, чтобы закончить уровень.","","Это задание можно выполнить несколькими способами (и, гляжу, ты посматриваешь на cherry-picking), но сейчас сосредоточься на вышеописанном методе.","","Обрати внимание на итоговое состояние в этом уровне – так как мы дважды перемещаем коммиты, оба они получат по апострофу. Ещё один апостроф добавляется, когда мы делаем `git commit --amend`.","","Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглюємо комітами","","Ось інша ситуація, що доволі часто трапляється. В тебе є якісь зміни (`newImage`) та ще якийсь набір комітів (`caption`), які зв’язані між собою, тому вони знаходяться один над одним в твоєму репозиторії (або один за одним).","","Штука в тому що іноді потрібно зробити невелику модифікацію до попереднього коміту. В цьому випадку, дизайнери хочуть щоб ми трохи змінили розміри `newImage`, не зважаючи на те, що цей коміт знаходиться досить глибоко в історії!!"]}},{type:"ModalAlert",options:{markdowns:["Ми поборимо цю складність наступним чином:","","* Ми відсортуємо коміти таким чином, щоб той, який ми хочемо змінити, був останнім за допомогою `git rebase -i`","* Ми виконаємо `git commit --amend` щоб внести невелику правку до останнього коміту","* Тоді ми відсортуємо коміти в попередньому порядку, за допомогою `git rebase -i`","* І на останок, ми пересунемо main на змінену частину дерева щоб закінчити цей рівень(ти можеш вибрати метод)","","Насправді є кілька способів як виконати поставлену задачу (Я бачу, ти поглядаєш на cherry-pick), і ми розберемося з ними всіма трохи пізніше, але зараз скористаймося саме цим методом.","Зверни увагу на фінальний стан в цьому рівні -- позаяк ми перемістили коміти двічі, кожен з них отримає по апострофу. Ще один апостроф додасться коли ми виконаємо commit --amend.","","Враховуючи сказане вище, я буду порівнювати дерево як за назвою коміта, так і за кількістю апострофів. Щойно дерево цілей та main співпадуть, ти пройдеш цей рівень."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tung hứng Commit","","Có một tình huống xảy ra khá thường xuyên. Bạn có vài thay đổi trên (`newImage`) và một vài thay đổi khác trên (`caption`) và chúng lại liên quan đến nhau, nên chúng nằm chồng lên nhau trong kho của bạn (một lại nối một).","","Tréo ngoe là bạn lại phải điều chỉnh một chút ở commit trước. Giả sử như tay thiết kế muốn ta đổi chiều của `newImage` một chút, mặc dù commit ấy đã xưa lắm rồi!!"]}},{type:"ModalAlert",options:{markdowns:["Để khắc phục khó khăn này ta có thể làm như sau:","","* Ta sẽ dùng `git rebase -i` sắp xếp lại commit để cái ta cần sửa sẽ nằm trên cùng","* Ta sẽ dùng `git commit --amend` tạo ra một điều chỉnh nhỏ","* Sau đó ta sẽ lại sắp xếp lại commit như trước bằng cách dùng `git rebase -i`","* Cuối cùng, ta sẽ chuyển `main` tới phần đã cập nhật để hoàn thành cấp độ (dùng cách nào tùy bạn)","","Có nhiều cách để hoàn thành mục tiêu (Tôi thấy bạn hấp háy sang cherry-pick rồi đấy), rồi ta sẽ thấy chúng nhiều hơn, nhưng giờ hãy cứ tập trung vào kỹ thuật này đã.","Sau cùng thì, hãy để ý các dấu nháy đơn (') -- Vì ta đã chuyển commit 2 lần, nên chúng có thêm một dấu nháy đơn và một dấu nữa cho commit mà ta đã sửa đổi, thế là ta có trạng thái cuối cùng của cây lịch sử ","","Nói cách khác, khi tôi so sánh kết quả, tôi chỉ so sánh cấu trúc của cây lịch sử. Sự khác biệt về số lượng `'` không được bao gồm trong so sánh. Miễn là cấu trúc nhánh `main` của bạn giống với cấu trúc đích, tôi sẽ vẫn để bạn qua bài."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Žongliranje s Commiti","","Tu je še ena situacija, ki se dogaja kar pogosto. Imaš nekaj sprememb (`newImage`) in še nekaj drugih sprememb (`caption`), ki so povezane in zložene druga na drugo v tvojem repozitoriju.","","Včasih se zgodi, da bi rad naredil manjšo spremembo na zgodnejšem commitu. V tem primeru si naš dizajner želi, da spremenimo dimenzije slike `newImage`, čeprav je commit daleč nazaj v naši zgodovini!!"]}},{type:"ModalAlert",options:{markdowns:["Ta izziv bomo rešili takole:","","* Preuredili bomo commite tako, da bo tisti, ki ga želimo spremeniti, na vrhu z `git rebase -i`","* Izvedli bomo `git commit --amend`, da naredimo naš popravek","* Nato bomo preuredili commite nazaj v začetno stanje z `git rebase -i`","* Za konec bomo premaknili main na ta posodobljen del drevesa, da zaključimo stopnjo (z metodo po tvoji izbiri)","","Obstaja več načinov, da dosežemo ta cilj (vidim te kako gledaš cherry-pick) s katerimi se bomo ukvarjali kasneje, ampak za zdaj se osredotočimo na to tehniko.","In nenazadnje, bodi pozoren na ciljno stanje -- ker premaknemo commit dvakrat, oba dobita pripet opuščaj zgoraj. Še eden je dodan za ammendan commit, torej skupno tri.","","Sedaj lahko primerjam stopnje po strukturi in relativni spremembi opuščajev. Dokler ima `main` branch na tvojem drevesu enako strukturo in število opuščajev, dobiš vse točke."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Żonglowanie commitami","","Oto inna sytuacja, która zdarza się dość często. Masz pewne zmiany (`newImage`) i inny zestaw zmian (`caption`), które są powiązane, więc są one ułożone jedne na drugim w twoim repozytorium (tzw. jeden po drugim).","","Problem polega na tym, że czasami trzeba dokonać małej modyfikacji wcześniejszego commitu. W tym przypadku projektant chce, abyśmy zmienili nieco wymiary `newImage`, mimo że ten commit jest daleko w tyle w naszej historii!!!"]}},{type:"ModalAlert",options:{markdowns:["Przezwyciężymy tę trudność, wykonując następujące czynności:","","* Zmienimy kolejność commitów tak, aby ten, który chcemy zmienić, był na górze, używając `git rebase -i`.","* Wykonamy `git commit --amend`, aby dokonać niewielkiej modyfikacji","* Następnie zmienimy kolejność commitów z powrotem na taką, jaka była poprzednio za pomocą `git rebase -i`.","* Na koniec przeniesiemy się do tej zaktualizowanej części drzewa, aby ukończyć ten poziom (w wybrany przez ciebie sposób)","","Istnieje wiele sposobów na osiągnięcie tego ogólnego celu (widzę, że masz na oku cherry-pick), i później zobaczymy ich więcej, ale na razie skupmy się na tej technice.","Na koniec zwróć uwagę na stan celu - ponieważ przenosimy commity dwukrotnie, oba otrzymują apostrof. Dodajemy jeszcze jeden apostrof dla commitu, który zmieniamy, co daje nam ostateczną postać drzewa.","","Uwzględniając to, mogę teraz porównać poziomy w oparciu o strukturę i względne różnice apostrofów. Tak długo, jak gałąź `main` twojego drzewa ma taką samą strukturę, rozwiązanie zostanie uznane."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Giocoliere di commit","","Ecco una situazione che capita spesso. Hai dei cambiamenti (`newImage`) e un altro insieme di modifiche (`caption`) che sono collegate tra loro, quindi sono posizionate una dopo l'altra nel repository.","","La cosa complicata è che a volte hai bisogno di fare una piccola modifica a un commit precedente. In questo caso, dobbiamo apporre una modifica a `newImage`, anche se questo commit non risulta essere l'ultimo!!"]}},{type:"ModalAlert",options:{markdowns:["Supereremo queste difficoltà facendo i seguenti passaggi:","","* Riordineremo i commit in modo che quello che vogliamo modificare risulti l'ultimo con `git rebase -i`","* Faremo `git commit --amend` per apporre la modifica","* Riordineremo i commit nello stesso ordine in cui erano, sempre con `git rebase -i`","* Alla fine, sposteremo main in questo ramo aggiornato dell'albero per finire il livello (utilizzate il metodo che volete)","","Ci sono vari modi per raggiungere l'obiettivo finale (vedo che strizzi l'occhio verso cherry-pick), e ne vedremo altri più tardi, ma per ora concentriamoci su questa tecnica.","In fine, presta attenzione all'obiettivo -- visto che spostiamo i commit due volte, a entrambi viene messo un apostrofo. Un ulteriore apostrofo è aggiunto per il commit --amend, che completa in fine l'albero.","","Detto questo, posso confrontare i livelli in base alla struttura e i relativi apostrofi. Finchè il tuo ramo `main` avrà la stessa struttura con i giusti apostrofi, ti darò pieni voti."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit Hokkabazlığı","","Şimdiki senaryomuz aslında sık karşılaşılan başka bir durumdur. İlgili olan iki değişiklik kümeniz (`newImage` ve `caption`) vardır, bu nedenle bu iki küme reponuzda üst üste yığılıdır (veya diğer adıyla birbiri ardına gelmişlerdir).","","Zor olan şey, bazen önceki bir commit üzerinde küçük bir değişiklik yapmanız gerektiğidir. Bu durumda, tasarım ekibi `newImage` 'in boyutlarını biraz değiştirmemizi istiyor, ancak bu commit geçmişimizde çok eski bir tarihte yer alıyor!!"]}},{type:"ModalAlert",options:{markdowns:["Bu zorluğun üstesinden şu şekilde gelebiliriz:","","* `git rebase -i` komutu ile değiştirmek istediğimiz commit'i en üste getireceğiz.","* Küçük değişikliği yapmak için `git commit --amend` komutunu kullanacağız.","* Ardından, `git rebase -i` komutu ile komitleri önceki sıralarına geri döndüreceğiz.","* Son olarak, main branch'ini ağacın bu güncellenmiş kısmına taşıyarak seviyeyi bitireceğiz (tabi sizin seçtiğiniz yöntemle).","","Bunu başarmak için birçok yol vardır (cherry-pick komutuna göz diktiğinizi görüyorum) ve ileride daha fazlasını göreceğiz, ancak şimdilik bu tekniğe odaklanalım.","Son olarak, buradaki hedef duruma dikkat edin - commit'leri iki kez taşıdığımızdan, her ikisi de bir tırnak işareti alıyor. Değiştirdiğimiz commit için bir tırnak işareti daha eklenir, bu da bize ağacın son halini verir. ","","Şunu da belirtmek isteriz ki, artık seviyeleri yapı ve göreceli tırnak işareti farklılıklarına göre karşılaştırabiliyoruz. Ağacınızın `main` branch'i aynı yapıya ve göreceli tırnak işareti farklılıklarına sahip olduğu sürece tam puan alacaksınız."]}}]}}}},{}],129:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%7D%2C%22newImage%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22newImage%22%7D%2C%22caption%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22caption%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout main;git cherry-pick C2;git commit --amend;git cherry-pick C3",disabledMap:{"git revert":!0},startTree:'{"branches":{"main":{"target":"C1","id":"main"},"newImage":{"target":"C2","id":"newImage"},"caption":{"target":"C3","id":"caption"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"caption","id":"HEAD"}}',compareOnlyMainHashAgnosticWithAsserts:!0,goalAsserts:{main:[function(e){return e.C2>e.C3},function(e){return e.C2>e.C1}]},name:{ko:"커밋 갖고 놀기 #2",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",es_MX:"Malabareando con las confirmaciones #2",pt_BR:"Malabarismo com commits #2",gl:"Argallando cos commits #2",de_DE:"Jonglieren mit Commits Teil 2",ja:"コミットをやりくりする その2",zh_CN:"提交的技巧 #2",zh_TW:"commit 的戲法 #2",ru_RU:"Жонглируем коммитами №2",uk:"Жонглюємо комітами #2",vi:"Tung hứng commit #2",sl_SI:"Žongliranje s Commiti #2",it_IT:"Giocoliere di commit #2",pl:"Żonglowanie commitami #2",tr_TR:"Commit Hokkabazlığı #2"},hint:{en_US:"Don't forget to forward main to the updated changes!",fr_FR:"N'oubliez pas d'appliquer les changements depuis la branche main",es_AR:"¡No te olvides de avanzar main a los cambios actualizados!",es_ES:"¡No te olvides de avanzar main a los cambios actualizados!",es_MX:"¡No te olvides de avanzar main a los cambios actualizados!",pt_BR:"Não se esqueça de avançar a referência do main para as mudanças efetuadas!",gl:"¡Non te esquezas de avanzar main ós cambios actualizados!",de_DE:"Vergiss nicht den main auf die aktuelle Version vorzuspulen",ja:"mainのポインタを先に進めることを忘れずに!",ko:"main을 변경 완료한 커밋으로 이동(forward)시키는 것을 잊지 마세요!",zh_CN:"别忘记了将 main 快进到最新的更新上!",zh_TW:"別忘記了將 main 推到最新的 commit 上面!",ru_RU:"Не забудь переместить main на последние изменения.",uk:"Не забудь перемістити main на останні зміни!",vi:"Đừng quên đẩy nhánh main lên cập nhật mới nhất!",sl_SI:"Ne pozabi prestaviti main naprej na posodobljene spremembe.",it_IT:"Non dimenticare di avanzare il main verso le ultime modifiche aggiornate!",pl:"Nie zapomnij sforwardować maina do najnowszych zmian!",tr_TR:"Main'i yaptığınız değişikliklere ilerletmeyi unutmayın!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Juggling Commits #2","","*If you haven't completed Juggling Commits #1 (the previous level), please do so before continuing*","","As you saw in the last level, we used `rebase -i` to reorder the commits. Once the commit we wanted to change was on top, we could easily --amend it and re-order back to our preferred order.","","The only issue here is that there is a lot of reordering going on, which can introduce rebase conflicts. Let's look at another method with `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember that git cherry-pick will plop down a commit from anywhere in the tree onto HEAD (as long as that commit isn't an ancestor of HEAD).","","Here's a small refresher demo:"],afterMarkdowns:["Nice! Let's move on."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["So in this level, let's accomplish the same objective of amending `C2` once but avoid using `rebase -i`. I'll leave it up to you to figure it out! :D","","Remember, the exact number of apostrophe's (') on the commit are not important, only the relative differences. For example, I will give credit to a tree that matches the goal tree but has one extra apostrophe everywhere."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jongler avec les commits #2","","*Si vous n'avez pas fait le défi Jongler avec les commits #1 (le niveau précédent), vous devriez le faire avant de continuer*","","Comme vu dans le niveau précédent, nous utilisons `rebase -i` pour réordonner les commits. Une fois que le commit à modifier est celui à la tête, nous pouvons facilement faire un --amend et réordonner dans l'ordre voulu.","","La difficulté ici est qu'il y a beaucoup de changements, ce qui peut introduire des conflits de rebase. Essayons avec l'autre méthode `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["N'oubliez pas que git cherry-pick va prendre un commit de n'importe où dans l'arbre de Git et le mettre devant HEAD (sauf s'il est un ancêtre de HEAD).","","Un petit rappel :"],afterMarkdowns:["Bien ! Continuons."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Dans ce niveau, nous voulons modifier `C2` sans utiliser `rebase -i`. À vous maintenant de trouver comment ! :D","","Petit rappel, le nombre exact d'apostrophes (') sur le commit n'est pas important. Par exemple, nous donnerons les points à une structure qui colle au résultat mais qui a une apostrophe en trop partout."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Haciendo malabares con los commits #2","","*Si no completaste Haciendo malabares con los commits #1 (el nivel anterior), hacelo 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 estaba 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:["Acordate de 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 main; 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 vos el darte cuenta cómo :D","","Acordate, la cantidad exacta de apóstrofes (') en el commit no es importante, sólo la diferencia relativa. Por ejemplo, le voy a dar puntaje a un árbol que matchee el objetivo pero cuyos commits tengan todos un apóstrofe extra."]}}]},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 main; 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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabareando con las confirmaciones #2","","*Si no completaste Malabareando con las confirmaciones #1 (el nivel anterior), hazlo antes de continuar*","","Como viste en el último nivel, usamos `rebase -i` para reordenar las confirmaciones. Una vez que la confirmación que queríamos cambiar se encontraba arriba de todo, pudimos `--amend` (enmendarlo) 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 demostración para refrescar la idea:"],afterMarkdowns:["¡Bien! Sigamos..."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; 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 puntos a un árbol que coincida con el objetivo pero cuyos commits tengan todos un apóstrofe extra."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Malabarismo com commits #2","","*Caso você não tenha completado o nível anterior (Malabarismo com commits #1), por favor faça-o antes de continuar*","","Como você viu no nível anterior, usamos `rebase -i` para reordenar os commits. Uma vez que o commit que queríamos mudar estava no topo, pudemos facilmente usar o `--amend` e depois reordená-lo de volta para obter nossa ordem preferida.","","O único problema aqui é que há muita reordenação ocorrendo, o que pode introduzir conflitos de rebase. Vamos dar uma olhada em outro método, usando o `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembre-se que o git cherry-pick copiará um commit de qualquer lugar na árvore sob o HEAD (desde que esse commit não seja um ancestral do HEAD).","","Aqui está uma demonstração para refrescar sua memória:"],afterMarkdowns:["Ótimo! Vamos em frente."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:['Então, neste nível, vamos alcançar o mesmo objetivo de fazer "amend" no `C2`, mas evitaremos usar o `rebase -i`. Agora vou deixar com você a tarefa de descobrir como fazer! :D',"","Lembre-se, o número exato de apóstrofos (') nos commits não é importante, apenas as diferenças relativas. Por exemplo, darei todos os pontos nesta tarefa se você obtiver o mesmo resultado da árvore da visualização de objetivo com um apóstrofo extra em todos os commits."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argallando cos commits #2","","*No caso de non ter rematado o tema anterior (Argallando cos commits #1), por favor faino antes de continuar*.","","Como puideches ver no anterior tema, usamos `rebase -i` para reordear os commits. Unha vez que atopamos o commit que queriamos modificar, puidemos empregar sinxelamente o `--amend`, e depois reordenalo de volta para obter a nosa orde preferida.","","O único problema aquí é que hai moita reordenación ocorrendo, o que pode introducir conflitos no rebase. Imos votar unha ollada a outro método, o uso de `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembra que `git cherry-pick` copiará un commit de qualquera lugar na árbore enriba do HEAD (sempre e cando non sexa ancestro do HEAD).","","Aquí está unha demostración para que refresques a memoria:"],afterMarkdowns:["¡A tope! Seguimos."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:['Entón, neste nivel, imos completar o mesmo obxectivo que facendo "amend" no `C2`, pero evitando facer o `rebase -i`. Agora deixámoste que lle des os miolos para sacar o exercicio! :D',"","Recorda, o número exacto de apóstrofos (') nos commits non é importante, só as diferencias relativas. Por exemplo, levarás todos os puntos desta tarefa se obtés o mesmo resultado da árbore que se mostra na visualización do exercicio con un apóstrofo extra en tódolos commits."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Jonglieren mit Commits Teil 2","",'Du solltest "Jonglieren mit Commits" (den vorherigen Level) bestanden haben, bevor du dich an diesem hier versuchst.',"","Wie du im letzten Level gesehen hast, haben wir `git rebase -i` genutzt, um die Commits neu anzuordnen. Sobald der Commit, den wir ändern wollten, ganz oben war, konnten wir ihn einfach mit `git commit --amend` anpassen. Danach haben wir die alte Reihenfolge wiederhergestellt.","","Das einzige Problem ist hier, dass da eine Menge Umsortieren stattfindet, was zu Rebase-Konflikten führen kann. Schauen wir uns also eine Methode mit `git cherry-pick` an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wie du dich erinnerst, macht `git cherry-pick` eine Kopie des angegebenen Commits und fügt sie an `HEAD` an (es sei denn der Commit ist ein Vorgänger von `HEAD`).","","Hier eine kleine Demo zur Erinnerung:"],afterMarkdowns:["Schick! Und weiter geht's."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["In diesem Level ist das Ziel wieder, den Commit `C2` zu modifizieren, diesmal aber ohne `git rebase -i` zu benutzen. Ich überlass es dir herauszufinden, wie das gehen soll. :D","","Nicht vergessen, die genaue Anzahl von Kopien (d.h. Apostrophen) ist nicht ausschlaggebend, nur die Differenz. Der Level ist zum Beispiel auch gelöst, wenn dein fertiger Baum dieselbe Struktur wie der Ziel-Baum hat, aber *überall* ein Apostroph mehr aufweist."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## コミットをやりくりする その2","","*注:この一つ前のレベル「コミットをやりくりする」をクリアしていない人は、まずそちらの問題をクリアしてきてください!*","","前回見てきたように、コミット順序の変更のために、私たちは`rebase -i`コマンドを利用しました。ツリーの先頭に変更対象のコミットがあれば、--amendオプションを使うことで容易に変更を書きかえて、元の順序に戻すことができます。","","この場合に心配なことが一つだけあって、それは複数回の順序の変更が行われるので、rebaseのコンフリクト(衝突)が起こりうることです。こういうケースへの対策として、`git cherry-pick`を使った別の解決法について考えてみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git cherry-pickを使うと、ツリーの中から複数のコミットを選んで、HEADの下に新しく作ることができましたね。","","簡単なデモを見てみましょう:"],afterMarkdowns:["できました!次へ進みましょう"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルでは、`C2`をamendすることで前回と同じ目的を達成しましょう。但し`rebase -i`は使わずにクリアしてください。どんな方法で進めるかはあなたにおまかせします!:D"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 提交的技巧 #2","","*如果你还没有完成“提交的技巧 #1”(前一关)的话,请先通过以后再来!*","","正如你在上一关所见到的,我们可以使用 `rebase -i` 对提交记录进行重新排序。只要把我们想要的提交记录挪到最前端,我们就可以很轻松的用 `--amend` 修改它,然后把它们重新排成我们想要的顺序。","","但这样做就唯一的问题就是要进行两次排序,而这有可能造成由 rebase 而导致的冲突。下面还是看看 `git cherry-pick` 是怎么做的吧。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["要在心里牢记 cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。","","来看看这个例子:"],command:"git cherry-pick C2",afterMarkdowns:["看到了吧?我们继续"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["这一关的目标和上一关一样,通过 `--amend` 改变提交记录 `C2`,但你不能用 `rebase -i`。自己想想要怎么解决吧! :D","","对了,提交记录上面的`'`的数量并不重要,只是引用的不同而已。也就是说如果你的最终结果在某个提交记录上多了个`'`,我也会算你通过的。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## commit 的戲法 #2","","*假如你還沒有完成 commit 的戲法 #1(前面那一個關卡),請先完成之後再來這一關!*","","如你在上一個關卡所看到的,我們使用 `rebase -i` 來重新排列那些 commit。只要把我們想要修改的 commit 移到最前面,我們就可以很容易地重新修改它,然後再把它們重新排成我們想要的順序。","","但唯一的問題就是這樣做就要排很多次,有可能造成 rebase conflict。下面就看看用另外一種方法 `git cherry-pick` 是怎麼做的吧!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["要記住喔! cherry-pick 可以從 commit tree 的任何地方拿一個 commit 來放在 HEAD 上(只要那個 commit 不是 HEAD 的 parent)。","","下面是一個簡單清楚的 demo:"],command:"git cherry-pick C2",afterMarkdowns:["太棒了,我們繼續吧!"],beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["在這一關和上一關一樣要去修改一個 commit 叫做`C2`,但你要避免使用 `rebase -i`。自己想想看要怎麼解決吧!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 커밋 갖고 놀기 #2","","*만약 이전 레벨의 커밋 갖고 놀기 #1을 풀지 않으셨다면, 계속하기에 앞서서 꼭 풀어보세요*","","이전 레벨에서 보셨듯이 `rebase -i` 명령으로 커밋의 순서를 바꿀 수 있습니다. 정정할 커밋이 바로 직전(top)에 있으면 간단히 --amend로 수정할 수 있고, 그리고 나서 다시 원하는 순서로 되돌려 놓으면 됩니다.","","이번에 한가지 문제는 순서를 꽤 많이 바꿔야한다는 점인데요, 그러다가 리베이스중에 충돌이 날 수 있습니다. 이번에는 다른 방법인 `git cherry-pick`으로 해결해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git cherry-pick으로 HEAD에다 어떤 커밋이든 떨어 뜨려 놓을 수 있다고 알려드린것 기억나세요? (단, 그 커밋이 현재 가리키고 있는 커밋이 아니어야합니다)","","간단한 데모로 다시 알려드리겠습니다:"],afterMarkdowns:["좋아요! 계속할게요"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["그럼 이번 레벨에서는 아까와 마찬가지로 `C2` 커밋의 내용을 정정하되, `rebase -i`를 쓰지 말고 해보세요. ^.~"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглируем коммитами №2","","*Перед прохождением этого уровня обязательно надо пройти предыдущий уровень – 'Жонглируем коммитами №1'*","","В прошлом уровне мы использовали `rebase -i`, чтобы переставлять коммиты. Как только нужный нам коммит оказывался в конце, мы могли спокойно изменить его при помощи `--amend` и переставить обратно.","","Единственная проблема тут - это множество перестановок, которые могут спровоцировать конфликты. Посмотрим, как с этой же задачей справится cherry-pick."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Важно помнить, что cherry-pick поместит любой коммит сразу после HEAD (только если этот коммит не является предком HEAD)","","Вот небольшое демо для напоминания:"],afterMarkdowns:["Ок! Едем дальше!"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Итак, в этом уровне нужно достичь того же эффекта, но без использования `rebase -i`. Остальное – по усмотрению.","","Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Жонглюємо комітами #2","","*Якщо ти ще не пройшов Жонглюємо комітами #1 (попередній рівень), будь ласка, зроби це перед тим як продовжити*","","Як ти бачив в попередньому рівні, ми використали `rebase -i` щоб впорядкувати набір комітів. Як тільки потрібний коміт опиняється вгорі, його досить легко змінити за допомогою --amend й потім відсортувати коміти в попередньому порядку.","","Єдина проблема з таким підходом полягає в тому, що виконується досить багато перестановок комітів, що може призвести до конфліктів при виконанні rebase. Спробуймо інший підхід який використовує `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Не забувай, що git cherry-pick вставить коміт з будь-якого місця в HEAD (якщо це не коміт-предок HEAD).","","Ось невелике демо, щоб пригадати:"],afterMarkdowns:["Добре! Продовжуємо"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Отже, в цьому рівні досягнімо тієї ж мети -- модифікації `C2` -- але без використання `rebase -i`. Я думаю, ти розберешся як це зробити! :D","","Зверни увагу, що точне число апострофів (') в коміті не важливе, важлива тільки відносна різниця. Наприклад, якщо кожен коміт буде містити додатковий апостроф, я все одно зарахую такий розв’язок."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tung hứng Commit #2","","*Nếu bạn vẫn chưa hoàn thành Tung hứng Commit #1 (cấp độ trước), hãy làm nó trước khi tiếp tục*","","Như bạn đã thấy ở cấp độ trước, ta dùng `rebase -i` để sắp xếp lại các commit. Một khi commit mà ta muốn sửa đã ở trên cùng, ta có thể dễ dàng --chỉnh sửa (amend) nó và sau đó sắp xếp lại trật tự lúc trước.","","Nhưng mà vẫn tồn tại vấn đề khi mà ta sắp xếp quá nhiều, điều này có thể dẫn đến xung đột khi rebase. Thử dùng cách khác với `git cherry-pick` nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy nhớ rằng cherry-pick sẽ thả commit ở bất cứ đâu xuống dưới HEAD (miễn là nó không phải cha ông hay tổ tiên gì của HEAD).","","Hãy xem thử minh họa nhỏ sau:"],afterMarkdowns:["Hay! Tiếp tục nào"],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Vậy thì ở cấp độ này, hãy làm hoàn thành mục tiêu tương tự là chỉnh sửa `C2` một lần nhưng hãy tránh dùng `rebase -i`. Tự tìm cách đi nhé! :D","","Nhớ rằng, số lượng dấu nháy đơn (') trên commit không quan trọng, quan trọng là sự khác biệt tương đối. Nói cách khác, kể cả bất cứ commit nào của bạn có thêm một đấu(') tôi vẫn công nhận đáp án của bạn"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Žongliranje s Commiti #2","","Če še nisi končal Žongliranje s Commiti #1 (prejšnjo stopnjo), jo končaj pred nadaljevanjem","","Kot si videl v prejšnji stopnji, smo uporabili `rebase -i` za preureditev commitov. Ko je bil commit, ki smo ga želeli spremeniti, na vrhu, smo preprosto uporabili --amend in preuredili nazaj v naše željeno stanje.","","Edini problem tu je, da je veliko prerazporejanja, kar lahko povzroči rebase konflikte. Poglejmo si še eno drugo tehniko imenovano `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Git cherry-pick bo skopiral commit iz bilokaterega mesta na drevesu na HEAD (seveda dokler ni ta commit že prednik HEAD).","","Tu je mali osvežitveni primer:"],afterMarkdowns:["Odlično! Nadaljujmo ..."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Torej v tej stopnji bi radi enako spremenili `C2`, ampak tokrat brez uporabe `rebase -i`. Kako to narediti, prepustim tebi! :D","","Točno število opuščajev (') na commitu ni pomembno, pomembna je samo relativna sprememba. Naprimer, vse točko bom dal tudi za drevo, ki ustreza ciljenmu drevesu, a ima povsod dodaten opuščaj."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Żonglowanie commitami #2","","*Ukończ poprzedni poziom Żonglowania commitami przed przejściem dalej*","","Na poprzednim poziomie użyliśmy `rebase -i`, aby zmienić kolejność commitów. Kiedy commit, który chcieliśmy zmienić, był już na górze, mogliśmy łatwo to zrobić (`--amend`), a następnie przywrócić do odpowiedniej kolejności.","","Jedynym problemem jest to, że dokonuje się wiele zmian w kolejności, co może powodować konflikty podczas rebase'u. Przyjrzyjmy się innej metodzie korzystającej z `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pamiętaj, że `git cherry-pick` zrzuci commit z dowolnego miejsca drzewa na HEAD (o ile ten commit nie jest przodkiem HEAD).","","Oto małe demo na odświeżenie pamięci:"],afterMarkdowns:["Ładnie! Ruszajmy dalej."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Więc na tym poziomie osiągnijmy ten sam cel zmiany `C2`, ale unikając użycia `rebase -i`. Zostawię ci to do rozgryzienia! :D","","Pamiętaj, że dokładna liczba apostrofów (') nie jest ważna, tylko względne różnice. Na przykład, uznam drzewo, które pasuje do drzewa celu, ale ma wszędzie jeden dodatkowy apostrof."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Giocoliere di commit #2","","*Se non hai completato Giocoliere di commit #1 (il livello precedente), sei pregato di farlo prima di proseguire*","","Come hai visto nell'ultimo livello, abbiamo usato `rebase -i` per riordinare i commit. Una volta che il commit che volevamo modificare era in cima, abbiamo potuto facilmente fare --amend per poi ritornare nell'ordine di partenza.","","L'unico problema qui è che ci sono tanti riordini da fare, che può portare a conflitti nel rebase. Vediamo di farlo attraverso il metodo `git cherry-pick`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ricorda che git cherry-pick creerà un qualsiasi commit del repository su HEAD (a condizione che il commit non sia un antenato di HEAD).","","Qui un breve demo per rinfrescare la memoria:"],afterMarkdowns:["Grande! Andiamo avanti."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["In questo livello, dobbiamo fare amend di `C2` una volta, evitando di usare `rebase -i`. Lascerò a te il compito di scoprire come farlo! :D","","Ricorda, il numero esatto di apostrofi sul commit non sono importanti, solo le differenze tra essi. Per esempio, considererò l'albero che corrisponde a quello della soluzione ma che ha un apostrofo extra dappertutto."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Commit Hokkabazlığı #2","","*Eğer Commit Hokkabazlığı #1'i (bir önceki level) bitirmediyseniz, devam etmeden önce lütfen önce o bölümü bitirin*","","Bir önceki seviyeden hatırlayacağınız gibi, `rebase -i` kullanarak commit'leri yeniden sıralayabiliyorduk. Değiştirmek istediğimiz commit en üstte olduğunda, onu kolayca düzeltebilir `--amend` ve tercih ettiğimiz sıraya yeniden düzenleyebilirdik.","","Tek sorun şu ki, birçok yeniden sıralama yapıldığında, bu yeniden sıralama çatışmalarını ortaya çıkarabilir. Başka bir yöntemi, git cherry-pick ile inceleyelim."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Unutmayın ki git cherry-pick, HEAD'in herhangi bir yerinde (bu commit, HEAD'in atası değilse) bulunan bir commit'i HEAD üzerine bırakacaktır.","","İşte küçük bir hatırlatma demosu:"],afterMarkdowns:["Harika! Devam Edelim."],command:"git cherry-pick C2",beforeCommand:"git checkout -b bugFix; git commit; git checkout main; git commit"}},{type:"ModalAlert",options:{markdowns:["Bu seviyede, `C2` commit'ini düzeltmek için `rebase -i` kullanmadan aynı sonuca ulaşmaya çalışın. Nasıl ulaşabileceğimizi size bırakıyorum! :D","","Unutmayın, commit'lerdeki tırnakların (') tam olarak eşleşmesi önemli değil, yalnızca göreceli farklar önemlidir. Örneğin, hedef ağaçla eşleşen ancak her yerde ekstra bir tırnak bulunan bir ağaçtan da puan alınabilir."]}}]}}}},{}],130:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C5","id":"main","remoteTrackingBranchID":null},"side":{"target":"C3","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"tags":{"v1":{"target":"C2","id":"v1","type":"tag"},"v0":{"target":"C1","id":"v0","type":"tag"}},"HEAD":{"target":"C2","id":"HEAD"}}',solutionCommand:"git tag v1 side~1;git tag v0 main~2;git checkout v1",startTree:'{"branches":{"main":{"target":"C5","id":"main","remoteTrackingBranchID":null},"side":{"target":"C3","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C2","C4"],"id":"C5"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Git Tags",de_DE:"Git Tags",ja:"Gitのタグ",es_AR:"Tags en git",es_ES:"Tags en git",es_MX:"Tags de Git",pt_BR:"Tags no Git",gl:"Etiquetas en git",fr_FR:"Git Tags",zh_CN:"Git Tag",zh_TW:"git tag",ru_RU:"git tag",ko:"Git 태그",uk:"Git Tags",vi:"Tag trong Git",sl_SI:"Git Tagi",it_IT:"Git Tag",pl:"Tagi Gita",tr_TR:"Git Tagleri"},hint:{en_US:"you can either check out the commit directly or simply checkout the tag!",fr_FR:"Vous pouvez faire le checkout sur le commit ou sur le tag !",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!",es_MX:"Puedes cambiar (checkout) directamente a la confirmación, ¡o simplemente cambiar (checkout) al 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 上",zh_CN:"你可以直接 checkout 到 commit 上,或是简单地 checkout 到 tag 上",ru_RU:"Можно сделать checkout напрямую на коммит или же на тег",ko:"커밋을 직접 또는 태그를 이용해서 체크아웃할수 있습니다!",uk:"ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!",vi:"Bạn có thể chuyển trực tiếp sang commit hoặc đơn giản là chuyển sang tag!",sl_SI:"Checkoutaš lahko neposredno commit ali pa preprosto njegov tag!",it_IT:"Puoi fare direttamente checkout del commit o semplicemente del tag!",pl:"Możesz checkoutować commit bezpośrednio lub po prostu tag!",tr_TR:"İsterseniz direkt commit'e veya direkt tag'e checkout yapabilirsiniz!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","As you have learned from previous lessons, branches are easy to move around and often refer to different commits as work is completed on them. Branches are easily mutated, often temporary, and always changing.","","If that's the case, you may be wondering if there's a way to *permanently* mark historical points in your project's history. For things like major releases and big merges, is there any way to mark these commits with something more permanent than a branch?",""]}},{type:"ModalAlert",options:{markdowns:['You bet there is! Git tags support this exact use case -- they (somewhat) permanently mark certain commits as "milestones" that you can then reference like a branch.',"",'More importantly though, they never move as more commits are created. You can\'t "check out" a tag and then complete work on that tag -- tags exist as anchors in the commit tree that designate certain spots.',"","Let's see what tags look like in practice."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's try making a tag at `C1` which is our version 1 prototype."],afterMarkdowns:["There! Quite easy. We named the tag `v1` and referenced the commit `C1` explicitly. If you leave the commit off, git will just use whatever `HEAD` is at."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["For this level just create the tags in the goal visualization and then check `v1` out. Notice how you go into detached `HEAD` state -- this is because you can't commit directly onto the `v1` tag.","","In the next level we'll examine a more interesting use case for tags."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","Comme appris dans les niveaux précédents, les branches sont faciles à manipuler et se réfèrent aux commits qui ont été faits pour compléter le travail fait sur celles-ci. Les branches sont donc constamment en mouvement.","","Dans ce cas, vous vous demandez peut-être s'il y a un moyen d'ajouter une marque *permanente* dans l'historique de votre projet. Pour des commits comme des livraisons majeures ou d'importantes fusions, existe-t-il une façon plus stable qu'une branche pour garder l'état d'une branche à un instant précis ?",""]}},{type:"ModalAlert",options:{markdowns:['Vous l\'avez deviné ! Les tags Git offrent cette fonctionnalité : les tags marquent à jamais certains commits comme "milestone" (étape clé) auxquels vous pouvez vous référer comme à des branches.',"","Encore plus important, ils sont définitifs. Vous ne pouvez donc pas rajouter de commit dans un tag : les tags sont un peu comme un pointeur définitif dans l'arbre des commits.","","Voyons les tags en pratique."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Essayons de faire un tag sur C1 (qui représente la version 1 de notre prototype)."],afterMarkdowns:["Voila, facile non ? Nous nommons le tag `v1` et il pointe vers le commit `C1`. Si vous ne spécifiez pas le commit, le tag pointera là où se trouve `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Pour ce niveau, créez simplement les tags visibles dans les objectifs puis faites un checkout sur le tag `v1`. Remarquez le passage à l'état `HEAD` détachée -- c'est parce que vous ne pouvez pas commiter sur le tag `v1`.","","Dans les niveaux suivants vous verrez un cas plus intéressant d'utilisation des tags."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git tag","","就像你之前學到的一樣,branch 很容易被移動,而且當有新的 commit 時,又會再移動,branch 經常指向不同的 commit,branch 很容易改變。","","你可能會有疑問,有沒有什麼方法可以*永遠*有一個指向 commit 的記號,例如,表示重大的軟體釋出,或者是修正很大的 bug,有沒有其它比 branch 更好的方法,可以永遠地指向這些 commit?",""]}},{type:"ModalAlert",options:{markdowns:['你說對了!git tag 可以解決這個問題,它們可以永遠地指向某個特定的 commit,就像是表示一個"里程碑"一樣。',"",'更重要的是,當有新的 commit 時,它們也不會移動,你不可以 "checkout" 到 tag 上面 commit,tag 的存在就像是一個在 commit tree 上的表示特定訊息的一個錨。',"","讓我們來實際看一下 tag 長什麼樣子..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們試著建立一個 tag,指向 commit `C1`,表示這是我們第一個版本。"],afterMarkdowns:["看吧!非常容易,我們命名這個 tag 叫做 `v1`,並且讓它指向 commit `C1`,如果你離開了該 commit,git 會根據 `HEAD` 所指向的位置才分辨。"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["在這個關卡中,建立一個如視覺化目標裡面的 tag,然後 checkout 到 `v1` 上面,要注意你會進到分離 `HEAD` 的狀態,這是因為你不能夠直接在 `v1` 上面做 commit。","","在下個關卡中我們會介紹更多 tag 的應用..."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","相信通过前面课程的学习你已经发现了:分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。","","你可能会问了:有没有什么可以*永远*指向某个提交记录的标识呢,比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性,有没有比分支更好的可以永远指向这些提交的方法呢?",""]}},{type:"ModalAlert",options:{markdowns:["当然有了!Git 的 tag 就是干这个用的啊,它们可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了。","","更难得的是,它们并不会随着新的提交而移动。你也不能切换到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。","","咱们来看看标签到底是什么样。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们先建立一个标签,指向提交记录 `C1`,表示这是我们 1.0 版本。"],afterMarkdowns:["很容易吧!我们将这个标签命名为 `v1`,并且明确地让它指向提交记录 `C1`,如果你不指定提交记录,Git 会用 `HEAD` 所指向的位置。"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["在这个关卡中,按照目标建立两个标签,然后切换到 `v1` 上面,要注意你会进到分离 `HEAD` 的状态 —— 这是因为不能直接在`v1` 上面做 commit。","","在下个关卡中我们会介绍更多关于标签的有趣的应用。"]}}]},es_AR:{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 podés referenciar como a un branch.',"",'Aún más importante, los tags no avanzan cuando se crean nuevos commits. No podés "checkoutear" 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 especificás 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 creá los tags en la visualización final y después checkouteá `v1`. Notá cómo entrás en el estado detached -- esto es porque no podés commitear directamente sobre el tag `v1`.","","En el próximo nivel vamos a examinar un caso de uso más interesante para los tags."]}}]},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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tags en git","","Como aprendiste en lecciones anteriores, las ramas pueden moverse fácilmente y en general van referenciando distintas confirmaciones 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 mezclas (merges), ¿hay algún modo de marcar esas confirmaciones con algo más permanente que una rama?",""]}},{type:"ModalAlert",options:{markdowns:['¡Apuesto a que lo hay! Los tags de Git soportan exactamente este caso de uso -- marcan (bastante) permanentemente determinadas confirmaciones como "hitos" que puedes referenciar como a una rama.',"","Aún más importante, los tags no avanzan cuando se crean nuevas confirmaciones. No puedes hacer checkout a un tag y completar el trabajo en ese tag - los tags son marcas fijas en el árbol de confirmaciones que designan ciertos puntos.","","Veamos cómo se ven los tags en práctica..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Intentemos crear un tag en `C1`, que es la versión 1 de nuestro prototipo"],afterMarkdowns:["¡Ahí está! Bastante simple. Nombramos al tag `v1` y referenciamos explícitamente a la confirmación `C1`. Si no especificas la confirmación 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 confirmar (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:[{type:"ModalAlert",options:{markdowns:["## Tags no Git","","Como você aprendeu nas lições anteriores, ramos são fáceis de mover e geralmente vão se referindo a diferentes commits conforme você vai trabalhando no código. Ramos são facilmente mutáveis, frequentemente temporários, e estão sempre mudando.","","Se este é o caso, você pode estar se perguntando se não existe uma forma de marcar *permanentemente* pontos históricos do projeto. Para coisas como grandes releases ou grandes merges, existe alguma forma de marcar commits com algo mais permanente que um ramo?",""]}},{type:"ModalAlert",options:{markdowns:['Você acertou a aposta, existe sim! As tags do Git foram criadas exatamente para esse caso de uso -- elas marcam de forma (relativamente) permanente certos commits como se fossem "pedras de kilometragem" ("milestones") em uma estrada, e você pode referenciá-las exatamente como faz com ramos.',"",'O mais importante, no entanto, é que elas nunca se movem sozinhas quando novos commits são criados. Você pode fazer "checkout" em uma tag e então completar trabalho nessa tag -- tags existem como âncoras na árvore de commits que estão atreladas a certos pontos.',"","Vejamos como as tags se comportam na prática."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Criemos uma tag em `C1`, que é nosso protótipo da versão 1"],afterMarkdowns:["Aqui! Bem fácil. Nós chamamos a tag de `v1` e referenciamos o commit `C1` explicitamente. Se você chamar o comando sem especificar um commit, o git vai usar seja lá qual commit para o qual o `HEAD` estiver apontando."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:['Para completar esta tarefa, simplesmente crie as tags mostradas na visualização do objetivo, e então faça checkout em `v1`. Veja que você vai para o estado "Detached HEAD" -- isso é devido ao fato de que você não pode commitar diretamente na tag `v1`.',"","No próximo nível, examinaremos mais um caso de uso interessante para as tags."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Etiquetas en Git","","Como aprendiches nas leccións previas, as ramas pódense mover sinxelamente, e xeralmente refírense a distintos commits según vas completando o código. As ramas mutan con facilidade, soen ser temporais, e sempre cambiantes.","","Se estamos nese caso, podes preguntarte se existe unha forma de marcar *permanentemente* puntos históricos no proxecto. Para cousas como grandes entregas ou grandes merges, ¿existe algunha forma de marcar commits con algo máis permanente que unha rama?",""]}},{type:"ModalAlert",options:{markdowns:['Acertaches seguro, ¡si que existe! As etiquetas de git foron creadas para ese propósito -- elas marcan de forma (relativamente) permanente algún commits coma se fosen "marcos das fincas" ("milestones") nun campeiro, e podes facer referencias a elas mellor que o catastro.',"",'É moi importante saber que, as etiquetas non avanzan cando se crean novos commits. Non podes facer "checkout" nun tag e completar o traballo de esa etiqueta cun commit amend ou rebasándoo -- as etiquetas existen como áncoras na árbore de commits que están pegadas a certos puntos.',"","Vexamos como se comportan as etiquetas na práctica."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Creamos un tag na rama `C1`, que é o noso prototipo da versión 1"],afterMarkdowns:["¡Ahí o tes!. Sinxelo. Nomeamos a etiqueta de `v1` e referenciamos o commit `C1` explícitamente. Se non indicas o commit, git vai empregar o commit onde está situado o `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:['Para completar esta tarefa, crea as etiquetas amosadas na visualización do obxectivo, e entón fai checkout en `v1`. Mira que terminas no estado "Detached HEAD" -- eso é porque non podes facer commit directamente na etiqueta `v1`.',"","No próximo nivel, examinaremos un caso de uso máis interesante para as etiquetas."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tags","","Wie du aus den vorhergehenden Levels weißt, sind Branches einfach durch die Gegend zu schieben und zeigen auf verschiedene Commits, während die Arbeit in ihnen fortschreitet. Ein Branch wird oft verändert, manchmal nur temporär, und ist ständig in Bewegung.","","Da das so ist fragst du dich vielleicht, ob es nicht eine Möglichkeit gibt, eine bestimmte Stelle in deiner Projekt-History *permanent* zu kennzeichnen. Kann man nicht zum Beispiel für große Releases und Meilensteine nicht einen Commit mit etwas festerem kennzeichnen, als mit einem Branch-Namen?",""]}},{type:"ModalAlert",options:{markdowns:["Aber klar! In Git gibt es genau zu diesem Zweck Tags -- sie kennzeichnen einen Commit (ziemlich) permanent als Meilenstein oder ähnliches und man kann sie ansprechen wie Branch-Namen.","","Noch viel wichtiger, Tags verändern nicht ihre Position, wenn man Commits hinzufügt. Du kannst ein Tag nicht in diesem Sinne auschecken und dann Modifikationen darauf committen. Tags sind Anker im Commit-Baum, die bestimmte Stellen anzeigen.","","Lass uns anschauen wie Tags in der Praxis funktionieren."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lass uns ein Tag bei `C1` anlegen und damit die Version 1 unseres Prototyps markieren."],afterMarkdowns:["Peng! Ziemlich einfach. Wir haben das Tag `v1` genannt und lassen es auf `C1` zeigen. Wenn du den Commit weglässt, wird das Tag für den Commit erzeugt, auf den `HEAD` zeigt."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:['Um diesen Level zu schaffen, erstelle einfach die Tags wie sie in der Zielbeschreibung stehen und mach dann einen Checkout auf `v1`. Beachte wie du dabei in den "Detached HEAD" Zustand gehst -- das liegt daran, dass du keine Commits direkt auf das `v1` Tag machen kannst.',"","Im nächsten Level schauen wir uns dann einen interessanteren Anwendungsfall für Tags an."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitのタグ","","私たちは、前回、ブランチが簡単に移動でき、またしばしば異なる作業の完了しているコミットを参照できることを学びました。ブランチは、簡単に変化させることができ、しばしば一時的で、いつも移動しています。","","そのような場合に、もしプロジェクトの歴史的な点に*恒久的*にマークをつける方法があったならと思うかもしれません。例えば、メジャーリリースや大きなマージを行った時などに、そのコミットにブランチより恒久的な印をつける方法はないのでしょうか?",""]}},{type:"ModalAlert",options:{markdowns:["それは存在します!Gitのタグは当にそのような場面で最適です。 -- ブランチのように参照でき、「マイルストーン(標識)」のような確かで(多少)永久的な印をコミットにつけます。","","重要なことは、コミットを新たに作ってもタグは動かないということです。あなたは、タグにチェックアウトしてそのタグで作業を完了させるということはできません -- タグは、コミットツリーの特定の地点を指定する錨のようなものとして機能します。","","では、実際にタグがどのように動作するかを見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["私たちのバージョン1の原本となる`C1`にタグを付けてみましょう"],afterMarkdowns:["見てください!とても簡単ですね。私たちは、`v1`という名前のタグを明示的に`C1`コミットに付与しました。もし、コミットを指定しなかった場合、`HEAD`にあるものにタグがつけられることになります。"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルは、ゴールとして提示されている図のようにタグを作り、`v1`にチェックアウトすることで完了します。そうすると、あなたは`HEAD`分離状態になることに気づくでしょう -- これは、あなたが直接`v1`タグにコミットができないことを意味しています。","","次のレベルでは、タグのより興味深い使い方について学びます。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Теги","","В прошлых уроках мы усвоили, что ветки просто двигать туда-сюда и они часто ссылаются на разные коммиты как на изменения данных в ветке. Ветки просто изменить, они часто временны и постоянно меняют своё состояние.","","В таком случае, где взять *постоянную* ссылку на момент в истории изменений? Для таких вещей, как релиз и большие слияния, нужно нечто более постоянное, чем ветка.",""]}},{type:"ModalAlert",options:{markdowns:["Такое средство имеется. Git предоставляет нам теги, чья основная задача – ссылаться постоянно на конкретный коммит.","","Важно, что после создания они никогда не сменят своего положения, так что можно с лёгкостью сделать checkout конкретного момента в истории изменений","","Посмотрим на это на практике."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Создадим тег на `C1`, который будет нашей версией 1"],afterMarkdowns:["Готово! Всё просто. Мы назвали тег `v1` и заставили его ссылаться на `C1` явным образом. Если конкретный коммит не указан, гит пометит тегом `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, просто создай теги так, как показано на визуализации, и потом перейди на тег `v1`. Обрати внимание, что ты перейдёшь в состояние `detached HEAD`, так как нельзя сделать коммит прямо в тег `v1`.","","В следующем уровне мы попробуем более интересные способы применения тегов."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 태그","","이전 강의에서 배웠듯이, 브랜치는 이동하기 쉽습니다. 작업의 완료, 진행에 따라 이리저리 이동하면서 서로 다른 커밋을 참조하게 됩니다. 브랜치는 쉽게 변하며 임시적인 것입니다 항상 바뀌고 있죠.","","이런 상황에서, 여러분은 여러분의 프로젝트의 역사(작업 이력)에서 중요한 지점들에 *영구적으로* 표시를 할 방법이 없을까 궁금할것입니다. 주요 릴리즈나 큰 브랜치 병합(merge)이 있을때가 그런 상황이겠군요. 이런 상황에 커밋들을 표시할 브랜치보다 영구적인 방법이 있을까요?",""]}},{type:"ModalAlert",options:{markdowns:['당연히 있습니다! Git 태그는 딱 이런 상황을 위해 존재합니다 -- Git 태그는 특정 커밋들을 브랜치로 참조하듯이 영구적인 "milestone(이정표)"으로 표시합니다.',"",'중요한 점은, Git 태그는 커밋들이 추가적으로 생성되어도 절대 움직이지 않는다는 것입니다. 여러분은 태그를 "체크아웃"한 후에 그 태그에서 어떤 작업을 완료할 수 없습니다 -- 태그는 커밋 트리에서 특정 지점을 표시하기위한 닻같은 역할을 합니다.',"","자 태그가 무엇을 하는지 예제를 통해 알아봅시다"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:[" 프로토타입의 첫 버전인 `C1`에 태그를 만들어 봅시다."],afterMarkdowns:["자! 아주 쉽죠. 우리는 태그의 이름을 `v1`이라고 지었고 커밋 `C1`을 지정해서 참조했습니다. 만약 커밋을 지정해주지 않으면 git은 `HEAD`가 있는지점에 태그를 붙일 것입니다."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨에서는 goal에 나타난것과 같이 태그를 만들고 `v1`을 체크아웃하면 됩니다. 분리된 `HEAD` 상태로 변하는것을 확인 해 보십시오 -- 이것은 `v1` 태그에 직접 커밋을 할 수 없기 때문입니다.","","다음 레벨에서는 태그의 더 흥미로운 활용 방법을 확인해 볼 것입니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Таги в Git","","Як ти вже знаєш з попередніх уроків, гілки досить просто переносити в інші місця, і вони постійно вказують на різні коміти в процесі того? як ті в них додаються. Гілки легко модифікувати, часто тимчасово, й вони постійно змінюються.","","В такому разі, де взяти *постійне* посилання на момент в історії твого проекту? Для таких речей як релізи чи великі мерджі потрібно щось більш стале ніж гілка.",""]}},{type:"ModalAlert",options:{markdowns:['Є один спосіб! Таги в гіт якраз для цього й були створені -- вони (більш-менш) постійно вказують на певні коміти, й відмічають певні "віхи" в житті проекту, на які ти можеш потім посилатись так само як на гілки.',"",'Але, що важливіше, вони ніколи не переміщуються під час створення нових комітів. Ти не зможеш "зачекаутити" таг а потім закомітити якісь зміни в цей таг -- таги просто відмічають корисні чи символічні місця в дереві комітів.',"","Розгляньмо це на практиці"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Спробуймо зробити новий таг на `C1`, що є прототипом нашої першої версії (вигаданого проекту)"],afterMarkdowns:["Ось і маєш! Все досить просто. Ми назвали наш таг `v1` і він явно посилається на `C1`. Якщо пропустити коміт, git просто відмітить те, на чому знаходиться `HEAD` в данний момент"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Для того щоб пройти цей рівень, достатньо створити кілька тагів, як показано на візуалізації цілей, і потім зачекаутити `v1`. Зауваж, що ти потрапиш в стан `detached HEAD` -- це тому що ти не можеш напряму комітити в таг `v1`.","","В наступному рівні ми розглянемо більш цікавий приклад роботи з тагами."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tag trong Git","","Qua các bài học trước, bạn đã biết được rằng rất dễ dàng để di chuyển qua lại giữa các nhánh và chúng thường tham chiếu đến các commit khác nhau trong quá trình ta làm việc trên chúng. Nhánh dễ dàng chỉnh sửa, thường tạm thời và luôn thay đổi.","","Nếu như vậy thì bạn có thể sẽ thắc mắc liệu có cách nào để đánh dấu *vĩnh viễn* một thời điểm nào đó trong lịch sử làm việc không? Khi mà dự án càng ngày càng mở rộng và merge thì diễn ra liên tục, vậy thì có cách nào để đánh dấu những commit đó một cách cố định hơn nhánh không?",""]}},{type:"ModalAlert",options:{markdowns:['Tất nhiên là có chứ! Git có các tag (thẻ) để hỗ trợ vấn đề này -- chúng (một phần chứ không hoàn toàn) đánh dấu vĩnh viễn một số commit nhất định là "cột mốc" mà sau này bạn có thể tham chiếu đến như với nhánh.',"",'Quan trọng hơn là, khi ta commit thì chúng không hề bị di chuyển. Bạn không thể "check out" một tag rồi làm việc trên đó -- tag giống như là mỏ neo để chỉ định một điểm cụ thể nào đó trên cây lịch sử.',"","Cùng xem tag thực tế là như thế nào nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy thử tạo một thẻ ở commit `C1` chỉ định rằng đây là phiên bản thứ nhất của ta."],afterMarkdowns:["Đó! Đơn giản như đan rổ. Ta tạo ra thẻ `v1` và tham chiếu đến commit `C1`. Nếu bạn không chỉ định commit, git sẽ gắn thẻ vào commit mà `HEAD` đang trỏ tới"],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Trong cấp độ này hãy tạo ra một thẻ tại vị trí chỉ định và chuyển sang `v1`. Để ý rằng bạn sẽ chuyển sang trạng thái tách biệt `HEAD` -- bởi vì bạn không thể tham chiếu đến thẻ `v1`.","","Sang cấp độ tới ta sẽ xem xét một vài cách hay ho để dùng thẻ."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tagi","","Kot si se naučil v prejšnjih lekcijah, so branchi enostavni za premikat okoli in pogosto kažejo na različne commite in delo za njimi. Veliko se spreminjajo in združujejo, pogosto le začasno.","","Če je temu res tako, se morda sprašuješ, če obstaja kak način, ki bi *trajno* označil točke v zgodovini projekta. Za stvari kot so večji release-i ali pomembni merge-i, ali obstaja način, ki je trajnejši kot branch?",""]}},{type:"ModalAlert",options:{markdowns:['Itak da je! Git tagi podpirajo točno ta primer uporabe -- oni trajno (do neke mere) označijo določene commite kot "mejnike" na katere se lahko sklicujemo kot na branche.',"",'Toda še pomembneje, oni se ne premikajo, ko se ustvarjajo novi commiti. Ne moreš "checkoutat" tag in nato končati delo na tem tagu -- tagi obstajajo kot sidra na drevesu commitov, ki označujejo določene točke.',"","Poglejmo kako to izgleda v praksi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poizkusimo narediti tag na `C1`, ki je recimo naša prva različica prototipa."],afterMarkdowns:["Tako! Kar enostavno. Tag smo poimenovali `v1` in se sklicuje na commit `C1`. Če ne navedeš commita, bo git postavil tag tam, kjer je trenutno `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Za to stopnjo ustvari tage kot so določeni na ciljnem prikazu in nato checkoutaj `v1`. Opazil boš, kako prideš v stanje ločenega `HEAD-a` -- to je zato, ker ne moreš commitat direktno na `v1` tag.","","V naslednji stopnji si bomo pogledali zanimivejši primer za uporabo tagov."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tagi Gita","","Jak wiesz z poprzednich lekcji, gałęzie łatwo przemieszczać, a w momencie ukończenia pracy nad nimi, często odnoszą się do różnych commitów. Gałęzie łatwo ulegają mutacjom, często są tymczasowe i zawsze się zmieniają.","","A skoro tak, to możesz się zastanawiać, czy istnieje sposób na *trwałe* zaznaczanie ważnych punktów w historii projektu. Czy istnieje jakiś sposób na oznaczenie tych commitów czymś bardziej trwałym niż gałąź, w przypadku takich rzeczy jak duże wydania i duże scalenia/ merge?",""]}},{type:"ModalAlert",options:{markdowns:['Pewnie, że tak! Znaczniki/tagi Gita obsługują dokładnie ten przypadek użycia -- (do pewnego stopnia) trwale oznaczają pewne commity jako "kamienie milowe", do których można się następnie odnieść (po nazwie) jak do gałęzi.',"",'Co ważniejsze jednak, nigdy się nie przesuwają, gdy tworzone są kolejne commity. Nie można "checkoutować" tagu, a następnie zakończyć pracy nad nim (jakby był gałęzią, na której można zapisać nowe zmiany) - tagi są jak kotwice w drzewie commitów, które wyznaczają pewne miejsca.',"","Zobaczmy, jak tagi wyglądają w praktyce."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spróbujmy zrobić tag w `C1`, który jest prototypem naszej wersji 1."],afterMarkdowns:["Otóż to! Całkiem proste. Nazwaliśmy tag `v1` i odwołaliśmy się do commitu `C1` w sposób jawny. Jeśli nie wskażesz konkretnego commitu, Git użyje commitu, na który wskazuje `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Dla tego poziomu utwórz tagi takie jak w wizualizacji celu, a następnie checkoutuj `v1`. Zauważ, że przechodzisz do odłączonego stanu `HEAD` - to dlatego, że nie możesz commitować bezpośrednio na tagu `v1`.","","Na kolejnym poziomie przeanalizujemy bardziej interesujący przypadek użycia tagów."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tag","","Come hai già imparato nelle lezioni precedenti, i rami sono facili da spostare e puntano a commit differenti man mano che il lavoro avanza. I rami subiscono modifiche, spesso temporaneamente, ma sono sempre in continua evoluzione.","","Ti starai chedendo se esiste un modo *definitivo* per segnare un particolare commit del repository. Nel caso di release importanti e grandi merge (fusioni), esiste un modo per segnare questi commit con qualcosa di più permanente dei rami?",""]}},{type:"ModalAlert",options:{markdowns:['Ci puoi scommettere! Git tag serve proprio a questo -- i tag contrassegnano in modo permanente dei commit "importanti" a cui puoi far riferimento come avviene con i rami.',"","Ancora più importante il fatto che non si spostano anche se vengono eseguiti nuovi commit. Non puoi selezionare un tag e aggiungere del lavoro su quel tag -- i tag esistono come ancore nell'albero dei commit, e si riferiscono a determinati punti.","","Vediamo in pratica a cosa servono i tag."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Creiamo un tag in `C1` che è la nostra versione 1 del prototipo."],afterMarkdowns:["Ecco! Abbastanza facile. Abbiamo creato il tag `v1` che si riferisce al solo commit `C1`. Se non specifichi il commit, git creera il tag sul commit puntato da `HEAD`."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["In questo livello riproduci gli stessi tag mostrati nell'obiettivo, e alla fine seleziona il tag `v1`. Presta attenzione a come vai nello stato di detached `HEAD` -- questo perché non puoi creare commit direttamente dal tag `v1.","","Nel livello successivo vedremo un utilizzo più interessante dell'uso dei tag."]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Tag'leri","","Önceki derslerden öğrendiğiniz gibi, branch'ler kolayca taşınabilir ve üzerlerinde çalışma tamamlandıkça farklı commitlere işaret ederler. Branch'ler kolayca değiştirilebilir, genellikle geçici ve her zaman değişkendirler.","","Eğer durum buysa, projenizin tarihindeki belirli noktaları *kalıcı* olarak işaretlemenin bir yolunun olup olmadığını merak ediyor olabilirsiniz. Büyük sürümler ve önemli birleştirmeler gibi durumlar için, bunları bir branch üzerine tag'lemek yerine daha kalıcı bir şekilde nasıl tag'leyeceğinizi düşünüyor olabilirsiniz.",""]}},{type:"ModalAlert",options:{markdowns:["Direkt olarak işaretlemek mümkün! Git tag'leri tam da bu kullanım durumunu destekler - belirli commit'leri \"milestone\" olarak (bir dereceye kadar) kalıcı olarak işaretler ve sonra bir branch gibi başvurabileceğiniz şekilde kullanabilirsiniz.","",'Daha da önemlisi, daha fazla commit oluşturulduğunda asla hareket etmezler. Bir etiketi "checkout" edemez ve sonra o etiket üzerinde çalışmayı tamamlayamazsınız - tagler, belirli noktaları belirleyen commit ağacındaki referans noktaları olarak varlıklarını sürdürürler.',"","Gelin, tag'ler pratikte nasıl görünüyor bakalım."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hadi `C1` üzerinde bir tag oluşturmayı deneyelim, bu bizim 1. sürüm prototipimizdir."],afterMarkdowns:["İşte bu! Oldukça kolay. Etiketi `v1` olarak adlandırdık ve `C1` commit'ini açıkça refere ettik. Eğer commit'i belirtmezseniz, git sadece `HEAD` neredeyse onu kullanır."],command:"git tag v1 C1",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Bu seviye için sadece hedef görselleştirmede tag'leri oluşturun ve ardından `v1`i kontrol edin. Dikkatinizi çekecektir ki bağımsız (detached) `HEAD` durumuna giriyorsunuz - bu, `v1` etiketi üzerine doğrudan commit yapamayacağınız içindir.","","Sonraki seviyede, etiketlerin daha ilginç bir kullanım durumunu inceleyeceğiz."]}}]}}}},{}],131:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C6%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git cherry-pick C3 C4 C7",compareOnlyMainHashAgnostic:!0,disabledMap:{"git rebase":!0},startTree:'{"branches":{"main":{"target":"C1","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C5","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C1"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{fr_FR:"Introduction à cherry-pick",en_US:"Cherry-pick Intro",de_DE:"Einführung Cherry-Picking",ja:"cherry-pick入門",es_AR:"Introducción a cherry-pick",es_ES:"Introducción a cherry-pick",es_MX:"Introducción a cherry-pick",pt_BR:"Introdução ao cherry-pick",gl:"Introuducción a cherry-pick",zh_CN:"Git Cherry-pick",zh_TW:"介紹 cherry-pick",ru_RU:"Введение в Cherry-pick",ko:"Cherry-pick 소개",uk:"Знайомство з cherry-pick",vi:"Giới thiệu về cherry-pick",sl_SI:"Uvod v Cherry-pick",it_IT:"Introduzione al cherry-pick",pl:"Wprowadzenie do cherry-pick"},hint:{fr_FR:"git cherry-pick suivi par les noms de commits",en_US:"git cherry-pick followed by commit names!",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 后面要跟提交的名字",zh_TW:"git cherry-pick 後面要接著 commit 的名稱",ru_RU:"git cherry-pick основывается на именах коммитов!",ko:"커밋의 이름들로 git cherry-pick 하세요!",uk:"git cherry-pick базується на іменах комітів!",vi:"git cherry-pick sau đó là tên commit!",sl_SI:"git cherry-pick nato pa imena commitov.",it_IT:"git cherry-pick seguito dai nomi dei commit!",pl:"git cherry-pick a po nim nazwy commitów!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moving Work Around","","So far we've covered the basics of git -- committing, branching, and moving around in the source tree. Just these concepts are enough to leverage 90% of the power of git repositories and cover the main needs of developers.","",'That remaining 10%, however, can be quite useful during complex workflows (or when you\'ve gotten yourself into a bind). The next concept we\'re going to cover is "moving work around" -- in other words, it\'s a way for developers to say "I want this work here and that work there" in precise, eloquent, flexible ways.',"","This may seem like a lot, but it's a simple concept."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","The first command in this series is called `git cherry-pick`. It takes on the following form:","","* `git cherry-pick <...>`","","It's a very straightforward way of saying that you would like to copy a series of commits below your current location (`HEAD`). I personally love `cherry-pick` because there is very little magic involved and it's easy to understand.","","Let's see a demo!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here's a repository where we have some work in branch `side` that we want to copy to `main`. This could be accomplished through a rebase (which we have already learned), but let's see how cherry-pick performs."],afterMarkdowns:["That's it! We wanted commits `C2` and `C4` and git plopped them down right below us. Simple as that!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["To complete this level, simply copy some work from the three branches shown into main. You can see which commits we want by looking at the goal visualization.",""]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Déplacer votre travail","","Nous avons maintenant pratiqué les bases de Git -- commits, branches, et déplacements dans l'arbre des commits. Ces seuls concepts sont suffisants pour utiliser 90% du pouvoir des dépôts Git et satisfaire les principaux besoins des développeurs.","",'Les 10% restants, cependant, peuvent être assez utiles pour les systèmes assez complexes (ou quand vous vous êtes mis tout seul dans le pétrin). Le prochain concept que nous allons aborder est "déplacer son travail" (moving work around) -- en d\'autres termes, c\'est une façon pour les développeurs de dire "Je veux ce travail ici et cet autre là.".',"","Cela peut sembler compliqué, mais c'est un concept simple."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","La première commande de cette série est `git cherry-pick`. Elle s'utilise ainsi :","","* `git cherry-pick <...>`","","C'est une manière simple de dire qu'on voudrait copier une série de commits en-dessous de notre emplacement actuel (`HEAD`). Personnellement, j'adore `cherry-pick` parce qu'il y a un petit peu de magie dedans, et parce que c'est facile à comprendre.","","Faisons une démonstration !",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ici le dépôt que nous avons contient du travail dans la branche `side`, que nous voulons copier dans `main`. Cela pourrait être fait avec un rebase (que nous avons déjà appris), mais voyons comment cherry-pick fonctionne."],afterMarkdowns:["Voilà ! Nous voulions les commits `C2` et `C4` et Git les a fait apparaître juste sous nos pieds. Aussi simple que ça !"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, copiez simplement le travail désigné dans la branche main. Vous pouvez voir les commits que nous souhaitons avoir en regardant dans la fenêtre d'objectif.",""]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moviendo el trabajo por ahí","","Hasta ahora cubrimos lo básico de git -- commitear, branchear, 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 quienes programan.","",'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 quienes programan de decir "Quiero este trabajo allá 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 querés 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:["Acá tenemos un repositorio con algo de trabajo en la rama `side` que queremos copiar a `main`. 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 main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente copiá algo de trabajo desde otras tres ramas a main. Podés ver qué commits queremos en la visualización del objetivo.",""]}}]},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 `main`. 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 main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a main. Puedes ver qué commits queremos en la visualización del objetivo.",""]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moviendo el trabajo por ahí","","Hasta ahora hemos cubierto lo básico de Git -- hacer confirmaciones, crear ramas y movernos por el árbol de confirmaciones. 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 demostración!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí tenemos un repositorio donde tenemos algo de trabajo en la rama `side` que queremos copiar a `main`. 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 main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente copia algo de trabajo desde otras tres ramas a main. Puedes ver qué commits queremos en la visualización del objetivo.",""]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Movendo o trabalho por aí","","Por enquanto nós abordamos o básico do Git -- commitar, criar ramos, e mover-se pela árvore. Apenas esses conceitos já são suficientes para utilizar 90% do poder dos repositórios Git, e cobrem as principais necessidades dos desenvolvedores.","",'Os 10% restantes, entretanto, podem ser extremamente úteis em fluxos de trabalho complexos (ou quando você estiver em uma enrascada). O próximo conceito que vamos abordar é "movendo trabalho por aí" -- em outras palavras, veremos as formas como o desenvolvedor pode dizer "eu quero este trabalho aqui, e aquele ali" de formas precisas, eloquentes e flexíveis.',"","Isso pode parecer muito, mas os conceitos são simples."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","O primeiro comando desta série é o `git cherry-pick`. Ele é chamado da seguinte forma:","","* `git cherry-pick <...>`","","Trata-se de uma forma bastante direta de dizer que você gostaria de copiar uma série de commits abaixo do seu local atual (`HEAD`). Eu pessoalmente amo o `cherry-pick` porque há muito pouca mágica envolvida e é fácil de entender o funcionamento.","","Vejamos uma demonstração!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui está um repositório onde temos algum trabalho no ramo `side` que desejamos copiar para o `main`. Isso poderia ser obtido por meio de um rebase (que já aprendemos), mas vamos ver como o cherry-pick se sai."],afterMarkdowns:["É isso! Queríamos os commits `C2` e `C4` e o git os inseriu logo abaixo de nós. Simples assim!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, simplesmente copie algum trabalho dos outros três ramos para o main. Você pode ver quais commits queremos copiar na visualização do objetivo.",""]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Movendo traballo por ahí","","Ata agora cubrimos o uso básico de git -- facer commit, crear ramas, e moverse pola árbore. Estes conceptos chegan para aproveitar o 90% do poder dos repositorios de git e cubrilas necesidades principais dos desenvolvedores.","",'O 10% restante, ademáis, poden ser extremadamente útiles nos fluxos de traballo complexos (ou cando te meteches nalgún problema complicado). O próximo concepto que imos abordar é "movendo o traballo por ahí" -- noutras verbas, unha forma que teñen os desenvolvedores de dicir "eu quero este traballo aquí, e aquel alí" de forma precisa, elocuente e flexible.',"","Eso pode ser moito, pero os conceptos son simples."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","O primeiro comando desta serie é `git cherry-pick`. O comando emprégase da seguinte forma:","","* `git cherry-pick <...>`","","Trátase dunha forma bastante directa de dicir que queres copiar unha serie de commits sobre a túa ubicación actual (`HEAD`). Eu persoalmente adoro `cherry-pick` porque hai moita maxia envolta e é un funcionamento sinxelo de entender.","","Vexamos unha demostración!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí está un repositorio onde hai algún traballo na rama `side` que desexamos copiar para a rama `main`. Iso podería ser obtido por medio dun rebase (que xa aprendemos), pero imos ver como o resolve cherry-pick."],afterMarkdowns:["¡Eso é! Queríamos os commits `C2` e `C4` e git insertounos por baixo de nós. ¡Moi sinxelo!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, copia algo de traballo das outras ramas na main. Podes ver qué commits queremos copiar na visualización do obxectivo.",""]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["移動 commit","","目前為止我們已經講了 git 的基礎,這些基礎包括 commit、branch 以及在 commit tree 中移動,只要有這些概念你就能發揮 git 90% 的功力,而且對於程式設計師來說,這樣就很夠了。","",'而剩下的 10%,在很複雜的專案上面,是非常有用的(或者當你陷入困惑時),我們下一個要講的概念是 "移動 commit",換句話說,當你會這個非常有彈性的招數之後,你就可以說"我想要把這個 commit 放這裡,而那個 commit 放在那裡"。',"","這看起來很複雜,但其實它很簡單。"]}},{type:"ModalAlert",options:{markdowns:["## git cherry-pick","","我們要講的第一個指令叫作 `git cherry-pick`,它的用法如下:","","* `git cherry-pick <...>`","","當你想要複製幾個 commit 並且接在你目前的位置(`HEAD`)下面的時候,這會是一個非常直接的方式。我個人非常喜歡用 `cherry-pick`,因為它並不複雜,很容易就可以了解。","","讓我們來看一個例子!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡有一個 repo,在 `side` branch 中,我們有一些 commit 想要複製到 `main` branch 上,這可以透過一個 rebase 來完成(我們之前已經學到了),但是讓我們看看 `git cherry-pick` 怎麼做。"],afterMarkdowns:["就是那樣!我們複製了 `C2` 以及 `C4` 並且把它們放到我們的後面,很簡單吧!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,只需要從三個 branch 複製幾個 commit 到 `main` 下面,你可以從視覺化的目標看到我們需要哪些 commit。",""]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 整理提交记录","","到现在我们已经学习了 Git 的基础知识 —— 提交、分支以及在提交树上移动。 这些概念涵盖了 Git 90% 的功能,同样也足够满足开发者的日常需求 ","","然而, 剩余的 10% 在处理复杂的工作流时(或者当你陷入困惑时)可能就显得尤为重要了。接下来要讨论的这个话题是“整理提交记录” —— 开发人员有时会说“我想要把这个提交放到这里, 那个提交放到刚才那个提交的后面”, 而接下来就讲的就是它的实现方式,非常清晰、灵活,还很生动。","","看起来挺复杂, 其实是个很简单的概念。"]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","本系列的第一个命令是 `git cherry-pick`, 命令形式为: ","","* `git cherry-pick <提交号>...`","","如果你想将一些提交复制到当前所在的位置(`HEAD`)下面的话, Cherry-pick 是最直接的方式了。我个人非常喜欢 `cherry-pick`,因为它特别简单。","","咱们还是通过例子来看一下!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这里有一个仓库, 我们想将 `side` 分支上的工作复制到 `main` 分支,你立刻想到了之前学过的 `rebase` 了吧?但是咱们还是看看 `cherry-pick` 有什么本领吧。"],afterMarkdowns:["这就是了!我们只需要提交记录 `C2` 和 `C4`,所以 Git 就将被它们抓过来放到当前分支下了。 就是这么简单!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["要通过此关, 只需要简单的将三个分支中的提交记录复制到 main 上就可以了。目标窗口展示了我们想要哪些提交记录,如果你不小心关掉了的话,通过 `show goal` 命令可以打开,左上角也有“显示目标按钮”",""]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Inhalte verschieben","","Bis jetzt haben wir uns die Grundlagen von Git angeschaut -- comitten, verzweigen und sich im Commit-Baum bewegen. Nur damit lässt sich schon 90% der Macht von Git-Repositorys nutzen und die meisten Anforderungen von Entwicklern erfüllen.","",'Die übrigen 10% jedoch können in komplexeren Abläufen sehr hilfreich sein (oder wenn man sich in eine schwierige Lage manövriert hat). Das nächste was wir uns anschauen, ist, Inhalte durch den Commit-Baum zu schieben. Es gibt dem Entwickler die Möglichkeit in präziser, eloquenter Manier zu sagen "Ich will diese Inhalte hier und diese dort haben".',"","Das klingt vielleicht nach einer Menge, aber es ist sehr einfach."]}},{type:"ModalAlert",options:{markdowns:["## git cherry-pick","","Der erste Befehl in dieser Serie ist `git cherry-pick`. Er sieht so aus:","","* `git cherry-pick <...>`","","Er ist eine einfache Möglichkeit um auszudrücken, dass du eine Folge von Commits unter deinen aktuellen Checkout (also `HEAD`) hängen möchtest. Ich persönlich liebe `cherry-pick`, weil es wenig Magie enthält und einfach zu verstehen ist.","","Schauen wir's uns mal an.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir ein Repository mit einigem Zeugs im Branch `side`, das wir in den Branch `main` kopieren wollen. Das könnten wir mit einem Rebase machen (wie bereits gesehen), aber schauen wir mal, wie das mit `cherry-pick` geht."],afterMarkdowns:["Das war's! Wir wollten die Commits `C2` und `C4` und Git hat die einfach unter unseren aktuellen Checkout kopiert. So einfach ist das."],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu schaffen, musst du einfach nur einige Commits aus den drei gezeigten Branches in den `main` kopieren. Der Zielbaum zeigt dir, welche.",""]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## コードの移動","","今まででは、gitの基本をひたすら見てきました -- コミットしたりブランチを派生したり、そしてソースツリーの中の色々な場所に移動することなどです。これらの概念だけで、gitリポジトリの力を90%使いこなすことができ、開発者としての主な需要を満たしています。","","しかし最後の10%はより複雑なワークフローやちょっとトラブった時にとても役にたちます。これから取り上げる次の課題は「作業内容の移動」 –- 詳しく言えば、「この作業はここに置き、その作業はそこに置きたい」と言う開発者のために、優しく具体的で正確にその方法をお教えしましょう。","","ちょっと複雑に聞こえるかもしれませんが、概念は簡単です。"]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","このシリーズの一つ目のコマンドは、`git cherry-pick`。このコマンドの使い方は、次の形になります:","","* `git cherry-pick <...>`","","現在の位置(`HEAD`)の下に一連のコミットをコピーしたいという意を単純に表す方法です。分かりにくいところが少ないので、個人的に私がとても好きなコマンドです。","","デモを見ていきましょう!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["このリポジトリには、現在`side`ブランチから`main`にコピーしたいコードがあります。この前に学んだrebaseコマンドでも実現可能ですが、ここではcherry-pickの動作を見ていきましょう。"],afterMarkdowns:["これだけで終わりです!コミット`C2` と `C4`を取得したかったわけですが、gitが現在の位置の直下に落としてくれました。単純ですね!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、3つのブランチからmainにコードをコピーしてください。どのコミットを取得するかについてはゴールのツリーをみてください。",""]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Поперемещаем изменения","","Итак, мы уже освоили основы Git: коммиты, ветки, перемещение по дереву изменений. Уже этих знаний достаточно, чтобы овладеть 90% мощью Git-репозиториев и покрыть нужды разработчиков.","",'А оставшиеся 10% будут очень полезны при сложных workflow (или если ты попал в сложную ситуацию). Теперь речь пойдёт о перемещении изменений — возможности, позволяющей разработчику сказать "Хочу, чтобы эти изменения были вот тут, а вот эти — вон там" и получить точные, правильные результаты, не теряя при этом гибкости разработки.',"","На первый взгляд запутанно, но на самом деле всё просто."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Первая из таких команд - это `git cherry-pick`. Она выглядит вот так:","","* `git cherry-pick <...>`","","Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммитов на место, где сейчас находишься (`HEAD`). Мы обожаем `cherry-pick` за то, что в нём очень мало магии и его очень просто понять и применять.","","Посмотрим на демонстрацию.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вот репозиторий, где есть некие изменения в ветке `side`, которые мы хотим применить и в ветку `main`. Мы можем сделать это при помощи команды rebase, которую мы уже прошли, но давай посмотрим, как cherry-pick справится с этой задачей."],afterMarkdowns:["Вуаля! Мы хотели перенести коммиты `C2` и `C4`, Git дал нам их там, где они нужны. Всё просто!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, просто скопируй изменения из этих трёх веток в мастер. Чтобы понять, какие коммиты копировать, посмотри на визуализацию уровня.",""]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 작업을 여기저기로 옮기기","","지금까지 우리는 git의 기초를 배웠습니다. -- 커밋을하고, 브랜치를 만들고, 소스 트리 여기저기를 돌아다녔습니다. 이런 개념들을 아는 것만으로도 git repository의 힘을 90%이상 사용하고 개발자들이 필요로하는 작업의 대부분을 할 수 있습니다.","",'그 나머지 10% 기능이, 복잡한 작업(또는 작업중 막혔을때) 중에 꽤 유용할 수 있습니다. 이제 배워 볼 다음 개념은 "작업을 여기저로 옮기기" 다시 말해, 개발자들의 언어로 "이 일은 여기에, 저 일은 저기에 두고 싶어" 정확하고 우아하고 유연하게.',"","다소 과해 보일 수 있지만, 간단한 개념입니다."]}},{type:"ModalAlert",options:{markdowns:["## Git 체리-픽 (Cherry-pick)","","이 시리즈의 첫 명령어는 `git cherry-pick` 입니다. 다음 과 같은 형태로 사용합니다:","","* `git cherry-pick <...>`","","현재 위치(`HEAD`) 아래에 있는 일련의 커밋들에대한 복사본을 만들겠다는 것을 간단히 줄인 말입니다. 개인적으로 저는 `cherry-pick`을 아주 좋아합니다 왜냐하면 조금의 마법이 첨가되있고 이해하기 쉽기 때문입니다.","","데모를 확인해봅시다",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 repository가 있습니다. `main` 으로 복사하고 싶은 작업이 있는 브랜치 `side`가 있습니다. 이것은 rebase를 통해서 할 수 있습니다(이미 배운), 하지만 체리-픽이 이 작업을 어떻게 수행하는지 확인해 봅시다."],afterMarkdowns:["됐습니다! 우리는 `C2`와 `C4` 커밋을 원했고 git이 우리가 원하는 곳 바로 밑에 톡 떨어뜨려 줬습니다. 아주 간단하죠!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["이 레벨을 통과하기 위해서는 몇개의 작업을 세개의 브랜치들에서 `main` 브랜치로 복사해와야합니다. 어떤 커밋들이 필요한지는 goal을 보고 확인하면 됩니다.",""]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Переміщуємо зміни","","Поки що ми розглядали основи git -- як працювати з комітами та гілками й переміщення по дереву комітів. Цього вже достатньо щоб використовувати 90% фунцкій гіт та мати змогу ефективно працювати з гіт як розробник.","",'Решта 10%, тим не менш, можуть бути надзвичайно корисними при роботі зі складними робочими процесами (workflow), чи коли ти чи ще хтось щось зробили не так і ти хочеш це виправити. Наступна концепція з якою ми познайомимось це "перенесення змін" -- іншими словами, це можливість розробника переміщувати коміти між гілками в простий та зручний спосіб.',"","Це може видаватися складним, але насправді це дуже проста концепція."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Перша команда в цій серії називається `git cherry-pick`. Вона має наступну форму:","","* `git cherry-pick <Коміт1> <Коміт2> <...>`","","Це надзвичайно простий спосіб вказати гіту що потрібно скопіювати серію комітів до поточного розташування (`HEAD`). Персонально я обожнюю `cherry-pick` за його прямолінійнсть, це дуже зрозуміла концепція що не використовує прихованої магії","","Давайте подивимось на практиці!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ми бачимо репозиторій де є певні зміни в гілці `side` які ми хочемо скопіювати в `main`. Для цього можна використати rebase (який ми вже вивчили), але подивимось як з цим впорається cherry-pick."],afterMarkdowns:["Овва! Ми хотіли коміти `C2` та `C4` і git додав їх до поточного розташування. Просто й доступно!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти це рівень, просто скопіюй якісь зміни з трьох гілок показаних на діаграмі в main. В візуалізації видно які коміти потрібно скопіювати.",""]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Di Chuyển Commit","","Cho đến giờ thì ta đã nắm được cơ bản về Git -- commit, rẽ nhánh, và dịch chuyển qua lại trên cây mã nguồn. Chừng ấy khái niệm là đã đủ để tận dụng đến 90% sức mạnh của Git và đáp ứng đủ nhu cầu chính cho nhà phát triển phần mềm.","",'Tuy nhiên 10% còn lại thì lại khá hữu ích trong các quy trình làm việc phức tạp (hoặc khi bạn vướng phải tình huống khó khăn). Khái niệm tiếp theo chúng ta sẽ đề cập đến là "di chuyển commit" -- đó là cách để nhà phát triển nói rằng "Tôi muốn lấy bản ghi ở đây và cả bản ghi ở đó" một cách chính xác, trôi chảy và linh hoạt.',"","Nghe thì có vẻ phức tạp, nhưng thực ra khái niệm này khá đơn giản."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Lệnh đầu tiên của loạt bài này là `git cherry-pick`, dạng lệnh là:","","* `git cherry-pick <...>`","","Đó là cách rất trực tiếp để copy một loạt commit xuống dưới vị trí hiện tại của bạn (`HEAD`). Cá nhân tôi thì rất thích `cherry-pick` bởi tính tiện dụng và dễ hiểu của nó.","","Hãy xem qua một ví dụ!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ở đây ta có một kho chứa mà ta muốn sao chép thành quả công việc từ nhánh `side` sang nhánh `main`. Có thể dùng rebase để làm việc này (kỹ thuật mà ta đã học), nhưng hãy xem thử cherry-pick làm điều này ra sao."],afterMarkdowns:["Thế thôi! Chúng ta chỉ cần các commit `C2` và `C4`, vì vậy Git sẽ lấy chúng và đặt chúng dưới nhánh hiện tại. Thật đơn giản!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, hãy copy thành quả công việc từ 3 nhánh khác vào main. Bạn có thể nhìn vào mô tả mục tiêu để biết chúng ta cần những commit nào.",""]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Premikanje dela naokoli","","Zaenkrat smo pokrili osnove gita -- commitanje, branchanje in pomikanje po drevesu. Samo te koncepti so dovolj za koriščenje 90% moči git repozitorijev in pokrijejo večino potreb razvijalcev.","",'Preostalih 10% pa je lahko kar uporabnih med reševanjem kompleksnejših situacij (ali ko ste zašli v zagato). Naslednji koncept, ki ga bomo pokrili je "premikanje dela naokoli" -- z drugimi besedami, tako razvijalci rečejo "Rad bi to delo tu in tisto delo tam" na natančen, zgovoren in prilagodljiv način.',"","Morda se zdi veliko, a gre za preprost koncept."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Prvi ukaz v zaporedju je `git cherry-pick`. Je sledeče oblike:","","* `git cherry-pick <...>`","","Gre za jasen način, da povemo, da bi radi skopirali zaporedje commitov pod trenutno lokacijo (`HEAD`). Sam imam rad `cherry-pick`, ker je vključeno le malo čarovnije in je preprost za razumet.","","Poglejmo predstavitev!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tu je repozitorij, kjer imamo nekaj dela na branchu `side`, ki bi ga radi skopirali na `main`. To bi lahko dosegli z rebase-om (kar smo se že naučili), ampak poglejmo kako se odreže cherry-pick."],afterMarkdowns:["To je to! Želeli smo commita `C2` in `C4` in git ju je prilimal točno pod nas. Preprosto!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Za končanje te stopnje enostavno skopiraj nekaj dela iz predstavljenih treh branchev v main. V priloženi vizualizaciji lahko vidiš katere commite.",""]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Przenoszenie pracy","","Do tej pory zajmowaliśmy się podstawami Gita - commitami, gałęziami i poruszaniem się w drzewie źródłowym. Samo to wystarczy, aby wykorzystać 90% mocy repozytoriów Git i zaspokoić główne potrzeby programistów.","",'Pozostałe 10% może być jednak dość użyteczne podczas niecodziennych zadań (lub kiedy wpakujesz się w kłopoty). Kolejny temat, który zamierzamy omówić, to "przenoszenie pracy" - innymi słowy, jest to sposób, w jaki programiści mogą powiedzieć: "Chcę te zmiany tu, a tamte tam" w precyzyjny, elegancki i elastyczny sposób.',"","Może się to wydawać skomplikowane, ale tak nie jest."]}},{type:"ModalAlert",options:{markdowns:["## Git cherry-pick","","Pierwsze polecenie w tej serii nazywa się `git cherry-pick`. Przyjmuje ono następującą formę:","","* `git cherry-pick <...>`","","Jest to bardzo prosty sposób określenia, że chcesz przenieść zmiany poniżej swojej obecnej lokalizacji (`HEAD`). Osobiście uwielbiam `cherry-pick`, ponieważ działa prosto i skutecznie.","","Zobaczmy demo!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["W tym repozytorium mamy trochę pracy na gałęzi `side`, którą chcemy skopiować do gałęzi `main`. Można by to osiągnąć przy użyciu rebase (którego już się nauczyliśmy), ale zobaczmy, jak działa cherry-pick."],afterMarkdowns:["No i fajnie! Chcieliśmy commity `C2` i `C4` i Git zrzucił je nam zaraz pod spód. Bułka z masłem!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, po prostu skopiuj część pracy z trzech pokazanych gałęzi do `main`. Commity, które należy skopiować, znajdują się na wizualizacji celu.",""]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Spostare il lavoro in giro","","Finora abbiamo intravisto le basi di git -- creazione di commit, rami, e come spostarsi sull'albero dei commit. Questi concetti sono sufficienti per sfruttare il 90% della potenza di git, e soddisfano gli utilizzi standard degli sviluppatori.","",'Il restante 10%, può rivelarsi utile in situazioni più complesse (o se ti sei messo nei guai). Il prossimo concetto che affronteremo è lo "spostare il lavoro in giro" -- in altre parole, è un modo per gli sviluppatori di dire "Voglio questo lavoro qua e quel lavoro là" in maniera chiara e precisa.',"","Sembra un grosso lavoro, ma è un concetto semplice."]}},{type:"ModalAlert",options:{markdowns:["## Git Cherry-pick","","Il primo comando si chiama `git cherry-pick`. Il comando ha il seguente aspetto:","","* `git cherry-pick <...>`","","È un modo chiaro e diretto di dire che vuoi la copia di una serie di commit da applicare sulla posizione in cui ti trovi attualmente (`HEAD`). Io personalmente adoro `cherry-pick` perché semplice e facile da capire.","","Vediamo una demo!",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["In questo repository abbiamo del lavoro nel ramo `side` che vogliamo copiare nel `main`. Questo può essere eseguito tramite rebase (che abbiamo già imparato), ma vediamo il cherry-pick all'opera."],afterMarkdowns:["Ecco qua! Volevamo i commit `C2` e `C4` e git li ha copiati sotto di noi. Semplicissimo!"],command:"git cherry-pick C2 C4",beforeCommand:"git checkout -b side; git commit; git commit; git commit; git checkout main; git commit;"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, copia il lavoro dai tre rami sul main. Puoi vedere quali sono i commit richiesti guardando l'obiettivo.",""]}}]}}}},{}],132:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main"},"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":{"main":{"target":"C2","id":"main"},"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_MX:"Separa tu 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",sl_SI:"Ločevanje tvoje glave - HEAD-a",it_IT:"Perdere la testa (HEAD)",pl:"Odczep sobie HEAD"},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!",sl_SI:"Uporabi oznako (hash) commita za pomoč!",it_IT:"Usa l'etichetta (hash) sul commit per aiutarti!",pl:"Użyj nazwy commita (hasza)!"},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:["## 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."],afterMarkdowns:["See! HEAD was hiding underneath our `main` branch all along."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["And now it's","","HEAD -> C1"],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."]}}]},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:["## 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:["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 `main` todo este tiempo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["Y así queda ahora:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{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."]}}]},es_ES:{childViews:[{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","",'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:["Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit."],afterMarkdowns:["¡Ves! HEAD estuvo oculta bajo nuestra rama `main` todo este tiempo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["Y así queda ahora:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Moviéndonos por ahí en 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 confirmaciones 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 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:["Veámoslo en acción. A continuación vamos a ver a HEAD antes y después de un commit."],afterMarkdowns:["¡Ves! HEAD estuvo oculta bajo nuestra rama `main` todo este tiempo."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Separando HEAD","","Separar HEAD simplemente significa adjuntarla a un commit en lugar de a un branch. Así es como se ve de antemano:","","HEAD -> main -> C1",""],afterMarkdowns:["Y así queda ahora:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, separemos HEAD de `bugFix` y juntémoslo en su lugar al commit.","","Especifica este commit por su hash. El hash de cada commit se muestra en el círculo que lo representa."]}}]},pt_BR:{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:["## 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:["Vejamos isto em ação. Aqui vamos mostrar o HEAD antes e depois de um commit."],afterMarkdowns:["Veja! O HEAD estava se escondendo ao lado do nosso `main` esse tempo todo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["E agora é","","HEAD -> C1"],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)."]}}]},gl:{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:["## 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:["Vexamos isto en acción. Aquí imos mostrar o HEAD antes e depois dun commit."],afterMarkdowns:["Ves! O HEAD estivo ó lado do noso `main` todo este tempo."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["E agora é","","HEAD -> C1"],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)."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Se déplacer dans Git","","Avant que nous ne 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 à l'aise avec ces déplacements, votre puissance avec les autres commandes de Git en sera amplifiée !","","","","",""]}},{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:["Voyons cela en action. Ici nous allons indiquer où se situe HEAD avant et après un commit."],afterMarkdowns:["Vous voyez ! HEAD était caché en-dessous de la branche `main` tout le long."],command:"git checkout C1; git checkout main; 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 -> main -> C1",""],afterMarkdowns:["Et maintenant c'est","","HEAD -> C1"],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."]}}]},de_DE:{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:["## 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:["Schauen wir uns das mal in Aktion an. Wir werden hier `HEAD` vor und nach dem Commit anzeigen."],afterMarkdowns:["Siehst du? `HEAD` war die ganze Zeit unter `main` versteckt."],command:"git checkout C1; git checkout main; 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` -> `main` -> `C1`",""],afterMarkdowns:["Und jetzt:","","`HEAD` -> `C1`"],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."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 在提交树上移动","","在接触 Git 更高级功能之前,我们有必要先学习在你项目的提交树上前后移动的几种方法。","","一旦熟悉了如何在 Git 提交树上移动,你驾驭其它命令的能力也将水涨船高!",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","","我们首先看一下 “HEAD”。 HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。","","HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。","","HEAD 通常情况下是指向分支名的(如 bugFix)。在你提交时,改变了 bugFix 的状态,这一变化通过 HEAD 变得可见。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["下面咱们通过实际操作看一下。我们将会观察提交前后 HEAD 的位置。"],afterMarkdowns:["看到了吗? HEAD 指向了 `main`,随着提交向前移动。","","(译者注:实际这些命令并不是真的在查看 HEAD 指向,看下一屏就了解了。如果想看 HEAD 指向,可以通过 `cat .git/HEAD` 查看,","如果 HEAD 指向的是一个引用,还可以用 `git symbolic-ref HEAD` 查看它的指向。但是该程序不支持这两个命令)"],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### 分离的 HEAD","","分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示: ","","HEAD -> main -> C1","","HEAD 指向 main, main 指向 C1"],afterMarkdowns:["现在变成了","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["想完成此关,从 `bugFix` 分支中分离出 HEAD 并让其指向一个提交记录。","","通过哈希值指定提交记录。每个提交记录的哈希值显示在代表提交记录的圆圈中。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 在 git 中前後移動","","在接觸 git 的更多進階的主題之前,我們先學習用不同的方法在你的 project 中的 commit tree 上面移動。","","一旦能夠熟練地在 commit tree 中隨意地移動,你使用其它的 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:"GitDemonstrationView",options:{beforeMarkdowns:["在實際的例子中。我們將會觀察 commit 前後 HEAD 的位置。"],afterMarkdowns:["看吧!HEAD 一直藏在 `main` 分支的後面。"],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### 分離 HEAD","","分離 HEAD 就是讓其指向一個 commit 而不是 branch 的名稱。這是指令執行之前的樣子:","","HEAD -> main -> C1",""],afterMarkdowns:["現在變成了","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["想要完成這一個關卡,從 `bugFix` 分離出 HEAD 並且讓它指向一個 commit。","","通過 hash 值可以指定 commit。每個 commit 的 hash 值顯示在各自的圓圈中。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 任意の位置への移動","","Gitの上級機能に進む前に、自分のプロジェクトを表すコミットツリーの中で任意の位置へ移動する様々な方法を知っておく必要があります。","","移動方法が身につけば、他のgitコマンドをよりうまく扱えるようになるでしょう!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'まずは"HEAD"から始めましょう。HEADとは現在チェックアウトされているコミットを指す単語です -- ようするに今作業中のコミットを表します。',"","HEADはいつも、作業中のツリーに反映されている最新のコミットを指します。作業ツリーへ変更を加える多くのgitコマンドはまずHEADから処理を始めます。","","HEADは普段、ブランチ名(例えば、bugFixなど)を指します。コミットすれば、bugFixの状態が変更され、その変更がHEADから確認できるようになります。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["実際の動作を見てみましょう。ここでは、コミットの前と後のHEADの状態を確認します。"],afterMarkdowns:["ほら、HEADが元から`main`ブランチの下に隠れていたんですね!"],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### HEADの分離","","HEADの分離(detached HEAD)とは単に、ブランチではなく特定のコミットにHEADを紐づけることです。実行前の状態は次のようです:","","HEAD -> main -> C1",""],afterMarkdowns:["そして実行後はこう:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、HEADを`bugFix`から分離し、その代わりに特定のコミットに紐づけましょう。","","このコミットをハッシュで指定します。コミットのハッシュはそのコミットを表す丸に刻まれています。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Прогулка по Git","","Прежде чем перейти к более продвинутым фичам Git, важно понять различные способы перемещения по дереву коммитов вашего проекта.","","Как только вы научитесь свободно передвигаться по дереву коммитов, ваши возможности в Git приумножатся.","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'В первую очередь, поговорим о "HEAD". HEAD - это символическое имя текущего выбранного коммита — это, по сути, тот коммит, над которым мы в данный момент работаем.',"","HEAD всегда указывает на последний коммит из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.","","Обычно HEAD указывает на имя ветки (например, `bugFix`). Когда вы делаете коммит, статус ветки `bugFix` меняется и это изменение видно через HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, как это работает. Обратите внимание на то, где находится HEAD до и после коммита."],afterMarkdowns:["Вот! HEAD всё это время скрывался за веткой `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Detaching HEAD","","Отделение (detaching) HEAD означает лишь присвоение его не ветке, а конкретному коммиту. Посмотрим, что было до отделения:","","HEAD -> main -> C1",""],afterMarkdowns:["А вот что получилось теперь","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти уровень, давай отделим HEAD от ветки `bugFix` и присвоим его последнему коммиту в этой же ветке.","","Укажи коммит при помощи его идентификатора (hash). Hash для каждого коммита указан в кружке на схеме."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git에서 여기저기로 옮겨다니기","","Git의 고급기능들에 대해 더 알아보기 전에, 여러분의 프로젝트를 표현하는 커밋 트리(commit tree)에서 이동 할 수 있는 여러가지 방법들을 아는것이 중요합니다.","","여기저기 이동하는 것에 익숙해지면, 여러분이 다른 git 명령어들을 사용하는 능력도 아주 좋아질 것입니다!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'먼저"HEAD"에 대해 이야기해 봅시다. HEAD는 현재 체크아웃된 커밋을 가리킵니다. -- 다시 말하자면 현재 작업중인 커밋입니다.',"","HEAD는 항상 작업트리의 가장 최근 커밋을 가리킵니다. 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는것으로 시작합니다.","","일반적으로 HEAD는 브랜치의 이름을 가리키고있습니다(bugFix와 같이). 커밋을 하게 되면, bugFix의 상태가 바뀌고 이 변경은 HEAD를 통해서 확인이 가능합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["직접 확인해 봅시다. 여기서 우리는 보이지 않던 HEAD를 커밋전, 후에 드러낼 것입니다."],afterMarkdowns:["보세요! HEAD가 `main`브랜치 아래에 숨어 있던 거군요."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### HEAD 분리하기","","HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:","","HEAD -> main -> C1",""],afterMarkdowns:["이제는 이렇게 되는군요","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.","","각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Прогулянка по Git","","Перед тим як ми перейдемо до складніших можливостей гіта, важливо розуміти різні способи переміщення по дереву комітів твого проекту.","","Дуже важливо щоб тобі було комфортно переміщатись по репозиторію, так як цей навик тобі знадобиться для використання в більшості команд git!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD (голова)","",'Спочатку розберемось з "HEAD". HEAD це символьне ім’я поточного вибраного коміта -- по суті це той коміт з яким ти зараз працюєш.',"","HEAD завжди вказує на найновіший коміт з робочого дерева. Більшість команд що змінюють локальне дерево комітів, також модифікують HEAD.","","Зазвичай HEAD вказує на ім’я бранча (наприклад bugFix). Коли ти комітиш, змінюється статус гілки bugFix й це можна побачити подивившись на HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Розберемось з цим на практиці. Зараз ми перевіримо HEAD до та після коміту."],afterMarkdowns:["Ти диви! HEAD весь цей час ховався за гілкою `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Відокремлюємо голову","","Detached HEAD (відокремлена голова) просто означає що HEAD посилається на коміт, а не на якусь гілку. Ось як це виглядає спочатку:","","HEAD -> main -> C1",""],afterMarkdowns:["А в стані detached head:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{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 thạo 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 hiệ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 trỏ tới tên nhánh (ví dụ bugFix). Khi bạn commit, 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ẽ làm rõ HEAD trước và sau khi commit."],afterMarkdowns:["Thấy chứ? HEAD đã ẩn dưới nhánh `main` suốt."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Tháo HEAD","","Tháo HEAD đơn 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 -> main -> 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` và 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 đó."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Premikanje po Gitu","","Preden se lotimo nekaj naprednejših funkcij Gita je pomembno, da razumemo različne načine premikanja po drevesu commitov, ki predstavljajo tvoj projekt.","","Ko ti je enkrat premikanje po drevesu domače, bodo tvoje sposobnosti z ostalimi git ukazi še močnejše!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'Najprej moramo spozanti "HEAD". HEAD (glava) je simbolično ime za trenutno checkoutan commit -- v bistvu povemo na katerem commitom bomo nadaljevali.',"","HEAD vedno kaže na zadnji commit na trenutnem drevesu. Večina git ukazov, ki spreminjajo to delovno drevo, bo začelo s spremembo HEAD-a.","","Ponavadi HEAD kaže na ime brancha (npr. bugFix). Ko commitaš, je stanje bugFix spremenjeno in ta sprememba je opazna tudi skozi HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo to v akciji. Sedaj bomo razkrili HEAD pred in po commitu."],afterMarkdowns:["Evo! HEAD se je vseskozi skrival pod našim `main` branchom."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Ločevanje HEAD-a","","Ločevanje HEAD-a pomeni samo, da ga namestno na branch sedaj pripnemo na commit. Tako je izgledalo prej:","","HEAD -> main -> C1",""],afterMarkdowns:["Sedaj pa je takole:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje odstranimo HEAD iz `bugFix` in ga pritrdimo raje na commit.","","Določi ta commit z njegovim hash-om. Hash za vsak commit je predstavljen v krogu, ki predstavlja commit."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Poruszanie się w Git","","Zanim przejdziemy do niektórych z bardziej zaawansowanych funkcji Gita, ważne jest, aby zrozumieć różne sposoby poruszania się po drzewie commitów, które reprezentują twój projekt.","","Kiedy już poczujesz się z tym wygodnie, to i inne komendy Gita nabiorą więcej mocy!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'Najpierw musimy porozmawiać o "HEAD". HEAD to symboliczna nazwa dla aktualnie checkoutowanego (wyciągniętego) commita - jest to zasadniczo commit z najnowszymi zmianami.',"","HEAD zawsze wskazuje na najnowszy commit, który jest odzwierciedlony w drzewie zmian. Większość poleceń git, które wprowadzają zmiany w drzewie, zaczyna się od zmiany HEADa.","","Normalnie HEAD wskazuje na nazwę gałęzi (jak np. `bugFix`). Kiedy commitujesz zmiany, status gałęzi `bugFix` się zmienia i zmiana ta jest widoczna właśnie poprzez przemieszczenie się HEADa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak to działa. Pokażemy HEAD przed i po commicie."],afterMarkdowns:["Zobacz! HEAD przez cały czas ukrywał się pod naszą gałęzią `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Odłączanie HEADa","","Odłączenie HEADa oznacza po prostu dołączenie go do commita, a nie gałęzi. Tak to wyglądało przed:","","HEAD -> main -> C1",""],afterMarkdowns:["A tak po:","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, odłącz HEADa od gałęzi `bugFix` i dołącz go do commita.","","Możesz wybrać konkretnego commita, posługując się jego haszem. Hasz każdego commita jest wyświetlany na okręgu, który go reprezentuje."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Spostarsi in Git","","Prima di imparare comandi avanzati in Git, è fondamentale conoscere i diversi modi per spostarsi nell'albero dei commit che costituiscono il tuo progetto.","","Una volta che ti sentirai a tuo agio, il tuo potere con gli altri comandi git sarà amplificato!","","","","",""]}},{type:"ModalAlert",options:{markdowns:["## HEAD","",'Prima di tutto dobbiamo parlare di "HEAD". HEAD (testa) è il nome simbolico dato al commit selezionato -- in pratica è il commit su cui stai lavorando.',"","HEAD punta sempre al commit più recente. La maggior parte dei comandi git che apportano modifiche all'albero dei commit, vanno a cambiare per primo HEAD.","","Di norma HEAD punta al nome di un ramo (per esempio bugFix). Quando esegui un commit, lo stato di bugFix viene modificato, e questo cambiamento è visibile attraverso HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamolo in azione. Qui mostreremo HEAD prima e dopo un commit."],afterMarkdowns:["Visto! HEAD era nascosto sotto il ramo `main`."],command:"git checkout C1; git checkout main; git commit; git checkout C2",beforeCommand:""}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["### Detaching HEAD (testa distaccata)","","Detaching HEAD significa attaccare la testa a un commit invece che a un ramo. All'inizio la situazione è questa:","","HEAD -> main -> C1",""],afterMarkdowns:["E ora è","","HEAD -> C1"],command:"git checkout C1",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, stacchiamo HEAD da `bugFix` e attacchiamolo a un commit.","","Per specificare un commit si usa l'hash. L'hash per ogni commit è presente sul cerchio che rappresenta il commit."]}}]}}}},{}],133:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22main%22%7D%2C%22overHere%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22overHere%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase -i overHere --solution-ordering C3,C5,C4",compareOnlyMainHashAgnostic:!0,disabledMap:{"git cherry-pick":!0},startTree:'{"branches":{"main":{"target":"C5","id":"main"},"overHere":{"target":"C1","id":"overHere"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"main","id":"HEAD"}}',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",es_MX:"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.",fr_FR:"Vous pouvez utiliser soit les branches, soit les références relatives (HEAD~) pour spécifier la cible à rebaser",zh_CN:"branch 或者是相对位置(HEAD~)都可以用來指定 rebase 的目标",zh_TW:"你可以指定 branch 或者是相對位置(HEAD~)來表示 rebase 的目標",ru_RU:"Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase",ja:"リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます",ko:"리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다",uk:"ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase",vi:"bạn có thể sử dụng tham chiếu tương đối (HEAD~) hoặc nhánh để chỉ định mục tiêu rebase",sl_SI:"Uporabiš lahko bilokateri branch ali relativno referenco (HEAD~), da določiš cilj za rebase.",it_IT:"Puoi usare sia i rami che i riferimenti relativi (HEAD~) per specificare l'obiettivo del rebase",pl:"Możesz użyć gałęzi lub referencji względnych (HEAD~), aby określić cel rebase'a"},name:{en_US:"Interactive Rebase Intro",es_AR:"Introducción al rebase interactivo",es_ES:"Introducción al rebase interactivo",es_MX:"Introducción al rebase interactivo",pt_BR:"Introdução ao rebase interativo",gl:"Introducción ó rebase interativo",de_DE:"Einführung Interaktives Rebase",ja:"インタラクティブrebase入門",fr_FR:"Introduction au rebase interactif",zh_CN:"交互式 rebase",zh_TW:"介紹互動式的 rebase",ru_RU:"Введение в интерактивный Rebase",ko:"인터랙티브 리베이스 소개",uk:"Знайомство з інтерактивним rebase",vi:"Giới thiệu về rebase tương tác",sl_SI:"Interaktivni uvod v Rebase",it_IT:"Introduzione al rebase interattivo",pl:"Wprowadzenie do interaktywnego rebase'a"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interactive Rebase","","Git cherry-pick is great when you know which commits you want (_and_ you know their corresponding hashes) -- it's hard to beat the simplicity it provides.","","But what about the situation where you don't know what commits you want? Thankfully git has you covered there as well! We can use interactive rebasing for this -- it's the best way to review a series of commits you're about to rebase.","","Let's dive into the details..."]}},{type:"ModalAlert",options:{markdowns:["All interactive rebase means Git is using the `rebase` command with the `-i` option.","","If you include this option, git will open up a UI to show you which commits are about to be copied below the target of the rebase. It also shows their commit hashes and messages, which is great for getting a bearing on what's what.","",'For "real" git, the UI window means opening up a file in a text editor like `vim`. For our purposes, I\'ve built a small dialog window that behaves the same way.']}},{type:"ModalAlert",options:{markdowns:["When the interactive rebase dialog opens, you have the ability to do two things in our educational application:","","* You can reorder commits simply by changing their order in the UI (via dragging and dropping with the mouse).","* You can choose to keep all commits or drop specific ones. When the dialog opens, each commit is set to be included by the `pick` button next to it being active. To drop a commit, toggle off its `pick` button.","","*It is worth mentioning that in the real git interactive rebase you can do many more things like squashing (combining) commits, amending commit messages, and even editing the commits themselves. For our purposes though we will focus on these two operations above.*","","Great! Let's see an example."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["When you hit the button, an interactive rebase window will appear. Reorder some commits around (or feel free to unpick some) and see the result!"],afterMarkdowns:["Boom! Git copied down commits in the exact same way you specified through the UI."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["To finish this level, do an interactive rebase and achieve the order shown in the goal visualization. Remember you can always `undo` or `reset` to fix mistakes :D"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interactive Rebase","","Git cherry-pick est pratique quand vous savez exactement quels commits vous voulez (_et_ que vous connaissez leurs identifiants) -- il est difficile de battre sa simplicité.","","Mais que faire quand vous ne connaissez pas les identifiants des commits ? Heureusement Git a pensé à vous pour ce cas-là ! Nous pouvons utiliser un rebase interactif pour cela -- c'est la meilleure façon de réexaminer une série de commits que vous vous apprêtez à rebaser.","","Entrons un peu plus dans les détails..."]}},{type:"ModalAlert",options:{markdowns:["Tout rebase interactif signifie utiliser la commande `rebase` avec l'option `-i`.","","Si vous mettez cette option, Git va ouvrir une interface graphique pour vous montrer quels commits vont être copiés en-dessous de la cible sur laquelle vous rebasez. Elle vous montre aussi les identifiants et commentaires des commits, ce qui est pratique pour s'orienter parmi les commits.","","Pour le \"vrai\" Git, l'interface graphique correspond en fait à ouvrir un fichier dans un éditeur de texte comme `vim`. Pour notre exemple, j'ai construit une petite fenêtre de dialogue qui se comporte de la même façon."]}},{type:"ModalAlert",options:{markdowns:["Quand le rebase interactif s'ouvre, vous avez trois possibilités :","","* Vous pouvez réarranger les commits simplement en changeant leur ordre dans l'interface graphique (dans notre fenêtre de dialogue, cela signifie déplacer les objets avec la souris -- drag and drop).","* Vous pouvez omettre certains commits. Cela est désigné par `pick` : cliquer sur `pick` désélectionne/resélectionne le commit.","* Enfin, vous pouvez écraser des commits. Malheureusement notre niveau ne supporte pas cette option, nous allons donc sauter les détails concernant cette possibilité. Pour faire court, cela vous permet de mélanger des commits.","","Super ! Voyons un exemple."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Quand vous activez le bouton, une fenêtre de rebase interactif va s'ouvrir. Reordonnez quelques commits (ou supprimez-en certains) et regardez le résultat !"],afterMarkdowns:["Boum ! Git a copié les commits de la même manière que vous l'aviez spécifié."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, faites un rebase interactif et atteignez l'ordre indiqué dans la fenêtre d'objectif. Souvenez-vous que vous pouvez toujours exécuter les commandes `undo` ou `reset` pour réparer vos erreurs :D"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git interactive rebase","","當你知道你要複製哪些 commit(而且你也知道他們所對應的 hash 值),那麼 `git cherry-pick` 很適合你。","","但是如果你不知道你要的是哪些 commit 呢? 很幸運的是,git 也有考慮到這個問題喔!我們可以用互動式的 rebase 來做到,當你想要檢查你想要的 commit 的時候,這會是最好的方法。","","讓我們來看一下這些細節..."]}},{type:"ModalAlert",options:{markdowns:["互動式的 rebase 相當於使用 rebase 這個指令的時候,後面加上一個 `-i` 的選項。","","如果你有包含了這個選項,git 就會打開一個 UI,讓你知道說有哪些 commit 會被複製下來,它也會告訴你它們的 hash 值以及可以讓你知道它們是什麼的訊息。","",'在"實務上",UI 會利用一個編輯器(例如 vim)打開一個檔案,對於我們來說,我已經設計了一個有同樣功能的對話視窗。']}},{type:"ModalAlert",options:{markdowns:["當互動式的 rebase 的對話視窗打開之後,你就可以做到三件事情:","","* 你可以藉由改變這些 commit 在 UI 的位置(在我們的視窗中,可以透過滑鼠去拖拉),來重新排序它們的順序。","* 你可以選擇完全忽略掉某些 commit,可以用滑鼠按一下,使它變暗,就表示你要忽略掉該 commit。","* 最後, 你可以把 commit 合併在一起,但基於某些理由,在我們的關卡裡面並沒有這個功能。","","太棒了!讓我們來看一個例子!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["當你按下按鈕的時候,一個互動式的 rebase 的視窗就會跳出來,重新排序一些 commit(大膽忽略掉某些 commit),然後看一下結果吧!"],afterMarkdowns:["看吧! git 根據你所選擇的 commit,把它們複製了下來。"],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,使用互動式的 rebase,並且完成視覺化目標所表示 commit 的順序,記住!你可以經常使用 `undo` 或者 `reset` 來修正你的一些錯誤:D"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 交互式的 rebase","","当你知道你所需要的提交记录(**并且**还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了 —— 没有比这更简单的方式了。","","但是如果你不清楚你想要的提交记录的哈希值呢? 幸好 Git 帮你想到了这一点, 我们可以利用交互式的 rebase —— 如果你想从一系列的提交记录中找到想要的记录, 这就是最好的方法了","","咱们具体来看一下……"]}},{type:"ModalAlert",options:{markdowns:["交互式 rebase 指的是使用带参数 `--interactive` 的 rebase 命令, 简写为 `-i`","","如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。","","在实际使用时,所谓的 UI 窗口一般会在文本编辑器 —— 如 Vim —— 中打开一个文件。 考虑到课程的初衷,我弄了一个对话框来模拟这些操作。"]}},{type:"ModalAlert",options:{markdowns:["当 rebase UI界面打开时, 你能做3件事:","","* 调整提交记录的顺序(通过鼠标拖放来完成)","* 删除你不想要的提交(通过切换 `pick` 的状态来完成,关闭就意味着你不想要这个提交记录)","* 合并提交。 遗憾的是由于某种逻辑的原因,我们的课程不支持此功能,因此我不会详细介绍这个操作。简而言之,它允许你把多个提交记录合并成一个。","","接下来咱们看个实例"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["当你点击下面的按钮时,会出现一个交互对话框。对提交记录做个排序(当然你也可以删除某些提交),点击确定看结果"],afterMarkdowns:["Git 严格按照你在对话框中指定的方式进行了复制。"],command:"git rebase -i HEAD~4",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要通过本关, 做一次交互式的 rebase,整理成目标窗口中的提交顺序。 记住,你随时都可以用 `undo`、`reset` 修正错误,这是不会记入步数的 :D"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## git rebase interactivo","","git cherry-pick es genial cuando sabés cuáles commits querés (_y_ sabés sus hashes) -- es dificil superar la simpleza que provee.","","Pero ¿qué pasa cuando no sabés qué commits querés? 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 por rebasear.","","Entremos en los detalles..."]}},{type:"ModalAlert",options:{markdowns:["Todo rebase interactivo significa usar el comando `rebase` con la opción `-i`.","","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 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.']}},{type:"ModalAlert",options:{markdowns:["Cuando el diálogo de rebase interactivo se abre, tenés la capacidad de hacer 3 cosas:","","* Podés reordenar los commits con solamente cambiar su orden en la UI (en nuestra ventana, eso significa hacer drag & drop con el mouse).","* Podés elegir ignorar completamente algunos commits. Esto se designa con `pick` -- no hacerle `pick` a algún commit significa que querés ignorarlo.","* Finalmente, podés _squashear_ commits. Desafortunadamente, nuestros niveles no soportan esto por cuestiones logísticas, por lo que voy a ahorrarte los detalles. Haciéndola corta, te permite combinar varios commits en uno solo.","","¡Genial! Veamos un ejemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cuando apretes el botón, va a aparecer una ventana de rebase interactivo. Reordená los commits (sentite libre de ignorar alguno, también) ¡y mirá el resultado!"],afterMarkdowns:["¡Boom! 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, hacé un rebase interactivo y alcanzá el orden que se muestra en la visualización objetivo. Acordate que siempre podés hacer `undo` y `reset` para arreglar errores :D"]}}]},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"]}}]},es_MX:{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 2 cosas:","","* Puedes reordenar las confirmaciones con solamente cambiar su orden en la UI (en nuestra ventana, eso significa arrastrar y soltar con el mouse).","* Puedes elegir mantener todas las confirmciones o ignorar algunas específicas. Cuando la ventana se abre, cada confirmación se asigna como incluido por medio del botón `pick` que está activo al lado. Para ignorar una confirmación, desactiva el botón `pick`.","","Vale la pena mencionar que en el rebase interactivo puedes hacer muchas más cosas como combinar confirmaciones, modificar los mensajes d elas confirmaciones e incluso editar las confirmaciones. Para nuestros propósitos nos centraremos en las dos operaciones anteriores.","","¡Genial! Veamos un ejemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cuando presiones 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:["¡Vientos! Git copió las cofirmaciones 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:[{type:"ModalAlert",options:{markdowns:["## Rebase Interativo do Git","","O cherry-pick é ótimo quando você sabe de antemão quais commits você quer (_e_ você sabe os hashes correspondentes) -- é difícil bater a simplicidade que ele oferece.","","Mas e quando você não sabe quais commits você quer? Felizmente o git pode te ajudar nesta situação também! Podemos usar o rebase interativo para isso -- trata-se da melhor forma de rever uma série de commits sobre os quais você está prestes a fazer um rebase.","","Mergulhemos nos detalhes..."]}},{type:"ModalAlert",options:{markdowns:["O rebase interativo é simplesmente o comando `rebase` com a opção `-i`.","","Se você incluir essa opção, o git abrirá uma interface para mostrar quais commits estão prestes a serem copiados abaixo do alvo do rebase. Ele também mostra os hashes e as mensagens dos commits, o que é ótimo para ter noção do que é o que.","",'No git "de verdade", a interface nada mais é que um arquivo aberto em um editor de texto (por exemplo o `vim`). Para os nossos propósitos, eu montei uma pequena janela que se comporta da mesma forma.']}},{type:"ModalAlert",options:{markdowns:["Quando a janela de rebase interativo abrir, você pode fazer 3 coisas diferentes:","","* Você pode reordenar os commits simplesmente mudando sua ordem na interface (na nossa janela isso significa arrastar e soltar com o mouse).","* Você pode escolher simplesmente omitir alguns commits. Para isso, clique no botão `pick` -- deixar o `pick` desligado significa que você quer descartar o commit.",'* Por fim, você pode "esmagar" (fazer squash) nos commits. Infelizmente, nosso tutorial não será capaz de cobrir essa funcionalidade por alguns motivos logísticos, então vamos pular os detalhes disto. Em resumo, no entanto, o squash permite que você combine commits.',"","Ótimo! Vejamos um exemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Quando você clicar o botão, uma janela de rebase interativo se abrirá. Reordene alguns commits da forma como você preferir (ou sinta-se livre para desmarcar o `pick` de alguns) e veja o resultado!"],afterMarkdowns:["Boom! O Git copiou alguns commits exatamente da mesma forma que você os especificou na janela."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Para finalizar este nível, faça um rebase interativo e obtenha a ordem mostrada na visualização do objetivo. Lembre-se que você pode usar os comandos `undo` ou `reset` para corrigir erros :D"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rebase Interativo en Git","","Empregar cherry-pick é xenial cando coñeces qué commits queres (_e_ coñeces os seus códigos hash) -- é difícil mellorar a súa simplicidade.","","Pero ¿qué pasa cando non sabes qué commits son os que queres? Por sorte, ¡git cúbrete nesta situación tamén! Podemos empregar o rebase interactivo para esto -- é a mellor forma de revisar unha serie de commits que estás a rebasar.","","Mergullémonos nos detalles..."]}},{type:"ModalAlert",options:{markdowns:["O rebase interativo é o comando `rebase` coa opción `-i`.","","Se ti inclúes esta opción, o git abrirá unha interfaz para mostrar qué commits están hábiles para ser copiados sobre o obxectivo do rebase. Tamén amosa os seus códigos hash e mensaxes dos commits, o cal axuda moito para saber qué é cada commit.","",'En git "de verdade", a interfaz significa abrir un arquivo de texto nun editor (por exemplo `vim`). Para os nosos propósitos, aquí aparecerá unha pequena ventá que se comporta do mesmo xeito.']}},{type:"ModalAlert",options:{markdowns:["Cando a xanela de rebase interativo abra, poderás facer 3 cousas distintas:","","* Podes reordenar os commits simplemente cambiando a súa orde na interface (na nosa ventá significa arrastrar e soltar os commits).","* Podes escoller a opción de omitir algúns commits. Para iso, pincha no botón `pick` -- deixar o `pick` desligado significa que queres descartar o commit.",'* Ademáis, ti podes "esmagar" (fazer squash) nos commits. Tristemente, este tutorial non será capaz de cubrir esa funcionalidade por algúns motivos loxísticos, entón imos pulir algúns detalles ó respecto. Resumindo, o squash permite combinar commits.',"","¡Xenial! Vexamos un exemplo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cando pinches o botón, unha ventá de rebase interativo abrirase. Reordena algúns commits da forma que ti prefieras (ou se o prefires desmarca o `pick` de algúns) e mira o seu resultado!"],afterMarkdowns:["¡Veña! Git copiou algúns commits exatamente da mesma forma que o indicaches na ventá."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Para finalizar este nivel, fai un rebase interativo e obteñaa a orde amosada na visualización do obxectivo. Lembra que podes usar os comandos `undo` ou `reset` para correxir erros :D"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Interaktiver Rebase","","Cherry-pick ist großartig, wenn du genau weißt, welche Commits du willst (_und_ ihre jeweiligen Hashes kennst) -- es ist dann schwer an Einfachheit zu überbieten.","","Aber wie sieht es aus, wenn du die benötigten Commits nicht genau kennst? Zum Glück bietet Git auch dafür eine Lösung an. Das können wir mit interaktivem Rebase machen -- die beste Art sich eine Serie von Commits in einem Rebase genau anzusehen.","","Schauen wir uns die Details an ..."]}},{type:"ModalAlert",options:{markdowns:["Interaktives Rebase bedeutet einfach nur, dass man dem `rebase` Befehl die Option `-i` hinzufügt.","","Wenn du das machst, zeigt Git dir jeden einzelnen Commit, der durch den Rebase kopiert werden würde. Es zeigt dir die Hashes und Kommentare, was gut ist um einen Überblick zu bekommen.","",'Im "echten" Git werden die Commits in einem Text-Editor angezeigt (z.B. in `vim`). Für unsere Zwecke habe ich ein kleines Dialog-Fenster gebaut, das sich ähnlich verhält.']}},{type:"ModalAlert",options:{markdowns:["Wenn sich der Dialog für den interaktiven Rebase öffnet, kannst du drei Dinge tun:","","* Du kannst die Reihenfolge der Commits durch Ziehen und Ablegen ändern.","* Du kannst einen Commit beim Rebase ignorieren, indem du im Dialog auf die Schaltfläche `omit` klickst. Du kannst einen Commit wieder aufnehmen, indem du auf `pick` klickst.","* Außerdem kannst du Commits zusammenfassen (squash). Leider wird das hier nicht unterstützt, aber im echten Git fasst es Commits zu einem zusammen.","","Super! Schauen wir uns ein Beispiel an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wenn du die Schaltfläche anklickst, wird sich der Rebase-Dialog öffnen. Verändere die Reihenfolge der Commits oder klicke bei einigen auf `pick` bzw. `omit` und schaue dir das Ergebnis an."],afterMarkdowns:["Bämm! Git hat die Commits genau so kopiert, wie du es ausgewählt hast."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level zu schaffen mach einen interaktiven Rebase, um genau die Reihenfolge zu erzeugen, die im Ziel-Baum angezeigt wird. Denk daran, dass du jederzeit mit `undo` oder `reset` Fehler rückgängig machen kannst. :D"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git インタラクティブrebase","","どのコミットを操りたいか(そしてそれを指定するハッシュ)がわかる時に`git cherry-pick`はとても便利で、その簡単さはとてもありがたいです。 ","","しかし、どのコミットを操りたいかがわからない時はどうでしょう?ありがたいことに、そんな時にぴったりのコマンドがgitに備わっています。このためにgitのインタラクティブrebaseを使えます。rebaseしたい一連のコミットを一括で見るベストな方法です。","","具体的に見てみましょう..."]}},{type:"ModalAlert",options:{markdowns:["インタラクティブrebaseとは単に、`rebase`コマンドに`-i`オプションを合わせて使うことです。","","このオプションをつければ、gitがインタフェースを開き、どのコミットがrebase対象の下にコピーされるかを確認できます。それらのコミットのハッシュやメッセージも表示され、rebaseの概要を一眼で見るのに便利です。","",'"ホンモノ"のgitでは、その「インターフェース」とは`vim`などのテキストエディタの中でファイルが開くだけです。ここでコンセプトを見せるために同じような動作をする小さなダイアログウィンドウを作りました。']}},{type:"ModalAlert",options:{markdowns:["インタラクティブrebaseダイアログが開くと、3つの操作から選べます:","","* UIウィンドウのなかで順番を調整するだけでコミットの順番を変えられます(こちらのダイアログでは、マウスでドラッグアンドドロップで操作します)。","* 特定のコミットを丸ごと除くこともできます。除きたいコミットを指定するには`pick`をオフにします。","* 最後に、コミットを組み合わせられます。技術的に制限があり再現できないのでその詳細な説明を省きますが、短く言いますと、複数のコミットを一つにまとめることができる機能です。","","さて、例を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["ボタンを押せば、インタラクティブrebaseウィンドウが現れます。コミットの順番を変更したり、`pick`を外したりしてみて、その結果を見てみましょう!"],afterMarkdowns:["よっしゃー。gitがUIで指定されたようにコミットをコピーしました!"],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするにはインタラクティブrebaseを実行し、ゴールのビジュアライズに表示されている順番を実現しましょう。ミスがあれば`undo`や`reset`で修正できるのをお忘れなく。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interactive Rebase","","Git cherry-pick прекрасен, когда точно известно, какие коммиты нужны (и известны их точные хеши)","","Но как быть в случае, когда точно не известно какие коммиты нужны? К счастью, Git позаботился о таких ситуациях! Можно использовать интерактивный rebase для этого - лучший способ отобрать набор коммитов для rebase.","","Углубимся в детали."]}},{type:"ModalAlert",options:{markdowns:["Всё, что нужно для интерактивного rebase - это опция `-i`","","Если добавить эту опцию, Git откроет интерфейс просмотра того, какие коммиты готовы к копированию на цель rebase (target). Также показываются хеши коммитов и комментарии к ним, так что можно легко понять что к чему.","",'Для "реального" Git, этот интерфейс означает просто открытие файла в редакторе типа vim. Для этой обучалки, я сделал небольшое диалоговое окно, которое по сути делает то же, что и редактор.']}},{type:"ModalAlert",options:{markdowns:["После открытия окна интерактивного rebase есть три варианта для каждого коммита:","","* Можно сменить положение коммита по порядку, переставив строчку с ним в редакторе (у нас в окошке строку с коммитом можно перенести просто мышкой).",'* Можно "выкинуть" коммит из ребейза. Для этого есть `pick` - переключение его означает, что нужно выкинуть коммит.',"* Наконец, можно соединить коммиты. В этом уровне игры у нас не реализована эта возможность, но, вкратце, при помощи этой функции можно объединять изменения двух коммитов.","","Ну что ж, посмотрим на примеры!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["После нажатия на эту кнопку появится окно интерактивного rebase. Переставь несколько коммитов (или удали кое-какие) и посмотри, что получится в итоге!"],afterMarkdowns:["Бах! Git скопировал коммиты в точности так, как было указано через интерфейс!"],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, переставь коммиты при помощи интерактивного rebase в таком порядке, как указано на визуализации. На всякий случай, помни, что всегда можно исправить ошибку, вызвав команду undo или reset."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 인터렉티브 리베이스(Interactive Rebase)","","Git 체리-픽은 여러분이 원하는 커밋이 무엇인지 알때(각각의 해시값도) 아주 유용합니다 -- 체리-픽이 제공하는 간단함은 아주 매력적입니다.","","하지만 원하는 커밋을 모르는 상황에는 어쩌죠? 고맙게도 git은 이런상황에 대한 대안이 있습니다. 우리는 이럴 때 인터렉티브 리베이스를 사용하면됩니다 -- 리베이스할 일련의 커밋들을 검토할 수 있는 가장 좋은 방법입니다.","","자세히 알아보죠..."]}},{type:"ModalAlert",options:{markdowns:["인터렉티브 리베이스가 의미하는 뜻은 `rebase` 명령어를 사용할 때 `-i` 옵션을 같이 사용한다는 것입니다.","","이 옵션을 추가하면, git은 리베이스의 목적지가 되는 곳 아래에 복사될 커밋들을 보여주는 UI를 띄울것 입니다. 각 커밋을 구분할 수 있는 각각의 해시들과 메시지도 보여줍니다.","",'"실제" git 에서는 UI창을 띄우는것 대신에 `vim`과 같은 텍스트 편집기에서 파일을 엽니다. 저희는 배우는 것이 목적이기에 같은 역할을 하는 작은 대화창을 만들어서 대신했습니다.']}},{type:"ModalAlert",options:{markdowns:["인터렉티브 리베이스 대화창이 열리면, 3가지를 할 수 있습니다:","","* 적용할 커밋들의 순서를 UI를 통해 바꿀수 있습니다(여기서는 마우스 드래그앤 드롭으로 가능합니다)","* 원하지 않는 커밋들을 뺄 수 있습니다. 이것은 `pick`을 이용해 지정할 수 있습니다(여기서는 `pick`토글 버튼을 끄는것으로 가능합니다)","* 마지막으로, 커밋을 스쿼시(squash)할 수 있습니다. 불행히도 저희 레벨은 몇개의 논리적 문제들 때문에 지원을 하지 않습니다. 이거에 대해서는 넘어가겠습니다. 요약하자면 커밋을 합칠 수 있습니다","","자! 예시를 확인해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["버튼을 누르면 인터렉티브 리베이스 대화창이 뜰 것 입니다. 커밋들의 순서를 바꿔보고(커밋을 빼 봐도 됩니다) 결과를 확인해봅시다!"],afterMarkdowns:["Boom! Git이 UI를 통해 명시한 그대로 커밋들을 복사했습니다."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨을 통과하기 위해서 goal에 나타난 순서대로 만들기 위해 인터렉티브 리베이스를 사용해봅시다. `undo`와 `reset`을 통해 했던 실수들은 되돌릴 수 있습니다 :D"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Інтерактивний Rebase","","Git cherry-pick зручно користуватись, коли ти знаєш які коміти тобі потрібні (_і_ ти знаєш їхні хеші) -- важко вигадати щось простіше.","","Але що робити в ситуації, коли ти не знаєш які коміти потрібні? На щастя git може впоратись і з цим! Для цього випадку використовують інтерактивний rebase -- це найкращий спосіб перевірити серію комітів які потрібно заребейсити.","","Розглянемо це детальніше..."]}},{type:"ModalAlert",options:{markdowns:["Інтерактивний rebase це насправді команда `rebase` з опцією `-i`.","","Якщо додати цю опцію, git відкриє діалог в якому покаже які коміти будуть скопійовані до кінцевого призначення. Він також покаже хеші комітів та їхні повідомлення, що допоможе розібратися що й до чого.","",'В "справжньому" git, замість UI вікна відкриється файл в сконфігурованому текстовому редакторі, можливо `vim`. Для цього туторіалу я створив невеличке діалогове вікно що поводиться приблизно так само.']}},{type:"ModalAlert",options:{markdowns:["Коли відкриється вікно інтерактивного rebase ти можеш зробити три речі:","","* Ти можеш переставити коміти між собою просто змінивши їх порядок в діалозі (в нашому вікні ти зможеш перетягнути їх мишкою).","* Ти можеш повністю пропустити якісь коміти. В туторіалі потрібно вимкнути опцію `pick`, але в справжньому гіт потрібно просто видалити відповідний рядок.","* Також можна розчавити (squash) якісь коміти. На жаль наш туторіал не підтримує цю фічу (так як ми не підтримуємо роботу з файлами), але це дуже зручна опція в справжньому гіт. За її допомогою можна декілька різніх комітів об’єднати в один.","","Чудово! Розгляньмо це на прикладі"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Коли ти натиснеш кнопку, відкриється вікно інтерактивного rebase. Перестав якісь коміти (можеш пропустити якісь якщо хочеш), і подивись що вийде!"],afterMarkdowns:["Ка-бум! Git cкопіював коміти відповідно до того що було вказано в UI."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень за допомогою інтерактивного rebase впорядкуй коміти як показано на візуалізації. Пам’ятай що ти завжди можеш використати `undo` чи `reset` щоб виправити помилку :D"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Rebase Tương tác","","Khi bạn biết rõ mình muốn những commit nào (và mã băm tương ứng của chúng) thì Git cherry-pick là công cụ tuyệt vời -- nó đơn giản đến bất ngờ.","","Nhưng mà lỡ như bạn không biết mình cần commit nào thì sao? May mà Git cũng có công cụ cho việc này! Ta có thể dùng rebase tương tác cho việc này -- đó là cách tốt nhất để cân nhắc lựa chọn các commit mà bạn muốn rebase.","","Hãy đi sâu vào chi tiết nào..."]}},{type:"ModalAlert",options:{markdowns:["Rebase tương tác nghĩa là dùng lệnh `rebase` với tùy chọn `-i`.","","Nếu lệnh của bạn có bao hàm tùy chọn này, Git sẽ mở một giao diện người dùng để cho bạn biết những commit nào sẽ được sao chép xuống dưới mục tiêu rebase. Nó cũng đồng thời thể hiện mã băm và thông điệp của commit, điều này thật tuyệt bởi nhờ đó ta có thể phân biệt được chúng.","",'Với Git "thật", cửa sổ UI (giao diện người dùng) sẽ được mở thông qua một tệp nhờ công cụ chỉnh sửa văn bản như là `vim`. Vì mục đích học tập, tôi đã xây dựng một hộp thoại nhỏ mà nó hành xử cũng tương tự như vậy.']}},{type:"ModalAlert",options:{markdowns:["Khi hộp thoại rebase tương tác bật lên, trong ứng dụng giáo dục của chúng tôi, bạn có khả năng làm hai điều sau:","","* Bạn có thể sắp xếp lại commit một cách đơn giản thông qua UI (bằng cách kéo thả trên công cụ của chúng tôi).","* Bạn có thể chọn hoặc loại bỏ một vài commit cụ thể. Điều này được thể hiện qua nút `pick` -- tắt nút `pick` nghĩa là bạn loại bỏ commit đó.","","*Chú ý rằng, đối với rebase tương tác trong thực tế, bạn có thể làm nhiều thứ hơn như squash (kết hợp) commit, sửa đổi commit message, thậm chí là chỉnh sửa commit. Tuy nhiên, chúng ta chỉ cần tập trung vào hai thao tác trên.*","","Tuyệt! Cùng xem qua một ví dụ nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Khi bấm nút, một cửa sổ rebase tương tác sẽ xuất hiện. Bạn có thể sắp xếp lại một số commit (hoặc có thể xóa bớt) và xem thử kết quả!"],afterMarkdowns:["BÙÙM! Git sao chép chính xác các commit mà bạn chọn thông qua UI."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, thực hiện rebase tương tác sao cho thứ tự commit giống với mục tiêu. Hãy nhớ rằng nếu gặp lỗi bạn luôn có thể hoàn tác hoặc đặt lại :D"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Interaktivni Rebase","","Git cherry-pick je odličen način, ko veš katere commite bi rad (in poznaš njihove hashe) -- težko je premagati njegovo enostavnost.","","Ampak kaj pa situacija, ko ne veš katere commite želiš? K sreči ima git pokrito tudi to! Uporabimo lahko interaktivni rebase -- gre za najboljši način za pregled commitov, ki jih želiš rebaseati.","","Spustimo se v podrobnosti ..."]}},{type:"ModalAlert",options:{markdowns:["Vse kar interaktvini rebase pomeni je, da uporabimo `rebase` ukaz z opcijo `-i`.","","Če vključiš to opcijo, bo git odprl okno, da ti pokaže, kateri commiti bodo skopirani pod naš ciljni commit rebaseanja. Prav tako pokaže tudi njihove hashe in sporočila, kar je super za razumevanje kaj je kaj.","",'Za "pravi" git, odpiranje okna pomeni odpiranje datoteke v urejevalniku kot je `vim`. Za naš namen sem zgradil majhno okno, ki se obnaša enako.']}},{type:"ModalAlert",options:{markdowns:["Ko se odpre okno za interaktivno rebaseanje, imaš možnost narediti 3 stvari:","","* Enostavno lahko preurediš commite v vrstni red, ki ga želiš (v našem oknu to dosežeš kar s klikom in vlečenjem miške).","* Odločiš se lahko, da čisto izpustiš nekatere commite. To je omogočeno s `pick` -- izklop `pick` opcije pomeni, da bi rad commit izpustil.","* Nenazadnje, commite lahko tudi stisnemo. Nažalost naše stopnje tega ne podpirajo zaradi logističnih razlogov, zato bom preskočil podrobnosti tega. Toda če povzamem -- omogoča združevanje commitov.","","Super! Poglejmo primer."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ko pritisneš gumb, se bo pojavilo interaktivno okno. Prerazporedi nekaj commitov okoli (ali pa jih odstrani z omit) in poglej rezultat!"],afterMarkdowns:["Boom! Git je na dno skopiral commite v točno takšnem vrstnem redu, kot si ga določil v oknu."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje naredi interaktvini rebase in doseži vrstni red, kot je predstavljen v ciljni vizualizaciji. Vedno lahko razveljavjiš z `undo` ali ponastaviš z `reset` ukazom, da popraviš napake :D"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Interaktywny rebase w Gicie","","Cherry-pick jest świetny, gdy wiesz, które commity chcesz przenieść (_oraz_ znasz ich hasze) - trudno jest dyskutować z prostotą, którą zapewnia.","","Ale co w sytuacji, gdy nie wiesz, które commity chcesz przenieść? Na szczęście Git jest przygotowany również na tę sytuację! Możemy wykorzystać do tego interaktywny rebase - to najlepszy sposób, aby przejrzeć serię commitów, które zamierzasz rebase'ować (czyli: przebazować).","","Przejdźmy do szczegółów..."]}},{type:"ModalAlert",options:{markdowns:["Wszystkie interaktywne znaczniki rebase używają polecenia `rebase` z opcją `-i`.","","Jeśli włączysz tę opcję, Git otworzy okno, aby pokazać ci, które commity mają być skopiowane poniżej wskazanego celu przebazowania (np. HEADa). W oknie pokażą się również wiadomości i hasze commitów, żeby ułatwić ci zrozumienie, co jest czym.","",'Dla "prawdziwego" Gita otwarte okno oznacza otwarcie pliku w edytorze tekstu, takim jak np. `vim`. Dla naszych potrzeb zbudowałem małe okno dialogowe, które zachowuje się tak samo.']}},{type:"ModalAlert",options:{markdowns:["Kiedy otworzy się okno dialogowe do interaktywnego przebazowania, masz możliwość zrobienia dwóch rzeczy w naszej aplikacji edukacyjnej:","","* Możesz zmienić kolejność commitów, po prostu przeciągając i upuszczając je myszką w oknie.","* Możesz zdecydować się zachować wszystkie commity lub pominąć niektóre z nich. Jest to oznaczone przez aktywny przycisk `pick`. Wyłączenie przycisku spowoduje pominięciu commitu.","","* Warto wspomnieć, że w prawdziwym interaktywnym rebase'ie możesz zrobić wiele innych rzeczy, takich jak squash (łączenie) commitów, poprawianie wiadomości commitów, a nawet edycja samych commitów. Dla naszych potrzeb jednak wystarczy, że skupimy się na dwóch omówionych operacjach.","","Świetnie! Spójrzmy na przykład."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Po naciśnięciu przycisku pojawi się interaktywne okno przebazowania. Zmień kolejność niektórych commitów (lub usuń niektóre z nich, a co!) i zobacz wynik!"],afterMarkdowns:["Tadam! Git skopiował commity w sposób podany w oknie."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, zrób interaktywny rebase i ustaw kolejność pokazaną w wizualizacji celu. Pamiętaj, że zawsze możesz użyć `undo` lub `reset`, aby naprawić błędy :D"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git rebase interattivo","","Git cherry-pick è fantastico quando sai quale commit vuoi (_e_ conosci l'hash corrispondente) -- è difficile avere di meglio.","","Ma cosa accade se non sai quale commit ti serve? Per fortuna git ci viene in contro anche in questo caso! Possiamo usare il rebase interattivo -- è il miglior modo per rivedere la sequenza di commit di cui stai per fare il rebase.","","Vediamolo nel dettaglio..."]}},{type:"ModalAlert",options:{markdowns:["Fare rebase interattivo significa usare il comando `rebase` con l'opzione `-i`.","","Se aggiungi quest'opzione, git aprirà un'interfaccia per mostrarti quali commit stanno per essere copiati sotto il commit su cui vuoi fare il rebase. Verrà anche mostrato l'hash e il messaggio del commit, il che è grandioso per darci l'idea di cosa è cosa","",'Nel git "vero", l\'interfaccia che si apre in realtà è un editor di testo come `vim`. Nel nostro caso, ho creato una piccola finestra che si comporta allo stesso modo.']}},{type:"ModalAlert",options:{markdowns:["Quando la finestra si apre, hai la possibilità di fare due cose:","","* Puoi riordinare i commit modificandone l'ordine (drag & drop con il mouse).","* Puoi decidere se conservare tutti i commit o rimuoverne qualcuno. Quando la finestra si apre, ogni commit è considerato preso dal pulsante `pick` attivo affianco a esso. Per scartare un commit, disattiva il suo pulsante `pick`.","","*Vale la pena ricordare che nel vero rebase interattivo puoi fare molte più cose come lo squashing (combinazione) di commit, la modifica del messaggio di commit (amending), e perfino la modifica dello stesso commit. Noi ci concentreremo sulle due funzioni descritte sopra.*","","Bene! Vediamo un esempio."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Quando premi il pulsante, apparirà la finestra del rebase interattivo. Riordina qualche commit (o sentiti libero di scartarne qualcuno) e vediamo il risultato!"],afterMarkdowns:["Boom! Git ha fatto la copia nell'ordine esatto che hai specificato nell'interfaccia grafica."],command:"git rebase -i HEAD~4 --aboveAll",beforeCommand:"git commit; git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Per concludere questo livello, esegui un rebase interattivo e raggiungi l'obiettivo mostrato. Ricordati che puoi sempre fare `undo` o `reset` per correggere gli errori :D"]}}]}}}},{}],134:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main"},"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":"C3","id":"HEAD"}}',solutionCommand:"git checkout bugFix^",startTree:'{"branches":{"main":{"target":"C2","id":"main"},"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":"main","id":"HEAD"}}',name:{en_US:"Relative Refs (^)",fr_FR:"Références relatives (^)",ja:"相対リファレンス (^)",zh_CN:"相对引用(^)",zh_TW:"相對引用(^)",es_AR:"Referencias relativas (^)",es_MX:"Referencias relativas (^)",es_ES:"Referencias relativas (^)",pt_BR:"Referências relativas (^)",gl:"Referencias relativas (^)",de_DE:"Relative Referenzen (^)",ru_RU:"Относительные ссылки (^)",ko:"상대 참조 (^) (Relative Refs)",uk:"Відносні посилання",vi:"Tham chiếu tương đối (^)",sl_SI:"Relativne Reference (^)",it_IT:"Riferimenti relativi (^)",pl:"Referencje względne (^)"},hint:{en_US:"Remember the Caret (^) operator!",fr_FR:"Rappelez-vous de l'opérateur circonflexe (^)",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:"记住操作符(^)!",zh_TW:"不要忘記插入(^)符號!",ru_RU:"Не забудь оператор `^`",ko:"(^)연산자를 기억하세요!",uk:"Не забудь оператор `^`",vi:"Đừng quên dấu mũ (^)!",sl_SI:"Spomni se na (^) operator!",it_IT:"Ricorda l'operatore Caret(^)... l'accento circonflesso!",pl:"Pamiętaj o operatorze wstawienia (^)!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relative Refs","","Moving around in Git by specifying commit hashes can get a bit tedious. In the real world you won't have a nice commit tree visualization next to your terminal, so you'll have to use `git log` to see hashes.","","Furthermore, hashes are usually a lot longer in the real Git world as well. For instance, the hash of the commit that introduced the previous level is `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Doesn't exactly roll off the tongue...","","The upside is that Git is smart about hashes. It only requires you to specify enough characters of the hash until it uniquely identifies the commit. So I can type `fed2` instead of the long string above."]}},{type:"ModalAlert",options:{markdowns:["Like I said, specifying commits by their hash isn't the most convenient thing ever, which is why Git has relative refs. They are awesome!","","With relative refs, you can start somewhere memorable (like the branch `bugFix` or `HEAD`) and work from there.","","Relative commits are powerful, but we will introduce two simple ones here:","","* Moving upwards one commit at a time with `^`","* Moving upwards a number of times with `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's look at the Caret (^) operator first. Each time you append that to a ref name, you are telling Git to find the parent of the specified commit.","",'So saying `main^` is equivalent to "the first parent of `main`".',"","`main^^` is the grandparent (second-generation ancestor) of `main`","","Let's check out the commit above main here."],afterMarkdowns:["Boom! Done. Way easier than typing the commit hash."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["You can also reference `HEAD` as a relative ref. Let's use that a couple of times to move upwards in the commit tree."],afterMarkdowns:["Easy! We can travel backwards in time with `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, check out the parent commit of `bugFix`. This will detach `HEAD`.","","You can specify the hash if you want, but try using relative refs instead!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Références relatives","","Se déplacer dans Git en spécifiant des identifiants de commits (hashes) peut être un peu agaçant. Dans le monde réel vous n'aurez pas une vue sur un joli arbre des commits à côté de votre terminal, et vous devrez donc utiliser `git log` pour connaître les identifiants.","","De plus, les identifiants sont plus longs dans le vrai monde de Git qu'ici. Par exemple, l'identifiant du commit introduit au précédent niveau était `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Difficilement mémorisable...","","Le côté positif est que Git est intelligent avec les identifiants. Vous avez seulement à spécifier les premiers caractères de l'identifiant jusqu'à ce qu'il reconnaisse exactement le commit. Ainsi je peux taper `fed2` au lieu de la longue chaîne ci-dessus."]}},{type:"ModalAlert",options:{markdowns:["Comme je l'ai dit, spécifier un commit par son identifiant n'est pas très pratique, c'est pourquoi Git a des références relatives. Elles sont géniales !","","Avec les références relatives vous pouvez commencer par vous placer à un endroit mémorisable (comme la branche `bugFix` ou `HEAD`) et travailler depuis cet endroit.","","Les commits relatifs sont puissants, et on va en présenter deux simples ici :","","* Revenir d'un commit en arrière avec `^`","* Revenir de plusieurs en arrière avec `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Regardons l'opérateur circonflexe (^) d'abord. Chaque fois que vous le faites suivre un nom de référence, vous êtes en train de demander à Git de trouver le parent du commit spécifié.","",'Ainsi, `main^` est équivalent à "le premier parent de `main`".',"","`main^^` est le grand-parent (ancêtre de seconde génération) de `main`","","Faisons un checkout du commit avant main."],afterMarkdowns:["Boum ! Fini. Bien plus facile que d'écrire l'identifiant du commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vous pouvez aussi utiliser `HEAD` comme une référence relative. Utilisons cela plusieurs fois pour remonter l'arbre des commits."],afterMarkdowns:["Facile ! Nous pouvons voyager dans le temps avec `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour compléter ce niveau, faites un checkout du commit parent de `bugFix`. Cela va détacher `HEAD`.","","Vous pouvez spécifier l'identifiant du commit si vous voulez, mais essayez plutôt d'utiliser les références relatives !"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relative Referenzen","","Es kann etwas mühselig werden, sich in einem Commit-Baum mittels Angabe der Hashes zu bewegen. Im echten Leben hat man normalerweise keine hübsche Visualisierung des Baumes neben seinem Terminal, also benutzt man `git log` um die Hashes zu sehen.","","Außerdem sind die echten Hashes sehr viel länger und nicht fortlaufend nummeriert. Beispielsweise heißt der Hash, mit dem ich den letzten Level committet habe, in echt `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Nicht gerade einprägsam ...","","Zum Glück ist Git intelligent wenn es um die Hashes geht. Du musst nur soviele Zeichen eines Hashes angeben, bis der Hash eindeutig ist. Ich kann also `fed2` eingeben anstatt die komplette Zeichenkette tippen zu müssen."]}},{type:"ModalAlert",options:{markdowns:["Wie ich schon sagte: Commits über ihren Hash zu referenzieren ist nicht gerade der bequemste Weg. Weshalb es in Git relative Referenzen gibt. Welche super sind!","","Mit relativen Referenzen kann man bei einem leicht zu merkenden Bezeichner anfangen (zum Beispiel dem Branch-Namen `bugFix` oder der Referenz `HEAD`) und sich von dort vorarbeiten.","","Relative Referenzierung von Commits kann komplex sein, aber wir starten mit zwei einfachen Beispielen:","","* Geh einen Commit zurück mit `^`","* Geh eine bestimmte Anzahl von Commits zurück mit `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns zuerst den Dach-Operator (`^`) an. Jedes mal wenn du ihn hinter einen Referenz-Namen setzt, sagst du Git damit, dass es zum Vorgänger des angegebenen Commits gehen soll.","",'Das heißt `main^` ist gleichbedeutend mit "direkter Vorgänger des Commits, auf den `main` zeigt".',"","`main^^` ist also der Vorgänger des Vorgängers von `main`.","","Wir checken jetzt mal den Commit vor `main` aus:"],afterMarkdowns:["Bämm! Fertig. Einfacher, als den Commit-Hash zu tippen (oder zu kopieren)."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Du kannst auch `HEAD` als Basis für relative Referenzen benutzen. Lass uns das ein paar Mal verwenden, um uns im Commit-Baum nach oben zu bewegen."],afterMarkdowns:["Das war einfach. Wir reisen mit `HEAD^` in der Zeit zurück."],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level abzuschließen musst du den direkten Vorgänger von `bugFix` auschecken. Dadurch wirst du `HEAD` von `bugFix` abkoppeln.","","Du kannst natürlich den Hash angeben, aber versuch doch relative Referenzen zu benutzen!"]}}]},es_AR:{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 copado 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 podés arrancar de algún lugar recordable (como la rama `bugFix`, o `HEAD`) y manejarte desde ahí.","","Los commits relativos son poderosos, pero ahora vamos a presentar sólo dos formas simples:","","* Moverse un commit atrás con `^`","* Moverse una cantidad de commits atrás con `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos el operador ^ primero. Cada vez que le agregás eso al nombre de una referencia, le estás diciendo a git que use el padre del commit especificado.","",'Entonces, decir `main^` es equivalente a "el primer padre de `main`".',"","`main^^` es el _abuelo_ (segunda generación de ancestros) de `main`","","Veamos el commit que está antes de main acá."],afterMarkdowns:["¡Boom! Ahí está. Mucho más simple que tipear el hash de ese commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["También podés 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, checkouteá el padre del commit de `bugFix`. Esto va a detachear a `HEAD`.","","Podés especificar el hash si querés, pero mejor ¡tratá de usar la referencia relativa!"]}}]},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 `main^` es equivalente a "el primer padre de `main`".',"","`main^^` es el _abuelo_ (segunda generación de ancestros) de `main`","","Veamos el commit que está antes de main aquí."],afterMarkdowns:["¡Zas! Ahí está. Mucho más simple que escribir el hash de ese commit."],command:"git checkout main^",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!"]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Referencias relativas","","Moverse por ahí en 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 larga cadena 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 memoralbe (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, `main^` quiere decir que es equivalente a "el primer padre de `main`".',"","`main^^` es el _abuelo_ (segunda generación de ancestros) de `main`","","Veamos el commit que está antes de main aquí."],afterMarkdowns:["Vientos! Ahí está. Mucho más simple que escribir el hash de ese commit."],command:"git checkout main^",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:[{type:"ModalAlert",options:{markdowns:["## Referências relativas","","Mover-se pela árvore do Git especificando o hash do commit pode se tornar um pouco entediante. No mundo real, você não terá à sua disposição essa bonita visualização da árvore ao lado do seu terminal, então você terá de usar o comando `git log` para ver os hashes.","","Além disso, os hashes são geralmente muito maiores no mundo real. Por exemplo, o hash do commit que introduziu o nível de exercícios anterior é `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Não é algo exatamente fácil de lembrar.","","O que salva é que o Git é inteligente com os hashes. Ele só exige que você especifique a quantidade de caracteres do hash suficiente para identificar unicamente o commit. Então eu posso digitar apenas `fed2` em vez da grande string acima."]}},{type:"ModalAlert",options:{markdowns:["Como eu disse, especificar commits pelo hash não é a sempre o mais conveniente, e é por isso que o Git suporta referências relativas. Elas são fantásticas!","","Com referências relativas, você pode começar a partir de um ponto fácil de lembrar (como o ramo `bugFix` ou o `HEAD`) e referenciar a partir dali.","","Commits relativos são poderosos, mas vamos introduzir apenas dois tipos simples aqui:","","* Mover para cima um commit por vez com `^`","* Mover para cima um número de vezes com `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos dar uma olhada no operador circunflexo (^) primeiro. Cada vez que você adicioná-lo a um nome de referência, você está dizendo ao Git para encontrar o pai do commit especificado.","",'Então, dizer `main^` é equivalente a "o primeiro pai do `main`".',"","`main^^` é o avô (ancestral de segunda geração) do `main`","","Vamos fazer checkout do commit logo acima do main."],afterMarkdowns:["Boom! Pronto. Muito mais fácil que digitar o hash do commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Você também pode usar o `HEAD` como parte de uma referência relativa. Vamos usar isso para nos mover para cima algumas vezes na árvore de commits."],afterMarkdowns:["Fácil! Podemos viajar para trás no tempo com `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 esse nível, faça checkout do commit pai de `bugFix`. Isso soltará o `HEAD`.","","Você pode especificar o hash se quiser, mas tente usar referências relativas em vez disso!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Referencias relativas","","Moverse por a árbore de git usando os códigos hash dos commits pode volverse un pouco tedioso. Neste mundo real non vas ter unha visualización dos commits tan bonita no terminal, así que vas ter que usar `git log` para ver cada código hash.","","Inda peor, os códigos hash són xeralmente moito máis grandes no mundo real. Por exemplo, o hash do commit que introduxemos no nivel anterior é `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Non é algo sinxelo de lembrar.","","O bo é que git aínda afina cos hashes. El só precisa que expecifiques a cantidade mínima de caracteres suficientes para identificar unívocamente ó commit. Entón eu podo escribir `fed2` e non o hash completo."]}},{type:"ModalAlert",options:{markdowns:["Como xa dixemos, indicar os commits polo seu código hash non é a forma máis convinte, e é por eso que git ten referencias relativas. ¡Son a caña!","","Cas referencias relativas, podes comezar por un punto sinxelo de lembrar (como a rama `bugFix` ou o `HEAD`) e referenciar a partir de ahí.","","Os commits relativos son poderosos, pero agora imos presentar só dous formas sinxelas:","","* Moverse un commit por riba con `^`","* Mover unha cantidade de commits atrás con `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Votémoslle unha ollada o operador (^) primeiro. Cada vez que o engadimos a unha referencia, estaslle dicindo a commit que queres o pai de esa referencia.","",'Entón, dicir `main^` é equivalente a "o primeiro pai do `main`".',"","`main^^` é o avó (ancestral de segunda xeración) do `main`","","Imos facer checkout do commit que está enriba de main."],afterMarkdowns:["Boom! Ahí o tes. Moito máis rápido que por o hash do commit."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tamén podes usar o `HEAD` como parte dunha referencia relativa. Ímolo utilizar para nos mover uns commits cara arriba na árbore."],afterMarkdowns:["¡Chupado! Podemos viaxar cara atrás no tempo 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, fai checkout do commit pai de `bugFix`. Iso soltará o `HEAD`.","","¡Podes indicar o hash que queiras, pero intenta empregar as referencias relativas, é moito mellor!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 相对引用","","通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用 `git log` 来查查看提交记录的哈希值。","","并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`。舌头都快打结了吧...","","比较令人欣慰的是,Git 对哈希的处理很智能。你只需要提供能够唯一标识提交记录的前几个字符即可。因此我可以仅输入`fed2` 而不是上面的一长串字符。"]}},{type:"ModalAlert",options:{markdowns:["正如我前面所说,通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!","","使用相对引用的话,你就可以从一个易于记忆的地方(比如 `bugFix` 分支或 `HEAD`)开始计算。","","相对引用非常给力,这里我介绍两个简单的用法:","","* 使用 `^` 向上移动 1 个提交记录","* 使用 `~` 向上移动多个提交记录,如 `~3`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["首先看看操作符 (^)。把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的 parent 提交。","","所以 `main^` 相当于“`main` 的 parent 节点”。","","`main^^` 是 `main` 的第二个 parent 节点","","现在咱们切换到 main 的 parent 节点"],afterMarkdowns:["搞定。这种方式是不是比输入哈希值方便多了?!"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你也可以将 `HEAD` 作为相对引用的参照。下面咱们就用 `HEAD` 在提交树中向上移动几次。"],afterMarkdowns:["很简单吧?!我们可以一直使用 `HEAD^` 向上移动。"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成此关,切换到 `bugFix` 的 parent 节点。这会进入分离 `HEAD` 状态。","","如果你愿意的话,使用哈希值也可以过关,但请尽量使用相对引用!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 相對引用","","如果要在 git 中移動,透過指定 commit 的 hash 值的方式會變得比較麻煩。在實際例子中,你的終端機上面不會出現漂亮且具備視覺效果的 commit tree,所以你不得不用 `git log` 來查詢 hash 值。","","另外,hash 值的長度在真實的 git 環境中很長。舉個例子,前一個關卡的介紹中的 commit 的 hash 值是 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`。舌頭不要打結了...","","幸運的是,git 對於處理 hash 值很有一套。你只需要提供能夠唯一辨識出該 commit 的前幾個字元就可以了。所以,我可以只輸入 `fed2` 而不是上面的一長串字元。"]}},{type:"ModalAlert",options:{markdowns:["我說過,透過 hash 值來指定 commit 不是很方便,所以 git 加入了相對引用。這個就很厲害了!","","使用相對引用,你可以從一個易於記憶的地方(比如說 branch 名稱 `bugFix` 或 `HEAD`)開始工作。","","相對引用非常好用,這裡我介紹兩個簡單的用法:","","* 使用 `^` 向上移動一個 commit","* 使用 `~` 向上移動多個 commit"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["首先看看插入(^)這一個符號。把這個符號接在某一個 reference 後面,就表示你告訴 git 去找到該 reference 所指向的 commit 的 parent commit。","",'所以 `main^` 相當於 "`main` 的 parent commit"。',""," `main^^` 是 `main` 的 grandparent commit(往前推兩代)","","切換到 main的 parent commit"],afterMarkdowns:["看吧!完成了。這種方式比輸入代表 commit 的 hash 值簡單多了!"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你也可以把 `HEAD` 當作相對引用。以下指令使用 `HEAD` 在 commit tree 中向上移動數次。"],afterMarkdowns:["簡單吧!我們可以一直使用 `HEAD^` 向上移動。"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,切換到 `bugFix` 的 parent commit。這會分離出 `HEAD`。","","如果你願意的話,透過直接指定 hash 值的方式也可以過關,但是還是試試看相對引用吧!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 相対リファレンス","","コミットのハッシュを利用してgitの中で移動するのも少し疲れる時もあります。現実の世界では、このチュートリアルのようにターミナルの隣に見やすいツリーのビジュアライズがないので、ハッシュを見るには`git log`を使う必要があります。","","その上、実際のハッシュはこちらで見たものよりずっと長いです。例えば、先ほどのレベルの紹介のコミットハッシュは`fed2da64c0efc5293610bdd892f82a58e8cbc5d8`です。少し覚えにくいですね...","","そのため、gitでは手短くコミットを指定する方法があります。ユニークな存在だと確認できるだけのハッシュの字数を入力すれば良いです -- 上記の長い文字列の代わりに`fed2`を入力するだけで済みます。"]}},{type:"ModalAlert",options:{markdowns:["先ほど言いましたように、ハッシュでコミットを指定するのがめんどくさくなる時もあるので、gitには相対リファレンスという素晴らしい機能があります。","","相対リファレンスを使うことで、覚えやすい位置(例えば`bugFix`ブランチや`HEAD`)から始め、そのところから相対的な位置を指定できます。","","相対コミットは強力ですが、ここでは二つをご紹介します:","","* 一つずつ上へ移動させる`^`(カレット)","* 複数回上へ移動させる `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["まずはカレット(^)から始めましょう。リファレンス名にカレットを追加すると、指定コミットの親コミットを見つけるようにとgitに命令を出しています。","",'なので `main^`と記述すれば、"`main`の一個上の親"、という意味になります。',"","そして`main^^`とはその親の一つの上のコミット(2代前の親)を指します。","","mainの上のコミットをここで見てみましょう"],afterMarkdowns:["やりました!コミットハッシュを書くよりずっと簡単ですね。"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`HEAD`を相対リファレンスとして参照することもできます。 ここで数回そのコマンドを使い、コミットツリーの中で上へと移動しましょう。"],afterMarkdowns:["簡単ですね!`HEAD^`で時間を巻き戻せます。"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、`bugFix`の親コミットをチェックアウトしてください。その操作により`HEAD`が分離されます。","","ハッシュを使用してもいいですが、その代わりに相対リファレンスを試してみましょう!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Относительные ссылки","","Передвигаться по дереву Git при помощи указания хешей коммитов немного неудобно. В реальной ситуации у вас вряд ли будет красивая визуализация дерева в терминале, так что придётся каждый раз использовать `git log`, чтобы найти хеш нужного коммита","","Более того, хеши в реальном репозитории Git намного более длинные. Например, хеш для коммита, который приведён в предыдущем уровне - `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Не очень просто для произношения =)","","Хорошая новость в том, что Git достаточно умён в работе с хешами. Ему нужны лишь первые несколько символов для того, чтобы идентифицировать конкретный коммит. Так что можно написать просто `fed2` вместо колбасы выше."]}},{type:"ModalAlert",options:{markdowns:["Как мы уже говорили, указание на коммит при помощи его хеша - не самый удобный способ, поэтому Git поддерживает относительные ссылки и они прекрасны!","","С относительными ссылками можно начать с какого-либо удобного места (например, с ветки `bugFix` или от HEAD) и двигаться от него","","Относительные ссылки - мощный инструмент, но мы покажем два простых способа использования:","","* Перемещение на один коммит назад `^`","* Перемещение на несколько коммитов назад `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Для начала рассмотрим оператор каретки (^). Когда мы добавляем его к имени ссылки, Git воспринимает это как указание найти родителя указанного коммита.","",'Так что `main^` означает "первый родитель ветки `main`".',"","`main^^` означает прародитель (родитель родителя) `main`","","Давайте переключимся на коммит Выше `main`"],afterMarkdowns:["Опачки! Готово. Сильно проще, чем поиск и указание хеша."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Можно также использовать `HEAD` как относительную ссылку. Попробуем пройти несколько раз назад по дереву коммитов"],afterMarkdowns:["Изи! Мы можем путешествовать во времени при помощи `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, переместись на первого родителя ветки `bugFix`. Это отделит `HEAD` от ветки.","","Конечно, можно указать хеш, но надо попробовать использовать относительные ссылки!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 상대 참조","","Git에서 여기저기 이동할 때 커밋의 해시를 사용하는 방법은 조금 귀찮습니다. 실제로 Git을 사용할 때는 터미널화면 옆에 예쁘장하게 커밋트리가 보이진 않으니까요. 매번 해시를 확인하려고 `git log` 명령어를 치고 있을 겁니다.","","나아가서, 실제 Git에서는 해시들이 훨씬 더 깁니다. 예를 들어 이전 레벨에 소개했던 커밋의 해시는 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`입니다. 쓰기 쉬워 보이진 않네요....","","다행히도, Git은 똑똑합니다. 해시가 커밋의 고유한 값임을 보여줄 수 있을 만큼만 명시해주면 됩니다. 위의 긴 문자열 대신 `fed2`만 입력해도 되는 겁니다."]}},{type:"ModalAlert",options:{markdowns:["말했듯이, 커밋들을 해시로 구분하고 사용하는것이 아주 편하다고 볼 수는 없습니다. Git의 상대 참조(Relative Ref)가 여기서 등장합니다. 굉장한 기능입니다.","","상대 참조로 우리가 기억할 만한 지점(브랜치 `bugFix`라던가 `HEAD`라던가)에서 출발해서 이동하여 다른 지점에 도달해 작업을 할 수 있습니다.","","상대 커밋은 강력한 기능인데, 여기서 두가지 간단한 방법을 소개하겠습니다.","","* 한번에 한 커밋 위로 움직이는 `^`","* 한번에 여러 커밋 위로 올라가는 `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["먼저 캐럿 (^) 연산자 부터 알아보겠습니다. 참조 이름에 하나씩 추가할 때마다, 명시한 커밋의 부모를 찾게 됩니다.","",'`main^`는 "`main`의 부모"와 같은 의미 입니다.',"",'`main^^` 는 "`main`의 조부모(부모의 부모)"를 의미합니다',"","main 위에 있는 부모를 체크아웃 해 봅시다."],afterMarkdowns:["Boom! 됐습니다. 커밋의 해시를 입력하는 것보다 훨씬 쉬운 방법입니다."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["또한 참조인 `HEAD`도 상대참조를 위해 사용할 수 있습니다. 커밋트리 위쪽으로 움직이기위해 여러번 사용 해 봅시다."],afterMarkdowns:["쉽군요! 이제 우린 `HEAD^`를 통해 시간을 거슬러 올라갈 수 있습니다."],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["이 레벨을 완료하기 위해서는, `bugFix`의 부모 커밋을 체크아웃 하십시오. 이렇게 하면 `HEAD`가 분리 될 것입니다.","","해시를 이용해서도 할 수 있지만, 상대 참조를 활용하는 것을 연습해 보세요!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Відносні посилання","","Пересуватися по гіту використовуючи хеш комітів може бути трохи напряжно. В справжньому гіті в тебе не буде візуалізації дерева комітів в терміналі, тому доведеться використовувати `git log` щоб подивится хеші комітів.","","Більше того, хеші як правило набагато довші в справжньому гіті. Типовий хеш виглядає як `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Без мнемонік не обійтися)...","","З іншого боку git дуже розумно працює з хешами. Він просить вказати рівно стільки літер, скільки потрібно щоб відрізнити один коміт від іншого. Отже, замість довгого хеша зверху можна просто набрати `fed2`."]}},{type:"ModalAlert",options:{markdowns:["Як було сказано, вказувати коміти за хешем не найзручніша річ, через це git підтримує відносні посилання. Вони реально круті!","","З відносними посиланнями ти можеш почати з якогось зручного місця (наприклад гілки `bugFix` чи посилання `HEAD`) й вказати потрібний коміт відносно цього посилання","","Відносні коміти є дуже потужним інструментом, але ми почнемо з двох простих прикладів:","","* Йдемо вверх на один коміт за допомогою `^`","* Йдемо вверх на кілька комітів за допомогою `~<число>`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Розберемось спочатку з оператором каретки (^). Кожна каретка додана до посилання (напр. до імені коміту) вказує git що потрібно знайти батька посилання до якого застосована каретка.","",'Тож `main^` тотожнє до "перший предок посилання `main`".',"","`main^^` це дідусь (предок другого покоління) посилання `main`","","Давайте перейдемо на коміт трохи вище від main:"],afterMarkdowns:["Бум! Готово. Трохи простіше ніж набирати хеш коміту"],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ти також можеш використовувати `HEAD` з відносними посиланнями. Давай використаємо це щоб трошки піднятися по дереву."],afterMarkdowns:["Просто! Ми можемо переміщуватись назад в часі з `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень перемістись на першого предка гілки `bugFix`. Ти опинишся в стані `detach HEAD`.","","Ти, звичайно, можеш вказати хеш, але натомість спробуй користуватися відносними посиланнями!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham chiếu tương đối","","Dịch chuyển trong Git bằng cách chỉ định mã băm (hash) của commit cỏ vẻ hơi buồn tẻ. Trong đời thực thì sẽ không có mô tả Git trực quan ngay bên cạnh terminal của bạn đâu, nên nếu bạn muốn nhìn mã băm của commit thì phải dùng `git log` thôi.","","Hơn nữa, mã băm thực tế thường dài hơn rất nhiều. Ví dụ, mã băm của commit được giới thiệu trong phần trước là `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Đọc mà xoắn hết cả lưỡi...","","Được cái là Git cũng khá thông minh về mã băm. Chỉ cần cung cấp kí tự mã băm đủ để phân biệt với các commit khác. Cho nên tôi có thể đơn giản chỉ cần gõ `fed2` thay vì cái chuỗi dài ngoằng phía trên."]}},{type:"ModalAlert",options:{markdowns:["Như tôi đã nói, xác định commit bằng mã băm chẳng hề thuận tiện tẹo nào, đó là tại sao Git có những `tham chiếu tương đối`. Chúng rất tuyệt vời!","","Với tham chiếu tương đối, bạn có thể bắt đầu từ những nơi có thể ghi nhớ được (như là nhánh `bugFix` hoặc `HEAD`) và làm việc trên đó.","","Những commit tương đối (relative commits) rất mạnh mẽ, nhưng chúng tôi sẽ chỉ giới thiệu 2 loại đơn giản sau:","","* Dịch chuyển lên 1 commit mỗi lần với `^`","* Dịch chuyển lên nhiều commit mỗi lần với `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Xem thử cái dấu mũ (^) trước nào. Mỗi lần bạn nối nó với một cái tên tham chiếu, bạn đang ra lệnh cho Git tìm kiếm cha của một commit cụ thể.","",'Cho nên `main^` nghĩa là "cha đầu tiên của `main`".',"","`main^^` là ông nội (tổ tiên thế hệ 2) của `main`","","Thử nhảy sang commit trước main nào"],afterMarkdowns:["BÙUM! Đã xong. Đơn giản hơn gõ mã băm nhiều."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bạn cũng có thể dùng `HEAD` như là tham chiếu tương đối. Thử dùng nó để leo commit vài lần nào."],afterMarkdowns:["Game là dễ! Du hành ngược thời gian với `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, nhảy sang cha của `bugFix`. Tức là tháo `HEAD`.","","Nếu muốn thì bạn có thể dùng mã băm, nhưng thế thì còn gì vui nữa dùng tham chiếu tương đối đi!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Relativne Reference","","Premikanje po Gitu z določanjem hashev commitov je lahko včasih nerodno. V praksi ne boš imel na voljo lepe vizualizacije drevesa zraven ukaznega terminala, zato boš moral uporabljati `git log`, da boš videl hashe.","","Hashi so ponavadi v praksi tudi veliko daljši. Naprimer, hash commita, predstavljenega v prejšnji stopnji, je `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Ni ravno preprosto za izgovoriti ...","","Pozitivna stran je, da je Git pameten glede hashev. Zahteva, da napišeš le toliko znakov hasha, da lahko prepozna unikaten commit. Tako lahko napišem `fed2`, namesto dolge verzije zgoraj."]}},{type:"ModalAlert",options:{markdowns:["Kot sem rekel, izbiranje commitov po njihovih hashih ni ravno najpriročnejša stvar na svetu, zato ima Git relativne reference. In te so super!","","Z relativni referencami lahko izhajaš iz nekje (npr. branch `bugFix` ali `HEAD`) in delaš od tam.","","Relativni commiti so močni in obsegajoči, ampak tu bomo predstavili dva preprosta:","","* Premikanje navzgor en commit naenkrat z `^`","* Premikanje navzgor n-krat z `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo najprej operator `^`. Vsakič, ko pripneš to imenu reference, poveš Gitu, naj najde starša tega commita.","",'Torej `main^` je isto kot "prvi starš brancha `main`".',"","`main^^` je stari starš (prednik druge generacije) `main`.","","Checkoutajmo sedaj commit nad masterjem."],afterMarkdowns:["Boom! Narejeno. Veliko enostavneje kot tipkanje hasha commita."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prav tako se lahko sklicuješ na `HEAD` kot relativno referenco. Uporabimo to nekajkrat, da se pomakenmo višje po drevesu commitov."],afterMarkdowns:["Enostavno! Lahko potujemo nazaj v čas z `HEAD^`."],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, checkoutaj starša commita `bugFix`. To bo ločilo `HEAD`.","","Hash lahko določiš, če želiš, ampak probaj raje z relativnimi referencami!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Referencje względne","","Poruszanie się w Gicie poprzez określanie haszy commitów może być trochę nudne. W prawdziwym świecie nie zobaczysz ładnej wizualizacji drzewa commitów obok swojego terminala (chyba, że używasz Forka lub TortoiseGita). Musisz użyć `git log`, aby zobaczyć hasze.","","Co więcej, hasze są zazwyczaj o wiele dłuższe w prawdziwym Gicie. Na przykład hash commita, który był na początku poprzedniego poziomu, to `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Spróbuj to przeczytać!","","Plusem jest to, że Git sprytnie radzi sobie z haszami. Wymaga jedynie podania tylu znaków hasza, ile potrzebuje, aby jednoznacznie zidentyfikować konkretny commit. Dlatego mogę wpisać jedynie `fed2` zamiast długiego łańcucha powyżej."]}},{type:"ModalAlert",options:{markdowns:["Jak już powiedzieliśmy, wybieranie commitów, używając ich hasza, nie jest najprzyjemniejszą rzeczą w życiu, dlatego Git ma referencje względne. Są niesamowite!","","Korzystając z referencji względnych, możesz zacząć od miejsca, które zapamiętasz (jak np. gałąź `bugFix` lub `HEAD`), i pracować stamtąd.","","Relatywne commity są potężne, ale pokażemy tu tylko dwie proste sytuacje:","","* Poruszanie się wstecz o jeden commit za pomocą `^`","* Poruszanie się wstecz o ileś commitów z `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spójrzmy najpierw na operator karety / daszek (^). Za każdym razem, gdy dodajesz go do referencji względnej, mówisz Gitowi, aby znalazł rodzica określonego commita.","",'Wpisując zatem `main^`, mamy na myśli "pierwszego rodzica z gałęzi `main`".',"","`main^^` to dziadek (przodek drugiego stopnia) gałęzi `main`.","","Zcheckoutujmy commit powyżej `main`:"],afterMarkdowns:["Tadam! Gotowe! O wiele łatwiej niż wpisując hasz commita."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Możesz również odwołać się do `HEAD` jako referencji względnej. Użyjmy tego kilka razy, aby przesunąć się w górę drzewa commitów."],afterMarkdowns:["Łatwizna! Możemy cofać się w czasie, używając `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, checkoutuj commita-rodzica z gałęzi `bugFix`. To spowoduje odczepienie `HEADa`.","","Możesz wybrać commita po haszu, jeżeli chcesz, ale spróbuj wykorzystać nowe umiejętności i użyć referencji względnej!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Riferimenti relativi","","Spostarsi in Git specificando l'hash dei commit può essere una scocciatura. Nella vita vera non avrai un bell'albero con tutti i commit sullo schermo, dovrai usare `git log` per vedere gli hash.","","Inoltre, gli hash sono solitamente molto più lunghi. Per esempio, l'hash del commit nel livello precedente è `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Non così semplice da ricordare...","","La nota positiva è che Git è furbo con gli hash. Richiede un numero di caratteri dell'hash tali da poter identificare in modo univoco il commit. Posso scrivere `fed2` invece dell'hash completo."]}},{type:"ModalAlert",options:{markdowns:["Come detto prima, specificare un commit tramite l'hash non è assolutamente il modo migliore, ragion per cui Git ha i riferimenti relativi. Sono stupendi!","","Tramite i riferimenti relativi, puoi partire da un punto facile da ricordare (per esempio dal ramo `bugFix` o `HEAD`) e procedere da lì.","","Questi riferimenti sono strumenti potenti, introduciamo i più semplici:","","* Risalire di un commit alla volta con `^`","* Risalire di tot commit alla volta con `~`"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diamo un occhiata all'operatore (^) chiamato Caret o accento circonflesso. Ogni volta che lo aggiungi a un riferimento, stai dicendo a Git di cercare il genitore del commit specificato.","",'Quindi, dire `main^` è equivalente a dire "il primo genitore di `main`".',"","`main^^` è il nonno (antenato di seconda generazione) di `main`","","Selezioniamo il commit sopra main."],afterMarkdowns:["Colpito! Fatto. Mille volte meglio che scrivere l'hash."],command:"git checkout main^",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Puoi considerare `HEAD` come un riferimento relativo. Usiamolo un paio di volte per risalire l'albero dei commit."],afterMarkdowns:["Facile! Possiamo viaggiare in dietro nel tempo con `HEAD^`"],command:"git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",beforeCommand:"git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, seleziona il commit padre di `bugFix`. Questo provocherà una detached `HEAD`.","","Puoi usare l'hash se vuoi, ma prova a usare i riferimenti relativi!"]}}]}}}},{}],135:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main"},"bugFix":{"target":"C0","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":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C1","id":"HEAD"}}',solutionCommand:"git branch -f main C6;git checkout HEAD~1;git branch -f bugFix HEAD~1",startTree:'{"branches":{"main":{"target":"C4","id":"main"},"bugFix":{"target":"C5","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":["C2"],"id":"C4"},"C5":{"parents":["C3"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"C2","id":"HEAD"}}',hint:{en_US:"You'll need to use at least one direct reference (hash) to complete this level",fr_FR:"Vous aurez besoin d'utiliser au moins une référence directe (hash) pour compléter ce niveau.",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",ja:"このレベルをクリアするには少なくとも一つの直接リファレンス(hash)を使用する必要があります",ru_RU:"Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень",ko:"이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다.",uk:"Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень",vi:"Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này",sl_SI:"Moral boš uporabiti vsaj eno direktno referenco (hash) za dokončanje te stopnje.",it_IT:"Dovrai usare almeno un riferimento diretto (hash) per completare questo livello",pl:"Aby ukończyć ten poziom, musisz użyć co najmniej jednej bezpośredniej referencji (hasza)."},name:{en_US:"Relative Refs #2 (~)",de_DE:"Relative Referenzen #2 (~)",ja:"相対リファレンス その2 (~)",es_AR:"Referencias relativas #2 (~)",es_ES:"Referencias relativas #2 (~)",es_MX:"Referencias relativas #2 (~)",pt_BR:"Referências relativas #2 (~)",gl:"Referencias relativas #2 (~)",fr_FR:"Références relatives #2 (~)",zh_CN:"相对引用2(~)",zh_TW:"相對引用二(~)",ru_RU:"Относительные ссылки №2",ko:"상대 참조 #2 (~)",uk:"Відносні посилання №2",vi:"Tham chiếu tương đối #2 (~)",sl_SI:"Relativne Reference #2 (~)",it_IT:"Riferimenti relativi #2 (~)",pl:"Referencje względne #2 (~)"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:['### The "~" operator',"","Say you want to move a lot of levels up in the commit tree. It might be tedious to type `^` several times, so Git also has the tilde (~) operator.","","","The tilde operator (optionally) takes in a trailing number that specifies the number of parents you would like to ascend. Let's see it in action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's specify a number of commits back with `~`."],afterMarkdowns:["Boom! So concise -- relative refs are great."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","You're an expert on relative refs now, so let's actually *use* them for something.","","One of the most common ways I use relative refs is to move branches around. You can directly reassign a branch to a commit with the `-f` option. So something like:","","`git branch -f main HEAD~3`","","moves (by force) the main branch to three parents behind HEAD.","","*Note: In a real git environment `git branch -f command` is not allowed for your current branch.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see that previous command in action."],afterMarkdowns:["There we go! Relative refs gave us a concise way to refer to `C1` and branch forcing (`-f`) gave us a way to quickly move a branch to that location."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Now that you have seen relative refs and branch forcing in combination, let's use them to solve the next level.","","To complete this level, move `HEAD`, `main`, and `bugFix` to their goal destinations shown."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:['### El operador "~"',"","Digamos que querés moverte un montón de niveles atrás en tu árbol de commits. Podría ser tedioso tipear `^` muchas veces, por lo que git tiene el operador ~.","","","El operador ~ (opcionalmente) toma una cantidad que especifica la cantidad de padres que querés volver hacia atrás. Veámoslo en acción"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especifiquemos una cantidad de commits hacia atrás con `~`."],afterMarkdowns:["¡Boom! Bien conciso -- las referencias relativas la rompen."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forzando los branches","","Ahora que conocés todo sobre 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. Podés reasignar directamente una rama a un commit usando la opción `-f`. Así que algo como:","","`git branch -f main HEAD~3`","","Mueve (forzadamente) la rama main tres padres atrás de HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Veamos ese comando previo en acción"],afterMarkdowns:["¡Ahí vamos! Las referencias relativas nos dieron 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 main 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, mové `HEAD`, `main` y `bugFix` a sus destinos finales."]}}]},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 main HEAD~3`","","Mueve (forzadamente) la rama main 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 main 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`, `main` y `bugFix` a sus destinos finales."]}}]},es_MX:{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 y por eso Git tiene el operador ~.","","","El operador ~ (opcionalmente) toma la cantidad especificada de padres que quieres volver hacia atrás. Veámoslo en acción"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especifiquemos una cantidad de confirmaciones hacia atrás con `~`."],afterMarkdowns:["¡Vientos! Genial -- las referencias relativas son lo mejor."],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 main HEAD~3`","","Mueve (forzadamente) la rama main 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 breve 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 main 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`, `main` y `bugFix` a sus destinos finales."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:['### O operador "~"',"","Digamos que você queira se mover vários níveis para cima na árvore de commits. Pode ser entediante digitar `^` várias vezes, e por isso o Git possui também o operador til (`~`).","","","Um número pode ser passado (opcionalmente) após o operador til, especificando o número de ancestrais que você deseja subir. Vamos vê-lo em ação"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos especificar um número de commits para trás com `~`."],afterMarkdowns:["Boom! Tão conciso -- referências relativas são incríveis."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forçando os ramos","","Agora que você é um especialista em referências relativas, vamos *usá-las* de fato para alguma coisa.","","Uma das situações mais comuns na qual eu uso referências relativas é quando quero trocar ramos de lugar. Você pode redefinir diretamente o commit para o qual um ramo aponta com a opção `-f`. Desta forma, o seguinte comando:","","`git branch -f main HEAD~3`","","Move (à força) o ramo main 3 ancestrais acima do HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos o comando anterior em ação"],afterMarkdowns:["Aqui vamos nós! As referências relativas nos deram uma forma concisa de nos referirmos ao `C1`, e a movimentação de ramos (com `-f`) nos deu uma forma de apontar rapidamente um ramo para esse local."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Agora que você viu referências relativas e movimentação de ramos combinadas, vamos usá-las para resolver o próximo nível.","","Para completar este nível, mova o `HEAD` e os ramos `main` e `bugFix` para os destinos mostrados no objetivo."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:['### O operador "~"',"","Digamos que queres moverte un montón de commits cara atrás nunha árbore de git. Sería moi tedioso escribir `^` moitas veces, e por iso que git tamén ten o operador (`~`).","","","Pódeselle pasar un número (opcionalmente) despois da tilde, especificando o número de commits que se quere mover cara atrás. Mira como é en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos especificar un número de commits cara atrás con `~`."],afterMarkdowns:["¡Veeeña! Ben apuntado -- as referencias relativas son a leche."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forzando as ramas","","Agora que eres un especialista en referencias relativas, imos *usalas* para algunha cousiña.","","Un dos usos máis comúns para o uso das referencias relativas é para movelas ramas de lugar. Ti podes reasignar directamente unha rama a un commit usando a opción `-f`. Así que con algo coma:","","`git branch -f main HEAD~3`","","Move (de forma forzosa) a rama main 3 commits enriba do HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos o comando anterior en acción"],afterMarkdowns:["¡Agora é o a nosa quenda! As referencias relativas nos darán unha forma concisa de nos referír a `C1`, e forzar a rama (con `-f`) deunos unha forma rápida de movela rama `main` a esa posición."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Xa viches as referencias relativas e o movemento de ramas combinadas, ímolas usar para resolver o próximo exercicio.","","Para completar este nivel, mova o `HEAD` e as ramas `main` e `bugFix` para os destinos mostrados no obxectivo."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:['### L\'opérateur "~"',"","Imaginons que vous souhaitiez remonter beaucoup de niveaux dans l'arbre des commits. Cela peut être ennuyeux d'utiliser `^` plusieurs fois, c'est pourquoi Git a aussi l'opérateur tilde (~).","","","L'opérateur tilde prend optionnellement à sa suite un nombre qui spécifie le nombre de parents que vous souhaitez remonter. Voyons cela en action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spécifions le nombre de commits en arrière avec `~`."],afterMarkdowns:["Boum ! Tellement rapide ! Les références relatives sont géniales."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forcer les branches","","Vous êtes maintenant un expert des références relatives, alors servons-nous en.","","L'une des principales raisons pour lesquelles j'utilise les références relatives est qu'elles permettent de réorganiser les branches. Vous pouvez directement réassigner les branches à un commit avec l'option `-f`. Ainsi la commande suivante :","","`git branch -f main HEAD~3`","","bouge (de force) la branche main à trois parents derrière HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons l'effet de la précédente commande."],afterMarkdowns:["On y est ! Les références relatives nous donnent une méthode concise pour référencer `C1` et le forçage de branche (`-f`) nous donne une méthode rapide pour déplacer une branche à cet emplacement."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Maintenant que vous avez vu les références relatives et le forçage de branche, utilisons-les pour résoudre le niveau suivant.","","Pour compléter ce niveau, bouger `HEAD`, `main`, et `bugFix` à leurs destinations désignées."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:['### Der "~"-Operator',"","Nehmen wir an, du willst viele Schritte im Commit-Baum zurückgehen. Dann wird es schnell mühsam immer wieder `^` einzugeben; deswegen gibt es in Git den Tilde-Operator `~`.","","Der Tilde-Operator akzeptiert optional eine Zahl, mit der du angeben kannst, wie viele Vorgänger du zurückgehen willst. Keine Anzahl anzugeben, bewirkt dasselbe wie `~1`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Geben wir mit `~` an, wie viele Commits wir zurückgehen wollen."],afterMarkdowns:["Peng! So einfach -- relative Referenzen sind super."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Erzwungene Branches","","Du bist jetzt Experte in Sachen relative Referenzen, also lass sie uns mal richtig einsetzen.","","Das Verschieben von Branches ist einer der häufigsten Anwendungsfälle dafür. Du kannst einen Branchnamen direkt auf einen bestimmten Commit setzen (_ohne_ ihn vorher ausgecheckt haben zu müssen!), indem du den Parameter `-f` benutzt. So in etwa:","","`git branch -f main HEAD~3`","","Das bewegt (erzwungenermaßen) den `main` auf den Commit drei Vorgänger vor `HEAD`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns das mal in Aktion an:"],afterMarkdowns:["Das war's schon! Relative Referenzen ermöglichen es uns den Commit `C1` sehr einfach anzugeben und `git branch -f` ermöglicht es uns, den Branch sehr schnell auf diesen Commit zu setzen."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Jetzt wo du relative Referenzen und erzwungenes Branching in Kombination gesehen hast können wir damit den nächsten Level bewältigen.","","Bewege `HEAD`, `main` und `bugFix` an die jeweils angegebenen Positionen, um diesen Level abzuschließen."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### “~”操作符","","如果你想在提交树中向上移动很多步的话,敲那么多 `^` 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 `~`。","","","该操作符后面可以跟一个数字(可选,不跟数字时与 `^` 相同,向上移动一次),指定向上移动多少次。咱们还是通过实际操作看一下吧"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们用 `~` 一次后退四步。"],afterMarkdowns:["多么的简洁 —— 相对引用就是方便啊!"],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### 强制修改分支位置","","你现在是相对引用的专家了,现在用它来做点实际事情。","","我使用相对引用最多的就是移动分支。可以直接使用 `-f` 选项让分支指向另一个提交。例如:","","`git branch -f main HEAD~3`","","上面的命令会将 main 分支强制指向 HEAD 的第 3 级 parent 提交。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["现在咱们来演示一下刚才的命令:"],afterMarkdowns:["这就对了! 相对引用为我们提供了一种简洁的引用提交记录 `C1` 的方式, 而 `-f` 则容许我们将分支强制移动到那个位置。"],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["既然你已经看过相对引用与强制移动分支的演示了,那么赶快使用这些技巧来挑战这一关吧!","","要完成此关,移动 `HEAD`,`main` 和 `bugFix` 到目标所示的位置。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:['### "~" 符號',"","假設需要在 commit tree 中向上移動多個 commit。使用太多 `^` 會非常討人厭,所以 Git 也加入了波浪(~)符號。","","","波浪符號後面可以選擇一個數字(你也可以不選擇),該數字可以告訴 Git 我要向上移動多少個 commit 。舉個例子"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["使用 `~` 一次往上移動多個 commit。"],afterMarkdowns:["哇!太簡潔了 -- 相對引用真的很好用!"],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","你現在是相對引用的高手了,現在用它來實際做點事情。","","我使用相對引用最多的就是移動分支。你可以使用 `-f` 選項直接讓分支指向另一個 commit。舉個例子:","","`git branch -f main HEAD~3`","","(強制)移動 main 指向從 HEAD 往上數的第三個 parent commit。"]}},{type:"ModalAlert",options:{markdowns:["要完成這一關,移動 `HEAD`,`main` 和 `bugFix` 到目標所示的位置。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:['###"~" 演算子',"","コミットツリーの中で複数の段階上へ移動したいとします。毎回毎回`^`と打つのは面倒くさくなるかもしれませんので、gitにはチルダの演算子も備わっています。","","","チルダ演算子のあとには、上へ移動したい親コミットの数を表す数字もオプションでつけられます。実際の動作を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["遡る前のコミット数を`~`で指定しましょう。"],afterMarkdowns:["よっしゃ!効率が良いですね -- 相対リファレンスはなんと便利です。"],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["###ブランチの強制","","今はあなたも相対リファレンスの達人なので、実践的な使い方を覚えましょう。","","相対リファレンスのよくある使い方としてあるのは、ブランチの移動です。`-f`オプションを使ってブランチを直接コミットに関連付けられます。次のようになります","","`git branch -f main HEAD~3`","","mainブランチを(強制的に)HEADより親三代前へと移動します。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["先ほどのコマンドの動作を見てみましょう。"],afterMarkdowns:["できました!相対リファレンスを使うことで、手短く`C1`を指定することができ、`-f`でブランチを強制的にそこへ移動することができました。"],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["相対リファレンスとブランチの強制関連付けを見ましたので、いまここでそれらの方法を使ってみましょう。","","このレベルをクリアするには`HEAD`、`main`、`bugFix`をゴールで指定されている目的位置まで移動してください。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:['### Оператор "~"',"","Предположим, нужно переместиться на много шагов назад по дереву. Было бы неудобно печатать `^` несколько раз (или несколько десятков раз), так что Git поддерживает также оператор тильда (~).","","","К тильде (опционально) можно добавить количество родительских коммитов, через которые нужно пройти. Посмотрим, как это работает."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Укажем после `~` число коммитов, через которые надо пройти."],afterMarkdowns:["Оп! Очевидно, относительные ссылки прекрасны."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Перемещение ветки (branch forcing)","","Теперь мы разбираемся в относительных ссылках, так что можно реально использовать их для дела.","","Одна из наиболее распространённых целей, для которых используются относительные ссылки - это перемещение веток. Можно напрямую прикрепить ветку к коммиту при помощи опции `-f`. Например, команда:","","`git branch -f main HEAD~3`","","Переместит (принудительно) ветку `main` на три родителя назад от `HEAD`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Посмотрим, как работает эта команда"],afterMarkdowns:["Вуаля! Относительная ссылка дала нам возможность просто сослаться на `C1`, а branch forcing (`-f`) позволил быстро переместить указатель ветки на этот коммит."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Мы рассмотрели относительные ссылки и branch forcing вкупе, так что теперь пришло время пройти следующий уровень.","","Чтобы пройти этот уровень, передвинь `HEAD`, `main` и `bugFix` так, как показано на визуализации."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:['### "~" 연산자',"","커밋트리에서 위로 여러 단계를 올라가고 싶을 수 있습니다. `^`를 계속 입력해서 올라가는것 말고 좋은 방법이 있습니다. Git 에는 틸드 (~) 연산자가 있습니다.","",""," (~) 틸드 연산자는 (선택적) 올라가고 싶은 부모의 갯수가 뒤에 숫자가 옵니다. 직접 확인해 보죠."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["돌아가고 싶은 커밋의 갯수를 `~`뒤의 숫자로 명시해 줍시다."],afterMarkdowns:["Boom! 아주 간결합니다. -- 상대 참조는 대단해요."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### 브랜치 강제로 옮기기","","이제 여러분은 상대 참조의 전문가 입니다. 이제 이걸로 무언가를 해봅시다.","","제가 상대 참조를 사용하는 가장 일반적인 방법은 브랜치를 옮길 때 입니다. `-f` 옵션을 이용해서 브랜치를 특정 커밋에 직접적으로 재지정 할 수 있습니다. 이런 식으로 말이죠:","","`git branch -f main HEAD~3`","","(강제로) main 브랜치를 HEAD에서 세번 뒤로 옮겼습니다. (three parents behind HEAD)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["방금의 커맨드를 직접 확인해 봅시다."],afterMarkdowns:["됐네요! 우리는 상대 참조를 통해 `C1`을 간결한 방법으로 참조할 수 있었고 브랜치 강제(`-f`)를 통해 브랜치를 저 위치로 빠르게 옮길 수 있었습니다."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["자 이제 상대 참조와 브랜치 강제의 조합을 봤으니 다음 레벨을 해결해 봅시다.","","이 레벨을 통과하기 위해서, `HEAD`와 `main`과 `bugFix`를 제시되는 골지점으로 옮겨 주십시오."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:['### Оператор "~"',"","Уявімо, що тобі потрібно піднятися досить високо вгору в дереві комітів. Було б трохи напряжно набирати `^` багато разів, тому Git також має оператор тильда(~).","","","До оператор тильда (не обов’язково) можна дописати справа число, що вказує на яку кількість предків потрібно піднятися вверх. Подивимось на практиці"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте вкажемо на яку кількість комітів повернутися з `~`."],afterMarkdowns:["Ка-бум! Так коротко -- відносні посилання прекрасні."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Форсуємо гілку","","Тепер ти експерт в відносних посиланнях, давай же *використаємо* їх для справи.","","Один з найуживаніших прийомів де я використовую відносні посилання це переміщення гілок. Ти можеш напряму переспрямувати бранч на якийсь коміт використавши опцію `-f` (force, тобто насильно). Щось на зразок:","","`git branch -f main HEAD~3`","","Переміщує (насильно) гілку main на три предки позад HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте подивимось на попередню команду в дії"],afterMarkdowns:["Ось і маєш! Відносні посилання дають нам зручний спосіб доступу до коміту `C1`, крім того форсування бранчів (`-f`) дає нам можливість швидко перемістити гілку на цей коміт"],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Тепер, коли ти побачив відносні посилання та форсування гілок в купі, давай використаємо це щоб пройти поточний рівень.","","Щоб пройти цей рівень, перемісти `HEAD`, `main` та `bugFix` так як показано в візуалізації."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:['### Toán tử "~"',"","Giả sử bạn muốn leo lên nhiều cấp trong Git. Dùng `^` vài lần thì tù lắm, nên Git đã có dấu ngã (~) cho việc đó.","","","Theo sau toán tử ngã (~) là số lượng cha ông mà bạn muốn leo lên (không bắt buộc). Xem thử làm thật thì thế nào nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy chỉ định số lượng commit với `~`."],afterMarkdowns:["BÙUM! Quá chuẩn luôn -- tham chiếu tương đối tuyệt vời."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Branch forcing","","Giờ thì bạn là cao thủ về tham chiếu tương đối rồi, *làm* thật thôi chứ nhỉ.","","Tôi thì hay thường dùng tham chiếu tương đối để dịch chuyển nhánh. Bạn có thể trực tiếp gán lại nhánh cho commit với cú pháp `-f`. Kiểu như thế này:","","`git branch -f main HEAD~3`","","dịch chuyển (ép buộc) nhánh main lên 3 commit phía trên HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Xem thử cái lệnh trên hoạt động sao nào."],afterMarkdowns:["Đóóóó! Tham chiếu tương đối cho chúng ta một cách chuẩn xác để trỏ tới `C1` và ép nhánh bằng (`-f`) để dịch chuyển nhanh chóng nhánh tới đó."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Bây giờ khi bạn đã biết về các tham chiếu tương đối và ép buộc nhánh, hãy sử dụng chúng để giải quyết cấp độ tiếp theo","","Để hoàn thành cấp độ này, chuyển `HEAD`, `main`, và `bugFix` đến mục tiêu được xác định của chúng."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:['### Operator "~"',"","Recimo, da se želiš premakniti veliko stopenj višje po drevesu commitov. Malo je nerodno večkrat tipkati `^`, zato ima Git tudi tilda (~) operator.","","","Tilda operator (opcijsko) sprejme številko, ki določi, koliko staršev bi se rad povzpel po drevesu. Poglejmo to v praksi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Določimo število prejšnjih commitov z `~`."],afterMarkdowns:["Boom! Tako jedrnato -- relativne reference so super."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forcanje Branchev","","Sedaj si strokovnjak za relativne reference, zato jih končno *uporabimo* za nekaj.","","Eden izmed najpogostejših načinov, kjer uporabljam relativne reference je za premikanje branchev naokoli. Direktno lahko premakneš branch na nek commit z `-f` opcijo. Takole nekako:","","`git branch -f main HEAD~3`","","premakne (s force-om) main branch tri commite za HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si prejšnji ukaz v praksi."],afterMarkdowns:["Tako ja! Relativne reference so nam dale jedrnat način s katerim se lahko nanašamo na `C1` in branch force-anje (`-f`) nam je omogočilo, da hitro prestavimo branch na to lokacijo."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Sedaj ko smo si pogledali relativne reference in force branchanje v kombinaciji, uporabimo to, da rešimo naslednjo stopnjo.","","Za dokončanje te stopnje, premakni `HEAD`, `main` in `bugFix` na njihove ciljne prikazane destinacije."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:['### Operator "~"',"","Powiedzmy, że chcesz przejść o wiele poziomów wstecz na drzewie commitów. Wielokrotne wpisywanie `^` może być męczące. Na tę okazję Git ma również operator - tyldę (~).","","","Do operatora tyldy możesz (opcjonalnie) dodać numer, który określa, o jaką liczbę rodziców chcesz się cofnąć. Zobaczmy, jak to działa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Podajmy liczbę commitów, które chcemy przeskoczyć, za `~`."],afterMarkdowns:["Tadam! Ale szybko - referencje względne są czadowe."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forsowanie gałęzi","","Jesteś teraz ekspertem ds. referencji. *Wykorzystajmy* je do czegoś.","","Jednym z najczęstszych sposobów, w jaki korzystam z referencji względnych, są działania na gałęziach. Możesz bezpośrednio przypisać gałąź do commita za pomocą opcji `-f`. Na przykład tak:","","`git branch -f main HEAD~3`","","przenosi (na siłę) gałąź `main` trzy commity wstecz - za HEADa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak działa poprzednie polecenie."],afterMarkdowns:["Proszę bardzo! Referencje względne umożliwiły ci odnieść się w zwięzły sposób do `C1`, a forsowanie gałęzi (`-f`) pozwoliło na szybkie przeniesienie gałęzi w to konkretne miejsce."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Teraz, gdy wiesz już, jak połączyć referencje względne i forsowanie gałęzi, użyj ich do rozwiązania następnego poziomu.","","Aby ukończyć ten poziom, przenieś `HEAD`, `main` oraz `bugFix` do wskazanych celów."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:['### L\'operatore "~"',"","Nel caso in cui voglia risalire di più livelli l'albero dei commit, è una seccatura aggiungere `^` per ogni salto, per questo Git ha l'operatore tilde(~).","","","A questo operatore si può (facoltativamente) aggiungere un numero che specifica di quanti livelli si vuole risalire l'albero dei commit. Vediamolo in azione."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Specifichiamo il numero di commit con `~`."],afterMarkdowns:["Fatto! Breve ed efficace -- i riferimenti relativi sono stupendi."],command:"git checkout HEAD~4",beforeCommand:"git commit; git commit; git commit"}},{type:"ModalAlert",options:{markdowns:["### Forzatura dei rami (branch forcing)","","Ormai sei un esperto di riferimenti relativi, quindi facciamone realmente *uso* per qualcosa.","","Uno dei motivi più comuni per cui uso i riferimenti relativi è per spostare i rami. E' possibile assegnare un ramo a un commit con l'opzione `-f`. Per esempio:","","`git branch -f main HEAD~3`","","sposta (con la forza) il ramo main al terzo antenato di HEAD."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamolo in azione."],afterMarkdowns:["Ecco qua! I riferimenti relativi ci permettono facilmente di specificare `C1` e il branch forcing (`-f`) ci da modo di spostare rapidamente il ramo su quella posizione."],command:"git branch -f main HEAD~3",beforeCommand:"git commit; git commit; git commit; git checkout -b bugFix"}},{type:"ModalAlert",options:{markdowns:["Ora che hai visto i riferimenti relativi e il branch forcing, usiamoli per completare il prossimo livello.","","Per completare questo livello, sposta `HEAD`, `main`, e `bugFix` alla loro destinazione finale mostrata nell'obiettivo."]}}]}}}},{}],136:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22main%22%7D%2C%22pushed%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22pushed%22%7D%2C%22local%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22local%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C2%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22pushed%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git reset HEAD~1;git checkout pushed;git revert HEAD",compareOnlyBranches:!0,startTree:'{"branches":{"main":{"target":"C1","id":"main"},"pushed":{"target":"C2","id":"pushed"},"local":{"target":"C3","id":"local"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"local","id":"HEAD"}}',name:{en_US:"Reversing Changes in Git",de_DE:"Änderungen in Git rückgängig machen",ja:"変更を元に戻す",fr_FR:"Annuler des changements avec Git",es_AR:"Revirtiendo cambios en git",es_ES:"Revirtiendo cambios en git",es_MX:"Revirtiendo cambios en Git",pt_BR:"Revertendo mudanças no Git",gl:"Revertindo cambios en git",ko:"Git에서 작업 되돌리기",zh_CN:"撤销变更",zh_TW:"在 git 中取消修改 ",ru_RU:"Отмена изменений в Git",uk:"Відміна змін в Git",vi:"Hoàn tác thay đổi trong Git",sl_SI:"Revertanje Sprememb v Gitu",it_IT:"Annullare i cambiamenti in Git",pl:"Odwracanie zmian w Gicie"},hint:{en_US:"Notice that revert and reset take different arguments.",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_MX:"Observa que revert y reset utilizan 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 使用的参数不同。",zh_TW:"注意 revert 和 reset 使用不同的參數。",ko:"revert와 reset이 받는 인자가 다름을 기억하세요",ja:"revertとresetとで引数が異なることに注意。",ru_RU:"Обрати внимание, что revert и reset принимают разные параметры.",uk:"Зверни увагу на те що revert та reset приймають різні параметри",vi:"Lưu ý rằng hoàn tác (revert) và đặt lại (reset) có những đối số khác nhau.",sl_SI:"Revert in reset sprejmeta različne argumente.",it_IT:"Revert e reset hanno parametri diversi.",pl:"Zauważ, że revert i reset przyjmują różne argumenty"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Reversing Changes in Git","","There are many ways to reverse changes in Git. And just like committing, reversing changes in Git has both a low-level component (staging individual files or chunks) and a high-level component (how the changes are actually reversed). Our application will focus on the latter.","","There are two primary ways to undo changes in Git -- one is using `git reset` and the other is using `git revert`. We will look at each of these in the next dialog",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` reverses changes by moving a branch reference backwards in time to an older commit. In this sense you can think of it as "rewriting history;" `git reset` will move a branch backwards as if the commit had never been made in the first place.',"","Let's see what that looks like:"],afterMarkdowns:["Nice! Git moved the main branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'While resetting works great for local branches on your own machine, its method of "rewriting history" doesn\'t work for remote branches that others are using.',"","In order to reverse changes and *share* those reversed changes with others, we need to use `git revert`. Let's see it in action."],afterMarkdowns:["Weird, a new commit plopped down below the commit we wanted to reverse. That's because this new commit `C2'` introduces *changes* -- it just happens to introduce changes that exactly reverses the commit of `C2`.","","With reverting, you can push out your changes to share with others."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["To complete this level, reverse the most recent commit on both `local` and `pushed`. You will revert two commits total (one per branch).","","Keep in mind that `pushed` is a remote branch and `local` is a local branch -- that should help you choose your methods."]}}]},es_AR:{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 esos a continuación",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` revierte los cambios moviendo la referencia de una rama hacia atrás en el tiempo a un commit anterior. En este sentido podés pensarlo 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 main 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 genial para ramas locales en tu máquina, su método de "reescribir la historia" no funciona para ramas remotas que utilizan otras personas.',"","Para revertir cambios y *compartir* esa _revertida_ con el resto, 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 usás revert, podés pushear ese cambio para compartirlo con otros."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, revertí el commit más reciente, 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."]}}]},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 main 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, revierte el commit más reciente, 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."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Revirtiendo cambios en Git","","Hay varias maneras de revertir cambios en Git. Y tal como al confirmar, 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 se ve eso:"],afterMarkdowns:["¡Genial! git simplemente movió la referencia de la rama main 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 reiniciar (reset) 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, revierte el commit más reciente, 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:[{type:"ModalAlert",options:{markdowns:["## Revertendo Mudanças no Git","","Existem várias maneiras de reverter mudanças no Git. E assim como o ato de commitar, reverter mudanças no Git também tem um componente de baixo nível (a preparação, ou staging, de arquivos ou trechos de arquivos individuais) e um componente de alto nível (como as mudanças são, de fato, revertidas). Aqui vamos focar neste último ponto.","","Há duas maneiras principais de desfazer mudanças no Git -- uma delas é usando `git reset`, e a outra é usando `git revert`. Vamos olhar cada uma delas na próxima janela",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'O comando `git reset` reverte mudanças movendo para trás no tempo (para um commit mais antigo) a referência do ramo. Desta forma, você pode pensar nessa operação como uma "reescrita do histórico"; o `git reset` vai mover o ramo para trás como se o commit nunca tivesse existido.',"","Vejamos como funciona:"],afterMarkdowns:["Legal! O Git simplesmente moveu a referência do ramo main de volta para `C1`; agora o nosso repositório local está em um estado como se o `C2` nunca tivesse acontecido."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Embora o reset funcione muito bem em ramos locais no seu próprio computador, o método utilizado de "reescrever o histórico" não funciona com ramos remotos que outras pessoas estejam usando.',"","Para reverter mudanças e conseguir *compartilhar* essas mudanças com os outros, precisamos usar o `git revert`. Vejamo-lo em ação"],afterMarkdowns:["Estranho, um novo commit surgiu abaixo do commit que queríamos reverter. Isso é porque o novo commit `C2'` introduz *mudanças* -- acontece que as mudanças que ele introduz revertem exatamente aquelas do commit `C2`.","","Com o `revert`, você pode fazer `push` das suas mudanças para compartilhá-las com os outros."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, reverta o commit mais recente tanto em `local` como em `pushed`.","","Tenha em mente que `pushed` é um ramo remoto, e `local` é um ramo local -- isso deve ajudá-lo a escolher o método apropriado."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Revertindo cambios en Git","","Existen varias formas de revertir os cambios en git. E, como cando se fai commit, desfacer cambios supon unha operación de baixo nivel (a indexación de arquivos ou trozos de eles) e unha operación de alto nivel (desfacer os cambios xa aplicados). Aquí ímonos enfocar neste último punto.","","Hai dúas formas de desfacer os cambios en git -- unha delas é `git reset`, e a outra é usando `git revert`. Imos comparalas na próxima ventá.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'O comando `git reset` desfai os cambios movendo a referencia dunha rama cara un commit máis antigo na rama. Desta forma, podes pensar nesta operación como "reescritura do histórico"; o `git reset` vai movela rama cara atrás, como se ós commits nunca antes se fixeran.',"","Vexamos o seu funcionamento:"],afterMarkdowns:["¡Bye bye! Git moveu a referencia da rama main cara atrás, ata o commit `C1`; agora o teu repositorio local está coma se o commit `C2` nunca acontecera."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Mentres que resetear os cambios funciona xenial para as ramas locales na túa máquina, o método utilizado de "reescribir o histórico" non funciona con ramas remotas que outra xente usa.',"","Para revervir os cambios e *compartir* eses cambios ca outra xente, precisamos usar `git revert`. Atende a cómo funciona."],afterMarkdowns:["Estrano, xurdíu un novo commit por baixo do commit que queriamos desfacer. Iso é porque o novo commit `C2'` engadíu *cambios* -- o que pasa é que o commit desfai exactamente os cambios feitos no commit `C2`.","","Con `revert`, ti podes facer `push` dos teus cambios para compartilos cos outros."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, reverte o commit máis recente tanto en `local` como en `pushed`.","","Ten en mente que `pushed` é unha rama remota, e `local` é unha rama local -- Iso poida que te axude a aplicar o método apropriado."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Änderungen in Git rückgängig machen","","Es gibt viele Möglichkeiten, Änderungen in Git zurückzunehmen. Und ebenso wie das Committen hat auch das Rückgängigmachen eine Basis-Komponente (Dateien und Inhalte vormerken) und einen übergeordneten Aspekt (wie die Änderungen tatsächlich zurückgenommen werden). Dieses Level beschäftigt sich mit den übergeordneten Vorgängen.","","Es gibt grundsätzlich zwei Arten in Git etwas rückgängig zu machen -- einerseits `git reset` und andererseits `git revert`. Wir schauen uns beide mal an.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` nimmt Änderungen zurück, indem es eine Branch-Referenz auf einen anderen Commit setzt. Es ist ein bisschen (aber nicht wirklich) wie "Geschichte umschreiben"; `git reset` bewegt einen Branch auf einen anderen Commit, als hätte er nie anders ausgesehen.',"","Schauen wir, wie das aussieht:"],afterMarkdowns:["Schick! Git hat den `main` einfach auf `C1` gesetzt; unser lokales Repository sieht nun so aus, als hätte `C2` nie stattgefunden."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Obwohl `git reset` super im lokalen Kontext funktioniert, ist der Ansatz vom "Umschreiben" der Commit-Geschichte nicht geeignet für Branches, die auf einem Server liegen und auch von anderen benutzt werden.',"","Um Änderungen rückgängig zu machen und das mit anderen zu *teilen* müssen wir `git revert` benutzen. Schauen wir uns das in Aktion an."],afterMarkdowns:["Komisch, es ist ein neuer Commit entstanden. Das liegt daran, dass `C2'` genau die *Änderungen* enthält, die die Änderungen aus `C2` aufheben.","","Durch Reverten kannst du das Zurücknehmen von Änderungen mit anderen teilen."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level abzuschließen musst du sowohl auf `local` als auch auf `pushed` jeweils den letzten Commit zurücknehmen.","","Vergiss nicht, dass `pushed` auch auf einem Server liegt und `local` ein rein lokaler Branch ist -- das sollte dir helfen, die richtige Methode zu wählen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 変更を元に戻す","","Gitでは変更を元に戻す方法がたくさんあります。コミットと同じように、低レベルな動作(ファイル別だったりファイルの中の一部だったり)も高レベルな動作(変更のまとまりのキャンセル)もできます。このアプリケーションでは後者の方法について紹介します。","","基本的な巻き戻しの方法は2つあります -- 一つは`git reset`を使う方法で、もう1つは`git revert`を使う方法です。次のダイアログで一つ一つを見ていきます。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset`はブランチのポインタを後方に移動することで変更のキャンセルを実現します。履歴を上書きするような動作だと思うと良いでしょうか。`git reset`はそもそも前のコミットなんかなかったかのように、ブランチのポインタを元に戻してくれます。","","どういう感じか見てみましょう。"],afterMarkdowns:["いいですね!Gitは単純にmainブランチへのポインタを`C1`へ戻しました。これでこのローカルリポジトリにはまるで`C2`なんて無かったかのように変更をキャンセルできました。"],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","自分のマシン上のブランチではさっきの`git reset`でうまくいきましたが、この「履歴を上書きする」手段は、他の人も使っているリモートにあるリポジトリに対しては使うことができません。","","変更を巻き戻して他の人とそれを共有するためには、`git revert`を使う必要があります。今度はこれを見てみましょう。"],afterMarkdowns:["あれ、おかしいな。巻き戻したいと思ってたコミットの下に新しいコミットが出来上がってしまったみたいです。そう、この新しい`C2'`コミットには`C2`コミットの内容を巻き戻す変更が含まれているのです。","","こんな風にして、巻き戻した内容を他人と共有するためにはrevertを使います。"],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["この章の仕上げに、`local`と`pushed`の両方の直近のコミットを巻き戻してみましょう。","","`pushed`はリモートのブランチで、`local`はローカルであることに注意。正しくコマンドを使い分けましょう。"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Annuler des changements avec Git","","Il y a de nombreuses façons d'annuler des changements avec Git. De même que pour les commits, annuler des changements avec Git est à la fois un aspect bas niveau (gestion des fichiers et morceaux de fichiers) et un aspect de plus haut niveau (comment les changements sont effectivement annulés). Nous allons nous intéresser à ce dernier point.","","Il y a principalement deux façons d'annuler des changements avec Git : l'une est `git reset` et l'autre est `git revert`. Nous allons maintenant voir chacune d'entre elles.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset` annule des changements en déplaçant la référence en arrière dans le temps sur un commit plus ancien. En ce sens, on peut considérer cela comme une façon de \"réécrire l'histoire\"; `git reset` fait remonter une branche en arrière comme si le(s) commit(s) n'avai(en)t jamais eu lieu.","","Regardons à quoi cela ressemble :"],afterMarkdowns:["Bravo ! Git a simplement déplacé la référence de la branche main en la faisant revenir sur `C1`; désormais notre dépôt est dans le même état que si `C2` n'avait jamais eu lieu."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","Bien que le reset marche parfaitement pour les branches locales sur notre propre machine, cette façon de \"réécrire l'histoire\" ne marche pas avec les banches distantes (remote) que d'autres personnes utilisent.","","Pour pouvoir annuler des changements et *partager* ces annulations avec d'autres, nous devons utiliser `git revert`. Regardons comment cela fonctionne."],afterMarkdowns:["Étrangement, un nouveau commit est apparu en bas sous le commit que nous voulions annuler. C'est parce que ce nouveau commit `C2'` introduit des *modifications* -- celles qui correspondent justement à l'annulation de celles du commit `C2`.","","Avec revert, vous pouvez diffuser (push) vos modifications et les partager avec tout le monde."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Pour accomplir ce niveau, annulez les derniers commits à la fois sur `local` et sur `pushed`. Vous devez annuler en tout 2 commits (un pour chaque branche).","","Ayez à l'esprit que `pushed` est une branche distante et `local` est une branche locale ; cela devrait vous guider dans le choix de la méthode à employer."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 撤销变更","","在 Git 里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。","","主要有两种方法用来撤销变更 —— 一是 `git reset`,还有就是 `git revert`。接下来咱们逐个进行讲解。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","","`git reset` 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。`git reset` 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。","","让我们来看看演示:"],command:"git reset HEAD~1",afterMarkdowns:["漂亮! Git 把 main 分支移回到 `C1`;现在我们的本地代码库根本就不知道有 `C2` 这个提交了。","","(译者注:在reset后, `C2` 所做的变更还在,但是处于未加入暂存区状态。)"],beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","虽然在你的本地分支中使用 `git reset` 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!","","为了撤销更改并**分享**给别人,我们需要使用 `git revert`。来看演示:"],command:"git revert HEAD",afterMarkdowns:["奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 `C2'` 引入了**更改** —— 这些更改刚好是用来撤销 `C2` 这个提交的。也就是说 `C2'` 的状态与 `C1` 是相同的。","","revert 之后就可以把你的更改推送到远程仓库与别人分享啦。"],beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["要完成此关,分别撤销 `local` 分支和 `pushed` 分支上的最近一次提交。共需要撤销两个提交(每个分支一个)。","","记住 `pushed` 是远程分支,`local` 是本地分支 —— 这么说你应该知道用分别哪种方法了吧?"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 取消 git 的修改","","在 git 裡面取消修改的方法很多。和 commit 一樣,在 git 裡面取消修改同時具有底層的部份(暫存一些獨立的文件或者片段)和高層的部份(修改是如何被取消)。我們主要講的重點是後者。","","在 git 裡主要用兩種方法來取消修改,一種是 `git reset`,另外一種是 `git revert`。讓我們在下一個對話視窗中逐一瞭解它們。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` 把分支的參考點退回到上一個 commit 來取消修改。你可以認為這是在"重寫歷史"。`git reset` 往回移動 branch,原來的 branch 所指向的 commit 好像從來沒有存在過一樣。',"","讓我們來看看要怎麼操作:"],command:"git reset HEAD~1",afterMarkdowns:["太好了! Git 把 main branch 簡單地移回到 `C1`;現在在我們的 local 已經退回到沒有 commit 過 `C2` 的狀態了。"],beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","雖然在你的 local branch 中使用 `git reset` 很方便,但是這種「改寫歷史」的方法對別人的 remote branch 是無效的哦!","","為了取消修改並且把這個狀態*分享*給別人,我們需要使用 `git revert`。舉個例子"],command:"git revert HEAD",afterMarkdowns:["很奇怪吧!在我們要取消的 commit 後面居然多了一個新的 commit!這是因為新的 commit `C2'` 引入了*修改*——用來表示我們取消 `C2` 這個 commit 的修改。","","多虧了 revert,現在可以把你的修改分享給別人啦。"],beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,分別取消 `local` branch 和 `pushed` branch 上的最近的一次 commit。","","記住 `pushed` 是一個 remote branch,`local` 是一個 local branch,有了這麼明顯的提示應該知道要用哪種方法了吧?"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git에서 작업 되돌리기","","Git에는 작업한 것을 되돌리는 여러가지 방법이 있습니다. 변경내역을 되돌리는 것도 커밋과 마찬가지로 낮은 수준의 일(개별 파일이나 묶음을 스테이징 하는 것)과 높은 수준의 일(실제 변경이 복구되는 방법)이 있는데요, 여기서는 후자에 집중해 알려드릴게요.","","Git에서 변경한 내용을 되돌리는 방법은 크게 두가지가 있습니다 -- 하나는 `git reset`을 쓰는거고, 다른 하나는 `git revert`를 사용하는 것입니다. 다음 화면에서 하나씩 알아보겠습니다.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git 리셋(reset)","",'`git reset`은 브랜치로 하여금 예전의 커밋을 가리키도록 이동시키는 방식으로 변경 내용을 되돌립니다. 이런 관점에서 "히스토리를 고쳐쓴다"라고 말할 수 있습니다. 즉, `git reset`은 마치 애초에 커밋하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것입니다.',"","어떤 그림인지 한번 보죠:"],afterMarkdowns:["그림에서처럼 main 브랜치가 가리키던 커밋을 `C1`로 다시 옮겼습니다; 이러면 로컬 저장소에는 마치 `C2`커밋이 아예 없었던 것과 마찬가지 상태가 됩니다."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git 리버트(revert)","",'각자의 컴퓨터에서 작업하는 로컬 브랜치의 경우 리셋(reset)을 잘 쓸 수 있습니다만, "히스토리를 고쳐쓴다"는 점 때문에 다른 사람이 작업하는 리모트 브랜치에는 쓸 수 없습니다.',"","변경분을 되돌리고, 이 되돌린 내용을 다른 사람들과 *공유하기* 위해서는, `git revert`를 써야합니다. 예제로 살펴볼게요."],afterMarkdowns:["어색하게도, 우리가 되돌리려고한 커밋의 아래에 새로운 커밋이 생겼습니다. `C2`라는 새로운 커밋에 *변경내용*이 기록되는데요, 이 변경내역이 정확히 `C2` 커밋 내용의 반대되는 내용입니다.","","리버트를 하면 다른 사람들에게도 변경 내역을 밀어(push) 보낼 수 있습니다."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["이 레벨을 통과하려면, `local` 브랜치와 `pushed` 브랜치에 있는 최근 두 번의 커밋을 되돌려 보세요.","","`pushed`는 리모트 브랜치이고, `local`은 로컬 브랜치임을 신경쓰셔서 작업하세요 -- 어떤 방법을 선택하실지 떠오르시죠?"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Отмена изменений в Git","","Есть много путей для отмены изменений в Git. Так же как и коммит, отмена изменений в Git возможна и на низком уровне (добавление в коммит отдельных файлов и наборов строк), и на высоком (как изменения реально отменяются). Сейчас сфокусируемся на высокоуровневой части.","","Есть два основных способа отмены изменений в Git: первый - это `git reset`, а второй - `git revert`. Попробуем оба на следующем шаге.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` отменяет изменения, перенося ссылку на ветку назад, на более старый коммит. Это своего рода "переписывание истории"; `git reset` перенесёт ветку назад, как будто некоторых коммитов вовсе и не было.',"","Посмотрим, как это работает:"],afterMarkdowns:["Неплохо! Git просто перенёс ссылку на `main` обратно на коммит `C1`. Теперь наш локальный репозиторий в состоянии, как будто `C2` никогда не существовал."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","","Reset отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи.","","Чтобы отменить изменения и поделиться отменёнными изменениями с остальными, надо использовать `git revert`. Посмотрим, как это работает"],afterMarkdowns:["Забавно, появился новый коммит. Дело в том, что новый коммит `C2'` просто содержит изменения, полностью противоположные тем, что сделаны в коммите `C2`.","","После `revert` можно сделать `push` и поделиться изменениями с остальными."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, отмени два последних коммита и в `local`, и в `pushed`","","Помни, что `pushed` - это remote ветка, а `local` - это локальная ветка. Это поможет выбрать способ отмены изменений."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Відміна змін в Git","","Є декілька шляхів відмини змін в Git. І так само як і коміти, зміни в гіт можна відміняти використовуючи або низькорівневі методи (додавання в коміт окремих файлів) так і високорівневі. Ми зосередемось на останніх.","","Є два основні шляхи відміни змін в Git -- перший це використовувати `git reset` й інший це `git revert`. В наступному слайді ми подивимося на кожний з них",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` відміняє зміни переміщуючи вказівник гілки назад в історії на старіший коміт. В принципі, можна вважати що це певне "переписування історії;" Коли `git reset` перемістить гілку назад буде здаватися, що відмінений коміт взагалі ніколи не створювався.',"","Давайте подивимося, як це виглядає:"],afterMarkdowns:["Чудово! Git перемістив посилання гілки main назад до `C1`; тепер наш локальний репозиторій в такому стані, наче коміту `C2` ніколи не було."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Команда reset чудово працює для локальних бранчів на власному комп’ютері, але так як вона спричиняє "переписування історії", її не можна використовувати в ситуації коли кілька користувачів працюють з цим бранчем',"","Для того щоб відкотити зміни й потім *поділитися* цими відкоченими змінами з друзями, потрібно використовувати `git revert`. Давай подивимось на прикладі"],afterMarkdowns:["Дивно, був створений новий коміт, нижче того коміту який ми хотіли відкотити. Це сталося тому що новий коміт `C2'` містить *зміни* які повністю протилежні змінам `C2`.","","Після revert, ти зможеш зробити push щоб поділитися гілкою з іншими."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень відміни два останні коміти на гілках `local` та `pushed`.","","Зауваж, що `pushed` це віддалена гілка, а `local` це локальна гілка -- це має допомогти з вибором методу."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Hoàn tác trong Git","","Có rất nhiều cách để hoàn tác thay đổi trong Git. Và cũng tương tự như commit, hủy thay đổi trong Git có cả thành phần bậc thấp (tạm thời lưu trữ một số tệp hoặc đoạn độc lập) và thành phần bậc cao (cách mà các thay đổi thực sự bị hủy). Ứng dụng của chúng tôi tập trung vào cái sau.","","Có 2 cách cơ bản để hủy thay đổi trong Git -- một là dùng `git reset`, hai là dùng `git revert`. Chúng ta sẽ xem xét từng cái trong hộp thoại sau",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` hoàn tác bằng cách chuyển tham chiếu của nhánh ngược lên commit cũ hơn. Bạn có thể hiểu nó như kiểu "viết lại lịch sử;" `git reset` sẽ dịch chuyển nhánh lên trên như thể commit chưa bao giờ được tạo ra vậy.',"","Cùng xem thử nó trông thế nào nào:"],afterMarkdowns:["Hay! Git chuyển tham chiếu của main trở lại `C1`; bây giờ kho lưu trữ trông như thể commit `C2` chưa bao giờ xảy ra vậy."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Trong khi git reset hoạt động rất tốt tại nhánh cục bộ trên máy cá nhân, cách thức "viết lại lịch sử" chẳng hề có tác dụng lên nhánh ở từ xa mà người khác sử dụng.',"","Để có thể hoàn tác và *chia sẻ* hoàn tác đó với người khác, thì ta cần sử dụng `git revert`. Xem thử cách thức nó hoạt động nào"],afterMarkdowns:["Lạ nhỉ, một commit mới được thả vào bên dưới commit mà ta muốn hoàn tác. Đó là bởi vì commit mới `C2'` này có chứa những *thay đổi* hoàn toàn ngược lại với những thay đổi trong commit `C2`.","","Dùng revert thì bạn có thể đẩy thay đổi mình lên và chia sẻ với người khác."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, hoàn tác commit gần nhất trên cả `local` và `pushed`. Bạn sẽ hoàn tác tổng cộng 2 commit (một trên mỗi nhánh).","","Nhớ rằng `pushed` là nhánh từ xa và `local` là nhánh cục bộ -- như thế thì bạn sẽ chọn được phương án phù hợp."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Revertanje Sprememb v Gitu","","Veliko načinov je, kako revertati (razveljaviti) spremembe v Gitu. In tako kot commitanje ima tudi revertanje sprememb v Gitu low-level komponente (stageanje posameznih datotek ali kosov) in high-level komponente (kako so spremembe dejansko povrnjene). Naša aplikacija se bo osredotočila na slednje.","","Obstajata dva glavna načina kako razveljaviti spremembe v Gitu -- prvi je uporaba `git reset` in drugi je uporaba `git revert`. V naslednjem dialogu si bomo pogledali oba pristopa.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` povrne spremembe tako, da prestavi referenco brancha na starejši commit. Lahko si predstavljaš kot "pisanje zgodovine na novo"; `git reset` bo prestavil branch nazaj, kot da se commiti sploh niso zgodili.',"","Poglejmo kako to izgleda:"],afterMarkdowns:["Lepo! Git je premaknil main branch referenco nazaj na `C1`; sedaj je naš lokalen repozitorij v stanju, kot da se `C2` sploh ni nikoli zgodil."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Medtem ko ponastavljanje z reset deluje super na lokalnih brancih na tvoji mašini, njegova metoda "prepisovanja zgodovina" ne deluje na remote brancih, ki jih uporabljajo drugi.',"","Če želimo ponastaviti spremembe in *deliti* te ponastavitve z drugimi, moramo uporabiti `git revert`. Poglejmo si to v praksi."],afterMarkdowns:["Čudno, nov commit se je naredil pod commitom, ki smo ga želeli reversati. To je zato, ker ta nov commit `C2'` uvede *spremembe* -- spremembe so pač v tem primeru točno nasprotne od `C2`.","","Z revertanjem lahko pushas in deliš svoje spremembe tudi z drugimi."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, povrni oba zadnja commita, tako na `local` kot na `pushed` brancih. Skupno boš revertal dva commita (enega na branch).","","Upoštevaj, da je `pushed` oddaljen branch in `local` lokalen branch -- to bi ti moralo pomagati izbrati metodo."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Odwracanie zmian w Gicie","","Istnieje wiele sposobów na odwrócenie zmian w Gicie. Podobnie jak w przypadku commitowania, odwracanie zmian w Gicie ma zarówno komponent niskopoziomowy (zapisywanie stanów plików lub ich fragmentów), jak i wysokopoziomowy (sposób, w jaki zmiany są faktycznie odwracane). Nasza aplikacja skupi się na tym ostatnim.","","Istnieją dwa podstawowe sposoby na cofnięcie zmian w Gicie - jeden z nich to `git reset`, a drugi `git revert`. W następnym oknie przyjrzymy się każdemu z nich.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` odwraca zmiany poprzez przesunięcie referencji gałęzi wstecz w czasie do starszego commita. Można myśleć o tym jako "przepisywaniu historii"; "resetowanie" spowoduje cofnięcie gałęzi, tak jakby commit nigdy nie został dodany.',"","Sprawdźmy, jak to działa:"],afterMarkdowns:["Nieźle! Git przeniósł referencję gałęzi `main` do `C1`; teraz nasze lokalne repozytorium jest w takim stanie, jakby commita `C2` nigdy nie było."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Mimo że resetowanie działa świetnie w przypadku lokalnych gałęzi na twoim komputerze, jego metoda "przepisywania historii" nie działa dla gałęzi zdalnych, które są używane przez innych.',"","W celu odwrócenia zmian i *podzielenia się* nimi z innymi, musimy użyć `git revert`. Zobaczmy, jak to działa."],afterMarkdowns:["Dziwne, nowy commit spadł poniżej tego, który chcieliśmy odwrócić. To dlatego, że ten nowy commit `C2'` wprowadza *zmiany* -- akurat takie, które idealnie odwracają commit `C2`.","","Dzięki `git revert` możesz wypchnąć swoje zmiany, by podzielić się nimi z innymi."],command:"git revert HEAD",beforeCommand:"git commit"}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Annullare i cambiamenti in Git","","Esistono molti modi per annullare i cambiamenti in Git. Come la creazione di commit, anche l'annullamento in Git ha sia una componente di basso livello (tracciatura dei singoli file o blocchi) e uno di alto livello (come l'annullamento viene realmente eseguito). La nostra applicazione si concentrerà su quest'ultima.","","Ci sono due modi principali per annullare con Git -- uno è usare `git reset` e l'altro è `git revert`. Entreremo nel dettaglio per entrambi.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Reset","",'`git reset` annulla le modifiche spostando il puntatore al ramo indietro nel tempo a un commit precedente. Puoi vederla come se stessi "riscrivendo la storia;" `git reset` torna al commit precedente come se il nuovo commit non fosse mai esistito.',"","Vediamone una rappresentazione:"],afterMarkdowns:["Grande! Git ha spostato il puntatore del ramo main the main sul commit `C1`; ora il nostro repository locale è come se non avesse mai avuto un commit `C2`."],command:"git reset HEAD~1",beforeCommand:"git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["## Git Revert","",'Git reset funziona perfettamente in locale sul proprio computer, ma la funzione di "riscrivere la storia" non va d\'accordo con i rami salvati in remoto utilizzati da altri colleghi.',"","Per fare in modo di annullare e *condividere* con gli altri le modifiche annullate, dobbiamo usare `git revert`. Vediamolo in azione."],afterMarkdowns:["Strano, un nuovo commit è stato creato sotto il commit che volevamo annullare. Questo perché il nuovo commit `C2'` porta *cambiamenti* -- per l'esattezza i cambiamenti sono quelli che annullano il commit `C2`.","","Con git revert, aggiungi i cambiamenti che possono essere poi condivisi con altri."],command:"git revert HEAD",beforeCommand:"git commit"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, annulla i commit più recenti sia in `local` che in `pushed`. Alla fine annullerai due commit in totale (uno per ramo).","","Tieni presente che `pushed` è un ramo remoto e `local` è un ramo locale -- questo dovrebbe aiutarti a scegliere quale metodo usare."]}}]}}}},{}],137:[function(e,t,o){o.level={compareOnlyMainHashAgnostic:!0,disabledMap:{"git revert":!0,"git cherry-pick":!0},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%7D%2C%22bugFix%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22bugFix%22%7D%2C%22side%22%3A%7B%22target%22%3A%22C6%27%22%2C%22id%22%3A%22side%22%7D%2C%22another%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22another%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git rebase main bugFix;git rebase bugFix side;git rebase side another;git rebase another main",startTree:'{"branches":{"main":{"target":"C2","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"side":{"target":"C6","id":"side"},"another":{"target":"C7","id":"another"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C0"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C5"],"id":"C7"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Rebasing over 9000 times",de_DE:"10000 Rebases unter dem `HEAD`",es_AR:"Rebaseando más de 9000 veces",es_MX:"Rebaseando más de 8000... 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",ko:"9천번이 넘는 리베이스",ja:"9000回以上のrebase",zh_CN:"多次 Rebase",zh_TW:"N次Rebase",ru_RU:"Rebase over 9000 раз",uk:"Rebase over 9000 разів",vi:"Rebase hơn 9000 lần",sl_SI:"Več kot 9000 Rebaseov",it_IT:"Rebasing livello 8000",pl:"Rebase ponad 8000 razy"},hint:{en_US:"Remember, the most efficient way might be to only update main at the end...",de_DE:"Nicht vergessen: Nur den main zu aktualisieren könnte die effizienteste Möglichkeit sein ...",es_AR:"Acordate, la manera más eficiente podría ser actualizar main sólo al final...",es_MX:"Recuerda, la manera más eficiente podría ser actualizar main hasta el final...",es_ES:"Recuerda, la manera más eficiente podría ser actualizar main sólo al final...",pt_BR:"Lembre-se, a forma mais eficiente pode ser atualizar o main por último...",gl:"Lembra, a forma máis eficiente pode ser actualizar a rama main ó final...",fr_FR:"Rappelez-vous, la façon la plus efficace peut être de mettre à jour main seulement à la fin...",ja:"最も効率的なやり方はmainを最後に更新するだけかもしれない・・・",ko:"아마도 main을 마지막에 업데이트하는 것이 가장 효율적인 방법일 것입니다...",zh_CN:"记住,最后更新 main 分支可能是最高效的方法……",zh_TW:"要記住喔! 把 main branch 留到最後更新可能是最有效率的方法。",ru_RU:"Не забудь, что лучше всего сдвинуть мастер в самом конце...",uk:"Не забувай, що краще всього буде перемістити main в самому кінці... ",vi:"Hãy nhớ rằng, cách tốt nhất có thể là cập nhật nhánh `main` sau cùng...",sl_SI:"Pomni, morda je najbolj učinkovit način posodabljanje masterja samo na koncu ...",it_IT:"Ricorda, il modo migliore potrebbe essere di aggiornare il main alla fine...",pl:"Pamiętaj, że najskuteczniejszym sposobem może być aktualizacja `main` dopiero na samym końcu..."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Multiple Branches","","Man, we have a lot of branches going on here! Let's rebase all the work from these branches onto main.","","Upper management is making this a bit trickier though -- they want the commits to all be in sequential order. So this means that our final tree should have `C7'` at the bottom, `C6'` above that, and so on, all in order.","","If you mess up along the way, feel free to use `reset` to start over again. Be sure to check out our solution and see if you can do it in fewer commands!"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebaseando múltiples ramas","","Che, ¡hay un montón de ramas acá! Rebaseemos todo el trabajo de esas ramas sobre main.","","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 hacés líos en el camino, sentite libre de usar `reset` para empezar de nuevo. ¡Asegurate de verificar tu solución y ver si podés hacerla en alguna cantidad menor de commandos!"]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebaseando múltiples ramas","","Mira eso, ¡hay un montón de ramas aquí! Hagamos rebase de todo el trabajo de esas ramas hacia main.","","La alta dirección nos está haciendo las cosas un poco más complicadas -- 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í, todos en orden.","","Si te revuelves durante el camino, siéntete libre de usar `reset` para empezar de nuevo. ¡Asegúrate de verificar nuestra solución y ver si puedes lograrlo en un número menor de comandos!"]}}]},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 main.","","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 comandos!"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Fazendo rebase em múltiplos ramos","","Cara, temos um monte de ramos aqui! Vamos fazer um rebase de todo o trabalho contido nesses ramos para o main.","","No entanto, a cúpula da administração está tornando as coisas mais difíceis -- eles querem que os commits estejam todos em ordem sequencial. Isso significa que a nossa árvore final precisa ter o `C7'` por último, `C6'` acima disso, e assim por diante, tudo ordenado.","","Se você fizer besteira, sinta-se livre para usar o comando `reset` para recomeçar do zero. Depois lembre de olhar nossa solução do gabarito para ver se consegue resolver a tarefa usando menos comandos!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Fazendo rebase en múltiples ramas","","Neno, temos unha chea de ramas aquí! Imos facer rebase de todo o traballo contido nesas ramas para a main.","","A xente de administración estanos a facer as cousas complicadas, igual eles queren que os commits estén todos en orde secuencial. Isto significa que a nosa árbore final precisa ter `C7'` de último, `C6'` inda por riba, está por adiante, todo ordeado.","","Se te fas un lio polo camiño, síntete ceibe para usar o comando `reset` para comezar de cero outra vez. Despois lembra ollar a nosa solución para ver se consegues resolver a tarefa usando menos comandos!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebaser plusieurs branches","","Dis-donc, nous avons beaucoup de branches par ici ! Rebasons tout le travail de ces branches dans main.","","Les patrons rendent cela encore plus compliqué -- ils veulent que les commits soient faits de manière séquentielle. Cela signifie donc que dans votre arbre final `C7'` est tout en bas, `C6'` juste au-dessus, et ainsi de suite, dans cet ordre.","","Si vous faites une erreur en cours de route, n'hésitez pas à utiliser `reset` pour recommencer. Pensez à comparer votre solution à la nôtre et voyez si vous pouvez le faire en moins de commandes !"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Mehrere Branches rebasen","","Wow, wir haben hier ja eine Menge Branches! Lass uns mal die ganze Arbeit, die in diesen Branches steckt, auf den `main` packen, um sie auf Stand zu bringen.","","Die Führungsetage macht die Sache allerdings etwas trickreicher -- sie möchte, dass alle Commits in aufsteigender Reihenfolge geordnet sind. Das heißt unser fertiger Baum sollte `C7` ganz unten haben, darüber `C6` und so weiter und so fort.","","Wenn du irgendwo einen Fehler machst, benütze ruhig `reset` um wieder von vorne anzufangen oder `undo` um einen Schritt zurückzugehen. Schau dir die Lösung an und versuche es in weniger Schritten hinzubekommen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### 複数のブランチをリベースする","","さあ、いくつものブランチが出てきます。このブランチたち全てをmainブランチにリベースしましょう。","","おエライさん方が今回の仕事を少しトリッキーにしてくれました -- コミットはすべて一列の連続した状態にしてほしいそうです。つまり私たちが作るリポジトリの最終的なツリーの状態は、`C7'`が最後に来て、`C6'`がその一つ上に来て、、と順に積み重なるイメージです。","","試行錯誤してツリーが汚くなってきたら、`reset`コマンドを使ってツリーの状態を初期化してください。模範解答をチェックして、それよりも簡単なコマンドで済ませられるかどうかを考えるのも忘れずに!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 多分支 rebase","","哇,现在我们这里出现了很多分支呢!让我们把所有这些分支上所做的工作都通过 rebase 合并到 main 分支上吧。","","但是你的领导给你提了点要求 —— 他们希望得到有序的提交历史,也就是我们最终的结果应该是 `C6'` 在 `C7'` 上面, `C5'` 在 `C6'` 上面,依此类推。","","即使你搞砸了也没关系,用 `reset` 命令就可以重新开始了。记得看看我们提供的答案,看你能否使用更少的命令来完成任务!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["### rebase 多個 branch","","嗨!現在我們有很多 branch 了啦!讓我們做一下 rebase,將這些分支接到 main branch 上吧。","","但是你的主管找了點麻煩,他們希望得到有序的 commit history,也就是我們最終的結果是 `C7'` 在最下面,`C6'` 在它上面,以此類推。","","假如你搞砸了,沒有關係啦!你用 `reset` 就可以重新開始!記得看看我們提供的答案,看你是否能夠使用更少的指令完成這一關!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### 여러 브랜치를 리베이스(rebase)하기 ","","음, 여기 꽤 여러개의 브랜치가 있습니다! 이 브랜치들의 모든 작업내역을 `main` 브랜치에 리베이스 해볼까요?","","윗선에서 일을 복잡하게 만드네요 -- 그 분들이 이 모든 커밋들을 순서에 맞게 정렬하라고 합니다. 그럼 결국 우리의 최종 목표 트리는 제일 아래에 `C7'` 커밋, 그 위에 `C6'` 커밋, 또 그 위에 순서대로 보여합니다.","","만일 작업중에 내용이 꼬인다면, `reset`이라고 쳐서 처음부터 다시 시작할 수 있습니다. 모범 답안을 확인해 보시고, 혹시 더 적은 수의 커맨드로 해결할 수 있는지 알아보세요!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebase на нескольких ветках","","У нас тут куча веток! Было бы круто перенести все изменения из них в мастер.","","Но начальство усложняет нашу задачу тем, что желает видеть все коммиты по порядку. Так что коммит `С7'` должен идти после коммита `С6'` и так далее.","","Если что-то пойдёт не так – не надо стесняться использовать `reset`, чтобы начать всё с чистого листа. Постарайся сделать как можно меньше манипуляций!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Ребейсимо кілька гілок","","В нас тут до біса гілок! Перенесімо всі зміни з різних гілок в main.","","Але вище керівництво нам не полегшує життя -- вони хочуть, щоб всі коміти були впорядковані. Це означає, що в результаті коміт `C7'` має бути з самого низу, `C6'` трохи вище, і так далі, все за порядком.","","Якщо ти щось зробиш не так, сміливо використовуй `reset` щоб почати спочатку. Подивись на наш розв’язок і подумай, чи ти можеш обійтись меншою кількістю команд!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebase nhiều nhánh","","Giời ạ, sao mà nhiều nhánh thế không biết! Chuyển hết chúng vào `main` thôi.","","Nhưng mà cha quản lý lại muốn oái oăm hơn cơ -- hắn muốn tất cả commit xếp thẳng hàng. Nghĩa là cây lịch sử của ta sẽ có `C7'` ở cuối, phía trên là `C6'`, và cứ thế theo đúng thứ tự.","","Nếu mà nhỡ may bạn làm nhầm thì có thể dùng lệnh `reset` để bắt đầu lại. Hãy nhớ đối chiếu với đáp án của chúng tôi xem bạn có thể hoàn thành với ít câu lệnh hơn không!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebasing Večih Branchev","","Uf, tu imamo pa res veliko branchev! Pojdimo in rebaseajmo vse delo iz teh branchev na main.","","Toda vodstvo se je odločilo, da le ne bo tako preprosto -- žeijo da so vsi commiti v zaporednem vrstnem redu. To pomeni, da bo naše ciljno drevo moralo imeti `C7'` na dnu, `C6'` nad njim, in tako dalje po vrsti.","","Če med reševanjem zamočiš, preprosto uporabi `reset`, da začneš znova. Poglej tudi našo rešitev in preveri, če lahko stopnjo rešiš še z manj ukazi!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rebase wielu gałęzi","","Człowieku, ależ tu pełno gałęzi! Przenieśmy wszystkie prace z tych gałęzi na `main`.","","Kierownictwo trochę utrudnia sprawę -- chcą, aby wszystkie commity były w odpowiedniej kolejności. Oznacza to, że nasze końcowe drzewo powinno mieć `C7'` na dole, `C6'` powyżej i tak dalej.","","Jeśli po drodze namieszasz, nie krępuj się użyć `reset`, aby zacząć od nowa. Przeanalizuj nasze rozwiązanie i sprawdź, czy dasz radę to zrobić, używając mniejszej liczby poleceń!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Fare rebase con più rami","","Hey, qui abbiamo un bel po' di rami! Facciamo un po' di rebase di questi rami nel main.","","I piani alti ci stanno rendendo la vita complicata -- vogliono i commit tutti in ordine progressivo. Questo significa che alla fine il nostro albero avrà `C7'` come ultimo commit, `C6'` sopra di esso, e così via, tutto in ordine.","","Se ti smarrisci lungo la via, usa `reset` senza problemi per ripartire da capo. Assicurati di raggiungere l'obiettivo e cerca di farlo con il minor numero di comandi!"]}}]}}}},{}],138:[function(e,t,o){o.level={compareAllBranchesHashAgnostic:!0,disabledMap:{"git revert":!0},goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C5%22%2C%22id%22%3A%22main%22%7D%2C%22one%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22one%22%7D%2C%22two%22%3A%7B%22target%22%3A%22C2%27%27%22%2C%22id%22%3A%22two%22%7D%2C%22three%22%3A%7B%22target%22%3A%22C2%22%2C%22id%22%3A%22three%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C4%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C4%27%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C4%27%27%22%7D%2C%22C3%27%27%22%3A%7B%22parents%22%3A%5B%22C4%27%27%22%5D%2C%22id%22%3A%22C3%27%27%22%7D%2C%22C2%27%27%22%3A%7B%22parents%22%3A%5B%22C3%27%27%22%5D%2C%22id%22%3A%22C2%27%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22two%22%2C%22id%22%3A%22HEAD%22%7D%7D",solutionCommand:"git checkout one; git cherry-pick C4 C3 C2; git checkout two; git cherry-pick C5 C4 C3 C2; git branch -f three C2",startTree:'{"branches":{"main":{"target":"C5","id":"main"},"one":{"target":"C1","id":"one"},"two":{"target":"C1","id":"two"},"three":{"target":"C1","id":"three"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{ko:"브랜치 스파게티",en_US:"Branch Spaghetti",fr_FR:"Branche spaghetti",de_DE:"Branch-Spaghetti",es_AR:"Ensalada de branches",es_MX:"Espagueti de ramas",es_ES:"Ensalada de ramas",pt_BR:"Espaguete de ramos",gl:"Espaguete de ramas",ja:"ブランチスパゲッティ",zh_CN:"纠缠不清的分支",zh_TW:"branch 漿糊",ru_RU:"Спутанные ветки",uk:"Макарони з гілок",vi:"Nhánh rối như canh hẹ",sl_SI:"Špageti iz Branchev",it_IT:"Rami spaghettificati",pl:"Spaghetti gałęzi"},hint:{en_US:"Make sure to do everything in the proper order! Branch one first, then two, then three",fr_FR:"Faites attention à tout faire dans le bon ordre ! La première branche 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_MX:"¡Asegúrate de hacer las cosas en el orden correcto! Primero la rama uno, después la dos, y después la tres.",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を片付ける。",ko:"이 문제를 해결하는 방법은 여러가지가 있습니다! 체리픽(cherry-pick)이 가장 쉽지만 오래걸리는 방법이고, 리베이스(rebase -i)가 빠른 방법입니다",zh_CN:"确保你是按照正确的顺序来操作!先操作分支 `one`, 然后 `two`, 最后才是 `three`",zh_TW:"確認你是按照正確的順序來操作!先操作 branch `one`, 然後 `two`, 最後才是 `three`",ru_RU:"Убедись, что у нас всё по порядку! Сначала ветка `one`, потом `two` и только потом `three`",uk:"Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`",vi:"Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`",sl_SI:"Glej da boš vse opravil v pravilnem vrstnem redu! Najprej branch ena, nato pa dva in tri.",it_IT:"Assicurati di fare tutto nel giusto ordine! Prima il primo ramo, poi il secondo, poi il terzo",pl:"Upewnij się, że robisz wszystko w odpowiedniej kolejności! Gałąź pierwsza, potem druga, potem trzecia."},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","WOAHHHhhh Nelly! We have quite the goal to reach in this level.","","Here we have `main` that is a few commits ahead of branches `one` `two` and `three`. For whatever reason, we need to update these three other branches with modified versions of the last few commits on main.","","Branch `one` needs a re-ordering of those commits and an exclusion/drop of `C5`. Branch `two` just needs a pure reordering of the commits, and `three` only needs one commit transferred!","","We will let you figure out how to solve this one -- make sure to check out our solution afterwards with `show solution`. "]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branche spaghetti","","WOAHHHhhh ! Nous avons pas mal d'objectifs dans ce niveau.","","Actuellement nous avons `main` qui se situe quelques commits en avance par rapport aux branches `one` `two` et `three`. Pour une raison quelconque, nous avons besoin de mettre ces trois branches à jour avec les modifications des derniers commits sur main.","","La branche `one` a besoin d'une réorganisation et de la suppression de `C5`. `two` doit simplement être réordonnée, et `three` ne nécessite qu'un commit !","","Nous vous laissons imaginer la solution pour ce niveau; comparez avec notre solution après-coup avec la commande `show solution`. "]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ensalada de branches","","¡WOAHHHhhh Nelly! Tenemos un _pequeño_ objetivo al que llegar en este nivel.","","Tenemos un `main` que está algunos commits adelante de `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de main.","","La rama `one` necesita reordenarse, y eliminar `C5`. `two` necesita sólo reordenamiento, y `three` ¡sólo necesita un commit!","","Te vamos a dejar darte cuenta cómo resolver este -- asegurate de mirar la solución, después, usando `show solution`. "]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Espagueti de ramas","","¡Oh vaya! Tenemos un _pequeño_ objetivo al que llegar en este nivel.","","La rama `main` se encuentra algunos commits por delante de las ramas `one`, `two` y `three`. Por alguna razón, necesitamos actualizar esas tres ramas con versiones modificadas de los últimos commits de main.","","La rama `one` necesita esos commits reordenados, y eliminar/excluir a `C5`. La rama `two` sólo necesita reordenarlos, y `three` ¡sólo necesita avanzar un commit!","","Vamos a dejar que averigues cómo resolver este -- asegúrate de revisar nuestra solución después, usando `show solution`. "]}}]},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 `main` 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 main.","","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:[{type:"ModalAlert",options:{markdowns:["## Espaguete de ramos","","Uhuuuuu Nelly! Temos um belo de um objetivo para alcançar neste nível.","","Temos aqui um `main` que está alguns commits atrás dos ramos `one`, `two` e `three`. Seja lá por qual razão, precisamos atualizar esses três outros ramos com versões modificadas dos últimos commits do main.","","O ramo `one` precisa de uma reordenação e da exclusão do `C5`. O `two` precisa apenas de reordenação. O `three` precisa de um único commit!","","Vamos deixar você descobrir como resolver esta tarefa -- mas não deixe de ver a nossa solução depois com o comando `show solution`. "]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Espaguete de ramas","","¡Íscalle lura! Temos un _pequeno_ obxectivo que acadar neste nivel.","","Temos aquí un `main` que está algúns commits por detrás das ramas `one`, `two` e `three`. Por algunha razón, precisamos atualizar esas tres ramas con versións modificadas dos últimos commits de main.","","A rama `one` precisa de unha reordenación, e votar fora a `C5`. O `two` precisa apenas de reordenacións. O `three` precisa dun único commit!","","Ímoste deixar resolver o problema por ti mesmo -- pero non deixes de ver a nosa solución, para eso escrebe `show solution`. "]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch-Spaghetti","","Puh! Wir haben ein ganz schön schweres Ziel für dieses Level.","","Wir haben hier einen `main`, der ein paar Commits weiter ist als die Branche `one`, `two` und `three`. Aus welchem Grund auch immer müssen wir diese drei anderen Branches mit modifizierten Versionen der paar letzten Commits von `main` aktualisieren.","","Branch `one` benötigt eine Umsortierung und `C5` muss gelöscht werden. `two` muss nur umsortiert werden und `three` braucht nur einen Commit!","","Ich lass dich diese Aufgabe selbst lösen -- schau dir hinterher auf jeden Fall die Lösung mit `show solution` an."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## ブランチスパゲッティ","","なんということでしょう。今回のレベルクリアのために、やることがたくさんあります。","","いま`main`が指しているコミットの数個前のコミットに、ブランチ`one`、`two`それから`three`があります。何か事情があって、これらの3つのブランチをmainが指している最新の状態に更新したいケースを考えます。","","ブランチ`one`に対しては、順序の変更と`C5`の削除が必要です。`two`では順序の変更のみ、`three`に対しては1回だけコミットすればOKです。","","`show solution`コマンドで模範解答を確認できますから、こちらも利用してください。 "]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 纠缠不清的分支","","哇塞大神!这关我们要来点不同的!","","现在我们的 `main` 分支是比 `one`、`two` 和 `three` 要多几个提交。出于某种原因,我们需要把 `main` 分支上最近的几次提交做不同的调整后,分别添加到各个的分支上。","","`one` 需要重新排序并删除 `C5`,`two` 仅需要重排排序,而 `three` 只需要提交一次。","","慢慢来,你会找到答案的 —— 记得通关之后用 `show solution` 看看我们的答案哦。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branch Spaghetti","","哇塞大神!這關我們要來點不同的!","","現在我們的 `main` branch 是比 `one` `two` 和 `three` 這三個 branch 多了幾個 commit。由於某種原因,我們需要將 main 所新增的幾個 commit 套用到其它三個 branch 上面。","","`one` branch 需要重新排序和取消 `C5` 這一個 commit, `two` 需要完全重排,而 `three` 只需要再一個 commit。","","我們會讓你知道如何解決這個問題,之後請記得用 `show solution` 看看我們的答案喔。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 브랜치 스파게티","","음, 이번에는 만만치 않습니다!","","여기 `main` 브랜치의 몇 번 이전 커밋에 `one`, `two`,`three` 총 3개의 브랜치가 있습니다. 어떤 이유인지는 몰라도, main의 최근 커밋 몇 개를 나머지 세 개의 브랜치에 반영하려고 합니다.","","`one` 브랜치는 순서를 바꾸고 `C5`커밋을 삭제하고, `two`브랜치는 순서만 바꾸며, `three`브랜치는 하나의 커밋만 가져옵시다!","","자유롭게 이 문제를 풀어보시고 나서 `show solution`명령어로 모범 답안을 확인해보세요."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Спутанные ветки","","УОУ! В этом уровне придётся попотеть!","","У нас тут по несколько коммитов в ветках `one`, `two` и `three`. Не важно почему, но нам надо видоизменить эти три ветки при помощи более поздних коммитов из ветки `main`.","","Ветка `one` нуждается в изменении порядка и удалении `C5`. `two` требует полного перемешивания, а `three` хочет получить только один коммит","","Как пройти этот уровень – решать тебе, а как найдёшь решение – сравни его с нашим при помощи `show solution`."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Макарони з гілок","","Ооо Неля! Ну й завданнячко.","","Ми маємо гілку `main`, яка на кілька комітів попереду гілок `one`, `two` та `three`. З незрозумілих причин, нам потрібно оновити ці гілки більш пізніми змінами з мастеру.","","Гілку `one` потрібно впорядкувати і видалити `C5`. Гілку `two` також потрібно впорядкувати, а в гілку `three` потрібно додати ще один коміт!","","Ми повністю покладаємось на тебе -- порівняй свій розв’зок з нашим, який можна подивитись командою `show solution`. "]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh rối như canh hẹ","","Chààà, anh bạn! Thử thách lần này hơi khoai đây.","","Hiện tại thì nhánh `main` đang có trước vài commit so với các nhánh `one`, `two` và `three`. Vì một lý do nào đó, ta cần cập nhật những commit trên nhánh `main` lên các nhánh còn lại kèm với một vài điều chỉnh.","","Nhánh `one` cần sắp xếp lại commit và xóa commit `C5`, nhánh `two` chỉ cần sắp xếp commit, còn `three` thì cần chuyển đi một commit!","","Cố gắng động não tìm ra cách đi nhé -- khi bạn làm xong thì nhớ so sánh với đáp án của chúng tôi bằng lệnh `show solution`. "]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Špageti iz Branchev","","WOAHHHhhh Miško! Ta stopnja bo pa pravi izziv.","","Tu imamo `main`, ki je nekaj commitov pred branchi `one`, `two` in `three`. Iz neznanega razloga moramo posodobiti te tri druge branche z modificiranimi različicami zadnjih nekaj commitov na masterju.","","Branch `one` potrebuje prerazporeditev in izbris `C5`. `two` rabi samo prerazporeditev, `three` pa potrebuje samo en commit!","","Prepustili ti bomo, da sam ugotoviš, kako tole rešiti -- vseeno lahko na koncu preveriš našo rešitev s `show solution`. "]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Spaghetti gałęzi","","Łałałiła! Na tym poziomie mamy poważny cel do osiągnięcia.","","Mamy tutaj gałąź `main`, która jest kilka commitów przed gałęziami `one`, `two` i `three`. Z jakiegoś powodu musimy zaktualizować te trzy inne gałęzie zmodyfikowanymi wersjami ostatnich kilku commitów na main.","","Gałąź `one` wymaga zmiany kolejności i usunięcia `C5`. `two` potrzebuje wyłącznie zmiany kolejności, a `three` potrzebuje tylko przeniesienia jednego commitu!","","Samodzielnie zastanów się, jak rozwiązać to zadanie -- po wykonaniu go koniecznie sprawdź nasze rozwiązanie za pomocą `show solution`. "]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami spaghettificati","","Accidenti! C'è tanto da fare per raggiungere l'obiettivo questa volta.","","Qui abbiamo il `main` situato qualche commit più avanti rispetto ai rami `one` `two` e `three`. Per una qualche ragione, dobbiamo aggiungere questi altri tre rami con versioni aggiornate degli ultimi commit sul main.","","Il ramo `one` deve essere riordinato e il commit `C5` è da rimuovere. `two` deve essere riordinato, e `three` deve avere un solo commit!","","Tocca a te capire come farlo -- controlla la soluzione alla fine con il comando `show solution`. "]}}]}}}},{}],139:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git clone",name:{en_US:"Clone Intro",fr_FR:"Introduction à clone",de_DE:"Clone Einführung",ja:"Clone入門",es_AR:"Introducción a clone",es_MX:"Introducción a clone",es_ES:"Introducción a clone",pt_BR:"Introdução à clonagem",gl:"Introducción a clone",zh_CN:"Git Clone",zh_TW:"介紹 clone",ru_RU:"Введение в клонирование",ko:"Clone 소개",uk:"Знайомство з clone",vi:"Giới thiệu về clone",sl_SI:"Uvod v Git Clone",pl:"Wstęp do klonowania (clone)",it_IT:"Introduzione al clone"},hint:{en_US:"Just git clone!",fr_FR:"Simplement git clone !",de_DE:"Einfach git clone ausführen!",ja:"単にgit clone!",zh_CN:"只要 git clone 就可以了!",es_AR:"Simplemente hacé git clone!",es_MX:"Simplemente haz 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 就好了",ru_RU:"Простой git clone!",ko:"그냥 git clone 하세요!",uk:"Просто git clone!",vi:"Đơn giản là git clone!",sl_SI:"Preprosto samo git clone!",pl:"Po prostu git clone!",it_IT:"Semplicemente git clone!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Remote repositories aren't actually that complicated. In today's world of cloud computing it's easy to think that there's a lot of magic behind git remotes, but they are actually just copies of your repository on another computer. You can typically talk to this other computer through the Internet, which allows you to transfer commits back and forth.","","That being said, remote repositories have a bunch of great properties:","","- First and foremost, remotes serve as a great backup! Local git repositories have the ability to restore files to a previous state (as you know), but all that information is stored locally. By having copies of your git repository on other computers, you can lose all your local data and still pick up where you left off.","","- More importantly, remotes make coding social! Now that a copy of your project is hosted elsewhere, your friends can contribute to your project (or pull in your latest changes) very easily.","","It's become very popular to use websites that visualize activity around remote repos (like [GitHub](https://github.com/)), but remote repositories _always_ serve as the underlying backbone for these tools. So it's important to understand them!"]}},{type:"ModalAlert",options:{markdowns:["## Our Command to create remotes","","Up until this point, Learn Git Branching has focused on teaching the basics of _local_ repository work (branching, merging, rebasing, etc). However now that we want to learn about remote repository work, we need a command to set up the environment for those lessons. `git clone` will be that command.","","Technically, `git clone` in the real world is the command you'll use to create _local_ copies of remote repositories (from github for example). We use this command a bit differently in Learn Git Branching though -- `git clone` actually makes a remote repository out of your local one. Sure it's technically the opposite meaning of the real command, but it helps build the connection between cloning and remote repository work, so let's just run with it for now.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lets start slow and just look at what a remote repository looks like (in our visualization).",""],afterMarkdowns:["There it is! Now we have a remote repository of our project. It looks pretty similar except for some visual changes to make the distinction apparent -- in later levels you'll get to see how we share work across these repositories."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["To finish this level, simply `git clone` your existing repository. The real learning will come in following lessons."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Les dépôts distants (remote repositories) ne sont pas si compliqués que ça. Dans l'ère actuelle du cloud computing il est facile de croire qu'il y a un peu de magie derrière les branches distantes, mais elles sont en fait juste des copies de votre dépôt local sur un autre ordinateur. Vous pouvez donc vous connecter à cet ordinateur par Internet, ce qui vous permet de transférer les commits en retard et en avance.","","Cela dit, les branches distantes ont plusieurs propriétés puissantes :","","- Tout d'abord, le dépôt distant sert de sauvegarde ! Le dépôt local de Git a la capacité de restaurer des fichiers à un état précédent (comme vous le savez), mais toutes les informations sont stockées localement. En ayant des copies de votre dépôt Git sur d'autres ordinateurs, vous pouvez perdre vos données et toujours repartir de là où vous en étiez resté.","","- Plus important encore, les dépôts distants sociabilisent le projet ! Maintenant qu'il est hébergé quelque part ailleurs, vos amis peuvent y contribuer facilement (ou récupérer vos derniers changements).","","Il est devenu courant de visualiser l'activité sur dépôt distant via des sites internet (comme [GitHub](https://github.com/)), mais les dépôts distants servent _toujours_ de colonne vertébrale à ce système. Il est donc important de les comprendre !"]}},{type:"ModalAlert",options:{markdowns:["## Les commandes pour créer des dépôts distants","","Jusqu'à maintenant, Learn Git Branching s'est surtout concentré sur l'apprentissage des bases du travail sur un dépôt _local_ (branch, merge, rebase, etc). Cependant maintenant que nous voulons savoir comment travailler sur les dépôts distants, nous avons besoin d'une commande pour l'environnement de ces leçons. `git clone` sera cette commande.","","Techniquement, `git clone` dans le monde réel sera la commande que vous utiliserez pour créer des copies _locales_ des dépôts distants (de github par exemple). Nous utilisons cette commande un peu différemment dans Learn Git Branching car `git clone` crée ici un dépôt distant à partir de votre dépôt local. Il est vrai qu'il s'agit donc du sens opposé de la commande originale, mais cela aide à construire la connexion entre le clonage et le travail sur le dépôt distant, travaillons donc avec cela pour l'instant.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Commençons doucement et regardons à quoi ressemble un dépôt distant (dans notre visualisation).",""],afterMarkdowns:["Nous y sommes ! Maintenant nous avons un dépôt distant de notre projet. Cela ressemble fortement à ce que nous avons d'habitude, en dehors de quelques changements pour rendre compte des différences -- dans les niveaux suivants vous allez voir comment partager le travail entre ces dépôts."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, faites simplement un `git clone` du dépôt existant. Le réel apprentissage arrivera dans les prochaines leçons."]}}]},es_AR:{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 copadas:","","- Primero y principal, los remotos ¡son un genial backup! Los repositorios locales de git tienen la habilidad de restaurar archivos a un estado previo (como ya sabés), pero toda esa información está almacenada localmente. Al tener copias de tu repositorio git en otras computadoras, podés perder todos tus datos locales y aún así retomar de donde habías dejado.","","- Más importante, ¡los remotos sociabilizan la programación! Ahora que hay una copia de tu proyecto hosteada en otro lugar, cualquiera puede 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/)), 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 (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.",""]}},{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 hacé `git clone` de tu repositorio existente. El verdadero aprendizaje viene en las próximas lecciones."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Los repositorios remotos no son realmente _tan_ complicados. En el mundo actual de la computación en la nube es facil pensar que hay un montón de magia detrás de los git remotes, pero en realidad sólo son copias de tu repositorio en otra computadora. Típicamente vas a comunicarte con esta otra computadora a través de Internet, lo que te permite transferir commits de un lado a otro.","","Habiendo dicho eso, los repositorios remotos tienen un montón de propiedades geniales:","","- Primero y principalmente, los remotes ¡funcionan como un respaldo increible! 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 donde lo dejaste.","","- Más importante, ¡los remotes hacen más social la programación! Ahora que hay una copia de tu proyecto almacenada en otro lugar, tus amigos pueden contribuir a tu proyecto (u obtener los últimos cambios) de un modo muy sencillo.","","Se ha vuelto bastante popular el uso de sitios web que muestran la actividad de los repositorios (como [GitHub](https://github.com/)), pero los repositorios remotos _siempre_ sirven como la base subyacente de esas herramientas. Así que ¡es importante entenderlos!"]}},{type:"ModalAlert",options:{markdowns:["## Nuestro comando para crear remotes","","Hasta este punto, Learn Git Branching se ha centrado en enseñar las bases del trabajo con repositorios _locales_ (manejo de ramas, mezclar, 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 (de GitHub, por ejemplo). Nosotros, en Learn Git Branching, lo usamos de un modo un poco diferente -- `git clone` va a crear un repositorio remoto a partir del tuyo local. Estamos de acuerdo en que técnicamente es lo opuesto al comando real, pero ayuda bastante a entender la conexión entre el clonado y el trabajo en un repositorio remoto, así que vamos a seguir así por ahora.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Comencemos despacio y simplemente veamos cómo se ve un repositorio remoto en nuestro caso.",""],afterMarkdowns:["¡Ahí está! Ahora tenemos un repositorio remoto de nuestro proyecto. Se ve bastante similar, excepto por 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."]}}]},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/)), 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:[{type:"ModalAlert",options:{markdowns:["## Remotos no Git","","Repositórios remotos não são algo muito complicado. Nos dias atuais de computação em nuvem, seria fácil pensar que existiria muita mágica por trás dos remotos do Git, mas não é o caso -- eles são na verdade apenas cópias do seu repositório em outro computador. Você pode geralmente comunicar-se com esse outro computador por meio da Internet, o que permite que você transfira commits de um lado para o outro.","","Tendo dito isto, repositórios remotos tem uma série de propriedades interessantes:","","- Primeiro e antes de tudo, repositórios remotos servem como um ótimo backup! Repositórios Git locais possuem a habilidade de restaurar um arquivo para um estado anterior (como você sabe), mas toda a informação está guardada localmente. Tendo cópias do seu repositório Git em outros computadores, mesmo se você perder todos os seus dados locais, ainda terá como recomeçar do mesmo ponto de onde você tinha parado.","","- Ainda mais importante, repositórios remotos tornam o desenvolvimento uma atividade social! Agora que uma cópia do seu projeto está hospedada em outro lugar, seus amigos podem contribuir para o seu projeto (ou obter as suas últimas alterações) de uma forma bastante simples.","","Está se tornando bastante popular o uso de websites para visualizar a atividade em repositórios (como o [GitHub](https://github.com/)), mas o recurso de repositórios remotos _sempre_ serve como mecanismo base para essas ferramentas. Então é importante entender como ele funciona!"]}},{type:"ModalAlert",options:{markdowns:["## Nosso comando para criar remotos","","Até este ponto, o Learn Git Branching focou em ensinar o básico a respeito de trabalho em repositórios _locais_ (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como repositórios remotos funcionam, precisamos de um comando para configurar o ambiente para essas lições. Esse comando será o `git clone`.","","Tecnicamente, o `git clone` do mundo real é um comando que se usa para criar cópias _locais_ de repositório remotos (do GitHub para o seu computador, por exemplo). Todavia, por motivos logísticos, nós usaremos esse comando de uma forma um pouco diferente no Learn Git Branching -- aqui o `git clone` criará um repositório remoto a partir do repositório local. Certamente, esse comportamento é exatamente o oposto do comando real, mas apesar disso ele ajuda a formar a conexão mental entre a clonagem e a forma como repositórios remotos funcionam, então vamos usá-lo dessa forma mesmo por enquanto.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos começar devagar e apenas olhar como um repositório remoto se parece na nossa visualização.",""],afterMarkdowns:["Aqui está ele! Agora temos um repositório remoto do nosso projeto. Ele é muito parecido exceto por algumas mudanças visuais para tornar a distinção factível -- nas tarefas a seguir veremos como compartilhar trabalho entre esses repositórios."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, simplesmente chame o comando `git clone`. Você aprenderá algo de verdade somente nas próximas lições."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Repositorios remotos en Git","","Os repositorios remotos non son complicados en git. Actualmente ca computación na nube, pódese pensar que hai moita maxia tras os repositorios remotos de git, pero para nada é así -- en verdade son copias do repositorio, pero noutra máquina. Ti podes comunicarte xeralmente con esa outra máquina por medio de internet, o que permite que mandes commits de un repositorio cara o outro.","","Dito isto, os repositorios remotos teñen propiedades interesantes:","","- Primeiro e antes de todo, os repositorios remotos serven como unha copia de seguranza! Os repositorios locais posúen a habilidade de restaurar un arquivo nun estado anterior (como xa sabes), pero toda á información está gardada. Tendo copias do repositorio noutras máquinas, incluso poderías perder tódolos datos da túa computadora, e comenzar a traballar no punto onde o deixaches no último commit.","","- Máis importante aún, ¡os repositorios remotos fan que o desenvolvemento sexa social! Agora que existe unha copia do teu código noutro lugar, os teus amigos poden contribuír no teu proxecto (ou obter os últimos cambios) dunha forma moi simple.","","Hai webs moi populares onde se pode ver a actividade dos repositorios (como [GitHub](https://github.com/)), pero estes recursos remotos _sempre_ axudan como mecanismo de base para esas ferramentas. ¡Entón é importante saber cómo funcionan!"]}},{type:"ModalAlert",options:{markdowns:["## O noso comando para crear remotos","","Ata este punto, Learn Git Branching enfocouse en ensinar o básico respecto do traballo en repositorios _locais_ (branch, merge, rebase, etc). Entretanto, agora que queremos aprender como os repositorios remotos funcionan, precisamos dun comando para configurar o entorno para esas leccións. Este comando será `git clone`.","","Técnicamente, `git clone` no mundo real é un comando que fai copias _locais_ de repositório remotos (de GitHub para a túa máquina, por exemplo). Todavía, por motivos loxísticos, nós usaremos ese comando dunha forma un pouco diferente, Learn Git Branching -- aquí `git clone` creará un repositorio remoto a partir do repositorio local. Certamente, ese comportamento é exactamente o oposto do comando real, pero a pesares de iso axudarate a formar unha conexión mental entre a clonación e como funcionan os repositorios remotos, entón imos usalo desa forma.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Imos comenzar a modo, e só ollar cómo un repositorio remoto semellase á nosa visualización.",""],afterMarkdowns:["¡Aquí o tes! Agora temos un respositorio remoto do noso proxecto. El é moi parecido exceto por algúns cambios visuais para ter a unha distinción visible -- nas tarefas a seguir veremos como compartir o traballo entre eses repositorios."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, escribe o comando `git clone`. Aprenderás algo de verdade sóamente nas próximas leccións."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","remote (遠端) repository 並不會很難了解. 藉由現在的雲端運算,可以很輕易地了解到在 git remote 裡面有很多有趣的事情,但它們其實其實就只是你的或者是其它電腦上的 repository 的副本。你可以輕易地透過網路去發送你的 commit 給其它的電腦。","","也就是說,remote repository 有很多有趣的地方:","","- 第一,remote 是用來備份的! 本地端的 git 有能力可以回復文件到前一個狀態 (你知道的),但是全部的資訊還是儲存在本地端。如果你在其它的電腦上面有你的 git repository 的副本,則你可以在資料不小心遺失的時候進行救援備份","","- 更重要的是, remote 讓大家一起來 coding!現在你的 project 放在 remote 上面,你的朋友可以很容易地對你的 project 做出貢獻(或者是 pull 你最後的修改) 。","","使用網站去對 remote repository 做視覺化非常流行(例如 [GitHub](https://github.com/) 或者是 [Phabricator](http://phabricator.org/)),但這背後最大的功臣是 remote repository,因此我們務必要了解它。"]}},{type:"ModalAlert",options:{markdowns:["## 我們去建立 remotes 的指令","","到目前為止,Learn Git Branching 著重在解釋本地端的工作(branching, merging, rebasing 以及其它指令), 但是我們現在想要學習針對 remote 的指令,我們需要一個指令去建立環境,`git clone` 就是我們需要的指令","","技術上來說, `git clone` 表示你想要把遠端的 repository 複製一份下來放在本地端( 例如從 github 複製)。 雖然 `git clone` 實際上是把遠端的 repository 複製下來放在本地端,在 Learn Git Branching 中,我們用的這個指令會有一點不同。雖然他跟真實的指令的意思相反,但是它可以建立起本地端以及遠端的一個連結,現在讓我們看看如何使用它吧。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們慢慢來,並且看看 remote repository 是長什麼樣子(在我們的視覺化圖形中)。",""],afterMarkdowns:["就是那樣!現在我們有了一個放置了我們 project 的 remote repository。除了一些視覺上的改變之外,它們看起來很像,在之後的關卡中你就會看到我們如何分享我們的工作到這些 repository 上面。"],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,只要打 `git clone,其它的學習會在後面的關卡中出現。"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 远程仓库","","远程仓库并不复杂, 在如今的云计算盛行的世界很容易把远程仓库想象成一个富有魔力的东西, 但实际上它们只是你的仓库在另个一台计算机上的拷贝。你可以通过因特网与这台计算机通信 —— 也就是增加或是获取提交记录","","话虽如此, 远程仓库却有一系列强大的特性","","- 首先也是最重要的的点, 远程仓库是一个强大的备份。本地仓库也有恢复文件到指定版本的能力, 但所有的信息都是保存在本地的。有了远程仓库以后,即使丢失了本地所有数据, 你仍可以通过远程仓库拿回你丢失的数据。","","- 还有就是, 远程让代码社交化了! 既然你的项目被托管到别的地方了, 你的朋友可以更容易地为你的项目做贡献(或者拉取最新的变更)","","现在用网站来对远程仓库进行可视化操作变得越发流行了(像 [GitHub](https://github.com/)), 但远程仓库**永远**是这些工具的顶梁柱, 因此理解其概念非常的重要!"]}},{type:"ModalAlert",options:{markdowns:["## 我们创建远程仓库的命令","","直到现在, 教程都聚焦于**本地**仓库的操作(branch、merge、rebase 等等)。但我们现在需要学习远程仓库的操作 —— 我们需要一个配置这种环境的命令, 它就是 `git clone`。","从技术上来讲,`git clone` 命令在真实的环境下的作用是在**本地**创建一个远程仓库的拷贝(比如从 github.com)。 但在我们的教程中使用这个命令会有一些不同 —— 它会在远程创建一个你本地仓库的副本。显然这和真实命令的意思刚好相反,但是它帮咱们把本地仓库和远程仓库关联到了一起,在教程中就凑合着用吧。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们慢慢来,先看看远程仓库(在图示中)的样子。",""],afterMarkdowns:["就是它了! 现在我们有了一个自己项目的远程仓库。除了远程仓库使用虚线之外, 它们几乎没有什么差别 —— 在后面的关卡中, 你将会学习怎样在本地仓库和远程仓库间分享工作成果。"],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["要完成本关, 用 `git clone` 复制下你的仓库就可以了。后续的课程我们会正式地学习"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes","","Entfernte Repositorys sind nicht weiter kompliziert. In dieser Welt des Cloud Computings könnte man vielleicht glauben, dass hinter entfernten Git-Repositorys eine Menge Magie steckt, aber es sind einfach nur Kopien eines Repositorys auf einem anderen Rechner. Du kannst mit diesem Rechner typischerweise über das Internet kommunizieren, was es dir ermöglicht Commits hin und her zu schicken.","","Nichts desto weniger haben entfernte Repositorys eine Menge toller Eigenschaften:","","- Vor allem: Sie sind ein super Backup! Lokale Git-Repositorys können deine Arbeitskopie in jeden beliebigen früheren Zustand versetzen (wie du ja weißt), aber all diese Informationen liegen eben bei dir lokal. Wenn es Kopien von deinem Repository auf anderen Rechnern gibt, kannst du ruhig all deine Daten verlieren und trotzdem genau da weitermachen, wo du aufgehört hast.","","- Noch wichtiger: Remotes geben dem Entwickeln eine soziale Komponente! Wenn eine Kopie deines Projekts woanders liegt, können deine Freunde sehr einfach etwas zu dem Projekt beitragen (oder sich deine neuesten Änderungen holen).","","Websites, die die Aktivitäten um diese entfernten Repositorys darstellen (wie [GitHub](https://github.com/)) erfreuen sich zunehmender Beliebtheit. Aber entfernte Repositorys sind _immer_ das Rückgrat für diese Werkzeuge. Deshalb ist es wichtig, sie zu verstehen."]}},{type:"ModalAlert",options:{markdowns:["## Der Befehl um ein Remote zu erstellen","","Bis jetzt hat sich Learn Git Branching darauf konzentriert, die Grundlagen der _lokalen_ Arbeit mit Repositorys zu vermitteln (Branche anlegen, zusammenführen, Rebasen etc). Jetzt wollen wir allerdings lernen mit entfernten Repositorys zu arbeiten und brauchen für die Level eine entsprechende Umgebung. Die schaffen wir mit `git clone`.","",'In der Realität ist `git clone` eigentlich der Befehl, mit dem du eine _lokale_ Kopie eines _entfernten_ Repositorys erstellst (das zum Beispiel auf GitHub liegt). Wir benutzen diesen Befehl in Learn Git Branching allerdings ein wenig anders -- hier macht `git clone` stattdessen eine Kopie von deinem lokalen Repository auf einem "entfernten Server". Klar, das ist eigentlich genau das Gegenteil von dem, was der echte Befehl macht, aber es hilft den Zusammenhang zwischen Cloning und der Arbeit mit entfernten Repositorys herzustellen, also machen wir\'s einfach so.',""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Fangen wir langsam an und schauen nur wie ein entferntes Repository in unserer Darstellung aussieht.",""],afterMarkdowns:["Da ist es! Jetzt haben wir ein entferntes Repository unseres Projektes. Es sieht so aus wie das lokale, nur mit ein paar Änderungen in der Darstellung -- in späteren Leveln wirst du sehen, wie man Änderungen zwischen den Repositorys austauschen kann."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Um diesen Level abzuschließen führ einfach `git clone` auf deinem bestehenden Repository aus. Alles weitere kommt in den nächsten Leveln."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gitリモート","","リモートのリポジトリというのはそんなに複雑なものでもありません。クラウドコンピューティングが普及している現在の世界では、gitリモートの裏には何か不思議な仕組みが動いていると思いやすいのですが、実は別のコンピュータ上に保存されているあなたのリポジトリのコピーにすぎません。通常、インターネットを媒体に使って別のコンピュータと対話し、コミットを交互にやり取りすることができます。","","とはいえ、リモートリポジトリにはいくつかの素晴らしい特徴があります:","","- まず、リモートはバックアップの役割を果たします。ご存知の通り、ローカルのgitリポジトリは以前の状態にファイルを復帰する機能を持っているのですが、その情報はすべてローカルに保存されています。gitリポジトリを別のコンピュータにも保存することで、ローカルのデータがすべて失われたとしても、保存状態からコーディングを続けられます。","","- それよりも大切なこととして、リモートではコードをより一般的に公開できます!プロジェクトのコピーが別の場所に保存されているため、友達などが簡単にそのプロジェクトに参加したり最近の変更をpullしたりできます。","","最近ではリモートリポジトリに関するデータをビジュアル的に表示するウェブサイト([GitHub](https://github.com/)や[Phabricator](http://phabricator.org/)など)の使用が人気を集めていますが、リモートリポジトリは_そのいずれの_ウェブサイトの裏にも使われています。なので理解する必要があります。"]}},{type:"ModalAlert",options:{markdowns:["## リモートを作成するコマンド","","今までLearn Git Branchingでは_ローカル_リポジトリの様々な作業(branch, merge, rebaseなど)に焦点を当ててきました。しかし、これからはリモートリポジトリの作業を学びますので、レッスンのために環境をセットアップする必要があります。そのコマンドは`git clone`になります。","","通常、`git clone`はリモートリポジトリ(githubなどから)を_ローカル_にコピーする時に使います。しかしLearn Git Branchingでは少し違ったように使います -- ここでは`git clone`が_ローカルリポジトリ_をリモートにコピーします。本当のコマンドの逆の動作になっているのですが、学んでいくうちにcloneとリモートリポジトリのつながりが見えてくるはずです。なので、今はとりあえず例として使ってみましょう。",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["最初の一歩として、ビジュアライズでリモートリポジトリを見てみましょう。",""],afterMarkdowns:["できました! プロジェクトのリモートリポジトリが保存されました。結構似ているのですが、その違いを明らかにするために少しだけビジュアルを工夫しました -- これからのレベルではこれらのリポジトリの間で作業をどう共有するか見ていきます。"],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["このレベルをクリアするには、`git clone`で既存のリポジトリのクローンを作成します。次のレッスンでより詳細に見ていきます。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Удалённые репозитории в Git","","На самом деле удалённые репозитории в Git не так сложны, как кажутся на первый взгляд. Кажется, что в современном мире облачных вычислений под термином «удалённый репозиторий» подразумевается что-то сложное и загадочное. Однако, удалённые репозитории — это всего-навсего копии вашего репозитория, хранящиеся на другом компьютере. Обычно вы можете связываться с этим другим компьютером через Интернет, что позволяет вам передавать коммиты туда и сюда.","","Как уже было сказано, удалённые репозитории обладают рядом замечательных свойств:","","- В первую очередь, удалённые репозитории - это замечательное средство резервного копирования! Насколько вам известно, локальные репозитории способны восстанавливать файлы, используя предыдущие состояния, но вся эта информация хранится локально. Потеряв все свои локальные данные, вы способны восстановить их при наличии копии своего репозитория на другом компьютере.","","- Что ещё более важно, удалённые репозитории позволяют сделать процесс разработки более социальным! Теперь, когда копия вашего проекта размещена в другом месте, ваши друзья запросто могут внести свой вклад в ваш проект или забрать последние и актуальные изменения.","","Набирает популярность использование web-сайтов для визуализации активности удалённых репозиториев (например, [GitHub](https://github.com/)), однако удалённые репозитории _всегда_ выступают в качестве базы для таких инструментов. Поэтому так важно понимать, как устроены удалённые репозитории!"]}},{type:"ModalAlert",options:{markdowns:["## Наша команда для создания удалённого репозитория","","До настоящего момента мы были сфокусированы на изучении основ работы с _локальным_ репозиторием (ветвление, слияние, перемещение и т.д.). Однако теперь, когда мы хотим научиться работать с удалёнными репозиториями, нам нужны новые команды для настройки рабочей среды для этих упражнений. Такой командой нам послужит `git clone`","","Технически, `git clone` в реальной жизни - это команда, которая создаст _локальную_ копию удалённого репозитория (например, с GitHub). На наших занятиях в Learn Git Branching мы используем эту команду немного иначе - `git clone` создаёт удалённый репозиторий на основе вашего локального репозитория. На самом деле, это является полной противоположностью реальной команды, однако такой подход поможет нам наладить связь между склонированным и удалённым репозиторием. Давайте просто запустим эту команду.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте начнём постепенное изучение и взглянем на то, что собой представляет удалённый репозиторий (в нашем представлении).",""],afterMarkdowns:["Вот так! Теперь у нас есть удалённый репозиторий нашего проекта. Выглядит всё довольно одинаковым за исключением некоторых визуальных различий - в последующих уровнях вы увидите, как мы разделяем работу по этим репозиториям."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Чтобы завершить уровень, просто выполните `git clone` на своём существующем репозитории. Настоящее обучение появится в последующих уроках."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remote(원격)","","원격 저장소라는 것이 사실 그다지 복잡한 개념은 아닙니다. 오늘날의 클라우드 컴퓨팅을 떠올리면 git remote의 이면에 수많은 마법이 부려지고 있을 것 같지만, 사실 git remote 또 하나의 컴퓨터에 있는 여러분의 저장소의 복사본일 뿐입니다. 여러분은 일반적으로 인터넷을 통해서 이 또 하나의 컴퓨터와 커밋을 주고받는 등의 대화를 할 수 있습니다.","","소개한 김에 자랑까지 하자면 원격 저장소는 수많은 장점이 있습니다:","","- 무엇보다 먼저, 원격 저장소는 백업으로서의 역할을 훌륭하게 수행합니다! 로컬 git 저장소는 파일들을 이전의 상태로 되돌리는 기능을 가지고 있습니다(아시다시피). 하지만 그 모든 정보가 로컬(내 PC)에 저장되어 있습니다. 여러분의 git 저장소를 다른 컴퓨터가 복사본으로 가지고 있으면 로컬 데이터를 다 잃더라도 다른 컴퓨터에 남아있는 복사본으로 다시 출발 할 수 있습니다.","","- 더 중요한 것은, 원격 저장소를 통해 코딩을 다른 사람들과 함께 할 수 있다는 것입니다. 여러분의 프로젝트의 복사본이 어느 곳에선가 호스트되기 때문에 여러분의 친구가 프로젝트에 아주 쉽게 기여할 수 있게 됩니다(최근의 변화를 pull하거나).","","원격 저장소에서의 활동을 시각화해주는 웹 사이트들을 사용하는 것이 추세입니다. ([GitHub](https://github.com/) 또는 [Phabricator](http://phabricator.org/)등이 있습니다). 원격 저장소가 _항상_ 이러한 도구들의 중심 뼈대를 이루고 있습니다. 그래서 잘 아는 것이 중요해요!"]}},{type:"ModalAlert",options:{markdowns:["## 원격 저장소를 생성하는 명령어","","지금까지, Git 브랜치 배우기는 _로컬_ 저장소가 어떻게 활용되는지에 대해 중점적으로 소개해 왔습니다(브랜치, 합병, 리베이스 등등). 이제 원격 저장소를 어떻게 활용하는지에 대해 배워보려고 합니다. 앞으로 이어질 레슨의 환경을 마련할 명령어가 필요합니다. `git clone`이 바로 그 명령어입니다.","","실제로 `git clone`은 원격 저장소의 복사본을 _로컬_에 생성할때 사용하는 명령어입니다(github에서 가져올 때라던가). Git 브랜치 배우기에서는 이 명령어를 살짝 다르게 사용합니다 -- `git clone`이 당신의 로컬 저장소에서 원격 저장소를 생성해냅니다. 물론 실제 명령어와 반대로 작동하는 것이지만 클론과 원격 저장소 사이의 연결관계를 이해하는데 도움이되서 이렇게 했습니다. 일단은 그냥 해봅시다.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["천천히 시작해봅시다. 일단 원격저장소가 우리 시각화 자료에서 어떻게 보이는지부터 봅시다.",""],afterMarkdowns:["자! 이제 우리 프로젝트의 원격 저장소를 가지게 되었습니다. 구분을 하기위해 조금 모양이 다른것 말고는 둘이 똑같게 생긴걸 알 수 있습니다 -- 뒤의 레벨에서는 우리가 이 저장소들 사이에서 어떻게 작업을 공유하는지 알아보겠습니다."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["이 레벨을 통과하기 위해서 `git clone`을 입력하세요. 뒤의 레슨에서 더많은 것들을 배워볼 것입니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Віддалені репозиторії","",'Віддалені репозиторії не є дуже складними. В сучасному світі, де на кожному кроці можна зустріти "хмарні обчислення", може видатися, що концепція віддалених репозиторіїв є дуже складною, але насправді вони -- просто звичайні копії твого репозиторію на віддаленому комп’ютері. Зазвичай з цим віддаленим комп’ютером можна зв’язатися через інтернет, що дозволяє обмінюватись комітами.',"","Приймаючи до уваги все сказане вище, віддалені репозиторії мають купу чудових властивостей:","","- В першу чергу, віддалені сервери -- це завжди чудова резевна копія (бекап)! Локальний репозиторій дає можливість відкотитися до попереднього стану, але вся інформація зберігається локально. Маючи копії свого репозиторію на віддалених машинах, ти можеш пережити втрату жорсткого диску чи пошкодження данних і продовжити працювати з того місця, на якому закінчив.","","- Що не менш важливо, віддалені репозиторії роблять програмування соціальним! Коли копія твого проекту розміщена в мережі, твої друзі мають змогу допомогти твоєму проекту (чи стягнути останні зміни) без зайвих зусиль.","","Стало дуже популярним користуватися веб-сайтами, що візуалізують активність на віддалених репозиторіях (наприклад [GitHub](https://github.com/)), але віддалені репозиторії _завжди_ слугують як основа цих сервісів. Тому важливо розуміти їх!"]}},{type:"ModalAlert",options:{markdowns:["## Команда, що створює віддалені репозиторії","","До цього моменту, Learn Git Branching концентрувало увагу на основах роботи з _локальним_ репозиторієм (гілкування, злиття гілок, ребейс, тощо). Однак тепер, коли ми вчимо віддалені репозиторії, нам потрібно налаштувати середовище для подальших уроків. `git clone` впорається з цим завданням.","","В принципі, `git clone` в справжньому git -- це команда для створення _локальної_ копії віддаленого репозиторію (наприклад з github). Але у Learn Git Branching ми використовуватимемо цю команду по-іншому -- `git clone` буде створювати віддалений репозиторій з локального. Я згодний, що це виходить трохи догори-дригом, але це допоможе створити зв’язок в голові між клонуванням та роботою з віддаленми репо, тому поки що будемо використовувати її таким чином.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Низький старт - просто подивімося, як віддалений репозиторій виглядає (в нашій візуалізації).",""],afterMarkdowns:["Ось і все! Тепер ми маємо віддалений репозиторій нашого проекту. Він виглядає досить схоже, хіба що деякі візуальні елементи інші, щоб краще показати різницю -- в наступних рівнях ти навчишся ділитися роботою між цими репозиторіями."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, просто зроби `git clone` свого поточного репозиторію. Справжні знання ти отримаєш в подальших рівнях."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remotes (Kho lưu trữ từ xa)","","Thực ra thì kho chứa từ xa cũng không khó hiểu lắm đâu. Giờ đây, đâu đâu cũng thấy điện toán đám mây nên ai ai cũng tưởng git remote nó là cái gì đó ma thuật lắm, nhưng chúng thực ra chỉ là những bản sao chép kho chứa của bạn lên máy tính khác. Bạn có thể giao tiếp với chúng qua internet, từ đó mà chuyển giao commit qua lại.","","Vì lẽ đó mà kho chứa từ xa có những đặc tính tuyệt vời:","","- Trước hết, có tác dụng như là bản sao dự phòng! Bạn đã biết rằng kho cục bộ có thể khôi phục trở lại trạng thái trước đó, nhưng tất cả thông tin đó chỉ được lưu trữ cục bộ. Bằng cách sao chép toàn bộ kho chứa của bạn lên máy tính ở xa, một khi dữ liệu trong máy tính bị mất, bạn vẫn có thể tiếp tục làm việc như chưa có gì xảy ra.","","- Quan trọng hơn nữa, kho chứa từ xa khiến lập trình có tính cộng đồng hơn! Bây giờ bản sao dự án của bạn đã được lưu trữ ở nơi khác, bạn bè của bạn có thể đóng góp (hoặc kéo về cập nhật mới nhất) dự án của bạn rất dễ dàng.","","Trực quan hóa các kho lưu trữ từ xa bằng cách sử dụng các trang web đang trở nên phổ biến hơn (như [GitHub](https://github.com/)), nhưng các kho lưu trữ từ xa _luôn luôn_ là trụ cột của các công cụ này, vì vậy điều quan trọng là phải hiểu khái niệm này!"]}},{type:"ModalAlert",options:{markdowns:["## Câu lệnh của chúng tôi để tạo kho lưu trữ từ xa","","Cho đến bây giờ, Học Nhánh Git đã tập trung dạy về làm việc trên kho chứa _cục bộ_ (rẽ nhánh `branch`, hợp nhánh `merge`, dịch chuyển nhánh `rebase`,...). Nhưng bây giờ ta lại muốn học về làm việc trên kho lưu trữ từ xa, ta cần một câu lệnh để cài đặt môi trường cho những bài học này. Đó là `git clone`.","","Về mặt kỹ thuật, thì `git clone` thực tế là câu lệnh dùng để tạo một bản sao chép _cục bộ_ của kho chứa từ xa (ví dụ từ GitHub chẳng hạn). Nhưng trong Học Nhánh Git ta sẽ dùng câu lệnh này hơi khác biệt một chút -- `git clone` sẽ tạo ra một bản sao chép lên kho lưu trữ từ xa dựa trên kho chứa cục bộ của bạn. Điều này hoàn toàn ngược lại với câu lệnh thực tế, nhưng nó giúp ta nhân bản và làm việc với kho lưu trữ từ xa, nên ta sẽ dùng nó trong quá trình học.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào cùng khởi động bằng cách nhìn xem kho lưu trữ từ xa trông như thế nào (trong mô tả của chúng tôi).",""],afterMarkdowns:["Nó đây rồi! Giờ ta đã có kho lưu trữ dự án từ xa. Nhìn nó cũng khá tương tự chỉ là được minh họa khác biệt một chút -- đến các cấp độ sau ta sẽ tìm hiểu thêm về cách thức trao đổi nội dung giữa các kho chứa này."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này chỉ cần đơn giản gõ lệnh `git clone` để sao chép kho chứa hiện tại. Ta sẽ học sâu hơn ở các bài học sau."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Oddaljeni Git","","Oddaljeno repozitoriji sploh niso tako zakomplicirani. V današnjem svetu oblačnih storitev si lahko kdo predstavlja, da je veliko čarovnije za oddaljnim Gitom, a gre preprosto za tvoj repozitorij na drugem računalniku. Ponavadi lahko komuniciraš s tem računalnikom preko interneta, ki ti omogoča da prenašaš commite naprej in nazaj.","","Poleg tega imajo oddaljeni repozitoriji tudi veliko super lastnosti:","","- Prvič, oddaljenost služi za odlično rezervo! Lokalni git repozitoriji imajo možnost obnovitve datotek v prejšnje stanje (kot že veš), ampak vse te informacije so shranjene lokalno. S tem da imaš shranjene kopije gita na drugih računalnikih, lahko izgubiš vse tvoje lokalne podatke, pa imaš še zmeraj opcijo nadaljevati, kjer si ostal.","","- Še pomembneje, kodiranje lahko naredijo družabno! Sedaj, ko je kopija tvojega projekta nekje objavljena, lahko tvoji prijatelji pomagajo tvojemu projektu (ali pridobijo zadnje spremembe) zelo enostavno.","","Uporaba strani, ki vizualizirajo oddaljene repozitorije je postala zelo popularna (npr. [GitHub](https://github.com/)), ampak bistvo teh strani vseeno predstavljajo oddaljeni repozitoriji. Zato je pomembno, da jih razumemo!"]}},{type:"ModalAlert",options:{markdowns:["## Naši ukazi za kreiranje oddaljenih repozitorijev","","Do te točke, se je Learn Git Branching osredotočil na učenje osnov dela na lokalnih repozitorijih (branching, merging, rebasing, itd). Ampak sedaj, ko se hočemo naučiti še o delu na oddaljenih repozitorijih, potrebujemo ukaz, da postavi okolje za te lekcije. `git clone` bo ta ukaz.","","Tehnično je `git clone` v pravem svetu ukaz, ki ga boš uporabil za ustvarjanje lokalnih kopij oddaljenih repozitorijev (iz githuba naprimer). Mi uporabljamo ta ukaz nekoliko drugače na Learn Git Branching -- `git clone` ubistvu naredi oddaljen repozitorij iz tvojega lokalnega. Seveda, tehnično je nasproten pomen pravega ukaza, ampak pomaga ustvariti povezavo med kloniranjem in delom na oddaljenem repozitoriju, zato ga zdaj pač uporabljajmo.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Začnimo počasi in poglejmo kako izgleda oddaljen repozitorij (v naši vizualizaciji).",""],afterMarkdowns:["Evo ga! Sedaj imamo oddaljen repozitorij našega projekta. Izgleda precej podoben razen nekaj vizualnih sprememb, da se opazi razlika -- v kasnejših stopnjah boš spoznal, kako si delimo delo preko teh repozitorijev."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, uporabi `git clone` na svojem obstoječem repozitoriju. Pravo učenje pride v lekcijah, ki sledijo."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zdalny Git","","Zdalne repozytoria nie są w rzeczywistości bardzo skomplikowane. W dzisiejszym, działającym w chmurze, świecie łatwo jest uznać, że za zdalnym Gitem kryje jakaś wielka magia, ale w rzeczywistości są to tylko kopie twojego repozytorium na innym komputerze. Zazwyczaj możesz połączyć się z nim przez internet, co umożliwia przesyłanie commitów tam i z powrotem. ","","Ale oczywiście zdalne repozytoria mają kilka świetnych właściwości:","","- Przede wszystkim zdalne repozytoria służą jako świetna kopia zapasowa! Lokalne repozytoria Git (jak już wiesz) mają możliwość przywracania plików do poprzedniego stanu, ale wszystkie te informacje są przechowywane lokalnie. Mając kopie repozytorium Git na innych komputerach, nawet jeśli stracisz wszystkie swoje dane lokalne, i tak możesz kontynuować pracę od tego samego miejsca.","","- Co ważniejsze, zdalne repozytoria sprawiają, że kodowanie jest społeczne! Teraz, gdy kopia twojego projektu jest umieszczona gdzie indziej, twoi znajomi mogą bardzo łatwo wnieść swój wkład do twojego projektu (lub pobrać najnowsze zmiany).","","Bardzo popularne stało się korzystanie ze stron internetowych, które wizualizują aktywność w zdalnych repozytoriach (takich jak [GitHub](https://github.com/)), ale podstawą tych narzędzi _zawsze_ są zdalne repozytoria. Dlatego ważne jest, aby je zrozumieć!"]}},{type:"ModalAlert",options:{markdowns:["## Polecenia do tworzenia zdalnych repozytoriów","","Do tego momentu kurs Learn Git Branching skupiał się na nauczaniu podstaw pracy z repozytoriami _lokalnymi_ (branch, merge, rebase itp.). Jednak teraz, gdy chcemy dowiedzieć się więcej o pracy ze zdalnym repozytorium, potrzebujemy polecenia, aby skonfigurować środowisko tych lekcji. Tym poleceniem będzie `git clone`.","","Technicznie rzecz biorąc, `git clone` w prawdziwym świecie jest poleceniem, którego będziesz używać do tworzenia _lokalnych_ kopii zdalnych repozytoriów (na przykład z GitHuba). Używamy tego polecenia nieco inaczej w Learn Git Branching -- `git clone` faktycznie tworzy repozytorium zdalne z lokalnego. Jasne, jest to technicznie odwrotne znaczenie prawdziwego polecenia, ale pomaga zrozumieć zależność między klonowaniem a pracą na zdalnym repozytorium, więc na razie zobaczmy, jak to wygląda w działaniu.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zacznijmy powoli i spójrzmy tylko, jak wygląda zdalne repozytorium (w naszej wizualizacji).",""],afterMarkdowns:["No i jest! Teraz mamy zdalne repozytorium naszego projektu. Wygląda dość podobnie, z wyjątkiem pewnych wizualnych zmian pomagających odróżnić je od lokalnego -- na kolejnych poziomach zobaczysz, jak udostępniamy pracę w tych repozytoriach."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, po prostu wpisz `git clone` na swoim repozytorium. Czas na prawdziwą naukę przyjdzie w kolejnych lekcjach."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remoto","","I repository remoti non sono così tanto complicati. Nell'odierno mondo del cloud computing è facile pensare che vi sia una sorta di magia dietro i remote di git, ma in effetti sono solo copie del tuo repository in un altro computer. Puoi comunicare con quest'altro computer tramite Internet, consentendoti di trasferire commit dall'uno all'altro.","","Detto ciò, i repository remoti hanno diverse proprietà interessanti:","","- Prima di tutto, un repository remoto può servire come backup! Con i repository git locali si possono riportare file ad uno stato precedente (come sai), ma tutte le informazioni sono memorizzate localmente. Avendo copie del tuo repository git in altri computer, tu potresti perdere tutti i tuoi dati locali e riprenderli da dove avevi interrotto.","","- Seconda cosa, ancora più importante, l'utilizzo di repository remoti introduce al coding sociale! Ora che una copia del tuo progetto è ospitata anche altrove, i tuoi amici possono contribuire al tuo progetto molto agevolmente (o recuperare le tue ultime modifiche) .","","E' diventato molto popolare l'utilizzo di siti web che mostrano le attività di repository remoti (come [GitHub](https://github.com/)), ma questi repository _sempre_ rappresentano la base sottostante per questi strumenti. Per cui è importante conoscerli a fondo!"]}},{type:"ModalAlert",options:{markdowns:["## I nostri comandi per creare repository remoti","","Finora, Learn Git Branching si è focalizzato nell'insegnare le basi del lavoro _locale_ sui repository (creazione di rami, fusione, rebasing, etc). Tuttavia, ora che vogliamo esplorare il lavoro con i repository remoti, abbiamo bisogno di un comando per impostare l'ambiente per tali lezioni. Questo comando sarà `git clone`.","","Tecnicamente, `git clone` nel mondo reale è il comando che userai per creare copie _locali_ di repository remoti (da github per esempio). In Learn Git Branching, però, useremo questo comando in modo leggermente diverso -- `git clone` creerà un repository remoto a partire da quello tuo locale. E' chiaro che questo è il significato tecnicamente opposto del comando reale, ma questo aiuta nel costruire la connessione tra il cloning e il lavoro sui repository remoti, quindi per ora lo utilizzeremo così.",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Partendo lentamente, esaminiamo come un repository remoto appare nella nostra visualizzazione.",""],afterMarkdowns:["Eccolo! Ora abbiamo un repository remoto del nostro progetto. Appare molto similie eccetto per qualche modifica nella visualizzazione per far notare la distinzione -- nei successivi livelli vedrai come condividere il lavoro tra questi repository."],command:"git clone",beforeCommand:""}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, semplicemente esegui `git clone` nel tuo repository esistente. Il succo dell'apprendimento avverrà nelle prossime lezioni."]}}]}}}},{}],140:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C5","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C3","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C4":{"parents":["C1"],"id":"C4"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C5":{"parents":["C3","C4"],"id":"C5"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git clone;git fakeTeamwork 2;git commit ;git pull",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Faking Teamwork",fr_FR:"Simulation du travail d'équipe",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:"模拟团队合作",zh_TW:"模擬團隊合作",ru_RU:"Коллективная работа",uk:"Симуляція колективної роботи",ko:"가짜 팀워크",vi:"Giả lập làm việc nhóm",sl_SI:"Lažno Ekipno Delo",pl:"Symulacja pracy zespołowej",it_IT:"Simulare il lavoro di squadra"},hint:{en_US:"Remember you can specify the number of commits to fake",fr_FR:"Rappelez-vous que vous pouvez spécifier le nombre de commits à simuler",de_DE:"Nicht vergessen, du kannst angeben wie viele 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:"记住你可以指定仿真提交的个数",zh_TW:"你要記得指定要送多少個 commit 出去",ru_RU:"помните, Вы можете указать количество фейковых коммитов",uk:"пам’ятай що ти можеш вказати кількість фейкових комітів",ko:"가장할 커밋의 갯수를 조절할 수 있습니다.",vi:"Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập",sl_SI:"Spomni se, da lahko določiš število lažnih commitov.",pl:"Pamiętaj, że możesz określić liczbę symulowanych commitów",it_IT:"Tieni a mente che puoi specificare il numero di commit da simulare"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulating collaboration","","So here is the tricky thing -- for some of these upcoming lessons, we need to teach you how to pull down changes that were introduced in the remote.","",'That means we need to essentially "pretend" that the remote was updated by one of your coworkers / friends / collaborators, sometimes on a specific branch or a certain number of commits.',"","In order to do this, we introduced the aptly-named command `git fakeTeamwork`! It's pretty self explanatory, let's see a demo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["The default behavior of `fakeTeamwork` is to simply plop down a commit on main."],afterMarkdowns:["There we go -- the remote was updated with a new commit, and we haven't downloaded that commit yet because we haven't run `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["You can also specify the number of commits or the branch by appending them to the command."],afterMarkdowns:["With one command we simulated a teammate pushing three commits to the `foo` branch on our remote."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["The upcoming levels are going to be pretty difficult, so we're asking more of you for this level.","","Go ahead and make a remote (with `git clone`), fake some changes on that remote, commit yourself, and then pull down those changes. It's like a few lessons in one!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simuler la collaboration","","C'est là que cela devient compliqué : pour certaines des leçons à venir, nous avons besoin de vous enseigner comment récupérer les changements effectués sur le dépôt distant.","","Cela signifie que nous devons faire semblant que le dépôt distant a été modifié par un collègue / ami / collaborateur, et parfois même sur une branche spécifique ou avec plusieurs commits.","","Pour faire cela, nous introduisons à point nommé la commande `git fakeTeamwork` ! Elle devrait vous paraître assez intuitive, voyons une démo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Le comportement par défaut de `fakeTeamwork` est tout simplement de faire apparaître un commit sur le main distant :"],afterMarkdowns:["Voilà : le dépôt distant a été mis à jour avec un nouveau commit, et nous n'avons pas encore téléchargé ce commit parce que nous n'avons pas exécuté la commande `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vous pouvez aussi spécifier le nombre de commits ou la branche en les ajoutant à la fin de la commande."],afterMarkdowns:["Avec une seule commande, nous avons simulé un collègue ayant pushé 3 commits sur la branche `foo` de notre dépôt distant."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Les niveaux suivants vont devenir assez difficiles, nous augmentons donc un peu la difficulté de cet exercice.","","Vous devrez créer un dépôt distant (avec `git clone`), simuler quelques changements sur ce dépôt, commiter les vôtres, et enfin appliquer les changements distants dans votre dépôt local (pull). C'est presque plusieurs leçons en une !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulando la colaboración","","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 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..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["El comportamiento por default de `fakeTeamwork` es simplemente crear un commit en main."],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 podés 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.","","Animate y creá un remoto (con `git clone`), simulá algunos cambios en ese remoto, commiteá en tu repo local, y luego pulleate esos cambios. ¡Es como varias lecciones en una!"]}}]},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 main."],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 rama 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:[{type:"ModalAlert",options:{markdowns:["## Simulando colaboração","","Neste ponto, temos uma pequena dificuldade -- para algumas das lições a seguir, precisaremos ensinar como fazer pull de mudanças que foram introduzidas no repositório remoto.","",'Isso significa que precisaremos essencialmente "fingir" que o repositório remoto foi atualizado por algum de seus colegas / amigos / colaboradores, algumas vezes em um ramo específico ou com um certo número de commits.',"","Para esta finalidade, criamos o comando fictício `git fakeTeamwork`! Ele é bastante auto-explicativo, vejamos uma demonstração..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O comportamento padrão do `fakeTeamwork` é simplesmente fazer aparecer um commit no main."],afterMarkdowns:["Aqui vamos nos -- o repositório remoto foi atualizado com um novo commit, e ainda não baixamos esse commit porque não executamos um `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Você também pode especificar o número de commits ou o ramo, anexando-os ao comando."],afterMarkdowns:["Com um único comando, nós simulamos um colega enviando 3 commits para o ramo `foo` do repositório remoto."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Os níveis posteriores serão mais difíceis, então estamos pedindo um pouco mais de você neste nível.","","Vá em frente e crie um repositório remoto (chamando `git clone`), simule algumas mudanças no repositório remoto, commite no repositório local, e então faça um pull das mudanças que haviam sido simuladas. É como se fossem várias lições em uma só!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulando o traballo no repositorio","","Entón, hai algo con trampa aquí -- para algunhas das leccións seguintes, precisamos explicarche cómo baixar os cambios introducidos no repositorio remoto.","",'Eso significa que escencialmente temos que "finxir" que o repositorio remoto foi actualizado por algún compañeiro, amigo ou incluso nalgunha rama específica a cantidade de commits feitos.',"","Para acadar esto, introduxemos o ben chamado comando `git fakeTeamwork`! É bastante auto-explicativo: semella traballo dos nosos colegas. Vexamos una demo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O comportamento por defecto de `fakeTeamwork` é simplemente crear un commit en main na rama remota."],afterMarkdowns:["Ahí o tes: a rama remota actualizouse cun novo commit, e aínda non nos baixamos ese commit porque inda non fixemos `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tamén podes especificar a cantidad de commits ou a rama agregándoos ó comando."],afterMarkdowns:["Cun único comando simulamos que un colega do equipo empurrou tres commits á rama `foo` do noso remoto."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Os niveis seguintes van ser un pouco máis complicados, así que imos a esixirte un pouco máis neste nivel.","","Anímate e crea unha rama remota (con `git clone`), e simula algúns cambios no repositorio remoto, logo desto, fai commit do teu repo local, e logo descarga os cambios. ¡É coma varias leccións nunha soa!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 模擬合作","","接下來的課程有一個很難的事情,我們需要讓你學會如何 pull remote 上的更新。","",'這就表示我們必須要 "假裝" remote 被你其中一個同事/ 朋友/ 合作的人在某個特定的 branch 上面送了一些特定的 commit。',"","為了要做到這件事情,我們要介紹一個自己設計的指令 `git fakeTeamwork`! 從字面上就可以很容易地看出來它在幹嘛,讓我們來看一個範例..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork` 的預設行為是在送一個 commit 給 main 分支"],afterMarkdowns:["我就說吧!remote 已經藉由一個新的 commit 而更新了,而且因為我們還沒有用 `git fetch`,所以表示我們還沒有下載該 commit。"],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你可以在命令的後面指定你要送幾個 commit 或是要送給哪個 branch。"],afterMarkdowns:["我們利用一個指令將三個 commit 送給在 remote 上面的 `foo` branch。"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["接下來的關卡會很困難,所以我們在這個關卡中會問你更多問題。","","現在先把 remote 下載下來(利用 `git clone`),假裝送幾個 commit 給 remote 做更新,然後 pull 這些 commit 下來 。這就好像是幾個教學中的指令的總結!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 模拟团队合作","","这里有一件棘手的事 —— 为了接下来的课程, 我们需要先教你如何制造远程仓库的变更。","","这意味着,我们需要“假装”你的同事、朋友、合作伙伴更新了远程仓库,有可能是某个特定的分支,或是几个提交记录。","","为了做到这点,我们引入一个自造命令 `git fakeTeamwork`!它的名称已经说明了一切,先看演示.."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork` 默认操作就是在远程仓库的 main 分支上做一次提交。"],afterMarkdowns:["完成了 —— 远程仓库增加了一个新提交,我们还没有下载它,因为我们还没有执行 `git fetch`。"],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["你还可以指定提交的分支或是数量,只需要在命令后加上它们就可以了。"],afterMarkdowns:["通过一个命令,我们就模拟队友推送了 3 个提交记录到远程仓库的 foo 分支。"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["接下来的关卡会相当的困难,所以在本关会让你做许多事情,先来热热身。","","克隆一个远程仓库(用 `git clone`),再在刚创建的远程仓库中模拟一些修改,然后在你自己的本地分支上做一些提交,再拉取远程仓库的变更。这看起来像是包含了好几节的课程。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zusammenarbeit simulieren","","Hier ist das Problem -- für einige der folgenden Level müssen wir lernen, wie man Änderungen vom entfernten Server holt.","",'Das heißt wir müssen im Grunde "so tun", als ob der Server von einem Kollegen / Freund / Mitarbeiter aktualisiert worden wäre, manchmal ein bestimmter Branch oder eine bestimmte Anzahl von Commits.',"","Um das zu tun führen wir den passend benannten Befehl `git fakeTeamwork` ein! Er ist ziemlich selbsterklärend, schauen wir uns ihn an ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Das normale Verhalten von `fakeTeamwork` ist es, einen Commit auf den entfernten `main` zu machen."],afterMarkdowns:["Da haben wir's -- der Server ist mit einem neuen Commit aktualisiert worden und wir haben ihn noch nicht lokal, weil wir weder `git fetch` noch `git pull` ausgeführt haben."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Du kannst auch angeben wie viele Commits oder auf welchem Branch sie gemacht werden sollen, indem du das an den Befehl anhängst."],afterMarkdowns:["Mit einem Befehlt haben wir simuliert, dass ein Kollege drei Commits auf den Branch `foo` gepackt hat."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Die kommenden Level werden recht anspruchsvoll, daher verlangen wir auch in diesem Level schon etwas mehr.","","Leg los und erstelle ein Remote (mit `git clone`), simuliere ein paar Änderungen auf dem Server, committe lokal und dann zieh dir die Änderungen vom Server. Das ist wie mehrere Level in einem!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Симуляция совместной работы","","В данном уроке мы находимся в немного затруднительном положении - для выполнения ряда упражнений нам нужно обучить вас скачивать наработки и изменения, которые были сделаны в удалённом репозитории.","",'Это означает, что нам следует "сделать вид", как будто мы знаем о том, что наш удалённый репозиторий, с которым мы работаем, был изменён одним из ваших коллег / друзей / единомышленников. Это может быть какая-то ветка, либо же какой-то конкретный коммит.',"","Для того, чтобы добиться своих целей, нам предоставляется команда со звучным именем `git fakeTeamwork`! Имя команды однозначно даёт понять, что она выполняет. Давайте ознакомимся с демо..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Поведение команды `fakeTeamwork` по умолчанию заключается в том, чтобы просто "инициировать" коммит на main-е'],afterMarkdowns:["Ну вот - удалённый репозиторий был изменён при помощи добавления нового коммита, и мы ещё не скачали этот коммит, потому что не запустили команду `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["В данной команде вам доступна возможность указать ветку и количество добавляемых коммитов"],afterMarkdowns:["С помощью одной лишь команды мы симулируем добавление трёх коммитов в ветку `foo` на удалённом репозитории"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Последующие уровни будут довольно сложными, поэтому в этом упражнении от вас больше ничего не требуется.","",'Вперёд! Склонируйте удалённый репозиторий (с помощью `git clone`), симулируйте любые изменения на этом удалённом репозитории, сделайте какие-нибудь свои коммиты и затем скачайте "чужие" изменения. Это выглядит как несколько уроков в одном!']}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 連携のシミュレーション","","ここでは少し奇怪なものを取り扱います -- これは次回以降の幾つかのレッスンのためのもので、リモートセクションで変更点の反映方法を教えるのに必要なものです。","","つまり、私たちには時にはリモートの特定のブランチや特定の数のコミットを、同僚/友人/共同開発者の一人が更新した「ふりをする」ことが必要だというわけです。","","これを行うために、私たちは適切に選んだ名前のコマンド`git fakeTeamwork`を導入しました!とても明白でしょう?では、デモを見てみましょう。","","*注:もちろん、本当のgit上にこのようなコマンドは存在しません!変更は、「実在する」同僚や友人が行ってくれるでしょうから!ここではレッスンのために「擬似的に」導入しているにすぎません!*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork`のデフォルトの動作は、単にmainの上にコミットを乗っけるだけです"],afterMarkdowns:["ではいってみましょう -- リモートには新しいコミットが更新され、それはまだ私たちの手元にはダウンロードされていません。なぜなら、`git fetch`を走らせていませんからね。"],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["さらに特定の数のコミット、または追加するブランチをコマンドで指定することもできます。"],afterMarkdowns:["一つのコマンドで、チームメイトが3個のコミットをリモートの`foo`ブランチにプッシュするという動作を再現することができました。"],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["今後のレベルはどんどん難しくなっていくでしょうから、このレベルでも私たちはあなたに少々多くのことを求めます。","","先に行くには、リモートを作り(`git clone`で)、リモートに幾つかの変更を再現して、自身のリポジトリにコミットし、変更を取り込む必要があります。これは、このリモートのセクションでやった幾つかのレッスンの内容と似ていますね!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Симулюємо співпрацю","","Зараз ми знаходимося в незручному становищі -- в деяких із наступних уроків нам потрібно буде пояснити як витягнути зміни з віддаленого репозиторію, що були туди додані іншим учасником.","",'Це означає, що нам треба "вдавати", що віддалений репозиторій був модифікований твоїм колегою / друзями / небайдужими, іноді на специфічній гілці чи коміті.',"","Щоб зробити це, ми додали влучно названу команду `git fakeTeamwork` (симуляціяКолективноїРоботи)! Насправді, з симуляцією колективної роботи стикався мабуть кожен, хто працював в колективі, тож перейдімо до прикладів..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["За замовчуванням `fakeTeamwork` просто додасть коміт в гілку `main`."],afterMarkdowns:["Є -- до віддаленого репозиторію додався ще один коміт, проте ми ще його не звантажили, оскільки ще не виконали `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ти також можеш вказати кількість комітів чи гілку, в яку потрібно додати коміти."],afterMarkdowns:["Виконавши одну команду ми симулювали колегу, що запушив три коміти в гілку `foo` на віддаленому репозиторії."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Наступні рівні будуть доволі складними, тому, щоб підготуватись, на цьому рівні теж доведеться не солодко.","","Створи віддалений репозиторій (за допомогою `git clone`), зроби кілька фіктивних змін, зроби кілька комітів локально, й підвантаж віддалені зміни. Це як кілька уроків в одному!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 협동 가장하기","","조금 곤란한일이 생겨버렸습니다 -- 앞으로 배울 레슨들에서 원격 저장소에서 일어난 변경들을 어떻게 로컬로 가져올것인지에 대해 배워 볼것입입니다.","",'그런데 여기서 우리는 불가피하게 그 _변경_들을 만들어야 되는데, 원격 저장소가 동료 / 친구 / 협력자등에 의해 특정 브랜치나 여러개의 커밋이 갱신되는 경우를 표현할 필요가 있습니다. 즉 우리는 팀워크를 "가장"할 필요가 있는것 입니다.',"","이런 문제를 해결하기 위해서 `git fakeTeamwork` 명령을 만들었습니다! 이름이 참 적절하죠? 예시를 통해 확인해봅시다..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`fakeTeamwork`의 기본 행동은 원격 main에 간단히 하나의 커밋을 하는것 입니다."],afterMarkdowns:["자, 됐습니다 -- 원격 저장소에 새로운 커밋이 갱신되었습니다. 아직 `git fetch`를 하지 않았기 때문에 로컬로 내려받아지지는 않았습니다."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["명령어에 추가할 커밋의 갯수나 어떤 브랜치에 추가할지 지정하는것도 가능합니다. 다음과 같이 명령어 뒤에 추가하면 됩니다."],afterMarkdowns:["하나의 명령어로 팀원이 원격저장소의 `foo` 브랜치에 세개의 커밋을 push한것처럼 가장했습니다."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["뒤의 레벨들이 조금 어렵기 때문에, 이번 레벨에서 여러분에게 조금 많은것을 요구하려고 합니다.","","원격 저장소를 하나 만들고(`git clone`), 원격 저장소에 몇가지 가짜 변경을 만들고 로컬에서 커밋하고 원격의 변경들을 가져오세요. Goal과 같은 결과가 나오면 됩니다. 몇개의 레슨이 하나에 있다고 보면 되겠네요! 도전해봅시다."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mô phỏng hợp tác","","Bây giờ khó đây -- để chuẩn bị cho những bài học tới, chúng tôi cần chỉ bạn cách kéo về những cập nhật có trên kho chứa từ xa.","",'Có nghĩa là ta cần "giả vờ" kho chứa từ xa được cập nhật bởi đồng nghiệp / bạn / cộng tác viên của bạn, có khi là một nhánh xác định hoặc là một số commit.',"","Để làm điều này, chúng tôi sẽ giới thiệu cho bạn một lệnh tự tạo `git fakeTeamwork`! Cái tên nói lên tất cả, cùng xem thử bản giới thiệu..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hành xử mặc định của `fakeTeamwork` đơn giản là tạo ra một commit ở trên nhánh main từ xa."],afterMarkdowns:["Đó -- kho chứa từ xa đã được cập nhật thêm một commit, và ta chưa tải commit đó xuống vì ta chưa hề chạy lệnh `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bạn cũng có thể chỉ định số lượng commit bằng cách thêm con số đằng sau câu lệnh."],afterMarkdowns:["Chỉ với một câu lệnh ta có thể giả lập tạo ra 3 commit trên nhánh `foo` từ xa của ta."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Các cấp độ tới sẽ khá là khó, nên ở cấp độ này chúng tôi sẽ yêu cầu bạn thêm một chút.","","Sao chép một kho chứa từ xa (sử dụng `git clone`), sau đó mô phỏng một số thay đổi trong kho chứa từ xa mà bạn vừa tạo, sau đó thực hiện một số commit trên nhánh cục bộ của riêng bạn, sau đó kéo các thay đổi từ kho chứa từ xa. Nhiều bài học trong một bài."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulacija sodelovanja","","Tule imamo izziv -- za nekaj naslednjih lekcij te moramo naučiti, kako potegniti dol spremembe, ki so bile narejene na oddaljenem repozitoriju.","",'To pomeni, da se moramo pravzaprav "pretvarjati", da je oddaljen branch posodobil kak sodelavec, včasih na določenem branchu ali določeno število commitov.',"","Da bi to lahko naredili, smo uvedli ukaz `git fakeTeamwork`! Poglejmo prikaz ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Privzeto delovanje `fakeTeamwork` je, da samo doda commit na main:"],afterMarkdowns:["Tako -- oddaljen repo je bil posodobljen z novim commitom, katerega še nismo potegnili k sebi, ker še nismo pognali ukaza `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prav tako lahko določimo tudi število commitov ali ime brancha tako, da jih dodamo na koncu:"],afterMarkdowns:["Z enim ukazom smo simulirali sodelavca, ki je dodal tri commite na `foo` branch na našem oddaljnem repotu."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Naslednje stopnje bodo precej težke, zato od tebe v tej stopnji zahtevamo še več.","","Naredi oddaljen repo (z `git clone`), simuliraj nekaj sprememb na tem repotu, sam commitaj, nato pa potegni dol spremembe. Kot da bi bilo več lekcij v eni!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Symulacja pracy zespołowej","","Pora na małe oszustwo -- na potrzeby niektórych z nadchodzących lekcji musimy nauczyć cię, jak ściągać (pull) zmiany, które zostały wprowadzone na zdalnej gałęzi przez innych.","",'W zasadzie oznacza to, że musimy "udawać", że zdalne repozytorium zostało zaktualizowane przez jednego z twoich współpracowników / przyjaciół / współtwórców na jakiejś gałęzi lub kilku commitach.',"","Aby to zrobić, wprowadziliśmy polecenie `git fakeTeamwork`! Po polsku byłoby to symulujPracę :D -- zobaczmy, jak to działa..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Domyślnym zachowaniem `fakeTeamwork` jest po prostu wrzucenie commita na gałąź main."],afterMarkdowns:["Proszę bardzo - zdalny serwer został zaktualizowany o nowy commit, a my jeszcze go nie pobraliśmy, ponieważ nie uruchomiliśmy `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Możesz również określić liczbę commitów lub gałąź poprzez dołączenie ich do polecenia."],afterMarkdowns:["Jednym poleceniem symulujemy, że kolega z zespołu wypycha trzy commity do gałęzi `foo` na zdalnym repozytorium."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["Kolejne poziomy będą dość trudne, więc tym razem twoje zadanie też jest bardziej wymagające.","","Nie bój się, stwórz zdalne repozytorium (używając `git clone`), zasymuluj na nim kilka zmian i zatwierdź je, a następnie ściągnij (pull) je. To jak kilka lekcji w jednej!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Simulare la cooperazione","","La questione è la seguente -- per alcune delle prossime lezioni, dovremo insegnarti come recuperare delle modifiche effettuate al repository remoto.","",'Questo significa che dobbiamo essenzialmente "far finta" che quest\'ultimo sia stato aggiornato da uno dei nostri colleghi / amici / collaboratori, a volte in un certo ramo o per un certo numero di commit.',"","Per fare ciò, abbiamo introdotto un comando ad hoc: `git fakeTeamwork`. È abbastanza autoesplicativo, vediamo una demo..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Il comportamento predefinito di `fakeTeamwork` consiste semplicemente nell'effettuare un commit sul main."],afterMarkdowns:["Ecco qua -- il repository remoto è stato aggiornato con un nuovo commit, e non lo abbiamo ancora scaricato in quanto non abbiamo eseguito `git fetch`."],command:"git fakeTeamwork",beforeCommand:"git clone"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Puoi anche specificare il numero di commit o il ramo su cui effettuali specificandolo nel comando."],afterMarkdowns:["Con un comando abbiamo simulato un nostro collega che invia tre commit al ramo `foo` del repository remoto."],command:"git fakeTeamwork foo 3",beforeCommand:"git branch foo; git clone"}},{type:"ModalAlert",options:{markdowns:["I prossimi livelli saranno abbastanza tosti, quindi ti chiediamo un po' di più già da ora.","","Crea un repository remoto (con `git clone`), simula alcune modifiche su quel repository, effettua tu un commit, e poi recupera quelle modifiche. È come più lezioni in una!"]}}]}}}},{}],141:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"o/main":{"target":"C5","id":"o/main"},"o/bugFix":{"target":"C7","id":"o/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":["C2"],"id":"C4"},"C6":{"parents":["C3"],"id":"C6"},"C5":{"parents":["C4"],"id":"C5"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"bugFix","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C5","id":"main"},"bugFix":{"target":"C7","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":["C2"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C3"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"bugFix","id":"HEAD"}}}',solutionCommand:"git fetch",startTree:'{"branches":{"main":{"target":"C2","id":"main"},"bugFix":{"target":"C3","id":"bugFix"},"o/main":{"target":"C2","id":"o/main"},"o/bugFix":{"target":"C3","id":"o/bugFix"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"bugFix","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C5","id":"main"},"bugFix":{"target":"C7","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":["C2"],"id":"C4"},"C5":{"parents":["C4"],"id":"C5"},"C6":{"parents":["C3"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"bugFix","id":"HEAD"}}}',name:{en_US:"Git Fetchin'",fr_FR:"Git fetch",de_DE:"Git Fetch",ja:"Git Fetch",es_AR:"git fetch",es_MX:"Git fetch",es_ES:"git fetch",pt_BR:"Git Fetch",gl:"Git Fetch",zh_CN:"Git Fetch",zh_TW:"git fetch",ru_RU:"Git fetch",uk:"Git fetch",ko:"Git Fetch",vi:"Git Fetch",sl_SI:"Git Fetch",pl:"Git fetch",it_IT:"Git Fetch"},hint:{en_US:"just run git fetch!",fr_FR:"Exécuter juste git fetch",de_DE:"Einfach git fetch ausführen!",ja:"単にgit fetchを実行!",es_AR:"Simplemente ¡hacé git fetch!",es_MX:"Simplemente ¡escribe git fetch!",es_ES:"Simplemente ¡escribe git fetch!",pt_BR:"Simplesmente chame git fetch!",gl:"¡Sinxelamente fai git fetch!",zh_CN:"只需要运行 git fetch 命令!",zh_TW:"只要下 git fetch 指令",ru_RU:"Просто выполните git fetch!",uk:"Просто виконай git fetch!",ko:"그냥 git fetch를 하세요!",vi:"Gõ git fetch là được!",sl_SI:"Le izvedi git fetch!",pl:"Po prostu uruchom git fetch!",it_IT:"Semplicemente git fetch!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Working with git remotes really just boils down to transferring data _to_ and _from_ other repositories. As long as we can send commits back and forth, we can share any type of update that is tracked by git (and thus share work, new files, new ideas, love letters, etc.).","","In this lesson we will learn how to fetch data _from_ a remote repository -- the command for this is conveniently named `git fetch`.","","You'll notice that as we update our representation of the remote repository, our _remote_ branches will update to reflect that new representation. This ties into the previous lesson on remote branches."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Before getting into the details of `git fetch`, let's see it in action! Here we have a remote repository that contains two commits that our local repository does not have."],afterMarkdowns:["There we go! Commits `C2` and `C3` were downloaded to our local repository, and our remote branch `o/main` was updated to reflect this."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### What fetch does","","`git fetch` performs two main steps, and two main steps only. It:","","* downloads the commits that the remote has but are missing from our local repository, and...","* updates where our remote branches point (for instance, `o/main`)","","`git fetch` essentially brings our _local_ representation of the remote repository into synchronization with what the _actual_ remote repository looks like (right now).","","If you remember from the previous lesson, we said that remote branches reflect the state of the remote repositories _since_ you last talked to those remotes. `git fetch` is the way you talk to these remotes! Hopefully the connection between remote branches and `git fetch` is apparent now.","","`git fetch` usually talks to the remote repository through the Internet (via a protocol like `http://` or `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### What fetch doesn't do","","`git fetch`, however, does not change anything about _your_ local state. It will not update your `main` branch or change anything about how your file system looks right now.","","This is important to understand because a lot of developers think that running `git fetch` will make their local work reflect the state of the remote. It may download all the necessary data to do that, but it does _not_ actually change any of your local files. We will learn commands in later lessons to do just that :D","","So at the end of the day, you can think of running `git fetch` as a download step."]}},{type:"ModalAlert",options:{markdowns:["To finish the level, simply `git fetch` and download all the commits!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Travailler avec les dépôts Git distants se résume en pratique à transférer nos données _depuis_ et _vers_ ces autres dépôts. Etant donné que nous pouvons envoyer des commits en avance et en retard, nous pouvons partager tous les types de mises à jour qui sont gérés par Git (et donc partager notre travail, de nouveaux fichiers, de nouvelles idées, des lettres d'amour, etc.).","","Dans cette leçon nous allons apprendre comment rapporter (fetch) des données _depuis_ un dépôt distant vers le nôtre : la commande pour cela est astucieusement dénommée `git fetch`.","","Vous allez remarquer qu'au moment où nous mettons à jour notre version du dépôt distant, nos branches _distantes_ vont se mettre à jour pour refléter cette nouvelle représentation. Cela est lié à la leçon précédente sur les branches distantes."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Avant d'entrer dans les détails de `git fetch`, voyons-le en action ! Ici nous avons un dépôt distant qui contient deux commits que notre dépôt local n'a pas."],afterMarkdowns:["Voilà ! Les commits `C2` et `C3` ont été téléchargés dans notre dépôt local, et notre branche distante `o/main` a été mise à jour pour refléter cela."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Ce que fetch fait","","`git fetch` procède en deux étapes principales, ni plus ni moins. Cela :","","* télécharge les commits que le dépôt distant possède mais qui ne sont pas dans le nôtre, puis...","* met à jour nos branches distantes (par exemple, `o/main`).","","`git fetch` prend en fait notre représentation _locale_ du dépôt distant pour la synchroniser avec ce à quoi le dépôt distant ressemble _réellement_ (à ce moment-là).","","Si vous vous rappelez de la précédente leçon, nous avons dit que les branches distantes reflètent l'état du dépôt distant _depuis_ la dernière fois où vous avez parlé à ces branches distantes. `git fetch` est le moyen de parler à ces branches distantes ! La relation entre `git fetch` et les branches distantes devrait vous sembler claire maintenant.","","`git fetch` contacte le dépôt distant par Internet (via un protocole comme `http://` ou `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Ce que fetch ne fait pas","","`git fetch`, cependant, ne change rien à _votre_ état local. Il ne met pas à jour votre branche `main` et ne va pas changer quelque chose aux fichiers qui se trouvent actuellement dans votre répertoire de travail.","","C'est important à comprendre car beaucoup de développeurs pensent qu'exécuter `git fetch` va mettre leur dépôt local dans le même état que le distant. Cela peut télécharger toutes les données nécessaires pour le faire, mais cela ne change en réalité _rien_ sur vos fichiers locaux. Les prochains niveaux seront justement dédiés aux commandes qui permettent de le faire :D","","Finalement, vous pouvez vous représenter `git fetch` comme une étape de téléchargement."]}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, exécuter simplement `git fetch` et téléchargez tous les commits !"]}}]},es_AR:{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. Acá tenemos un repositorio remoto que contiene dos commits que nuestro repositorio local no tiene."],afterMarkdowns:["¡Ahí vamos! Bajamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/main` 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/main`)","","`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`.","","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 `main` 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, podés pensar a `git fetch` como un paso de descarga."]}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente corré `git fetch` y bajate todos los commits."]}}]},es_MX:{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 a otro, podemos compartir cualquier tipo de actualización monitoreada por git (y, por lo tanto, compartir trabajo, archivos nuevos, ideas nuevas, cartas de amor, etc.).","","En esta lección vamos a aprender cómo traer datos _desde_ un repositorio remoto - el comando para esto se llama, `git fetch`.","","Vas a notar que a medida que actualicemos nuestra representación del repositorio remoto, nuestras ramas _remotas_ van a actualizarse para reflejar esa nueva representación. Esto va 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:["¡Ahí está! Descargamos los commits `C2` y `C3` a nuestro repositorio local, y nuestra rama remota `o/main` 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 principalmente dos pasos, y sólo esos dos pasos:","","* descarga 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/main`)","","`git fetch` escencialmente pone nuestra representación _local_ del repositorio remoto en sincronía con el _verdadero_ estado del repositorio remoto (en ese momento).","","Si recuerdas la lección anterior, dijimos que las ramas remotas reflejan el estado de los repositorios remotos _desde_ la última vez que te comunicaste con ellos. ¡`git fetch` es la manera con la que te comunicas con esos remotos! Espero que la relación entre las ramas remotas y `git fetch` sea evidente ahora.","","`git fetch` usualmente habla con el repositorio remoto a través de internet (mediante un protocolo como `http://` o `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### ¿Qué *no* hace fetch?","","Sin embargo, `git fetch` no modifica en nada _tu_ estado local. No va a actualizar tu rama `main` ni va a cambiar nada sobre cómo se ve tu sistema de archivos en ese momento.","","Es importante entender esto, porque un montón de desarrolladores piensan que correr `git fetch` hará que su trabajo local refleje el estado del remoto. Puede que `git fetch` descargue los datos necesarios para hacerlo, pero realmente *no* cambia ninguno de tus archivos locales. Vamos a aprender otros comandos para hacer eso más adelante. :D","","Así que, a fin de cuentas, puedes imaginar a `git fetch` como un proceso de descarga."]}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, simplemente ejecuta `git fetch` y descarga todos los commits."]}}]},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/main` 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/main`)","","`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 `main` 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:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Trabalhar com remotos no Git, no final das contas, se resume a transferir dados _de_ e _para_ outros repositórios. Desde que possamos enviar commits para um lado e para o outro, poderemos compartilhar qualquer tipo de atualização que seja gerenciada pelo Git (e portanto compartilhar trabalho, novos arquivos, novas ideias, cartas de amor, etc).","","Nesta lição vamos aprender como baixar dados _de_ um repositório remoto -- o comando para isso é convenientemente chamado de `git fetch`.","","Você perceberá que conforme atualizarmos a representação do repositório remoto, nossos ramos _remotos_ atualizar-se-ão para refletir essa nova representação. Isso tem a ver com o que vimos na lição anterior sobre ramos remotos."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Antes de entrar nos detalhes do `git fetch`, vejamo-no em ação! Aqui temos um repositório remoto que contém dois commits que nosso repositório local não possui."],afterMarkdowns:["Lá vamos nós! Os commits `C2` e `C3` foram baixados para o nosso repositório local, e nosso ramo remoto `o/main` foi atualizado para refletir esse fato."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### O que o fetch faz","","O `git fetch` realiza dois passos principais, e somente estes dois passos principais. Ele:","","* Baixa os commits que o repositório remoto possui mas que estão faltando no repositório local, e...","* Atualiza a referência para a qual os ramos remotos (por exemplo, `o/main`) estão apontando","","O `git fetch` essencialmente faz com que nossa representação _local_ do repositório remoto fique sincronizada com a forma com que o repositório remoto _de fato_ se parece (naquele momento).","","Se você lembrar da lição anterior, nós dissemos que os ramos remotos refletem o estado dos repositórios remotos _desde a última vez_ na qual você falou com esses repositórios. O `git fetch` é a única forma de falar com esses repositórios remotos! Espero que a conexão entre os ramos remotos e o `git fetch` esteja clara agora.","","O `git fetch` geralmente conversa com o repositório remoto por meio da Internet (usando um protocolo como `http://` ou `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### O que o fetch NÃO faz","","O `git fetch`, no entanto, não muda nada do estado _local_ do repositório. Ele não atualiza o seu ramo `main` nem muda nada na forma como o seu sistema de arquivos está no momento.","","É importante entender isso, pois muitos desenvolvedores pensam que executar `git fetch` fará com que o trabalho local reflita o estado do repositório remoto. Ele pode até baixar todos os dados necessários para fazê-lo, mas ele _não_ muda de fato nenhum dos arquivos locais. Vamos aprender comandos para fazê-lo nas lições a seguir :D","","No final das contas, você pode pensar no `git fetch` como um passo de download."]}},{type:"ModalAlert",options:{markdowns:["Para terminar este nível, simplesmente execute `git fetch` e baixe todos os commits!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Traballar con respositorios remotos en Git, a fin de contas, resúmese en transferir datos _dun_ repositorio _cara_ outros repositorios. Dende que podemos enviar commits dun lado cara o outro, poderemos compartir calquera tipo de actualización que sexa xerada por git (e polo tanto compartir o traballo, novos arquivos, novas ideas, cartas de amor, etc).","","Nesta lección imos aprender como baixar os cambios _dun_ repositorio remoto -- o comando para iso é `git fetch`.","","Percibirás que conforme atualizamos a representación do repositorio remoto, as nosas ramas _remotas_ actualizaranse para reflexar a nova representación. Iso ten que ver co que vimos na lección anterior sobre as ramas remotas."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ántes de entrar nos detalles de `git fetch`, vexámolo en acción! Aquí temos un repositorio remoto que contén dous commits que o noso repositorio local non ten."],afterMarkdowns:["Alá imos! Os commits `C2` e `C3` baixáronse ó noso repositorio local, e a nosa rama `o/main` actualizouse para reflexar ese cambio."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### O que fai o fetch","","`git fetch` fai dous pasos pasos principais, e soamente estes dous pasos princpipais. Son:","","* Baixa os commits que o repositório remoto contén pero non temos nos no noso repositoiro local, e...","* Actualiza a referencia nas ramas remotas (por exemplo, `o/main`) nas que se está apuntando","","`git fetch` esencialmente fai que a nosa representación _local_ do repositorio remoto se sincronice ca forma que posúe o repositorio remoto, _de feito_ parecese (nese momento).","","Se ti lembras a lección anterior, nos dixemos que as ramas remotas reflexan o estado dos repositorios remotos _dende a última vez_ na que ti fixeches un commit dese repositorio. O `git fetch` é a única forma de falar con eses repositorios remotos! Agardo que a conexión entre as ramas remotas e o `git fetch` esté clara dabondo agora.","","`git fetch` xeralmente fala co repositorio remoto por medio da rede (usando un protocolo como `http://`, `git://` ou `ssh`).",""]}},{type:"ModalAlert",options:{markdowns:["### O que fetch NON fai","","`git fetch`, por agora, non cambia nada no estado _local_ do repositorio. El solo actualiza a rama `main` sen facer cambios na forma de cómo está o teu sistema de arquivos nese momento.","","É importante entender iso, xa que moitos desenvolvedores pensan que executar `git fetch` fará que o traballo local se vexa modificado polo repositorio remoto. El pode que baixara todos os cambios necesarios para facelo, pero, o comando _non_ cambia cómo están os teus arquivos locais. Imos aprender comandos para facer esas conexións :D","","A fin de contas, ti podes pensar en `git fetch` como unha descarga."]}},{type:"ModalAlert",options:{markdowns:["Para rematar este nivel, so executa `git fetch` e baixa todos os commits!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git fetch","","透過 git remote 其實就是把資料接收或傳送到其它的 repository,只要我們可以將資料傳進及傳出,我們就可以分享任何被 git 所追蹤的 repository 的更新(例如分享工作進度,新的檔案,新的想法,以及情書等等...)。","","在這個教學中,我們會學習到如何從 remote repository 來 fetch (抓取)資料,這個指令叫作 `git fetch`。","","你將會注意到當我們的 remote repository 更新的時候,相對應的 _remote_ branch 也會反映該更新,這個跟我們之前所提到的 remote branch 的特性是吻合的。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在講到 `git fetch` 的細節之前,我們要先來看一下例子!在這裡我們有一個新增了兩個 commit 的 remote repository,而且我們的 local repository 並沒有包含這兩個 commit。"],afterMarkdowns:["看吧!commit `C2` 以及 `C3` 已經被下載到我們的 local repository,而且我們的 remote branch `o/main` 也更新了。"],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### fetch 做了什麼","","`git fetch` 只有執行了兩個主要步驟,包含:","","* 下載 remote 有的 commit,但是在我們的 local repository 是沒有該 commit。還有...","* 更新我們 remote branch 所指向的地方(例如, `o/main`)","","基本上,`git fetch` 同步了我們的 local repository 以及 remote repository 的最新狀態。","","假如你還記得之前的教學的話,我們說過 remote branch 反映了 remote repository 的狀態,原因在於說你最後接觸的是這些 remote repository,而你就是利用 `git fetch` 來接觸這些 remote repository!現在 remote branch 跟 `git fetch` 的關係已經很明顯了。","","`git fetch` 通常是透過網路來跟 remote 溝通(透過一個 protocol (協定),例如 `http://` 或者是 `git://`)。",""]}},{type:"ModalAlert",options:{markdowns:["### fetch 沒有做的事情","","然而,`git fetch` 並不會影響到在你的 local repository 中的 `main` branch,他並不會將你的 `main` branch 更新到最新的狀態。","","這個觀念很重要,因為很多程式設計師以為 `git fetch` 可以讓他們在 local repository 上面的工作跟 remote repository 的工作可以同步。它是會下載同步所需的資料,但是不會更新任何的檔案,我們會在後面的教學中提到如何做到這件事情。:D","","因此,你可以把 `git fetch` 想成是在下載資料。"]}},{type:"ModalAlert",options:{markdowns:["要完成這一關,只要透過 `git fetch` 並且下載全部的 commit 即可!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Git 远程仓库相当的操作实际可以归纳为两点:向远程仓库传输数据以及从远程仓库获取数据。既然我们能与远程仓库同步,那么就可以分享任何能被 Git 管理的更新(因此可以分享代码、文件、想法、情书等等)。","","本节课我们将学习如何从远程仓库获取数据 —— 命令如其名,它就是 `git fetch`。","","你会看到当我们从远程仓库获取数据时, 远程分支也会更新以反映最新的远程仓库。在上一节课程中我们已经提及过这一点了。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在解释 `git fetch` 前,我们先看看实例。这里我们有一个远程仓库, 它有两个我们本地仓库中没有的提交。"],afterMarkdowns:["就是这样了! `C2`,`C3` 被下载到了本地仓库,同时远程分支 `o/main` 也被更新,反映到了这一变化"],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### git fetch 做了些什么","","`git fetch` 完成了仅有的但是很重要的两步:","","* 从远程仓库下载本地仓库中缺失的提交记录","* 更新远程分支指针(如 `o/main`)","","`git fetch` 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。","","如果你还记得上一节课程中我们说过的,远程分支反映了远程仓库在你**最后一次与它通信时**的状态,`git fetch` 就是你与远程仓库通信的方式了!希望我说的够明白了,你已经了解 `git fetch` 与远程分支之间的关系了吧。","","`git fetch` 通常通过互联网(使用 `http://` 或 `git://` 协议) 与远程仓库通信。",""]}},{type:"ModalAlert",options:{markdowns:["### git fetch 不会做的事","","`git fetch` 并不会改变你本地仓库的状态。它不会更新你的 `main` 分支,也不会修改你磁盘上的文件。","","理解这一点很重要,因为许多开发人员误以为执行了 `git fetch` 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是**并没有**修改你本地的文件。我们在后面的课程中将会讲解能完成该操作的命令 :D","","所以, 你可以将 `git fetch` 的理解为单纯的下载操作。"]}},{type:"ModalAlert",options:{markdowns:["要完成本关,只需用 `git fetch` 下载所有的提交!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","In Git mit entfernten Repositorys zu arbeiten lässt sich wirklich auf das Hin- und Zurückübertragen von Daten reduzieren. Solange wir Commits hin und her schicken können, können wir jede Art Update teilen, das von Git getrackt wird (und somit Arbeit, neue Dateien, neue Ideen, Liebesbriefe etc. teilen).","","In diesem Level werden wir lernen, wie man Daten _von_ einem entfernten Repository holt -- der entsprechende Befehl heißt `git fetch`.","","Dir wird auffallen, dass mit der Aktualisierung unserer Darstellung des entfernten Repositorys die _Remote_ Branches auf den neuesten Stand gebracht werden. Das passt zum vorherigen Level über Remote Branches."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bevor wir uns die Einzelheiten von `git fetch` ansehen wollen wir es mal in Aktion sehen. Wir haben hier ein entferntes Repository, das zwei Commits hat, die in unserem lokalen Repository fehlen."],afterMarkdowns:["Das war's! Die Commits `C2` und `C3` wurden zu unserem Repository heruntergeladen und unser Remote Branch `o/main` wurde aktualisiert."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Was Fetch tut","","`git fetch` führt genau zwei Schritte aus:","","* Es lädt die Commits herunter, die im lokalen Repository fehlen, und ...","* aktualisiert die Remote Branches wo nötig (zum Beispiel `o/main`).","","`git fetch` synchronisiert im Prinzip unsere _lokale_ Abbildung des entfernten Repositorys mit dem, wie das entfernte Repository _tatsächlich_ aussieht (in diesem Moment).","","Wie du dich vielleicht erinnerst, haben wir im letzten Level gesagt, dass die Remote Branches den Zustand der Branches auf dem entfernten Repository darstellen _seit_ du das letzte Mal dieses Repository angesprochen hast. `git fetch` ist die Methode mit der du das Repository ansprichst! Der Zusammenhang zwischen Remote Branches und `git fetch` ist damit hoffentlich klar.","","`git fetch` kommuniziert mit dem entfernten Repository in der Regel über das Internet (über ein Protokoll wie `http://` oder `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Was Fetch nicht tut","","`git fetch` ändert allerdings überhaupt nichts an _deinen_ lokalen Branches. Es aktualisiert nicht deinen `main` oder ändert irgendetwas an deinem Checkout.","","Das ist wichtig zu wissen, denn eine Menge Entwickler glauben, wenn sie `git fetch` ausführen, würden ihre lokalen Branches auf den Stand des entfernten Repositorys gebracht. Es lädt zwar alle Daten herunter, damit man diese Aktualisierung durchführen kann, aber es ändert _nichts_ an deinen lokalen Branches. Wir werden in späteren Level Befehle genau dafür kennenlernen. :D","","Am Ende des Tages kannst du dir `git fetch` also als den Download-Schritt vorstellen."]}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu schaffen musst du einfach nur `git fetch` ausführen, um alle Commits herunterzuladen!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","リモートGitを用いた作業は、本当にただ単なる他のリポジトリ_への_、または他のリポジトリ_からの_データの転送に集約されます。コミットを転送できる限り、Gitで管理されている全ての種類の更新が共有できます(例えば作業や、新しいファイル、新しいアイデア、ラブレターなどです)。","","このレベルでは、リモートリポジトリ_から_データを取ってくる方法を学びます -- このコマンドは`git fetch`と名付けられています。","","リモートリポジトリの情報を私たちが更新するように、_リモート_ブランチも情報を更新することができることが分かるでしょう。これは前のレッスンでのリモートブランチの働きに結びつきます。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`git fetch`の説明に入る前に、その動作を見てみましょう。ここに、ローカルリポジトリにない二個のコミットを含んでいるリモートブランチがあります。"],afterMarkdowns:["やりました!`C2`、`C3`コミットがローカルリポジトリにダウンロードされ、`o/main`リモートブランチに反映されました。"],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### fetchとはどのようなものか","","`git fetch`は、主に二つのステップだけで動作します。それは以下のようなものです:","","* リモートにあってローカルリポジトリにないコミットをダウンロードする","* リモートブランチの位置を更新する(例えば、`o/main`)","","`git fetch`は本質的には、_実際_のリモートリポジトリと同じように見えるような形でリモートリポジトリの_ローカル_の情報に同期します(ちょうど今のように)。","","前のレッスンでのことを覚えていると思いますが、リモートブランチはリモートと最後に同期した時点での状態を保持しているという話をしました。`git fetch`はそのリモートと同期する方法なのです!これでリモートブランチと`git fetch`の関係性は明らかになったでしょう?","","`git fetch`は、通常インターネットを通してリモートリポジトリと対話します(`http://`または`git://`プロトコル経由で)。",""]}},{type:"ModalAlert",options:{markdowns:["### fetchがしてくれないもの","","`git fetch`は、しかしながら、_あなたの_ローカルの状態は変更しません。あなたの`main`ブランチや他のもの、今現在のあなたのファイルシステムが見せているものを更新しないのです。","","これは理解する上で重要なことです。なぜなら、多くの技術者は`git fetch`がリモートの状態をローカルの作業場に反映してくれると思っているからです。必要なデータはダウンロードされるかもしれませんが、ローカルのファイルを実際に変更するというようなことは_してくれない_のです。私たちは、この後のレッスンでもこのようなコマンドを学びます :D","","なので、この1日が終わる頃には、あなたは`git fetch`のダウンロードステップの動作が分かるようになるでしょう。"]}},{type:"ModalAlert",options:{markdowns:["このレベルを終えるには、単に`git fetch`を実行し、全てのコミットをダウンロードしてください。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Работа с удалёнными git репозиториями сводится к передаче данных _в_ и _из_ других репозиториев. До тех пор, пока мы можем отправлять коммиты туда-обратно, мы можем делиться любыми изменениями, которые отслеживает git (следовательно, делиться новыми файлами, свежими идеями, любовными письмами и т.д.).","","В этом уроке вы научитесь тому, как извлекать данные _из_ удалённого репозитория - и для этого у нас есть соответствующая команда `git fetch`.","","Вы увидите, что как только мы изменим представление нашего удалённого репозитория, наши _удалённые_ ветки обновятся соответствующим образом и отобразят это представление. Это связывает воедино предыдущий урок про удалённые репозитории."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Прежде чем углубляться в детали команды `git fetch`, давайте взглянем на её визуализацию в действии! Здесь у нас имеется удалённый репозиторий, который содержит в себе два коммита, отсутствующих в нашем локальном репозитории."],afterMarkdowns:["Вот и всё! Коммиты `C2` и `C3` были успешно скачаны в наш локальный репозиторий, и наша удалённая ветка `o/main` отобразила эти изменения соответствующим образом."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Что делает fetch","","`git fetch` выполняет две и только две основные операции. А именно:","","* связывается с указанным удалённым репозиторием и забирает все те данные проекта, которых у вас ещё нет, при этом...","* у вас должны появиться ссылки на все ветки из этого удалённого репозитория (например, `o/main`)","","Фактически, `git fetch` синхронизирует _локальное_ представление удалённых репозиториев с тем, что является _актуальным_ на текущий момент времени.","","Насколько вы помните, в предыдущем уроке мы сказали, что удалённые ветки отображают состояние удалённых репозиториев _на тот момент_ когда вы 'общались' с ними в последний раз. `git fetch` является тем механизмом, который даёт вам возможность общаться с удалёнными репозиториями! Надеюсь, что связь между удалёнными ветками и командой `git fetch` теперь прояснилась.","","`git fetch` обычно 'общается' с удалёнными репозиториями посредством Интернета (через такие протоколы, как `http://` или `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Чего fetch не делает","","Важно отметить, что команда `git fetch` забирает данные в ваш _локальный_ репозиторий, но не сливает их с какими-либо вашими наработками и не модифицирует то, над чем вы работаете в данный момент.","","Важно это помнить и понимать, потому что многие разработчики думают, что, запустив команду `git fetch`, они приведут всю свою локальную работу к такому же виду, как и на удалённом репозитории. Команда всего лишь скачивает все необходимые данные, но вам потребуется вручную слить эти данные с вашими, когда вы будете готовы. В следующих уроках мы научимся это делать :D","","Одним словом, вы можете относиться к `git fetch` как к процедуре скачивания."]}},{type:"ModalAlert",options:{markdowns:["Чтобы выполнить уровень, просто запустите `git fetch` и скачайте все коммиты!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Робота з віддаленими git-репозиторіями зводиться до передачі данних _до_ та _з_ інших репозиторіїв. Можливість передавати коміти дозволяє нам ділитися будь-якою інформацією, що відслідковується gitом (а отже, виконаною роботою, новими файлами, ідеями, листами, тощо).","","На цьому уроці ми навчимося витягати дані _з_ віддаленого репозиторію -- команда, що відповідає за це, зручно називається `git fetch` (fetch - англ. витягнути чи дістати).","","Зауваж, що коли ми оновлюємо наш віддалений репозиторій, наші _віддалені_ гілки теж оновляться. Про це ми говорили на попередньому уроці."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Перед тим, як почати розбиратися з `git fetch`, спробуймо його в дії! Тут ми маємо віддалений репозиторій, що містить два коміти, яких немає в нашому локальному сховищі."],afterMarkdowns:["Ось, маєш! Коміти `C2` та `C3` було завантажено до нашого локального сховища й наша віддалена гілка `o/main` була відповідно оновлена."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Що робить fetch","","`git fetch` виконує дві основні дії, і тільки дві дії. Він:","","* звантажує коміти, які містить віддалене сховище, але яких немає в локальному сховищі, та...","* оновлює посилання віддаленого бранчу (наприклад, `o/main`)","","Якщо коротко, `git fetch` приводить репрезентацію віддаленого репозиторію в локальному сховищі до _актуального_ стану справжнього віддаленого репозиторію.","","Якщо ти пам’ятаєш з попереднього уроку, ми тоді зауважили, що віддалені гілки відображають стан віддаленого репозиторію _від_ останнього разу, коли ми синхронізувались з віддаленим репозиторієм. `git fetch` якраз і відповідає за синхронізацію з віддаленим сховищем! Сподіваюсь, що зв’язок між віддаленими гілками `git fetch` тепер є очевидним.","","Як правило, `git fetch` працює з віддаленими сховищами через інтернет (через протоколи `http://` чи `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Чого не робить fetch","","Тим не менш, `git fetch` нічого не змінює в _твоєму_ локальному стані. Він не оновить твою гілку `main` і не змінить того, як наразі виглядає локальна файлова система.","","Це важливо зрозуміти, тому що багато розробників думають, що `git fetch` оновить їхні локальні данні до стану віддаленого репозиторію. Він дійсно звантажить всі потрібні дані, щоб це зробити, але він _не змінить_ автоматично жодних локальних файлів. Ми вивчимо команди, які це роблять, в наступних уроках :D","","Отже, зрештою, ти можеш вважати що `git fetch` просто звантажує нову інформацію з віддаленого сховища."]}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень просто виконай `git fetch` і звантаж всі коміти!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","git 원격 작업들은 결국 서로다른 저장소에서 데이터를 _주고_ _받는_것에 불과하다는것을 알 수 있습니다. 우리가 커밋들을 주고 받을수 있는 한, git을 바탕으로하는 모든 종류의 업데이트를 공유할 수 있습니다(작업, 새로운 파일들, 새로운 아이디어, 러브레터 등...).","","이번 레슨에서는 원격 저장소_에서_ 데이터를 가져오는 방법을 배워볼 것입니다 -- 이를 위한 명령어는 `git fetch`라고 불립니다.","","먼저 알아두고 넘어갈것이 있는데 우리가 원격 저장소와 작업을 해서 상태가 변하면 _원격_브랜치들 또한 그 변경들을 반영합니다. 원격 브랜치에대한 이전 레슨을 참고하세요."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`git fetch`의 세부사항을 알아보기 전에 일단 눈으로 먼저 확인해 봅시다! 여기 로컬 저장소에는 없는 두개의 커밋이 있는 원격 저장소가 있습니다."],afterMarkdowns:["됐습니다! 커밋 `C2` 와 `C3`가 우리의 로컬 저장소로 다운로드 되었고, 원격 브랜치 `o/main`가 이것을 반영하기 위해 업데이트 되었습니다."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### fetch는 무엇을 하는가","","`git fetch`는 두가지의 중요한 단계를 수행합니다. 사실 이 두 단계만을 진행합니다. 그것은 :","","* 원격 저장소에는 있지만 로컬에는 없는 커밋들을 다운로드 받습니다. 그리고... ","* 우리의 원격 브랜치가 가리키는곳을 업데이트합니다 (예를들어, `o/main`)","","`git fetch`는 본질적으로 _로컬_에서 나타내는 원격 저장소의 상태를 _실제_ 원격 저장소의 (지금)상태와 동기화합니다.","","이전 레슨을 기억한다면, 원격 브랜치는 가장 최근 원격 원격저장소와 작업을 했을때를 기준으로 원격 저장소의 상태를 반영한다고 했습니다. `git fetch`가 그러한 작업중에 하나입니다!(역: 원문에서는 talk with remote라고 표현합니다. 원격 저장소와 대화한다고 번역하기 어색해서 의역했습니다.) 원격 브랜치와 `git fetch`의 관계를 분명하게 알게되셨으면 좋겠습니다.","","`git fetch`는 일반적으로 원격 저장소와 인터넷을 통해 접근합니다(`http://` 또는 `git://`와같은 프로토콜로).",""]}},{type:"ModalAlert",options:{markdowns:["### fetch는 무엇을 하지 않는가","","`git fetch`는 그러나, _여러분의_ 로컬 상태는 전혀 바꾸지 않습니다. 여러분의 `main` 브랜치도 업데이트하지 않고 파일 시스템의 모습이던 그 어떤것도 바꾸지 않습니다.","","이것을 이해하는게 아주 중요한데, 왜냐하면 수 많은 개발자들이 `git fetch`를 하면 자신의 로컬 작업이 변경되어 원격 저장소의 모습을 반영해 업데이트 될것이라고 생각하기 때문입니다. 앞의 과정에 필요한 데이터를 다운로드는 하지만, 실제로 로컬 파일들이나 브랜치를 변경하지는 않습니다. 이것을 하기위한 명령어들은 뒤에서 배우겠습니다 :D","","간단하게 `git fetch`를 다운로드 단계로 생각할 수 있습니다."]}},{type:"ModalAlert",options:{markdowns:["레벨을 마치기 위해, `git fetch`를 수행하고 모든 커밋들을 내려 받으세요!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Làm việc với git remote về căn bản là chuyển giao dữ liệu qua và lại giữa các kho chứa. Miễn là ta có thể chia sẻ qua lại các commit, ta có thể chia sẻ bất kỳ cập nhật gì được theo dõi bở Git (và từ đó chia sẻ thành quả, tập tin mới, ý tưởng mới, thư tình, các kiểu con đà điểu.).","","Ở bài học này ta sẽ học cách lấy dữ liệu về từ một kho chứa từ xa -- lệnh đó là `git fetch`.","","Bạn sẽ nhận thấy rằng khi ta cập nhật đại điện kho chứa từ xa, nhánh _từ xa_ của ta cũng được cập nhật để phản ánh đại diện đó. Điều này liên quan đến bài học trước về nhánh từ xa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Trước khi đi vào chi tiết về `git fetch`, hãy xem cách nó hoạt động! Ở đây ta có một kho chứa từ xa trong đó chứa 2 commit mà kho chứa cục bộ của ta không có."],afterMarkdowns:["Đó! Commit `C2` và `C3` đã được tải xuống kho chứa cục bộ của ta, và nhánh từ xa `o/main` của ta đã được cập nhật để phản ánh điều này."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Fetch làm gì","","`git fetch` thực hiện 2 bước chính, và chỉ 2 bước chính. Nó:","","* tải xuống commit có trên kho chứa từ xa mà kho chứa cục bộ của ta không có, và...","* cập nhật nơi mà nhánh từ xa của ta trỏ tới (ví dụ nhánh `o/main`)","","Về căn bản thì `git fetch` đưa đại diện _cục bộ_ của kho chứa từ xa của ta về trạng thái đồng bộ với trạng thái _thực tế_ của kho chứa từ xa (ngay lúc này).","","Nếu bạn còn nhớ thì trong bài học trước, chúng tôi có đề cập rằng nhánh từ xa phản ánh trạng thái của kho chứa từ xa kể từ lần cuối bạn tương tác với các nhánh từ xa đó. `git fetch` chính là cách để tương tác với các nhánh từ xa! Hy vọng chúng tôi đã làm sáng tỏ sự liên kết giữa nhánh từ xa và `git fetch`.","","`git fetch` thường tương tác với kho chứa từ xa bằng Internet (thông qua các giao thức như `http://` hoặc `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Fetch không làm gì","","Tuy nhiên, `git fetch` không hề thay đổi trạng thái kho chứa _cục bộ_ của bạn. Nó sẽ không cập nhật nhánh `main` hay thay đổi bất kỳ điều gì trong hệ thống tập tin hiện tại của bạn.","","Điều này rất quan trọng, vì nhiều nhà phát triển nghĩ rằng `git fetch` sẽ làm kho chứa cục bộ của họ phản ánh trạng thái của kho chứa từ xa. Nó có thể tải xuống tất cả dữ liệu cần thiết, nhưng nó thực tế không thay đổi bất cứ thứ gì trên tập tin cục bộ của bạn. Ta sẽ học lệnh để làm điều đó sau :D","","Nói tóm lại, bạn có thể coi `git fetch` thuần túy như một bước tải xuống."]}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, đơn giản hãy gõ `git fetch` để tải xuống tất cả commit!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Delanje z git oddaljnemi repoti je v bistvu le premikanje podatkov na in z drugih repozitorijev. Dokler lahko pošiljamo commite naprej in nazaj, lahko delimo bilokakšno posodobitev, kateri git sledi (in posledično delimo delo, nove datoteke, nove ideje, ljubezenska pisma, itd.).","","V tej lekciji se bomo naučili kako fetchat (prenesti) podatke iz oddaljenega repozitorija -- ukaz za to je poimenovan `git fetch`.","","Opazil boš, da ko posodobimo našo predstavitev oddaljenega repota, se bo naš oddaljen branch posodobil in imel nove spremembe. To se navezuje na prejšnjo lekcijo o oddaljenih repozitorijih."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Preden se spustimo v podrobnosti `git fetch` ga poglejmo v akciji! Tu imamo oddaljen repozitorij, ki vsebuje dva commita, ki jih naš lokalen repozitorij nima."],afterMarkdowns:["Tako! Commita `C2` in `C3` sta bila prenesena v naš lokalen repozitorij in naš oddaljen branch `o/main` je bil posodobljen, da to odraža."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Kaj fetch naredi","","`git fetch` naredi dve stvari. In sicer:","","* prenese commite, ki jih ima oddaljeni repo ampak manjkajo v našem lokalnem in ...","* posodobi, kam kaže naš oddaljeni branch (naprimer `o/main`)","","`git fetch` v bistvu našo lokalno predstavitev oddaljenega repozitorija uskladi z dejanskim stanjem na oddaljenem repozitoriju.","","Če se spomneš še iz prejšnje lekcije smo rekli, da oddaljeni branchi odsevajo stanje na oddaljenih repozitorijih, odkar si komuniciral z njimi. `git fetch` je način, da komuniciraš z njimi! Upam, da je sedaj povezava med oddaljenimi repozitoriji in `git fetch` jasna.","","`git fetch` ponavadi komunicira z oddaljenimi repozitoriji preko interneta (s protokolom kot sta `http://` ali `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Kaj fetch ne naredi","","`git fetch` ne spremeni ničesar glede tvojega lokalnega stanja. Ne bo posodobil tvojega `main` brancha ali spremenil česarkoli v tvojih datotekah.","","To je pomembno razumeti, ker veliko razvijalcev misli, da bo `git fetch` posodobil njihovo lokalno stanje s stanjem na oddaljenem repozitoriju. Lahko bo prenesel vse potrebne podatke, da to izvede, ampak v bistvu _ne_ spremeni tvojih datotek. V kasnejših lekcijah se bomo naučili ukaze, ki pa naredijo točno to. :D","","Torej na koncu dneva, izvajanje `git fetch` si lahko predstavljate kot korak za prenašanje."]}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje uporabi `git fetch` in prenesi vse commite!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch","","Praca ze zdalnymi Gitami tak naprawdę sprowadza się do przesyłania danych _do_ i _z_ innych repozytoriów. Tak długo jak możemy przesyłać zatwierdzenia tam i z powrotem, możemy udostępniać wszelkiego rodzaju aktualizacje śledzone przez Git (a tym samym dzielić się pracą, nowymi plikami, pomysłami, listami miłosnymi itp.).","","W tej lekcji nauczymy się, jak pobierać dane _ze_ zdalnego repozytorium -- polecenie to nosi nazwę `git fetch`.","","Zauważysz, że gdy aktualizujemy reprezentację zdalnego repozytorium, nasze _zdalne_ gałęzie zostaną zaktualizowane, aby odzwierciedlić tę nową reprezentację. Wiąże się to z poprzednią lekcją dotyczącą zdalnych gałęzi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zanim przejdziemy do szczegółów polecenia `git fetch`, zobaczmy, jak działa! Mamy tu zdalne repozytorium, zawierające dwa commity, których nie ma w naszym lokalnym repozytorium."],afterMarkdowns:["No to jedziemy! Commity `C2` i `C3` zostały pobrane do naszego lokalnego repozytorium, a zdalna gałąź `o/main` została zaktualizowana, aby to odzwierciedlić."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Co robi fetch","","`git fetch` wykonuje dwie rzeczy:","","* pobiera commity, które są w zdalnym repozytorium, ale których brakuje w naszym lokalnym repozytorium i...","* aktualizuje miejsca, które wskazują nasze zdalne gałęzie (na przykład `o/main`)","","`git fetch` zasadniczo synchronizuje _lokalną_ reprezentację zdalnego repozytorium z tym, jak w _rzeczywistości_ zdalne repozytorium wygląda (w danej chwili).","","Jak pamiętasz z poprzedniej lekcji, powiedzieliśmy, że zdalne gałęzie odzwierciedlają stan zdalnych repozytoriów od czasu ostatniej komunikacji nimi. `git fetch` to sposób, w jaki rozmiawiasz z tymi repozytoriami! Mamy nadzieję, że związek między zdalnymi gałęziami a `git fetch` jest teraz jasny.","","`git fetch` zwykle komunikuje się ze zdalnym repozytorium przez internet (za pośrednictwem protokołu takiego jak `http://` lub `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Czego fetch nie robi","","Zauważ, że `git fetch` nie zmienia nic w _twoim_ stanie lokalnym. Nie zaktualizuje twojej gałęzi `main` ani nie zmieni niczego w wyglądzie twojego systemu plików.","","Zrozumienie tego to ważna sprawa! Wielu programistów uważa, że uruchomienie `git fetch` spowoduje, że ich lokalna praca będzie odzwierciedlać stan zdalny. Mimo że `git fetch` pobiera wszystkie niezbędne do tego dane, _nie zmienia_ żadnego z plików lokalnych. Poleceń, które służą właśnie do tego celu, nauczymy się później. :D","","Dlatego, podsumowując to wszystko, możesz myśleć o `git fetch` jako pobieraniu."]}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, po prostu użyj polecenia `git fetch` i pobierz wszystkie commity!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch","","Lavorare con git remoto consiste essenzialmente nel trasferimento di dati _verso_ e _da_ altri repository. Fino a che possiamo inviare commit avanti e indietro, possiamo condividere qualsiasi tipo di aggiornamento tracciabile da git (e quindi condividere lavoro, nuovi file, nuove idee, letterine d'amore, etc.).","","In questa lezione vedremo come recuperare dati _da_ un repository remoto -- il comando per fare ciò è `git fetch`.","","Man mano che aggiorneremo la nostra rappresentazione del repository remoto, noterai che i nostri rami _remoti_ si aggiorneranno per riflettere quella nuova rappresentazione. Questo si collega alla lezione precedente sui rami remoti."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prima di addentrarci nei dettagli di `git fetch`, vediamolo in azione! Qui abbiamo un repository remoto contenente due commit che il nostro repository locale non ha."],afterMarkdowns:["Ecco fatto! I commit `C2` e `C3` sono stati scaricati nel nostro repository locale, e il nostro ramo remoto `o/main` è stato aggiornato per riflettere questo cambiamento."],command:"git fetch",beforeCommand:"git clone; git fakeTeamwork 2"}},{type:"ModalAlert",options:{markdowns:["### Cosa fa git fetch","","`git fetch` compie unicamente queste due azioni:","","* scarica i commit presenti in remoto ma assenti dal nostro repository locale, e...","* aggiorna dove puntano i nostri rami remoti (ad esempio, `o/main`)","","`git fetch` essenzialmente porta la nostra rappresentazione _locale_ del repository remoto al pari con lo stato _attuale_ dello stesso (in questo momento).","","Se ti ricordi, nella lezione precedente abbiamo visto che i rami remoti riflettono lo stato del repository remoto dall'_ultima volta_ in cui hai comunicato con esso. `git fetch` è il modo per comunicare con i repository remoti! Ora il legame tra i rami remoti e `git fetch` dovrebbe essere più chiaro.","","`git fetch` generalmente comunica con il repository remoto attraverso Internet (tramite un protocollo come `http://` o `git://`).",""]}},{type:"ModalAlert",options:{markdowns:["### Cosa non fa git fetch","","`git fetch`, però, non effettua modifiche a ciò che è già presente in locale sul _tuo_ sistema. Non aggiornerà il tuo ramo `main` e non apporterà modifiche ai tuoi file.","","Questo è importante da comprendere in quanto molti sviluppatori pensano che eseguire `git fetch` porterà il loro lavoro a riflettere lo stato del repository remoto. Va a scaricare tutti i dati necessari per farlo, ma _non_ va a modificare effettivamente alcun file locale. Impareremo nelle prossime lezioni i comandi per fare proprio questo :D","","In fin dei conti, puoi considerare `git fetch` come una fase di download di dati."]}},{type:"ModalAlert",options:{markdowns:["Per completare il livello, digita `git fetch` per scaricare tutti i commit!"]}}]}}}},{}],142:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C7","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C3","C6"],"id":"C7"}},"HEAD":{"target":"foo","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C6","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"foo","id":"HEAD"}}}',solutionCommand:"git fetch origin main~1:foo;git fetch origin foo:main;git checkout foo;git merge main",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"C1","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C6","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"},"C4":{"parents":["C3"],"id":"C4"},"C5":{"parents":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"foo","id":"HEAD"}}}',name:{en_US:"Fetch arguments",fr_FR:"Arguments de fetch",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",ja:"Fetchの引数",ru_RU:"Аргументы для fetch",ko:"Fetch의 인자들",uk:"Аргументи для fetch",vi:"Tham số fetch",sl_SI:"Fetch argumenti",pl:"Argumenty fetch",it_IT:"Parametri di git fetch"},hint:{en_US:'Pay attention how the commit ids may have swapped! You can read slides again with "help level"',fr_FR:'Faites attention à la façon dont les ids des commits ont été intervertis ! Vous pouvez relire les slides avec "help 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',ja:"コミットIDの入れ替わりに注意!スライドを復習するには`help level`を実行",ru_RU:'Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой "help level"',ko:'커밋 ID가 바뀔수도있으니 주의하세요! "help level"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.',uk:'Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою "help level"',vi:'Lưu ý id của các commit bị tráo đổi, bạn có thể dùng "help level" để đọc lại hộp thoại',sl_SI:'Bodi pozoren kako so se commit id-ji morda zamenjali! Ponovno lahko prebereš navodila z "help level".',pl:'Zauważ, że identyfikatory commitów mogły zostać zamienione! Slajdy możesz przeczytać jeszcze raz po wpisaniu: "help level"',it_IT:'Fai attenzione, alcuni ID dei commit potrebbero essere invertiti! Puoi leggere nuovamente le slide con "help level"'},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch arguments","","So we've just learned all about git push arguments, this cool `` parameter, and even colon refspecs (`:`). Can we use all this knowledge for `git fetch` as well?","","You betcha! The arguments for `git fetch` are actually *very, very* similar to those for `git push`. It's the same type of concepts but just applied in the opposite direction (since now you are downloading commits rather than uploading).","","Let's go over the concepts one at a time..."]}},{type:"ModalAlert",options:{markdowns:["### The `` parameter","","If you specify a place with git fetch like in the following command:","","`git fetch origin foo`","","Git will go to the `foo` branch on the remote, grab all the commits that aren't present locally, and then plop them down onto the `o/foo` branch locally.","","Let's see this in action (just as a refresher)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["By specifying a place..."],afterMarkdowns:["We download only the commits from `foo` and place them on `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["You might be wondering -- why did git plop those commits onto the `o/foo` remote branch rather than just plopping them onto my local `foo` branch? I thought the `` parameter is a place that exists both locally and on the remote?","","Well git makes a special exception in this case because you might have work on the `foo` branch that you don't want to mess up!! This ties into the earlier lesson on `git fetch` -- it doesn't update your local non-remote branches, it only downloads the commits (so you can inspect / merge them later).",""]}},{type:"ModalAlert",options:{markdowns:['"Well in that case, what happens if I explicitly define both the source and destination with `:`?"',"","If you feel passionate enough to fetch commits *directly* onto a local branch, then yes you can specify that with a colon refspec. You can't fetch commits onto a branch that is checked out, but otherwise git will allow this.","","Here is the only catch though -- `` is now a place on the *remote* and `` is a *local* place to put those commits. It's the exact opposite of git push, and that makes sense since we are transferring data in the opposite direction!","","That being said, developers rarely do this in practice. I'm introducing it mainly as a way to conceptualize how `fetch` and `push` are quite similar, just in opposite directions."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see this craziness in action:"],afterMarkdowns:["Wow! See, git resolved `foo~1` as a place on the origin and then downloaded those commits to `bar` (which was a local branch). Notice how `foo` and `o/foo` were not updated since we specified a destination."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What if the destination doesn't exist before I run the command? Let's see the last slide but without `bar` existing beforehand."],afterMarkdowns:["See, it's JUST like git push. Git made the destination locally before fetching, just like git will make the destination on remote before pushing (if it doesn't exist)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["No args?","","If `git fetch` receives no arguments, it just downloads all the commits from the remote onto all the remote branches..."],afterMarkdowns:["Pretty simple, but worth going over just once."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, enough talking! To finish this level, fetch just the specified commits in the goal visualization. Get fancy with those commands!","","You will have to specify the source and destination for both fetch commands. Pay attention to the goal visualization since the IDs may be switched around!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les arguments de git fetch","","Nous savons maintenant tout ce qu'il y a à savoir sur les arguments de git push, y compris le paramètre `` et la ponctuation pour refspecs (`:`). Pouvons-nous utiliser ces connaissances avec `git fetch` également ?","","Bien sûr ! Les arguments de `git fetch` sont en fait *très, très* similaires à ceux de `git push`. Il s'agit des mêmes concepts mais simplement appliqués dans le sens opposé (puisque maintenant vous récupérez des commits plutôt que de les envoyer).","","Voyons ces concepts un par un..."]}},{type:"ModalAlert",options:{markdowns:["### Le paramètre ``","","Si vous spécifiez un emplacement à git fetch, comme dans la commande suivante :","","`git fetch origin foo`","","Git va aller à la branche distante `foo`, récupérer tous les commits qui ne sont pas présents localement, puis les rapatrier dans la branche locale `o/foo`.","","Voyons cela en action (juste pour réviser)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["En spécifiant un emplacement..."],afterMarkdowns:["Nous téléchargeons uniquement les commits de `foo` et les plaçons dans `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Vous vous posez peut-être la question : pourquoi Git a-t-il fait apparaître ces commits dans la branche distante `o/foo` plutôt que les placer directement dans ma branche locale `foo` ? Je croyais que le paramètre `` était un emplacement qui existait à la fois localement et sur le dépôt distant ?","","En fait Git fait une exception dans ce cas parce que vous pourriez avoir du travail en cours dans la branche `foo` que vous ne voulez pas écraser !! Cela vient de ce que nous avions vu dans la leçon précédente sur `git fetch` : cette commande ne met pas à jour vos branches locales, elle télécharge uniquement les commits (pour que vous puissiez les inspecter et/ou les fusionner plus tard).",""]}},{type:"ModalAlert",options:{markdowns:['"Bon, mais dans ce cas, que se passe-t-il si je spécifie explicitement la source et la destination avec `:` ?"',"","Si vous êtes déterminé à rapatrier (fetch) des commits *directement* dans votre branche locale, alors oui vous pouvez préciser cela avec la notation refspec. Vous ne pouvez cependant pas rapatrier les commits dans la branche courante.","","Il y a un petit piège cependant : dans ce cas précis `` est l'emplacement sur le dépôt *distant* et `` l'emplacement sur le dépôt *local* où seront placés ces commits. C'est l'exact opposé de git push, et cela se tient puisque nous transférons des données dans le sens opposé !","","Cela dit, les développeurs utilisent rarement cette syntaxe en pratique. Je l'introduis principalement pour concrétiser le fait que `fetch` et `push` sont très similaires, fonctionnant simplement dans des sens opposés."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons ce phénomène en action :"],afterMarkdowns:["Wow ! Vous voyez, Git a résolu `foo~1` comme un emplacement sur origin et a ensuite téléchargé les commits dans `bar` (qui était une branche locale). Remarquez aussi que `foo` et `o/foo` n'ont pas été mises à jour puisque nous avons spécifié une destination."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Que se passe-t-il si l'emplacement n'existe pas avant que j'exécute la commande ? Voyons cela dans ce dernier slide, en nous mettant dans la situation où `bar` n'existe pas encore."],afterMarkdowns:["Vous voyez, c'est COMME un git push. Git a créé la destination localement avant le fetch, exactement comme il fait avec push en créant au préalable la destination sur le dépôt distant (si elle n'existe pas)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pas d'arguments ?","","Si `git fetch` ne reçoit pas d'arguments, cela télécharge simplement tous les commits du dépôt distant au sein de toutes les branches distantes..."],afterMarkdowns:["Assez simple, mais ce n'était pas inutile de le voir en action."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, assez parlé ! Pour finir ce niveau, faites simplement un fetch des commits indiqués dans la fenêtre de visualisation de l'objectif. Faites-vous plaisir !","","Vous devrez préciser la source et la destination pour les deux commandes fetch. Faites attention à l'objectif puisque les IDs peuvent avoir été intervertis !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de git fetch","","Entonces, recién aprendimos todo sobre los parámetros de push, este parámetro `` copado, 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 a la vez..."]}},{type:"ModalAlert",options:{markdowns:["### El parámetro ``","","Si especificás 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 vos podrías tener trabajo en la rama `foo` que no quieras mezclar. Esto refiere 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 sentís lo suficientemente seguro como para traer commits *directamente* a una rama local, entonces, sí, podés especificarlo usando una referencia con dos puntos. No podés traer commits a una rama que tengas checkouteada, pero en cualquier otro caso git te lo va a permitir.","","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, 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:["¡Wow! Mirá: git resolvió `foo~1` como un lugar en el origin y bajó esos commits a `bar` (que era una rama local). Notá 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 que corra este comando? Veamos el último ejemplo pero sin que `bar` exista de antemano."],afterMarkdowns:["Mirá: 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 pushear (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 vale la pena verlo al menos una vez."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Bueno, demasiada charla. Para completar este nivel, fetcheáte sólo los commits especificados en la visualización del objetivo. ¡Amigate con esos comandos!","","Vas a tener que especificar el origen y el destino para ambos comandos fetch. Prestá atención al objetivo dado que ¡los IDs pueden estar invertidos!"]}}]},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 main"}},{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:[{type:"ModalAlert",options:{markdowns:["## Parâmetros do git fetch","","Então acabamos de aprender tudo sobre os parâmetros do git push, inclusive sobre esse parâmetro bacana chamado ``, e até mesmo sobre colon refspecs (`:`). Será que poderíamos aplicar todo esse conhecimento também ao `git fetch`?","","Você adivinhou! Os parâmetros do `git fetch` são na verdade *muito, muito* similares aos do `git push`. Trata-se do mesmo tipo de conceito, só que aplicado na direção oposta (já que agora é um download em vez de um upload).","","Vamos aos conceitos um por vez..."]}},{type:"ModalAlert",options:{markdowns:["### O parâmetro ``","","Se você passar um lugar ao git fetch, como no seguinte comando:","","`git fetch origin foo`","","O Git vai ao ramo remoto `foo` e pega todos os commits que não estão presentes localmente, jogando-os no ramo local `o/foo`.","","Vejamo-lo em ação (só para refrescar a memória)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especificando um lugar..."],afterMarkdowns:["Baixamos só os commits de `foo` e colocamos em `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Você pode estar se perguntando -- por que o Git colocou os commits no ramo remoto `o/foo` em vez de simplesmente jogá-los no meu ramo local `foo`? Eu pensei que o parâmetro fosse um `` que existisse tanto no repositório local como no remoto?","","Bem, o Git tem uma exceção especial neste caso, porque pode ser que exista trabalho seu no ramo local `foo` que você não queira bagunçar!! Esse fato é relacionado com o abordado na lição anterior sobre o `git fetch` -- ele não atualiza ramos locais não-remotos, ele apenas baixa os commits (de forma que você possa inspecioná-los e/ou realizar um merge posteriormente).",""]}},{type:"ModalAlert",options:{markdowns:['"Bem, neste caso, o que acontece se eu definir explicitamente tanto a origem como o destino, com `:`?"',"","Se você estiver apaixonado o suficiente para baixar commits *diretamente* em um ramo local, então sim, você pode especificar esse comportamento com um colon refspec. Você só não pode baixar commits em um ramo que esteja atualmente em checkout, mas se não estiver, o Git permitirá o fetch.","","Aqui está o único detalhe -- `` agora é uma referência *remota* e `` é uma referência *local* de onde colocar esses commits. É exatamente o oposto do git push, e realmente faz sentido, já que estamos transferindo os dados na direção oposta!","","Tendo dito isto, desenvolvedores raramente fazem isso na prática. Estou introduzindo essa informação mais como uma forma de conceitualizar a forma como `fetch` e `push` são tão similares, apenas em direções opostas."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos essa loucura em ação:"],afterMarkdowns:["Wow! Viu, o Git entendeu o `foo~1` como um lugar de origin e baixou os commits para o ramo local `bar`. Veja como `foo` e `o/foo` não foram atualizados, já que especificamos outro 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:["E se o destino não existir antes de eu executar o comando? Vamos rever o último slide, mas em uma situação na qual o `bar` não existe de antemão."],afterMarkdowns:["Viu? Funciona EXATAMENTE como o git push. O Git criou o destino localmente antes do fetch, da mesma forma como o Git cria o destino (se ele não existir) no repositório remoto durante um push."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Sem parâmetros?","","Se o `git fetch` não receber argumentos, ele simplesmente baixa todos os commits do repositório remoto em todos os ramos remotos..."],afterMarkdowns:["Bastante simples, mas importante de rever ao menos uma vez."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, chega de conversa! Para completar este nível, faça fetch apenas dos commits especificados na visualização do objetivo. Capriche nos comandos!","","Você terá de especificar tanto a origem como o destino em ambos os comandos de fetch. Preste atenção na janela de visualização, já que os identificadores podem trocar!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de fetch","","Entonces, aprendido todo sobre os parámetros de push, este parámetro `` molón, e incluso as referencias separadas por dous puntos (`:`). ¿Poderemos empregar todo este coñecemento para `git fetch` tamén?","","¡Home claro! Os parámetros para `git fetch` son realmente *moi, moi* semellantes os de `git push`. É o mesmo tipo de conceptos, pero aplicados na dirección contraria (xa que agora estás baixando os commits en lugar de subilos).","","Vexamos os conceptos dunha puntada..."]}},{type:"ModalAlert",options:{markdowns:["### O parámetro ``","","Se especificar o lugar co git fetch como no comando seguinte:","","`git fetch origin foo`","","Git vai ir á rama `foo` no remoto, vai traer tódolos commits que non estén presentes localmente, e logo aplicaráos sobre a rama `o/foo` localmente.","","Vexámolo en acción (refresquemos o concepto)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Especificando un lugar..."],afterMarkdowns:["Sólo baixamos os commits de `foo` e os poñemos en `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:['Poderás preguntarte "¿Por qué git aplicou eses commits sobre a rama `origin/foo` e non os aplicou sobre a rama `foo` local? Lembra que o parámetro `` era un lugar que existía tanto no local como no remoto."',"","Bueno, git fai unha excepción especial neste caso, xa que poderías ter traballo na rama `foo` que non quixeras mesturar. Esto refírese á lección anterior sobre `git fetch` - non actualiza as túas ramas locais non-remotas, só descarga os commits (para que poidas velos ou mesturalos despois).",""]}},{type:"ModalAlert",options:{markdowns:['"Bueno, e, neste caso, ¿qué pasa se explícitamente definimos o orixe e destino con `:`?"',"","Se te sentes o suficientemente seguro como para traer os commits *directamente* da rama local, entón, sí, podes especificalo empregando a referencia con dous puntos. Non podes traer commits a unha rama que non teñas, pero en calquera outro caso, git vaino facer.","","Este é o único problema, igual: `` é agora un lugar no *remoto*, e `` é un lugar *local* onde poñer esos commits. É exactamente o oposto a git push, e eso ten sentido xa que ¡estamos enviando os datos no sentido contrario!","","Dito esto, difícilmente alguén use esto na práctica. Estouno presentando principalmente como un modo de traballar no que `fetch` e `push` son moi semellantes, só que en direccións opostas."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos esta locura en acción"],afterMarkdowns:["¡Wow! Mira: git resolveu `foo~1` como un lugar no que a orixe descargou eses commits a `bar` (que era unha rama local). Nota como `foo` e `o/foo` non foron actualizados, xa que especificamos o 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 o destino non existe antes de lanzar este comando? Vexamos o último exemplo pero sin que `bar` exista de antemán."],afterMarkdowns:["Mira: é IGUAL que git push. Git creou o destino localmente antes de facer o fetch, tal e como git creará o destino no remoto antes de empurrar (se non existiran)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Sen argumentos?","","Se `git fetch` non recibe ningún argumento, simplemente descarga tódolos commits do remoto a tódalas ramas remotas..."],afterMarkdowns:["Moi sinxelo, pero vale a pena velo ó menos unha vez."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Bueno, moitas verbas. Para rematar o nivel, descarga só os commits especificados na visualización do obxectivo. ¡Faite colega destes comandos!","","Vas ter que especificar a orixe e o destino para ámbolos dous comandos fetch. Presta atención ó objetivo dado que ¡os IDs poden estar invertidos!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git fetch 的參數","","我們剛學到了所有關於 git push 的參數,有非常棒的 `` 參數,甚至是 colon refspecs(`:`),我們可不可以也同樣套用到 `git fetch` 上面?","","你猜對了!`git fetch` 的參數*非常非常*類似 `git push`,一樣的概念,但方向不同(因為你在下載 commit,而不是在上傳 commit)。","","讓我們一次講一個概念..."]}},{type:"ModalAlert",options:{markdowns:["###`` 參數","","對於 `git fetch`,如果你特別指定了一個 ``:","","`git fetch origin foo`","","git 會到 remote 上的 `foo` branch,抓下所有不在 local 上的 commit,然後將它們放到 local 的 `o/foo` branch。","","讓我們實際看一下(就只是一個*更新*的方法)。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["指定一個 ``..."],afterMarkdowns:["我們只下載了 `foo` 上的 commit,並且把它們放到 `o/foo`。"],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["你也許會感到奇怪,為什麼 git 是把這些 commit 放到 `o/foo` branch 而不是放到我的 local 的 `foo` branch? 我認為,`` 參數是表示一個位置,這個位置同時存在 local 跟 remote 上?","","因為你可能已經 checkout 到 `foo` branch 上,而且你不想要打亂上面的 commit,因此 git 才會特別這樣做!!這就又回到之前的 `git fetch` 的課程,它並不會放到你的 local 上的 branch (該 branch 沒有對應到任何的 remote branch),它只會下載 commit 到 local 上且表示 remote 的 branch(所以你之後可以觀察或者 merge 它們)。",""]}},{type:"ModalAlert",options:{markdowns:['"在該例子當中,如果我特別透過 `:` 來指定 source 以及 destination,會發生什麼事情?"',"","如果你很想要把 fetch 回來的 commit *直接*放到 local branch,那麼你就可以利用一個 colon refspec 來做到。你不能夠把 fetch 回來的 commit 放到你目前正 checkout 的 branch,如果不是的話,git 就會允許你這麼做。","","這裡只有一個重點,`` 現在是一個在 *remote* 上的 branch,而且 `` 是一個放置這些 commit 的 *local* 的位置。它剛好就是 `git push` 的相反,而且因為我們在相反方向傳遞資料,所以這也很合理!","","其實,程式設計師很少會想要做這個,我主要是強調 `fetch` 以及 `push` 的概念是很類似的,就只是方向相反而已。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來實際看一下這個瘋狂的事情:"],afterMarkdowns:["哇!看到了吧,git 把 `foo~1` 解讀成一個在 origin 上的位置,而且把該位置上面的 commit 下載到 `bar`(這是一個 local branch)上面,注意,因為我們有指定目的地,因此 `foo` 跟 `o/foo` 並沒有被更新。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我在執行這個指令之前,destination 不存在的話會怎樣?我們回到上一個例子,但這一次事前並沒有 `bar` 這個 branch 的存在。"],afterMarkdowns:["看到了吧,這就像是 `git push`,在 fetch 之前,git 會自己建立 destination,就好像是在 push 之前, git 會建立 remote 上的 destination 一樣(如果它不存在的話)。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["沒有參數的情況?","","如果使用 `git fetch` 的時候,沒有指定任何的參數,那就相當於它會下載 remote 上面的所有的 commit,並且把這些 commit 放到 local 上面所有對應到 remote 的 branch..."],afterMarkdowns:["超簡單,但是所有的更新只做一次,很值得。"],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["好的,講了好多!要完成這一關,fetch 視覺化的目標所指定的 commit,好好玩這些指令吧!","","對於兩個 fetch 的指令,你必須要指定 source 以及 destination,注意一下視覺化的目標,因為 commit 的 id 可以被交換!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch 的参数","","我们刚学习了 git push 的参数,很酷的 `` 参数,还有用冒号分隔的 refspecs(`:`)。 这些参数可以用于 `git fetch` 吗?","","你猜中了!`git fetch` 的参数和 `git push` 极其相似。他们的概念是相同的,只是方向相反罢了(因为现在你是下载,而非上传)","","让我们逐个讨论下这些概念……"]}},{type:"ModalAlert",options:{markdowns:["### `` 参数","","如果你像如下命令这样为 git fetch 设置 的话:","","`git fetch origin foo`","","Git 会到远程仓库的 `foo` 分支上,然后获取所有本地不存在的提交,放到本地的 `o/foo` 上。","","来看个例子(还是前面的例子,只是命令不同了)"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["通过指定 place..."],afterMarkdowns:["我们只下载了远程仓库中 `foo` 分支中的最新提交记录,并更新了 o/foo"],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["你可能会好奇 —— 为何 Git 会将新提交放到 `o/foo` 而不是放到我本地的 foo 分支呢?之前不是说这样的 参数就是同时应用于本地和远程的位置吗?","","好吧, 本例中 Git 做了一些特殊处理,因为你可能在 foo 分支上的工作还未完成,你也不想弄乱它。还记得在 `git fetch` 课程里我们讲到的吗 —— 它不会更新你的本地的非远程分支, 只是下载提交记录(这样, 你就可以对远程分支进行检查或者合并了)。",""]}},{type:"ModalAlert",options:{markdowns:["“如果我们指定 `:` 会发生什么呢?”","","如果你觉得直接更新本地分支很爽,那你就用冒号分隔的 refspec 吧。不过,你不能在当前切换的分支上干这个事,但是其它分支是可以的。","","这里有一点是需要注意的 —— `source` 现在指的是远程仓库中的位置,而 `` 才是要放置提交的本地仓库的位置。它与 git push 刚好相反,这是可以讲的通的,因为我们在往相反的方向传送数据。","","理论上虽然行的通,但开发人员很少这么做。我在这里介绍它主要是为了从概念上说明 `fetch` 和 `push` 的相似性,只是方向相反罢了。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["来看个疯狂的例子:"],afterMarkdowns:["哇! 看见了吧, Git 将 `foo~1` 解析成一个 origin 仓库的位置,然后将那些提交记录下载到了本地的 `bar` 分支(一个本地分支)上。注意由于我们指定了目标分支,`foo` 和 `o/foo` 都没有被更新。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果执行命令前目标分支不存在会怎样呢?我们看一下上个对话框中没有 bar 分支的情况。"],afterMarkdowns:["看见了吧,跟 git push 一样,Git 会在 fetch 前自己创建立本地分支, 就像是 Git 在 push 时,如果远程仓库中不存在目标分支,会自己在建立一样。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["没有参数呢?","","如果 `git fetch` 没有参数,它会下载所有的提交记录到各个远程分支……"],afterMarkdowns:["相当简单,但是仅需更新一次,值得你去做!"],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["好, 说得太多了!要完成本关,抓取目标窗口中指定的提交记录,使用这些魔幻的命令吧!","","使用 fetch 时, 你必须指定 source 和 destination。 注意一下目标窗口, 因为提交对象的 ID 可能会变哦!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch Optionen","","Nun haben wir also alles gelernt über `git push` Optionen, diesen coolen ``-Parameter und sogar mit Doppelpunkt getrennte Ref-Spezifikationen (`:`). Können wir all dieses neu erworbene Wissen auch auf `git fetch` anwenden?","","Jede Wette! Die Optionen für `git fetch` sind wirklich *sehr, sehr* ähnlich denen von `git push`. Es sind dieselben Verfahren, nur in die andere Richtung angewendet (da man bei `fetch` herunterlädt anstatt hochzuladen).","","Gehen wir die verschiedenen Verfahrensweisen mal eine nach der anderen durch ..."]}},{type:"ModalAlert",options:{markdowns:["### Der Parameter ``","",'Wenn du, wie folgt, einen "Ort" bei `git fetch` angibst:',"","`git fetch origin foo`","","wird Git zum Branch `foo` auf dem Remote gehen, dort alle Änderungen holen, die es lokal noch nicht gibt, und sie an den lokalen Branch `o/foo` anhängen.","","Schauen wir uns das mal live an (nur zur Wiederholung)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Durch Angabe eines Ortes ..."],afterMarkdowns:["... laden wir die fehlenden Commits von `foo` und packen sie auf `o/foo` drauf."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Du wunderst dich vielleicht, warum Git diese Commits auf den `o/foo` Branch gepackt hat, anstatt einfach direkt auf den lokalen Branch `foo`? Zeigt der Parameter `` nicht einen Ort an, der sowohl lokal als auch entfernt existiert?","","Nun ja, Git geht diesen Schritt, weil du auf `foo` ja noch Commits haben könntest, die nicht auf dem Server sind, und da will es nichts durcheinander bringen. Ähnlich wie beim früheren Level zu `git fetch` -- es aktualisiert nicht deine lokalen Arbeits-Branches, es lädt die Commits nur in die `o` (bzw. `origin`) Branches, damit du sie dir in Ruhe anschauen und integrieren kannst.",""]}},{type:"ModalAlert",options:{markdowns:["Wenn das so ist, was passiert dann wenn ich explizit Quelle und Ziel im Ort angebe?","","Wenn du Commits wirklich per `fetch` *direkt* auf einen lokalen Branch holen willst, dann kannst du das mit einer Ref-Spezifikation erreichen. Das funktioniert nicht mit deinem gerade ausgecheckten Branch, aber davon abgesehen lässt Git es zu.","","Nur ein Haken -- `` bezeichnet jetzt einen Ort auf dem *entfernten* Server und `` ist ein *lokaler* Ort, wo die Commits hin sollen. Es ist genau umgekehrt wie bei `git push` und das ist logisch, denn wir übertragen die Daten ja auch in die umgekehrte Richtung!","","Davon abgesehen benutzt man das in der Praxis kaum. Ich zeige das vor allem um zu verdeutlichen, wie `fetch` und `push` sehr ähnlich sind, nur in entgegengesetzten Richtungen."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns den Quatsch mal in Aktion an:"],afterMarkdowns:["Wow! Siehst du, Git löst `foo~1` als Ort auf dem Server `origin` auf und lädt dessen Commits herunter in `bar` hinein. Beachte wie `foo` und `o/foo` *nicht* aktualisiert wurden, da wir ein Ziel angegeben haben."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was ist denn, wenn das Ziel nicht existiert, für das ich den Befehl ausführe? Schauen wir uns das letzte Beispiel noch mal an, nur dass `bar` jetzt noch nicht existiert."],afterMarkdowns:["Siehst du, es ist *genau* wie `git push`. Git erstellt das Ziel lokal bevor es den `fetch` ausführt, genauso wie Git erst das Ziel auf dem Remote erstellt, bevor es pusht (falls das Ziel nicht existiert)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Keine Optionen?","","Wenn bei `git fetch` keine Optionen angegeben werden, lädt es einfach alle Commits vom Remote auf die lokalen Abbildungen aller Remote Branches ..."],afterMarkdowns:["Ziemlich einfach, aber man sollte es mal gesehen haben."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, genug gelabert! Um den Level zu schaffen musst du nur die im Zielbild angegebenen Commits per `fetch` holen. Sei kreativ mit den Befehlen!","","Du wirst Quelle und Ziel bei beiden `fetch` Befehlen angeben müssen. Schau dir das Zielbild gut an, da die IDs vertauscht sein könnten!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Fetch の引数","","ここまでで、git pushの引数やとても便利な``引数、コロンでの参照指定(:)などについて学んできました。","","これらの知識は`git fetch`コマンドにも応用できるのでしょうか?","","その通り!`git fetch`の引数はとても、と〜っても`git push`の引数と似ています。実はfetchとpushは同種の概念ですが、適用される方向が逆なだけです。(今は、コミットをアップロードするのではなく、ダウンロードしています)","","ひとつずつしっかりと確認していきましょう..."]}},{type:"ModalAlert",options:{markdowns:["### ``引数","","次のように`git fetch`で場所を指定すると、","","`git fetch origin foo`","","Gitはリモートの`foo`ブランチに移動して、ローカル上に存在しないコミットを全てローカルの`o/foo`ブランチにダウンロードしてきます。","","実際に確認してみましょう(おさらいとして)"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["場所を指定することで..."],afterMarkdowns:["`foo`ブランチ上のコミットだけをダウンロードしてきて、","","`o/foo`ブランチに置きます。"],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["しかし、なぜGitはダウンロードしてきたコミットをローカルの`foo`ブランチではなく`o/foo`ブランチに置いたのでしょうか?","","``引数に指定したブランチはローカルとリモートの両方に存在しているはずなのに...","","なぜなら、Gitは`foo`ブランチでの作業を台無しにしたくないからです!これは先ほどの`git fetch`のレッスンと関連しています。","","`git fetch`はローカルのブランチを更新するのではなく、リモートからコミットをダウンロードするだけです!",""]}},{type:"ModalAlert",options:{markdowns:["では、ダウンロード元とダウンロード先を`:`で明示的に指定してあげるとどうなるのでしょうか?","","コミットをローカルブランチ上に「直接」取り込みたいという強い理由があるのでしたら、コロンを使ったRefspecで指定することができます。今チェックアウトしているブランチでない限り、直接取り込むことができます。","","``がリモート上の場所になり、``がそのコミットを置くローカル上の場所になるということです。","","これは`git push`と真逆で、データを逆方向に転送するということになります!","","とはいえ、開発者が実際にこの操作を行うことはありません。","ここでは、`fetch`と`push`がいかに似ていて、方向性が逆であるかを概念的に説明するために紹介しています。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["このクレイジーさを実際に確認してみましょう。"],afterMarkdowns:["うわぁ〜!gitは`foo~1`をorigin上の場所として解決し、そのコミットをローカルの`bar`ブランチに直接ダウンロードしました。","","保存先を指定したので`foo`と`o/foo`ブランチが更新されていないことに注目しましょう。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["コマンドを実行する際にダウンロード先のブランチが存在しない場合はどうなるでしょう?"],afterMarkdowns:["ご覧ください!`git push`と同じです。Gitはfetchする前にローカルへダウンロード先を作成しています。これはpushする際に、リモートにアップロード先が存在しない時、リモート上にアップロード先を作るのと同じです。"],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["引数がなかったらどうなるでしょう?","","`git fetch`に引数を渡さなかった時は、リモート上に存在する全てのブランチのコミットをダウンロードしてきます・"],afterMarkdowns:["とてもシンプルですね。確認してみましょう。"],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["よし、話はここまでにしましょう!このレベルをクリアするにはゴールで示されている指定されたコミットだけを`fetch`します。","","コマンドを駆使してみましょう!","","両方の`fetch`コマンドにsourceとdestinationを指定する必要があります。IDが入れ替わる可能性があるのでゴールをよく確認してください。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументы git fetch","","Итак, мы только что изучили всё, что касается аргументов git push, мы узнали о параметре `<пункт назначения>`, и даже об аргументе, задающем отдельно источник и получатель коммитов (`<источник>:<получатель>`). Можем ли мы применить все эти полученные знания для команды `git fetch` ?","","Ещё бы! Аргументы для команды `git fetch` на самом деле *очень, очень* похожи на те, что мы использовали в `git push`. В данном случае применяется тот же подход, только в противоположном направлении (так как теперь вы скачиваете коммиты, а не закачиваете их).","","Давайте ознакомимся с принципами один за одним..."]}},{type:"ModalAlert",options:{markdowns:["### Параметр `<пункт назначения>`","","Если вы указываете пункт назначения в команде git fetch, например так, как в следующем примере:","","`git fetch origin foo`","","Git отправится в ветку `foo` на удалённом репозитории, соберёт с собой все коммиты, которые не присутствуют локально, и затем поместит их в локальную ветку под названием `o/foo`.","","Давайте взглянем на всё это в действии (чтобы освежить в памяти)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Указывая пункт назначения..."],afterMarkdowns:["мы скачиваем только коммиты с ветки `foo` и помещаем их в `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Вы, должно быть, спрашиваете себя — зачем git поместил эти коммиты в ветку `o/foo` вместо того, чтобы разместить их в локальной ветке `foo` ? Ведь я думал о параметре `<пункт назначения>`, как о месте, ветке, которая существует в обоих - локальном и удалённом репозитории. Верно?","","На самом деле, в данном случае git делает исключение, потому что вы, возможно, работаете над веткой `foo`, которую не хотите привести в беспорядок!! Об этом упоминалось в ранних уроках по `git fetch` - эта команда не обновляет ваши локальные 'не удалённые', она лишь скачивает коммиты (соответственно, вы можете инспектировать / объединять их позже).",""]}},{type:"ModalAlert",options:{markdowns:['"Что же тогда произойдёт, если я явно укажу оба параметра: и источник и получатель, пользуясь синтаксисом `<источник>:<получатель>` ?"',"","Если вы уверены в том, что хотите закачать коммиты *прямиком* в вашу локальную ветку, тогда да, вы можете явно указать источник и получатель через двоеточние. Вы можете воспользоваться таким приёмом лишь для ветки, на которой вы не находитесь в настоящий момент `checkout`.","","Теперь у нас `<источник>` - это место на *удалённом репозитории*, а `<получатель>` - место в *локальном* репозитории, в который следует помещать коммиты. Аргументы в точности до наоборот повторяют git push, и немудрено, ведь теперь мы переносим данные в обратном направлении!","","Как уже было сказано, разработчики редко используют такой подход на практике. Целью демонстрации этой возможности было показать, насколько схожи концептуально `fetch` и `push`. Их отличие лишь в направлении переноса данных."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте взглянем на всё это в действии:"],afterMarkdowns:["Ого! Видите, git распознал `foo~1` как место в origin и затем скачал эти коммиты в `bar`, которая является локальной веткой. Обратите внимание, что ветки `foo` и `o/foo` не изменились, так как в аргументах мы явно указали получателя."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А что, если ветка-получатель не существует на момент запуска команды? Давайте ещё раз взглянем на предыдущий слайд, но на этот раз ветки `bar` ещё не существует."],afterMarkdowns:["Видите, поведение совсем такое же, как и у git push. Git создал ветку-получатель локально прежде чем скачивать данные. Всё как и в случае, когда git создаёт получателя в удалённом репозитории, когда мы закачиваем изменения (если получатель не существует)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А если вообще без аргументов ?","","Если команда `git fetch` выполняется без аргументов, она скачивает все-все коммиты с удалённого репозитория и помещает их в соответствующие удалённо-локальные ветки в локальном репозитории..."],afterMarkdowns:["Достаточно просто, после того как мы пережили все эти технические тонкости."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ладно, достаточно болтовни! Чтобы выполнить этот уровень, скачайте лишь определённые коммиты так, как представлено в визуализации цели. Пофантазируйте с этими командами!","","Вам следует явно указывать источник и получателя для обеих команд fetch. Обратите внимание на визуализацию цели, так как ID-шники могут меняться!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch 인자들","","여태까지 우리는 git push 인자들에 대해 배워봤습니다. 이 멋진 `` 인자 그리고 콜론 참조스펙도 말이죠(`:`). 우리가 알아낸 이 지식을 `git fetch`에도 적용 할 수 있으려나요?","","당연하죠! `git fetch`에 넘기는 인자들은 사실 `git push`의 그것들과 *아주 아주* 비슷합니다. 같은 컨셉으로 적용되지만 방향이 반대일 뿐이죠(커밋을 업로드하는게 아니라 다운받는것이니까요).","","하나씩 차근차근 알아봅시다..."]}},{type:"ModalAlert",options:{markdowns:["### `` 인자","","git fetch에 다음 명령어와 같이 place를 지정해주면:","","`git fetch origin foo`","","Git은 원격 저장소의 `foo` 브랜치로 가서 현재 로컬에 없는 커밋들을 가져와 로컬의 'o/foo' 브랜치 아래에 추가 할 것입니다.","","직접 확인해봅시다(상기해보죠)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["place를 지정해주면..."],afterMarkdowns:["커밋들을 `foo`브랜치에서만 내려받은 후 로컬의 `o/foo`브랜치에만 적용합니다."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["여러분은 분명 궁금할거에요 -- 왜 로컬의 `foo`에 그냥 커밋을 추가하지 않고 로컬의 원격 브랜치 `o/foo`에 커밋들을 추가한거지? 인자는 로컬하고 원격 저장소 모두에 똑같이 있는 곳을 의미한게 아니였나?","","음, git이 이번 상황은 특별히 예외적으로 처리하기 때문입니다. 여러분이 `foo`브랜치에 작업을 했을지도 모르는데 이 명령으로 망쳐서 건드릴지도 모르니까요! 이전에 했던 강의 `git fetch`를 떠올려보면 왜 그런지 느낌이 올겁니다 -- `git fetch`는 로컬의 원격 브랜치가 아닌 브랜치는 갱신하지 않습니다, 커밋들을 내려받기만 합니다(여러분이 확인해보고 나중에 병합할 수 있도록 말이죠).",""]}},{type:"ModalAlert",options:{markdowns:['"그렇다면, 이전 강의처럼 source와 destination를 모두 직접 지정해주면 어떻게될까요? 이 명령어로 말이죠 `:`"',"","여러분이 커밋을 *직접* 로컬 브랜치로 fetch할 열의가 있다면, 네 콜론 참조스펙으로 지정해서 할 수 있습니다. 하지만 체크아웃된 브랜치에 fetch할 수 는 없고 체크아웃되지 않은 브랜치만 가능합니다.","","주의 할점이 하나 있는데 -- ``는 이제 받아올 커밋이 있는 *원격*에 있는 place를 넣어줘야하고 ``은 그 커밋들을 받아올 *local*의 place를 인자로 넣어줘야 합니다. git push와 정반대로 하는거죠, 데이터를 반대의 방향으로 옮기는 작업이니 이게 더 납득이 갑니다.","","언급한 것 처럼, 실제로 이것을 하는 개발자들은 많지 않습니다. 이것을 소개하는것은 `fetch`와 `push`가 방향이 반대일뿐 컨셉이 비슷하다는것을 표현하기 위해서입니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["자 이 해괴한 작업을 직접 확인해봅시다:"],afterMarkdowns:["이야! 보셨습니까, git이 `foo~1`을 origin의 place로 지정하고 커밋들을 내려받아 `bar`(로컬 브랜치)에 추가했습니다. `foo`와 `o/foo`는 갱신되지 않는게 확인되나요? destination을 지정해줬기 때문입니다."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["만약 destination이 될 브랜치가 없는 없는 상태에서 명령을 수행하면 어떻게 될까요? 방금의 슬라이드에서 `bar`브랜치가 없는 상태에서 수행해봅시다."],afterMarkdowns:["보이나요, git push 와 똑같습니다. Git이 fetch를 수행하기전에 destination을 로컬에 만들었습니다. git이 push를 수행하기 전에 원격저장소에 destination을 만드는것과 똑같습니다(없을경우에)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["인자 없이는?","","만약 `git fetch`를 인자없이 수행하면 원격저장소에서 모든 원격 브랜치들로 커밋들을 내려받습니다..."],afterMarkdowns:["간단하지만, 짚고 넘어갑시다."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["좋습니다, 설명은 이정도로 하고! 이번 레벨을 끝내기위해서는 시각화된 골처럼 커밋들을 fetch하면 됩니다. 명령어로 멋지게 해내봅시다!","","fetch 명령에 source와 destination을 모두 지정해줘야 할겁니다. 골 시각화를 잘 보세요 fetch를 하다보면 커밋들의 ID가 바뀔수도있어요!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументи git fetch","","Отже, ми вже вивчили все про аргументи git push, про корисний параметр `` і про формат запису з двокрапкою (`:`). Чи знадобляться нам ці зання при вивченні `git fetch`?","","Ще б пак! Аргументи для `git fetch` насправді *дуже, дуже* схожі на `git push`. Принцип той самий, з точністю до напрямку (бо ми звантважуємо коміти, а не завантажуємо).","","Розгляньмо це крок за кроком..."]}},{type:"ModalAlert",options:{markdowns:["### Параметр ``","","Якщо вказати параметр `` для команди git fetch, наприклад, так:","","`git fetch origin foo`","","git піде у віддалену гілку `foo`, візьме всі коміти, яких немає локально і закине в локальну гілку `o/foo`.","","Подивімось на це в дії (просто щоб пригадати)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Вказуючи ``..."],afterMarkdowns:["Ми звантажуємо коміти лише з `foo` і кладемо їх в `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Ти можеш спитати, чому git закинув ці коміти в гілку `o/foo` замість того, щоб покласти їх відразу в локальну гілку `foo`? Я думав, що параметр `` одночасно вказує місце звідки взяти і куди поставити?","","Ну, git робить невеликий виняток в цьому випадку, оскільки ти, ймовірно, маєш якусь роботу в `foo`, і не хочеш там нічого зіпсувати! Пригадай з попереднього уроку про `git fetch` -- він не оновлює твої локальні (не віддалені -- без `o/`) гілки, він тільки звантажує коміти (так, щоб їх можна було переглянути/змерджити пізніше).",""]}},{type:"ModalAlert",options:{markdowns:['"Ну, в такому разі, що буде, якщо явно вказати і джерело і призначення `:`?"',"","Якщо ти почуваєшся достатньо впевненим і хочеш звантажити віддалені коміти *прямо* в свою локальну гілку, тоді -- справді, ти можеш так написати, використавши синтаксис з двокрапкою. Єдиний виняток -- таким способом не можна витягувати зміни в поточну локальну гілку, в будь-яку іншу -- без проблем.","","Тепер в нас `` вказує на *віддалений репозиторій*, а `` -- на *локальне* місце, куди звантажаться коміти. Це повна протилежність тому, як було в git push, що, зрештою, має сенс, адже ми передаємо дані у протилежному напрямку!","","Насправді, розробники рідко використовують такий спосіб на практиці. І він показаний тут лише для повноти описання наскільки `fetch` і `push` схожі, відрізняючись лише напрямом дії."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Подивімось на це божевілля в дії:"],afterMarkdowns:["Ого! Дивись, git прийняв `foo~1` за джерело, і звантажив коміти в `bar` (локальна гілка). Зауваж, що `foo` і `o/foo` не оновлювались, оскільки ми явно вказали звідки і куди передавати коміти."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А якщо вказаного місця призначення не існує на момент виконання команди? Погляньмо на попередній слайд, але без гілки `bar`."],afterMarkdowns:["Бачиш, все як і в випадку з git push. Git створив локальну гілку-призначення перед звантаженням, так само як створить гілку-призначення на віддаленій стороні перед пушем (якщо її не існувало, звичайно)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Без аргументів?","","Якщо `git fetch` запущено без аргументів, він просто звантажить всі коміти з віддаленого репозиторія в віддалені (`o/`) гілки..."],afterMarkdowns:["Все дуже просто, але варто було згадати ще раз."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Гаразд, годі балакати! Щоб пройти цей рівень, звантаж лише вказані на візуалізації коміти. Прояви фантазію, підбираючи команди!","","Тобі потрібно вказати і джерело і призначення для обидвох fetch-команд. Слідкуй за змінами на візуалізації, ID комітів можуть змінюватися!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham số Git fetch","","Chúng ta vừa tìm hiểu về tham số của git push, sự tuyệt vời của tham số ``, và thậm chí cả refspecs (`:<đích>`). Liệu ta có thể áp dụng điều này vào `git fetch` không nhỉ?","","Đoán chuẩn rồi đấy! Tham số cho lệnh `git fetch` thực ra *rất, rất* giống với `git push`. Chúng có chung khái niệm nhưng được áp dụng cho hướng ngược lại (vì bây giờ ta tải xuống commit chứ không phải tải lên).","","Hãy lần lượt đi qua từng khái niệm một..."]}},{type:"ModalAlert",options:{markdowns:["### Tham số ``","","Nếu bạn chỉ định vị trí cho `git fetch` như câu lệnh dưới:","","`git fetch origin foo`","","Git sẽ lênh nhánh `foo` trên kho chứa từ xa, lấy toàn bộ các commit chưa có trên kho chứa cục bộ và thả chúng xuống nhánh `o/foo` ở kho chứa cục bộ.","","Hãy xem một ví dụ (vẫn là câu lệnh trên nhưng mà trực quan hơn)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Thông qua chỉ định vị trí..."],afterMarkdowns:["Ta chỉ tải xuống commit ở trên nhánh `foo` và đặt chúng ở nhánh `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Có thể bạn sẽ thắc mắc -- tại sao Git lại thả các commit xuống nhánh `o/foo` thay vì nhánh `foo` ở kho chứa cục bộ? Tôi tưởng tham số `` tồn tại ở cả kho chứa cục bộ và kho chứa từ xa mà?","","Chà trong trường hợp này Git ứng xử có một chút ngoại lệ đặc biệt, vì có thể bạn đang làm việc trên nhánh `foo` ở kho chứa cục bộ mà bạn không muốn nó bị làm rối!! Điều này liên kết đến bài học trước về `git fetch` -- nó không cập nhật nhánh cục bộ không liên kết nhánh từ xa của bạn (nhánh không có tiền tố `origin/`), nó chỉ tải xuống các commit (mà bạn có thể xem xét hoặc hợp nhất sau).",""]}},{type:"ModalAlert",options:{markdowns:['"Nếu vậy, thì điều gì sẽ xảy ra nếu tôi chỉ định cả nguồn và đích với `:<đích>`?"',"","Nếu bạn nhất quyết muốn tải commit *trực tiếp* xuống nhánh cục bộ, thì bạn có thể chỉ định điều này bằng cách dùng refspec hai chấm. Bạn không thể nạp commit vào nhánh mà bạn đang đứng, nhưng Git sẽ cho phép bạn làm điều này:","","Đây là cách duy nhất -- `` là vị trí trên kho chứa *từ xa* và `<đích>` là vị trí *cục bộ* để đặt các commit. Điều này hoàn toàn ngược lại với `git push`, và đó là tất nhiên thôi vì ta đang chuyển giao dữ liệu theo hướng ngược lại!","","Thực tế là, các nhà phát triển rất hiếm khi làm điều này. Tôi giới thiệu về nó chủ yếu là vì muốn giải thích rõ hơn việc `fetch` và `push` là khá tương đồng, chỉ là theo hướng ngược lại."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lấy một ví dụ điên rồ..."],afterMarkdowns:["Wao! Thấy chứ, Git diễn giải `foo~1` thành một vị trí trên kho chứa từ xa sau đó tải xuống các commit lên nhánh `bar` ở kho chứa cục bộ. Để ý rằng nhánh `foo` và `o/foo` không hề được cập nhật vì ta đã chỉ định đích đến."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu như đích đến chưa hề tồn tại trước khi tôi chạy lệnh thì sao? Cùng xem lại ví dụ vừa rồi nhưng lần này nhánh `bar` chưa hề tồn tại."],afterMarkdowns:["Thấy chứ, nó Y HỆT với git push. Git tạo ra đích đến ở kho chứa cục bộ trước khi nạp, cũng giống như Git sẽ tạo ra đích đến trên kho chứa từ xa trước khi đẩy (trong trường hợp nó không tồn tại)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Không có tham số?","","Nếu lệnh `git fetch` không nhận được bất kỳ tham số nào, nó sẽ tải xuống tất cả các commit có trên kho chứa từ xa lên tất cả các nhánh từ xa ở kho chứa cục bộ..."],afterMarkdowns:["Khá là đơn giản, nhưng mà cũng nên xem qua thử."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Được rồi, lý thuyết như vậy là đủ rồi! Để hoàn thành cấp độ này, hãy chỉ nạp những commit được chỉ định trong mô tả mục tiêu. Thoải mái ứng biến với những câu lệnh nhé!","","Bạn sẽ phải chỉ định nguồn và đích cho lệnh fetch. Chú ý đến mô tả mục tiêu vì các ID có thể bị xáo trộn!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git fetch argumenti","","Torej pravkar smo se naučili vse o git push argumentih ter kul `` parameteru in celo dvopični referenci (`:`). Torej uporabimo vse znanje tudi za `git fetch`?","","Itak! Argumenti za `git fetch` so v bistvu *zelo zelo* podobni tistim za `git push`. Gre za enak koncept, ampak uporabljen v nasprotni smeri (ker sedaj prenašamo commite, namesto da jih nalagamo).","","Pojdimo čez koncepte drug za drugim ..."]}},{type:"ModalAlert",options:{markdowns:["### `` parameter","","Če podaš mesto poleg git fetcha kot v naslednjem ukazu:","","`git fetch origin foo`","","Bo Git šel na `foo` branch na oddaljenem repotu, pograbil vse commite, katerih lokalno še nimamo in jih dodal na dno lokalnega `o/foo` brancha.","","Poglejmo to v akciji (samo kot osvežitev)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Z določanjem mesta ..."],afterMarkdowns:["Prenesemo samo commite iz `foo` in jih postavimo na `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Morda se sprašuješ -- zakaj je git dodal te commite na `o/foo` oddaljen branch namesto, da bi jih dodal na moj lokalen `foo` branch? Mislil sem, da je `` parameter mesto, ki obstaja in lokalno in na oddaljenem repozitoriju?","","No, git naredi v tem primeru posebno izjemo, ker imaš morda delo na `foo` branchu, ki ga ne želiš pokvariti!! To se navezuje na prejšnjo lekcijo o `git fetch` -- ne posodobi tvojega lokalnega ne-oddaljenega brancha, samo prenese commite (da jih lahko pregledaš / mergaš kasneje).",""]}},{type:"ModalAlert",options:{markdowns:['"Ampak v tem primeru, kaj se zgodi, če posebaj določim izvor in cilj s `:`?"',"","Če se počutiš dovolj strastno, da bi fetchal commite *direktno* na lokalen branch, potem ja, lahko to definiraš z dvopično referenco. Ne moreš fetchati commitov na branch, ki je checkoutan, ampak v drugih primerih to lahko narediš.","","Tu je edina zanka -- `` je sedaj mesto na *oddaljenem* in `` je *lokalno* mesto za dodati te commite. Je ravno nasprotje od git pusha in to je logično, saj prenašamo podatke v nasprotni smeri!","","Glede na to, razvijalci to redko delajo v praksi, to predstavljam zgolj, da si lahko predstavljaš, kako sta si `fetch` in `push` kar podobna, ampak v nasprotni smeri."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si to zmešnjavo v praksi:"],afterMarkdowns:["Wow! Vidiš, git je naredil `foo~1` kot mesto na originu in nato prenesel commite na `bar` (ki je bil lokalen branch). Opazi, kako `foo` in `o/foo` nista bila posodobljena, ker smo določili destinacijo."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj pa, če destinacija ne obstaja, preden zaženem ukaz? Poglejmo zadnji primer, vendar brez da bi prej `bar` že obstajal."],afterMarkdowns:["Vidiš, je TAKO kot git push. Git je naredil destinacijo lokalno pred fetchem, tako kot bo naredil destinacijo na oddaljneme repotu pred pushem (če ne obstaja)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ni argumentov?","","Če `git fetch` ne prejme argumentov, prenese vse commite iz oddaljenega repota na vse oddaljene branche ..."],afterMarkdowns:["Precej enostavno, ampak vredno, da gremo čez vsaj enkrat."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Ok, dovolj govorjenja! Da zaključiš to stopnjo, fetchaj samo določene commite iz ciljne vizualizacije. Razturaj te ukaze!","","Določiti boš moral izvor in cilj za oba fetch ukaza. Bodi pozoren na ciljno vizualizacijo, saj so lahko IDji obrnjenji okoli!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argumenty git fetch","","No to właśnie nauczyliśmy się o argumentach git push, o tym fajnym parametrze ``, a nawet o refspec z dwukropkiem (`<źródło>:`). Czy możemy tę samą wiedzę zastosować też przy `git fetch`?","","No ba... Argumenty `git fetch` są w gruncie rzeczy *bardzo, bardzo* podobne do tych z `git push`. To ta sama idea, tyle że zastosowana w odwrotną stronę (przecież nie wysyłasz commitów, tylko je pobierasz).","","Powtórzmy krok po kroku, na czym to polega..."]}},{type:"ModalAlert",options:{markdowns:["### Parametr `` (miejsce)","","Jeśli w git fetch określisz miejsce, tak jak w tym poleceniu:","","`git fetch origin foo`","","Git przejdzie do gałęzi `foo` w zdalnym repozytorium, weźmie wszystkie commity, których brakuje lokalnie, i zrzuci je nam na lokalną gałąź `o/foo`.","","Zobaczmy, jak to działa (tylko dla odświeżenia pamięci)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Określając miejsce..."],afterMarkdowns:["pobraliśmy tylko commity z `foo` i umieściliśmy je na `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Może się zastanawiasz, dlaczego Git zrzucił te commity na zdalną gałąź `o/foo`, a nie tylko na lokalną gałąź `foo`? Wydawało się, że parametr `` to miejsce istniejące zarówno lokalnie, jak i na zdalnym repozytorium.","","Cóż... Git robi w tym miejscu bardzo wyjątkowy wyjątek, bo wie, że możesz mieć na gałęzi `foo` pracę, w której nie chcesz namieszać!!! Łączy się to z wcześniejszą lekcją o `git fetch`. To polecenie nie aktualizuje twoich lokalnych gałęzi - ono tylko pobiera commity (a ty możesz je sobie obejrzeć i scalić później).",""]}},{type:"ModalAlert",options:{markdowns:['"No to co się w takim razie stanie, jeśli samodzielnie określę źródło i cel za pomocą `:`?"',"","Jeśli naprawdę czujesz wewnętrzną potrzebę, żeby robić fetch *bezpośrednio* na lokalną gałąź, to proszę bardzo, możesz wykorzystać refspec z dwukropkiem. Nie możesz tylko ściągnąć przy użyciu fetch commitów na aktualnie wybraną za pomocą checkout gałąź. Poza tym Git pozwoli ci zrobić, co chcesz.","","Jest jednak jeden haczyk -- `<źródło>` to teraz *zdalne* miejsce, a `` jest *lokalnym* miejscem, na które trafią commity. To dokładne przeciwieństwo git push, i to ma sens, skoro przenosimy teraz dane w odwrotnym kierunku!","","No ale w praktyce mało kto tak robi. Tłumaczę to głównie po to, żeby uzmysłowić ci, że `fetch` i `push` są dość podobne, tylko działają w odwrotne strony."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy, jak to szaleństwo działa:"],afterMarkdowns:["Nieźle! Spójrz. Git zinterpretował `foo~1` jako miejsce na origin i pobrał z niego commity do `bar` (czyli lokalną gałąź). Zauważ, że ani `foo`, ani `o/foo` nie zostały zaktualizowane, ponieważ określiliśmy cel."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A co, jeśli cel nie istnieje przed wykonaniem polecenia? Spójrzmy jeszcze na ostatni slajd, na którym `bar` na początku nie ma."],afterMarkdowns:["Widzisz, to działa DOKŁADNIE jak git push. Git stworzył lokalnie cel przed wykonaniem fetch, dokładnie tak samo jak zrobiłby to na zdalnym repozytorium przed zrobieniem push (gdyby cel tam nie istniał)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bez argumentów?","","Jeśli `git fetch` nie dostanie żadnych argumentów, to po prostu ściągnie wszystkie commity ze zdalnego repozytorium do wszystkich zdalnych gałęzi..."],afterMarkdowns:["Niby proste, ale warto to zobaczyć chociaż raz."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Dobra, dość gadania! Żeby ukończyć ten poziom, użyj fetch tylko do commitów określonych w wizualizacji celu. Pokombinuj trochę z tymi poleceniami!","","Dla obu poleceń fetch musisz określić źródło i cel. Przyjrzyj się dokładnie wizualizacji celu; identyfikatory mogą być zamienione miejscami!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parametri di git fetch","","Abbiamo imparato un sacco sui parametri di git push, su questo bel ``, e persino sui colon refspec (`:`). Possiamo usare tutta questa conoscenza anche per `git fetch`?","","Ma certo! I parametri di `git fetch` sono *molto, molto* simili a quelli di `git push`. È lo stesso tipo di concetto ma applicato nel verso opposto (in quanto ora stai scaricando commit invece che caricarli in un repository remoto).","","Vediamo i vari concetti uno per volta..."]}},{type:"ModalAlert",options:{markdowns:["### Il parametro ``","","Se specifici un luogo con git fetch come nel comando seguente:","","`git fetch origin foo`","","Git andrà al ramo `foo` sul remoto, prenderà tutti i commit che non sono presenti in locale, e li andrà a mettere nel ramo locale `o/foo`.","","Vediamolo in azione (per rinfrescare le idee)."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Specificando un luogo..."],afterMarkdowns:["Scarichiamo solamente i commit da `foo` e li piazziamo su `o/foo`."],command:"git fetch origin foo",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"ModalAlert",options:{markdowns:["Potresti domandarti -- perché git ha messo i commit sul ramo remoto `o/foo` invece che metterli sul mio ramo locale `foo`? Il parametro `` non era un luogo esistente sia localmente che sul remoto?","","Git fa un'eccezione in questo caso dato che potresti avere del lavoro sul ramo `foo` che non vuoi venga messo a rischio!! Questo si collega alla vecchia lezione su `git fetch` -- non aggiorna i tuoi rami locali, non-remoti, va solo a scaricare i commit (così che sia tu ad esaminarli / fonderli più avanti).",""]}},{type:"ModalAlert",options:{markdowns:['"Bene allora, cosa succede se definisco esplicitamente sia la fonte che la destinazione con `:`?"',"","Se ti senti abbastanza ispirato da voler scaricare commit *direttamente* su di un ramo locale, allora sì, puoi farlo con un colon refspec. Non puoi scaricare commit sul ramo nel quale sei attualmente, a parte questo git te lo permetterà.","","Qui c'è la fregatura però -- `` è ora un luogo sul repository *remoto* e `` è un luogo *locale* nel quale piazzare i commit recuperati. È l'esatto opposto di git push, il che ha senso dato che stiamo trasferendo dati nella direzione opposta!","","Detto ciò, gli sviluppatori raramente lo fanno. Lo sto introducendo principalmente come metodo per concettualizzare come `fetch` e `push` siano molto simili, solo in direzioni opposte."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo questa pazzia sul campo:"],afterMarkdowns:["Wow! Vediamo, git ha risolto `foo~1` come un luogo sul repository remoto e ha poi scaricato quei commit su `bar` (nostro ramo locale). Notiamo come `foo` e `o/foo` non sono stati aggiornati in quanto abbiamo specificato una destinazione."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se la destinazione non esistesse nel momento in cui eseguo il comando? Vediamo la slide precedente ma con l'assenza del ramo `bar`."],afterMarkdowns:["Visto, è PROPRIO come git push. Git ha creato la destinazione in locale prima di recuperare i dati, allo stesso modo in cui avrebbe creato la destinazione in remoto prima di caricarli con push (in caso non esista)."],command:"git fetch origin foo~1:bar",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo 2"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Senza parametri?","","Se `git fetch` non riceve parametri, scarica semplicemente tutti i commit dal repository remoto su tutti i rami remoti..."],afterMarkdowns:["Abbastanza semplice, ma vale la pena darci almeno un'occhiata."],command:"git fetch",beforeCommand:"git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork main"}},{type:"ModalAlert",options:{markdowns:["Abbiamo parlato abbastanza! Per finire questo livello, scarica solo i commit specificati nella finestra dell'obiettivo. Scatenati con quei comandi!","","Dovrai specificare la fonte e la destinazione per entrambi i comandi di fetch. Presta attenzione alla finestra obiettivo in quanto gli ID dei commit potrebbero essere scambiati!"]}}]}}}},{}],143:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22o/main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22main%22%5D%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D",solutionCommand:"git clone;git fakeTeamwork;git commit;git pull --rebase;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}',name:{en_US:"Diverged History",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 Historie",fr_FR:"Historique divergent",ja:"履歴の分岐",ru_RU:"Расхождение в истории",uk:"Розбіжності в історії",ko:"엇갈린 히스토리",vi:"Dị biệt lịch sử",sl_SI:"Razdeljena Zgodovina",pl:"Rozbieżna historia",it_IT:"Storico divergente"},hint:{en_US:"Check out the ordering from the goal visualization",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",ja:"ゴールのツリーの順番を参考にすること",fr_FR:"Regardez l'ordre dans la fenêtre de visualisation d'objectif",ru_RU:"проверьте сортировку в визуализации цели",uk:"перевірте порядок в візуалізації цілі",ko:"순서는 goal을 참고하세요",vi:"Kiểm tra kỹ thứ tự trên mô hình mục tiêu",sl_SI:"Preveri vrstni red iz ciljne vizualizacije.",pl:"Przyjrzyj się kolejności na wizualizacji celu",it_IT:"Controlla l'ordinamento dalla schermata dell'obiettivo"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Diverged Work","","So far we've seen how to `pull` down commits from others and how to `push` up our own changes. It seems pretty simple, so how can people get so confused?","","The difficulty comes in when the history of the repository *diverges*. Before discussing the details of this, let's see an example...",""]}},{type:"ModalAlert",options:{markdowns:["Imagine you clone a repository on Monday and start dabbling on a side feature. By Friday you are ready to publish your feature -- but oh no! Your coworkers have written a bunch of code during the week that's made your feature out of date (and obsolete). They've also published these commits to the shared remote repository, so now *your* work is based on an *old* version of the project that's no longer relevant.","","In this case, the command `git push` is ambiguous. If you run `git push`, should git change the remote repository back to what it was on Monday? Should it try to add your code in while not removing the new code? Or should it totally ignore your changes since they are totally out of date?","","Because there is so much ambiguity in this situation (where history has diverged), git doesn't allow you to `push` your changes. It actually forces you to incorporate the latest state of the remote before being able to share your work."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["So much talking! Let's see this situation in action."],afterMarkdowns:["See? Nothing happened because the command fails. `git push` fails because your most recent commit `C3` is based off of the remote at `C1`. The remote has since been updated to `C2` though, so git rejects your push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["How do you resolve this situation? It's easy, all you need to do is base your work off of the most recent version of the remote branch.","","There are a few ways to do this, but the most straightforward is to move your work via rebasing. Let's go ahead and see what that looks like."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now if we rebase before pushing instead..."],afterMarkdowns:["Boom! We updated our local representation of the remote with `git fetch`, rebased our work to reflect the new changes in the remote, and then pushed them with `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Are there other ways to update my work when the remote repository has been updated? Of course! Let's check out the same thing but with `merge` instead.","","Although `git merge` doesn't move your work (and instead just creates a merge commit), it's a way to tell git that you have incorporated all the changes from the remote. This is because the remote branch is now an *ancestor* of your own branch, meaning your commit reflects all commits in the remote branch.","","Lets see this demonstrated..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Now if we merge instead of rebasing..."],afterMarkdowns:["Boom! We updated our local representation of the remote with `git fetch`, *merged* the new work into our work (to reflect the new changes in the remote), and then pushed them with `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Awesome! Is there any way I can do this without typing so many commands?","","Of course -- you already know `git pull` is just shorthand for a fetch and a merge. Conveniently enough, `git pull --rebase` is shorthand for a fetch and a rebase!","","Let's see these shorthand commands at work."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["First with `--rebase`..."],afterMarkdowns:["Same as before! Just a lot shorter."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["And now with regular `pull`."],afterMarkdowns:["Again, exact same as before!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["This workflow of fetching, rebase/merging, and pushing is quite common. In future lessons we will examine more complicated versions of these workflows, but for now let's try this out.","","In order to solve this level, take the following steps:","","* Clone your repo","* Fake some teamwork (1 commit)","* Commit some work yourself (1 commit)","* Publish your work via *rebasing*"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Travail divergent","","Jusqu'à présent nous avons vu comment rapatrier (`pull`) les commits de nos collaborateurs et comment envoyer les nôtres (`push`). Cela a l'air simple, alors comment se fait-il que certains puissent trouver le sujet aussi confus ?","","La difficulté apparaît lorsque l'historique du dépôt *diverge*. Avant d'aborder les détails de cette situation, voyons un exemple...",""]}},{type:"ModalAlert",options:{markdowns:["Imaginez que vous clonez un dépôt le lundi et commencez à bidouiller une nouvelle fonctionnalité. Le vendredi vous êtes prêt à publier votre fonctionnalité -- mais oh non ! Vos collègues ont écrit une floppée de code durant la semaine, ce qui rend votre fonctionnalité désuète (et obsolète). Ils ont aussi publié sur le dépôt distant partagé, donc maintenant *votre* travail est basé sur une *vieille* version du projet qui n'est plus viable.","","Dans ce cas, la commande `git push` est ambiguë. Si vous exécutez `git push`, Git devrait-il remettre le dépôt distant tel qu'il était lundi ? Doit-il essayer d'ajouter votre code sans supprimer le nouveau code ? Ou doit-il totalement ignorer vos changements puisqu'ils ne sont plus à jour ?","","Comme il y a trop d'ambiguïté dans cette situation (où l'historique a divergé), Git ne vous autorise pas à faire un `push` de vos changements. Cela vous force en fait à rapatrier chez vous le dernier état du dépôt distant avant de pouvoir partager votre travail."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Assez parlé ! Observons cette situation en action :"],afterMarkdowns:["Vous voyez ? Rien ne s'est produit car la commande a échoué. `git push` a échoué car votre commit le plus récent `C3` est basé sur `C1` sur le dépôt distant. Le dépôt distant a été mis à jour depuis avec `C2`, donc Git rejette votre push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Comment allez-vous résoudre cette situation ? C'est facile, tout ce que vous avez à faire est de baser votre travail sur la dernière version de la branche distante.","","Il y a plusieurs façons de faire cela, mais la plus directe est de déplacer votre travail avec rebase. Regardons à quoi cela ressemble."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Maintenant si nous rebasons avant de push..."],afterMarkdowns:["Boum ! Nous avons mis à jour notre représentation locale du dépôt avec `git fetch`, rebasé notre travail pour refléter les nouveaux changements, et enfin les avons envoyés avec `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Existe-t-il d'autres façons de mettre à jour notre travail quand le répertoire distant a été mis à jour ? Bien sûr ! Faisons la même chose, mais cette fois avec `merge`.","","Bien que `git merge` ne déplace pas votre travail (et crée à la place un commit de fusion), cette commande est également une façon de dire à Git que vous avez incorporé tous les changements du dépôt distant. En effet la branche distante est maintenant une *ancêtre* de votre propre branche, ce qui signifie que vos commits contiennent tous les changements faits sur la branche distante.","","Voyons une démonstration..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Maintenant si nous mergeons au lieu de rebaser..."],afterMarkdowns:["Boum ! Nous avons mis à jour notre représentation locale du dépôt distant avec `git fetch`, *fusionné* les nouveaux commits dans notre copie de travail (pour refléter les nouveaux changements du dépôt distant), et les avons ensuite envoyés avec `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Impressionnant ! Existe-t-il une façon de faire tout cela sans taper autant de commandes ?","","Bien sûr : vous savez déjà que `git pull` est simplement un raccourci pour un fetch puis un merge. De manière assez pratique, `git pull --rebase` est un raccourci pour un fetch puis un rebase !","","Voyons ce raccourci au travail."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Premièrement avec `--rebase`..."],afterMarkdowns:["Comme avant ! Juste un peu plus court."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Et maintenant avec un `pull` normal :"],afterMarkdowns:["Encore une fois, c'est exactement la même chose qu'auparavant !"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Cette succession de fetch, rebase/merge, et push est assez commune. Dans les leçons suivantes, nous explorerons cette façon d'enchaîner les commandes dans des conditions plus complexes, mais pour le moment appliquons ce principe de façon classique.","","Pour finir ce niveau, réalisez les étapes suivantes :","","* Clonez votre dépôt","* Simulez un travail d'équipe (1 commit)","* Commitez un peu de votre travail (1 commit)","* Publiez votre travail avec *rebase*"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Trabajo divergente","","Hasta acá vimos cómo pullear commits de otros y cómo pushear 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:["Imaginate que clonás un repositorio el lunes y empezás a desarrollar algo. Para el viernes tenés todo listo para publicar tu trabajo, pero, ¡oh, oh! Tus colegas también escribieron código durante la semana, haciendo que tu trabajo quede desactualizado (y obsoleto). Además, 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 corrés `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 que la historia divirgió), git no te permite pushear 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 resolvés esta situación? Es fácil, todo lo que tenés 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 mejor rebaseamos antes de pushear..."],afterMarkdowns:["¡Boom! Actualizamos nuestra representación local del remoto con `git fetch`, rebaseamos nuestro trabajo para reflejar los nuevos cambios del remoto, y después los pusheamos con `git push`."],command:"git fetch; git rebase o/main; 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 rebasear hacemos un merge..."],afterMarkdowns:["¡Boom! 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 pusheamos usando `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¡Asombroso! ¿Hay forma de hacer esto sin tipear tantos comandos?","","¡Claro que sí! Ya sabés 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 esta movida de fetchear, rebasear/mergear y pushear es bastante común. En lecciones futuras vamos a ver formas más complejas de estos flujos de trabajo, pero por ahora probemos esto que vimos.","","Para resolver este nivel, hacé lo siguiente:","","* Cloná tu repositorio","* Simulá algo de trabajo de un colega (1 commit)","* Commiteá algo de trabajo propio (1 commit)","* Publicá tu trabajo *rebaseando*"]}}]},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/main; 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/main; 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:[{type:"ModalAlert",options:{markdowns:["## Histórico Divergente","","Até o momento vimos como fazer `pull` de commits dos outros e como fazer `push` de nossas próprias mudanças. Parece ser tão simples, como será que as pessoas ficam tão confusas?","","A dificuldade aparece quando o histórico do repositório *diverge*. Antes de discutir os detalhes disso, vejamos um exemplo...",""]}},{type:"ModalAlert",options:{markdowns:["Imagine que você clonou um repositório na segunda-feira e começou a trabalhar em uma funcionalidade nova. Na sexta-feira você está pronto para publicar a funcionalidade -- mas, ah não! Seus colegas escreveram um bocado de código durante a semana, tornando a sua funcionalidade obsoleta. Eles também publicaram esses commits no repositório remoto que vocês compartilham, então agora o *seu* trabalho é baseado em uma versão *antiga* do projeto, que não é mais relevante.","","Neste caso, o comando `git push` é ambíguo. Se você executar `git push`, será que o Git deveria tratar o repositório remoto como se ele ainda estivesse no estado da segunda-feira? Será que ele deveria tentar adicionar seu código dentro do repositório sem tentar remover o código novo? Ou será que ele deveria simplesmente ignorar suas mudanças totalmente, já que elas estão obsoletas?","","Devido à grande ambiguidade que surge neste tipo de situação (quando a história divergiu), o Git não permite que você faça `push` das suas mudanças. Ele, de fato, força você a incorporar o último estado do repositório remoto antes de conseguir compartilhar o seu trabalho."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Chega de conversa! Vejamos essa situação na prática."],afterMarkdowns:["Viu? Nada aconteceu porque o comando falhou. O `git push` falha porque o commit mais recente (`C3`) é baseado no remoto em `C1`. Como o remoto foi atualizado no meio tempo, o Git rejeita o push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Como resolver essa situação? É fácil, tudo que você precisa fazer é basear seu trabalho na versão mais recente do ramo remoto.","","Existem algumas maneiras de fazer isso, mas a mais direta é mover o seu trabalho usando rebase. Vamos em frente, ver como isso é feito."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora se nós fizermos um rebase antes do push..."],afterMarkdowns:["Boom! Nós atualizamos a representação local do repositório remoto com `git fetch`, fizemos rebase do nosso trabalho para refletir as novas mudanças no repositório remoto, e então enviamos nossas mudanças com `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Será que existem outras formas de compartilhar meu trabalho quando o repositório remoto tiver sido atualizado? Claro! Vamos fazer a mesma tarefa usando `merge` em vez de `rebase`.","","Embora o `git merge` não mova o seu trabalho (em vez disso, ele cria um commit de merge), ele é uma forma de contar ao Git que você incorporou todas as mudanças do repositório remoto. Isso acontece porque o ramo remoto passa a ser um *ancestral* do seu próprio ramo, significando que o seu commit reflete todos os commits contidos no ramo remoto.","","Vejamos uma demonstração..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora se fizermos merge em vez de rebase ..."],afterMarkdowns:["Boom! Atualizamos nossa representação local do repositório remoto com `git fetch`, fizemos *merge* do novo trabalho com o nosso (para refletir as novas mudanças no repositório remoto), e então fizemos push deles com `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Incrível! Existe alguma forma de fazer isso sem digitar tantos comandos?","","É claro -- você já conhece o `git pull` e ele é simplesmente um atalho para um fetch e um merge. Convenientemente, entretanto, o comando `git pull --rebase` é uma abreviação para um fetch e um rebase!","","Vejamos esses dois comandos em ação."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Primeiro com `--rebase`..."],afterMarkdowns:["Mesma coisa que antes! Porém muito mais curto."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E agora com o `pull` normal."],afterMarkdowns:["De novo, exatamente como antes!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Esse fluxo de trabalho de fazer fetch, rebase/merge, e push é bastante comum. Em lições futuras vamos examinar versões mais complicadas desses fluxos de trabalho, mas por enquanto vamos tentar o seguinte.","","Para resolver este nível, faça o seguinte:","","* Clone o repositório","* Simule trabalho de seus colegas (1 commit)","* Faça um commit seu (1 commit)","* Publique seu trabalho usando *rebase*"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Traballo diverxente","","Ata agora vimos cómo descargar e mesturar os commits de outros e como empurrar os nosos. Parece bastante sinxelo, así que ¿cómo pode confundirse tanto a xente?","","A dificultade ven cando a historia dos repositorios *diverxe*. Antes de entrar nos detalles, vexamos un examplo...",""]}},{type:"ModalAlert",options:{markdowns:["Imaxínate que clonas un repositorio o luns e comezas a desenvolver algo. Para o venres, xa estás listo para publicar o teu traballo, pero, ¡oh, oh! Os teus colegas tamén fixeron código durante a semana, facendo que o teu traballo quede desactualizado (e obsoleto). Ademáis, eles publicaron eses commits no repositorio remoto, así que agora o *teu* traballo está baseado nunha versión *vella* do proxecto, que xa non lle interesa a ninguén.","","Neste caso, o comando `git push` é ambiguo. Se executas `git push`, ¿git debería mudar o repositorio para como estaba o luns? ¿Deberías arranxar o teu código sen eliminar o código novo? ¿Ou debería ignorar completamente os teus cambio porque xa están desactualizados?","","Como hai tanta ambiguedade nesta situación (na que a historia diverxeu), git non che permite empurrar os teus cambios. En cambio, fórzate a integrar o último estado do respositorio remoto antes de poder compartir o teu traballo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¡Demasiada charla, vexámolo en acción!"],afterMarkdowns:["¿Ves? Non pasou nada, porque o comando falla. `git push` falla porque `C3`, o teu commit máis recente, está baseado no remoto sobre `C1`. O remoto foi actualizado a `C2` dende entonces, polo que git rechaza o teu push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¿Cómo resolves esta situación? É sinxelo, todo o que tes que facer é basear o teu traballo na versión máis recente da rama remota.","","Hai un par de formas de facer esto, pero a máis sinxela é mover o teu traballo facendo un rebase. Probémolo a ver cómo se ve."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Agora, se facemos rebase antes de empurrar..."],afterMarkdowns:["¡Boom! Actualizamos a nosa representación local do remoto con `git fetch`, rebasamos o noso traballo para reflexar os novos cambios do remoto, e despois os empurramos con `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¿Hai outra forma de actualizar o meu traballo se actualizaran o repositorio remoto? ¡Pois claro! Vexamos cómo facer o mesmo pero empregando `merge`.","","Por máis que `git merge` non mova o teu traballo (só crea un commit de merge), é un modo de decirlle a git que integrase tódolos cambios do remoto. Esto é porque agora unha rama remota pasou a ser un *ancestro* da tua propia rama, o que significa que o teu commit reflexa os cambios de tódolos commits da rama remota.","","Vexamos unha mostra..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Si no lugar de rebasar facemos un merge..."],afterMarkdowns:["¡Boom! Actualizamos a nosa representación local do remoto usando `git fetch`, *mesturamos* ou *mergeamos* o novo traballo xunto co noso (para reflexar os novos cambios no remoto), e despois os empurramos empregando `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["¡Asombroso! ¿Hai forma de facer esto sen escreber tantos comandos?","","¡Claro que sí! Xa sabes que `git pull` é sinxelamente un atallo para facer fetch e merge. Ademáis, ¡`git pull --rebase` é un atallo para facer fetch e rebase!","","Vexamos estos atallos funcionando."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Primeiro con `--rebase`..."],afterMarkdowns:["¡Igual que antes! Só que máis corto."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E agora un `pull` común"],afterMarkdowns:["Outra vez, ¡exactamente o mesmo que antes!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Toda esta movida de fetchear, rebasear/mergear e pushear é bastante común. Nas seguintes leccións imos ver formas máis complexas de estes fluxos de traballo, pero por agora probemos o que vimos.","","Para resolver este nivel, fai o siguiente:","","* Clona o teu repositorio","* Simula algo de trabajo dun colega (1 commit)","* Commitea algo de traballo propio (1 commit)","* Publica o teu traballo *rebasando*"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Diverged Work","","到目前為止我們已經知道如何 `pull` 其他人所送的 commit,而且也知道如何 `push` 我們自己的 commit,感覺很簡單,但是為什麼有人看起來很困惑?","","當 repo 的歷史紀錄是 *diverge(branch 走向不同)* 的狀態時就會很棘手,在討論這個之前,讓我們先來看一個例子...",""]}},{type:"ModalAlert",options:{markdowns:["想像一下你在星期一的時候 clone 了一個 repo,並且開始在設計一個功能,在星期五的時候你準備好要發佈你的新功能,但是非常不幸地,你的同事已經寫了一連串的程式碼並且已經將 commit 發佈到 remote,所以現在*你的*進度是在一個比較*舊*的版本的後面(如果與 remote 比較的話啦!)。","","在這種情況底下,使用 `git push` 會有問題,如果你使用 `git push`,那麼 git 應該要把 remote 退回到星期一的狀態?它應該要把你所寫好的程式碼一起更新進去,同時不會影響你的同事寫好的程式碼?或者是他應該要因為版本比較舊而完全忽略你的程式碼?","","因為在這種情況下會很麻煩(當 git 歷史紀錄被 diverge 了),所以 git 不會允許你 `push` 你的 commit。在你上傳你的 commit 之前,它實際上會先強迫你先跟 remote 同步。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["講太多了啦!讓我們實際看一下這個情況。"],afterMarkdowns:["看到了沒?因為指令失敗了,所以沒有任何事情發生。 `git push` 失敗的原因是因為你最近的 commit `C3` 是在 `C1` 的後面,但是 remote 那邊是 `C2` 在 `C1` 的後面,所以 git 才會拒絕你的 push。"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["你要如何解決這種情況?很簡單,你只需要把 `C3` 接在 remote 最新的版本 `C2` 的後面就可以了。","","有一些方法可以做到,但是最直接的方式是用 rebase,我們來做看看。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["在我們 push 之前,先來做 rebase..."],afterMarkdowns:["看吧!我們利用 `git fetch` 下載了 remote 上面的 commit,並且 rebase 我們的 commit,使得我們的 commit 可以接在 remote 上面最新的版本的後面,接著透過 `git push` 就可以上傳更新了。"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["在 remote 已經率先更新之後,還有沒有其它方法可以上傳我們的 commit?當然有阿!我們這次利用 `merge` 來做看看!","","雖然 `git merge` 並不會去移動你的 commit(反而會產生一個 merge commit),這是一個告訴 git 你已經下載了 remote 上面的 commit 並且在 local repo 中已經做完 merge,而因為 remote branch 上的最新的 commit 現在已經是 merge commit 的一個 *ancestor*,這就表示你的 commit 已經包含了在 remote branch 上的所有 commit。","","讓我們來看一下這種情況..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在假設我們不是用 rebase,而是用 merge..."],afterMarkdowns:["看吧!我們藉由 `git fetch` 把 remote 上的 commit 下載下來,並且 *merged* 該 commit 到我們目前的 branch(這樣就表示我們產生的 merge commit 有包含了 remote 上的 commit),接著再透過 `git push` 上傳到 remote。"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["太棒了! 有沒有其它可以不用打這麼多指令的方法?","","當然有阿!你已經知道 `git pull` 就是表示一個 fetch 跟一個 merge。 有一個指令非常方便,那就是 `git pull --rebase`,它表示的是一個 fetch 以及一個 rebase。","","我們來看如何使用這個簡化後的指令。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["首先 `--rebase`..."],afterMarkdowns:["跟之前一樣!只是少打了很多指令。"],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["現在用一般的 `pull`"],afterMarkdowns:["又來了,剛好跟之前的一樣!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["fetch,rebase/merge,以及 push 的流程是幾乎一樣的。在之後的教學中我們會看到比這些流程更複雜的版本。但是現在讓我們先牛刀小試一下。","","為了要完成這一關,請按照下面的步驟:","","* clone 你的 repo","* 假裝送一個 commit 給 remote","* 送一個 commit 給 local repo","* 透過 *rebase* 送自己的 commit"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 偏离的工作","","现在我们已经知道了如何从其它地方 `pull` 提交记录,以及如何 `push` 我们自己的变更。看起来似乎没什么难度,但是为何还会让人们如此困惑呢?","","困难来自于远程库提交历史的**偏离**。在讨论这个问题的细节前,我们先来看一个例子……",""]}},{type:"ModalAlert",options:{markdowns:["假设你周一克隆了一个仓库,然后开始研发某个新功能。到周五时,你新功能开发测试完毕,可以发布了。但是 —— 天啊!你的同事这周写了一堆代码,还改了许多你的功能中使用的 API,这些变动会导致你新开发的功能变得不可用。但是他们已经将那些提交推送到远程仓库了,因此你的工作就变成了基于项目**旧版**的代码,与远程仓库最新的代码不匹配了。","","这种情况下, `git push` 就不知道该如何操作了。如果你执行 `git push`,Git 应该让远程仓库回到星期一那天的状态吗?还是直接在新代码的基础上添加你的代码,亦或由于你的提交已经过时而直接忽略你的提交?","","因为这情况(历史偏离)有许多的不确定性,Git 是不会允许你 `push` 变更的。实际上它会强制你先合并远程最新的代码,然后才能分享你的工作。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["说了这么多,咱们还是看看实际案例吧!"],afterMarkdowns:["看见了吧?什么都没有变,因为命令失败了!`git push` 失败是因为你最新提交的 `C3` 基于远程分支中的 `C1`。而远程仓库中该分支已经更新到 `C2` 了,所以 Git 拒绝了你的推送请求。"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["那该如何解决这个问题呢?很简单,你需要做的就是使你的工作基于最新的远程分支。","","有许多方法做到这一点呢,不过最直接的方法就是通过 rebase 调整你的工作。咱们继续,看看怎么 rebase!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我们在 push 之前做 rebase 呢?"],afterMarkdowns:["我们用 `git fetch` 更新了本地仓库中的远程分支,然后用 rebase 将我们的工作移动到最新的提交记录下,最后再用 `git push` 推送到远程仓库。"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["还有其它的方法可以在远程仓库变更了以后更新我的工作吗? 当然有,我们还可以使用 `merge`","","尽管 `git merge` 不会移动你的工作(它会创建新的合并提交),但是它会告诉 Git 你已经合并了远程仓库的所有变更。这是因为远程分支现在是你本地分支的祖先,也就是说你的提交已经包含了远程分支的所有变化。","","看下演示..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["咱们们用 merge 替换 rebase 来试一下……"],afterMarkdowns:["我们用 `git fetch` 更新了本地仓库中的远程分支,然后**合并**了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用 `git push` 把工作推送到远程仓库"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["很好!但是要敲那么多命令,有没有更简单一点的?","","当然 —— 前面已经介绍过 `git pull` 就是 fetch 和 merge 的简写,类似的 `git pull --rebase` 就是 fetch 和 rebase 的简写!","","让我们看看简写命令是如何工作的。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这次用 `--rebase`……"],afterMarkdowns:["跟之前结果一样,但是命令更短了。"],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["换用常规的 `pull`"],afterMarkdowns:["还是跟以前一样! "],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["由 fetch、rebase/merge 和 push 组成的工作流很普遍。后续课程我们会讲解更复杂的工作流,不过现在我们先解决这个关卡吧。","","要完成本关,你需要完成以下几步:","","* 克隆你的仓库","* 模拟一次远程提交(fakeTeamwork)","* 完成一次本地提交","* 用 *rebase* 发布你的工作"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Abweichende Inhalte","","Bisher haben wir gesehen wie man per `pull` Commits von Anderen ins lokale Repository holt und die eigenen Änderungen in ein entferntes `push`t. Ist doch ziemlich einfach, wie kann man da durcheinander kommen?","","Die Schwierigkeiten entstehen, wenn die Historien der beiden Repositorys *divergieren*, also voneinander abweichen. Bevor wir die Einzelheiten besprechen, schauen wir uns ein Beispiel an ...",""]}},{type:"ModalAlert",options:{markdowns:["Stell dir vor du holst dir Montags ein Repository per `clone` und fängst an, an einem Feature zu arbeiten. Bis Freitag soll es fertig und veröffentlicht sein -- doch, oh je! Deine Kollegen haben eine Menge Code während der Woche geschrieben, der dein Feature hat veralten lassen (und überflüssig gemacht hat). Sie haben diesen Code außerdem zum entfernten Repository gepusht, und dadurch basiert *deine* harte Arbeit jetzt auf einer *alten* Version des Projektes, die nicht länger relevant ist.","","In diesem Fall ist ein `git push` problematisch. Wenn du es ausführst, soll Git das entfernte Repository in den Zustand von Montag zurückversetzen? Soll es versuchen deinen Code auf die aktuelle Version zu packen? Oder soll es deine Änderungen einfach ignorieren, weil sie total veraltet sind?","","Da es in dieser Situation so viele Mehrdeutigkeiten gibt (da die Historien divergieren), erlaubt Git dir nicht, deine Änderungen einfach zu `push`en. Es zwingt dich, zuerst die neuesten Änderungen vom Server zu holen und in deine zu integrieren, bevor du deine Arbeit mit anderen teilen kannst."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Bla bla bla. Schauen wir uns das lieber in Aktion an:"],afterMarkdowns:["Siehst du? Nichts passiert, weil der Befehl fehlschlägt. `git push` schlägt fehl, weil der neueste Commit `C3` auf dem Commit `C1` des Remotes basiert. Der entfernte Server hat mittlerweile jedoch `C2` gepusht bekommen, also lässt Git deinen Push jetzt nicht mehr zu."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Wie sollen wir das auflösen? Es ist ganz einfach, du musst deinen Commit nur von der aktuellsten Version des Remotes ableiten.","","Es gibt verschiedene Möglichkeiten, wie man das erreichen kann, aber die offensichtlichste ist, deine Commits per Rebase zu verschieben. Schauen wir mal wie das abläuft:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Also wenn wir vor dem Push erst mal einen Rebase machen ..."],afterMarkdowns:["Bämm! Wir haben unsere lokale Abbildung des entfernten Repositorys mit `git fetch` auf den neuesten Stand gebracht, unsere Arbeit auf die neueste Version des Remotes drauf gepackt und dann mit `git push` auf den Server geschoben."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Gibt es noch weitere Möglichkeiten deine Arbeit zu aktualisieren, wenn das entfernte Repository neue Commits bekommen hat? Klar! Schauen wir uns dasselbe an, aber diesmal arbeiten wir mit `merge`.","","Obwohl `git merge` deine Arbeit nicht verschiebt (und stattdessen einen Merge Commit erzeugt) ist es eine Möglichkeit Git dazu zu bringen, alle Änderungen vom Remote in deine Sachen zu integrieren. Denn durch den Merge wird der Remote Branch zu einem *Vorgänger* deines Branches, was bedeutet, dass dein Commit alle Commits des entfernten Branches beinhaltet.","","Zur Demonstration ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wenn wir nun also mergen anstatt einen Rebase zu machen ..."],afterMarkdowns:["Ok. Wir haben die lokale Abbildung des entfernen Repositorys mit `git fetch` aktualisiert, die neuen Änderungen per *Merge* in deine integriert, und letztere dann mit `git push` auf den Server gebracht."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Wahnsinn! Kann ich das auch irgendwie machen ohne soviel zu tippen?","","Na klar -- du kennst ja schon `git pull` als Zusammenfassung von `fetch` und `merge`. Praktischerweise bringt man es mit der Option `--rebase` dazu, anstatt des Merge einen Rebase zu machen.","","Gucken wir uns das mal an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zunächst `git pull --rebase` ..."],afterMarkdowns:["Genau wie vorher! Nur viel kürzer."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Und nun das normale `git pull` ..."],afterMarkdowns:["Und wieder, genau wie zuvor!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Dieser Ablauf von `fetch`, `rebase` / `merge` und `push` ist sehr verbreitet. In zukünftigen Leveln werden wir uns kompliziertere Varianten dieses Workflows ansehen, aber jetzt probieren wir erst mal diesen aus.","","Um diesen Level zu lösen, gehe folgende Schritte durch:","","* Clone dein Repository","* Simuliere einen entfernten Commit mit `git fakeTeamwork`","* Erzeuge einen lokalen Commit","* Benutze *Rebase*, um deine Arbeit schließlich pushen zu können."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Когда наработки расходятся","","Вот мы и познакомились с тем, как забирать (`pull`) чужие коммиты и как закачивать (`push`) свои наработки и изменения. Выглядит всё довольно просто, и не ясно какие же могут возникать у людей трудности со всем этим?","","Сложности возникают тогда, когда история репозитория *расходится*. Прежде чем идти дальше, давайте посмотрим на пример...",""]}},{type:"ModalAlert",options:{markdowns:["Представьте себе, вы склонировали репозиторий в понедельник и начали разрабатывать какую-то новую и уникальную часть приложения (на сленге разработчиков - `фича`). В пятницу вечером вы наконец-то готовы опубликовать вашу фичу. Но, о нет! Ваш коллега в течение недели написал кучу кода, который делает все ваши наработки устарелыми. Этот код был также закоммичен и опубликован на общедоступном удалённом репозитории, поэтому теперь *ваш* код базируется на *устаревшей* версии проекта и более не уместен.","","В этом случае использование команды `git push` является сомнительным. Как поведёт себя команда `git push`, если вы её выполните? Может быть, она изменит удалённый репозиторий и вернёт всё к тому состоянию, которое было в понедельник? А может, команда попробует добавить ваш код, не удаляя при этом новый? Или же она проигнорирует ваши изменения, так как они уже устарели?","","По причине того, что в данной ситуации (когда история расходится) слишком много двусмысленностей и неопределённостей, git не даст вам закачать (`push`) ваши изменения. Он будет принуждать вас включить в состав своей работы все те последние наработки и изменения, которые находятся на удалённом репозитории."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Слишком много болтовни! Давайте посмотрим, как всё работает на живом примере"],afterMarkdowns:["Видите? Ничего не произошло. Всё потому, что команда `git push` не выполнилась успешно. Дело в том, что ваш последний коммит `C3` основан на удалённом коммите `C1`. В свою очередь, удалённый репозиторий уже изменился под воздействием `C2`. Вот почему git отклонил ваш push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Как же разрешить данную ситуацию? Всё очень просто! Всё, что вам нужно - перебазировать свою работу на самую последнюю версию удалённой ветки.","","Существует множество способов сделать это, но наиболее простой способ 'сдвинуть' свои наработки - через перебазировку или rebasing. Давайте посмотрим, как это выглядит."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Теперь, когда мы сперва перебазируемся прежде чем публиковать изменения..."],afterMarkdowns:["Опа! Мы только что обновили наш локальный образ удалённого репозитория средствами `git fetch`. Ещё мы перебазировали наши наработки, чтобы они отражали все изменения с удалённого репозитория, и опубликовали их с помощью `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["А есть ещё какие-либо варианты обновить мои наработки к тому моменту, как удалённый репозиторий был обновлён? Конечно есть! Давайте ознакомимся с парочкой новых штучек, но в этот раз с помощью команды `merge`.","","Несмотря на то, что `git merge` не передвигает ваши наработки (а всего лишь создаёт новый коммит, в котором Ваши и удалённые изменения объединены), этот способ помогает указать git-у на то, что вы собираетесь включить в состав ваших наработок все изменения с удалённого репозитория. Это значит, что ваш коммит отразится на всех коммитах удалённой ветки, поскольку удалённая ветка является *предком* вашей собственной локальной ветки.","","Давайте взглянем на демонстрацию..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Таким образом, если мы объединим (merge) вместо перебазирования (rebase)..."],afterMarkdowns:["Опа! Мы обновили наше локальное представление удалённого репозитория с помощью `git fetch`, *объединили* ваши новые наработки с нашими наработками (чтобы отразить изменения в удалённом репозитории) и затем опубликовали их с помощью `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Здорово! А можно ли как-то сделать всё то же самое, но с меньшим количеством команд?","","Конечно - ведь вы уже знаете команду `git pull`, которая является аналогом и более кратким аналогом для совместных fetch и merge. А команда `git pull --rebase` - аналог для совместно вызванных fetch и rebase!","","Давайте взглянем на эти оба варианта."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Сперва - с флагом `--rebase`..."],afterMarkdowns:["Тот же результат, как и ранее, но намного короче вызов команд."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А теперь с обычным `pull`."],afterMarkdowns:["И снова - результат такой же, как и ранее!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Рабочий процесс получения изменений (fetching), перебазирования/объединения (rebase/merging) и публикации изменений (pushing) используется довольно часто. В последующих уроках мы изучим более сложные варианты этих рабочих процессов, но пока что давайте остановимся на том, что есть.","","Чтобы выполнить задание уровня, сделайте следующее:","","* Склонируйте репозиторий","* Сфабрикуйте командную работу (1 коммит)","* Сделайте свой собственный коммит (1 коммит)","* Опубликуйте свои наработки посредством *перебазировки (rebasing)*"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 分かれた作業","","これまでは、どのようにして`pull`でコミットを取り込み、`push`で自身の変更を反映するかを見てきました。単純なようにみえます。では何故人々は混乱するのでしょうか?","","その難しさは、リポジトリの履歴が*分岐*することに起因します。この詳細について説明する前に、まずは例を見てみましょう。",""]}},{type:"ModalAlert",options:{markdowns:["月曜日にリポジトリをクローンし、ある表面の機能をちょっと弄ることを想像してみてください。金曜日までに、あなたはその機能を公開する準備ができる -- しかし、ああなんということでしょう!あなたの同僚達は、あなたの機能が依存していた(そして、廃れた)コードの束をその週の内に書き換えていました。彼らはリモートリポジトリにコミットを共有して公開し、今や*あなたの*作業は*古い*バージョンのもはや適切でないプロジェクトに基づいていることになります。","","この場合、`git push`コマンドは曖昧になってしまいます。あなたが`git push`を走らせたとき、gitはリモートリポジトリは月曜の状態に変更を戻すべきでしょうか?それとも、新しいコードを取り除かないで追加しようとしてみるべきでしょうか?または、あなたの変更が完全に古いものになってしまったため、全て無視するべきなのでしょうか?","","この状況(履歴が分岐をしているとき)ではまったくもって曖昧なので、gitはあなたの変更を`push`することを許可しません。実際には、あなたの作業を共有する前に最新のリモートの状態を取り込むことを強制します。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["話しすぎましたね!この状況での動作をみてみましょう!"],afterMarkdowns:["見ましたか?コマンドが失敗して、何も起こりませんでした。あなたの最近の`C3`コミットはリモートの`C1`コミットに依存しているため、`git push`は失敗しました。リモートには`C2`が更新されているので、gitはあなたのプッシュを拒否します。"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["ではこの状況を解決するにはどうしたらいいでしょう?簡単です、リモートブランチの最新の状態にあなたの作業が基づくようにすればいいのです。","","いくつか方法はありますが、最も簡単なのはあなたの作業をリベースで移動させることです。それがどのようなものか、さあみてみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["今、プッシュをする前に代わりにリベースをしてみましょう。"],afterMarkdowns:["わお!私たちは`git fetch`でローカルのリモートブランチを更新し、私たちの作業をリベースさせてリモートの新しい変更に適用させ、`git push`でそれをプッシュしました。"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["リモートリポジトリが更新されたとき、他に自身の作業を更新する方法はあるでしょうか?もちろん、あります!今度は同じことを`merge`を代わりに使ってやってみましょう。","","`git merge`はあなたの作業を移動しませんが(代わりにマージコミットを作ります)、リモートの変更を全て取り込みgitに通知する方法なのです。この通知とは、リモートブランチが今やあなた自身のブランチの*親*を指していることになるため、あなたのリモートブランチの全ての変更を反映しているコミットを指します。","","この状況の例を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["リベースの代わりに今度はマージを用います。"],afterMarkdowns:["わお!私たちは`git fetch`でローカルのリモートブランチを更新し、私たちの作業を*マージ*して(リモートの新しい変更を反映するために)、`git push`でそれをプッシュしました。"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["素晴らしい!多くのコマンドを打たないでこれを実現する方法はあるでしょうか?","","もちろん -- あなたが既に知っているコマンドです。`git pull`は、`fetch`して`merge`するためのより短い書き方です。さらに便利なことに、`git pull --rebase`は`fetch`して`rebase`することの省略形です!","","コマンドを省略した場合を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["まずは、`--rebase`から"],afterMarkdowns:["前と一緒です!そしてとても短いです。"],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["そして通常使う`pull`で試してみましょう"],afterMarkdowns:["ここでも、前と同じです!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["この取り込み作業の流れ、リベースとマージ、そしてプッシュはとてもよく行います。次回以降のレッスンではより複雑なパターンの作業を学びますが、今は習ったことをとりあえず試してみましょう。","","このレベルをクリアするには、以下のステップを踏みます:","","* あなたのリポジトリをクローン","* 擬似的に幾つかの同僚の変更を真似る(1コミット)","* あなた自身の作業をコミット(1コミット)","* あなたの作業を*リベース*で公開"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Розбіжності в історії","","Ми розглянули як витягувати (`pull`) коміти інших та як завантажувати (`push`) свої власні коміти. Це виявилось не надто складно, то як же так, що в людей дуже часто виникають з цим труднощі?","","Основна складність полягає в тому, що історія різних репозиторіїв *розбігається*. Перед тим, як вдатися в деталі, подивімося як це виглядає на прикладі...",""]}},{type:"ModalAlert",options:{markdowns:["Уяви, що ти склонував репозиторій в понеділок і почав працювати над якоюсь фічею. В пятницю фіча готова і ти хочеш повернути її назад (в апстрім) -- але що це? Твої колеги, грець їм, вже встигли вкомітити купу коду що робить твою фічу застарілою (і не дуже доречною). Вони вже запушили ці коміти в публічний репозиторій, й тепер *твоя* робота базується на *старій* версії продукту, що вже не актуальна.","","В цьому випадку команда `git push` неоднозначна. Коли ти виконаєш `git push`, гіт повинен змінити віддалений репозиторій до того стану, на якому він знаходився в понеділок? Чи він має додати твій код і залишити код твоїх колег? Чи він має повністю проігнорувати твої зміни, оскільки вони застаріли?","","Через такі неоднозначності в цій ситуації (коли історія розійшлася), git не дозволить тобі запушити твої зміни. Він фактично змушує тебе інтегрувати останні зміни з віддаленого репозиторію перед тим як ти зможеш завантажити на нього свої напрацювання."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Але, забагато розмов! Подивімось на ділі!"],afterMarkdowns:["Бачиш? Нічого не сталося тому що остання команда не виконалася. `git push` не спрацював тому що твій недавній коміт `C3` базується на коміті `C1`. Але віддалений репо вже прейшов на`C2`, тому git відхилив твій push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Як вийти з цієї ситуації? Дуже просто! Все, що треба -- це оновити свої напрацювання так, щоб вони базувалися на останніх змінах з віддаленої гілки.","","Є кілька шляхів як цього досягнути, але найпростіший -- це перемістити свою роботу 'вперед' за допомогою rebase. Спробуймо і погляньмо як це виглядає."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер якщо виконати rebase перед push..."],afterMarkdowns:["Ка-бум! Ми оновили наш локальний образ віддаленого репозиторію за допомогою `git fetch`, заребейсили наші напрацювання відповідно до змін у віддаленому репо, й завантажили їх за допомогою `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Чи є якийсь інший спосіб оновити свої напрацювання, коли віддалений репозиторій пішов вперед? Звісно! Спробуймо зробити те ж саме, але натомість за допомогою `merge` (злиття).","","Хоча `git merge` і не переміщує твою роботу (а просто створює натомість коміт злиття чи merge commit), це -- ще один спосіб сказати git, що ти інтегрував останній стан віддаленого репозиторію в свої зміни. Це працює тому, що тепер віддалена гілка є *предком* твоєї гілки, а отже твої останні коміти інтегрують в собі всі коміти з віддаленої гілки.","","Невелика демонстрація..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Тепер ми зробимо merge замість rebase..."],afterMarkdowns:["Ка-бум! Ми оновили наш локальний образ віддаленої гілки за допомогою `git fetch`, *змерджили* нові напрацювання з власними (щоб відобразити останні зміни у віддаленій гілці), й відіслали їх за допомогою `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Чудово! Чи можу я це зробити, використовуючи меншу кількість команд?","","Звісно -- ти ж знаєш, що `git pull` це просто коротша форма для git fetch а потім git merge. Натомість, `git pull --rebase` це коротка форма для git fetch а потім git rebase!","","Спробуймо використати ці коротші команди."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Спочатку з `--rebase`..."],afterMarkdowns:["Те саме, що й раніше! Просто трохи коротше."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А тепер просто з `pull`."],afterMarkdowns:["Знову, так як і було!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Робочий процес, що складається з fetch, rebase/merge і push є дуже широковживаним. В наступних уроках ми розглянемо складніші версії цього процесу, а наразі спробуймо його виконати.","","Щоб пройти цей рівень, виконай наступні кроки:","","* Склонуй свій репозиторій","* Зроби симуляцію командної роботи (1 коміт)","* Зроби власний коміт (1 коміт)","* Опублікуй свої напрацювання за допомогою *rebasе*"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 엇갈린 작업","","지금까지 우리는 다른곳에서 커밋을 `pull`해서 내려받고 우리가 만든 변경들을 `push`하는 방법을 배웠습니다. 간단해보이는데, 왜 사람들이 이것 때문에 곤란해 할까요?","","어려움은 저장소의 히스토리가 *엇갈릴 때* 찾아옵니다. 자세히 살펴보기 전에 예제를 확인해봅시다...",""]}},{type:"ModalAlert",options:{markdowns:["상상을 해봅시다. 여러분은 월요일에 저장소를 clone해서 부가기능을 만들기 시작했습니다. 금요일쯤 기능을 공개할 준비가 되었습니다 -- 그런데 오 이런! 동료들이 주중에 코딩을 잔뜩해서 여러분이 만든 기능은 프로젝트에 뒤떨어져서 무용지물이 되었습니다. 이 사람들이 그 커밋들을 공유하고있는 원격 저장소에도 공개했습니다, 이제 *여러분의* 작업은 이제 의미가 없는 *구*버전의 프로젝트를 기반으로한 작업이 되어버렸습니다.","","이런 경우, 명령어 `git push`가 할 일이 애매해집니다. `git push`를 수행했을때, git은 원격 저장소를 여러분이 작업했던 월요일의 상태로 되돌려야 할까요? 아니면 새 코드를 건들지 않고 여러분의 코드만 추가해야 되나요? 아니면 여러분의 작업은 뒤 떨어졌기 때문에 완전히 무시해야되나요?","","이렇게 상황이 애매모호하기 때문에(히스토리가 엇갈렸기 때문이죠), git은 여러분이 `push`하지 못하게 합니다. 사실 여러분이 작업을 공유하기전에 원격 저장소의 최신 상태를 합치도록 강제합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["너무 떠든거같습니다! 이 상황을 직접 눈으로 확인해봅시다"],afterMarkdowns:["보이죠? 명령어가 실행되지 않아서 아무것도 잃어나지 않습니다. 여러분의 최근 커밋 `C3`가 원격저장소의 `C1`을 기반으로 하기 때문에 `git push`가 실패합니다. 원격 저장소는 `C2`까지 갱신된 상태기때문에 git은 여러분의 push를 거부하게됩니다."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["그러면 이 상황을 어떻게 해결할까요? 쉽습니다, 여러분의 작업을 원격 브랜치의 최신상태를 기반으로 하게 만들면 됩니다.","","이렇게 하기위한 방법이 여러가지가 있는데, 가장 간결한 방법은 리베이스를 통해 작업을 옮기는 방법입니다. 예제를 통해 눈으로 확인해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["push를 하기전에 리베이스를 하면..."],afterMarkdowns:["Boom! `git fetch`로 원격 저장소의 변경정보를 가져오고, 새 변경들로 우리 작업을 리베이스 했습니다, 이제 `git push`하면 끝!"],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["다른 방법은 없냐고요? 당연히 있습니다! 같은것을 `merge`로 대신 해봅시다.","","`git merge`가 여러분의 작업을 옮기지는 않지만(merge 커밋을 생성합니다). git에게 원격 저장소의 변경을 합쳤다고 알려주는 방법중에 하나입니다. 이제 원격 브랜치가 여러분 브랜치의 *부모*가 되었기때문입니다, 여러분의 커밋이 원격 브랜치의 모든 커밋을 반영했다는 뜻이죠.","","눈으로 확인해봅시다..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["리베이스대신 병합을하면..."],afterMarkdowns:["Boom! `git fetch`로 원격 저장소의 변경정보를 가져오고, 새 작업을 우리 작업으로 *병합*했습니다 (원격 저장소의 변경을 반영하기 위해서죠), 이제 `git push`하면 끝!"],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["멋집니다! 명령어를 좀더 적게써서 하는 방법은 없나요?","","물론 있습니다 -- 여러분은 `git pull`이 fetch와 merge의 줄임 명령어라는 것은 이미 알고 있을 것입니다. 아주 간단하게, `git pull --rebase`를 하면 fetch와 리베이스를 하는 작업의 줄임 명령어 입니다","","이 줄임 명령어가 잘 작동하는지 확인해 봅시다"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["먼저 `--rebase`와 함께하면..."],afterMarkdowns:["이전과 같습니다! 간결하고요."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["일반의 `pull`과 사용했을 때는"],afterMarkdowns:["또다시, 이전과 같습니다!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["fetch를 하고 리베이스/병합을 하고 push를 하는 이런 작업흐름은 꽤 흔합니다. 앞으로의 레슨에서는 이런 작업흐름의 복잡한 버전들을 확인해볼 것입니다. 일단은 이것부터 연습해 보죠.","","이번 레벨을 통과하려면, 다음의 단계를 거쳐야 합니다:","","* 여러분의 저장소를 clone 하세요","* 가짜 팀워크를 만드세요 (1개의 커밋)","* 여러분의 작업도 커밋하세요 (1개의 커밋)","* 여러분의 작업을 *리베이스*를 통해 공유하세요"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Diverged Work","","Cho đến giờ ta đã biết cách `kéo` (`pull`) commit từ nơi khác về và cách `đẩy` (`push`) lên những thay đổi của ta. Chúng nhìn có vẻ khá đơn giản, vậy tại sao người ta lại thấy lúng túng về chúng?","","Khó khăn đến từ sự *dị biệt* của cây lịch sử trên kho chứa từ xa. Trước khi đi vào thảo luận chi tiết vấn đề này, hãy xem qua một ví dụ...",""]}},{type:"ModalAlert",options:{markdowns:["Tưởng tượng bạn sao chép một kho chứa vào thứ Hai và bắt đầu phát triển một tính năng mới. Đến thứ Sáu thì bạn đã sẵn sàng để xuất bản thành quả của mình -- nhưng không! Đồng nghiệp của bạn đã viết thêm hàng loạt mã trong một tuần vừa rồi và điều này làm cho chức năng của bạn trở nên lỗi thời. Và họ cũng đã xuất bản những commit này lên kho chứa từ xa chung, vậy giờ thành quả của *bạn* lại dựa trên phiên bản *cũ* của dự án mà nó không còn thích đáng nữa.","","Trong trường hợp này, lệnh `git push` trở lên khá nhập nhằng. Nếu bạn dùng `git push`, liệu git nên thay đổi kho chứa từ xa trở về trạng thái ngày thứ Hai? Hay nó nên cố gắng thêm mã của bạn vào trong khi không xóa mã mới? Hay là nó sẽ bỏ qua hoàn toàn mã của bạn vì nó đã lỗi thời?","","Vì có quá nhiều tình huống mơ hồ (dị biệt lịch sử), Git sẽ không cho phép bạn `đẩy` (`push`) thay đổi của mình. Nó sẽ ép bạn phải sát nhập trạng thái mới nhất của kho chứa từ xa vào thành phẩm của mình trước khi chia sẻ chúng."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nói quá nhiều rồi! Đi vào hành động thôi"],afterMarkdowns:["Thấy chứ? Không có gì xảy ra cả vì lệnh bị thất bại. `git push` thất bại vì commit mới nhất của bạn: `C3` dựa trên commit `C1` ở nhánh từ xa. Nhánh đó đã được cập nhật lên commit `C2`, nên Git từ chối lệnh đẩy của bạn"],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Vậy thì giải quyết tình huống này sao giờ? Đơn giản thôi, tất cả những gì bạn cần làm là khiến cho thành quả của mình dựa trên phiên bản mới nhất của nhánh từ xa.","","Có vài cách để làm điều này, nhưng cách trực tiếp nhất là bố trí lại (dùng rebase) để di chuyển thành quả của bạn. Cùng xem cách nó hoạt động nào."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nào bây giờ trước push ta dùng rebase thì..."],afterMarkdowns:["Bùùm! Ta đã cập nhật nhánh từ xa trong kho chứa cục bộ với `git fetch`, dịch chuyển thành quả của mình để phản ánh thay đổi mới của kho chứa từ xa, sau đó đẩy chúng lên với `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Có cách nào khác để cập nhật thành quả của mình khi kho chứa từ xa được cập nhật không? Tất nhiên rồi! Hãy xem xét điều tương tự với `merge`.","","Mặc dù `git merge` không dịch chuyển commit của bạn (thay vì đó nó tạo ra một commit hợp nhất), đó là cách để nói với Git rằng bạn đã kết hợp tất cả thay đổi từ nhánh từ xa. Đó là bởi vì bây giờ nhánh từ xa đã trở thành một *tổ tiên* của nhánh cục bộ của bạn, nghĩa là commit của bạn có thể tham chiếu đến tất cả commit có ở nhánh từ xa.","","Hãy xem qua bản biểu diễn sau..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giờ nếu ta dùng merge thay vày rebase thì..."],afterMarkdowns:["Bùùm! Ta đã cập nhật đại diện nhánh từ xa tại kho chứa cục bộ với `git fetch`, *hợp nhất* (*merge*) thành quả mới vào thành quả của ta (để phản ánh thay đổi ở nhánh từ xa), sau đó đẩy chúng lên với `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Tuyệt vời! Có cách nào để làm việc này mà không phải gõ nhiều lệnh thế không nhỉ?","","Tất nhiên rồi -- bạn đã biết rằng `git pull` là lệnh tắt của fetch và merge. Tương tự như vậy, `git pull --rebase` là lệnh tắt của fetch và rebase!","","Hãy xem thử cách lệnh tắt này hoạt động ra sao."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Trước tiên với `--rebase`..."],afterMarkdowns:["Giống hệt như trước! Chỉ là lệnh ngắn hơn."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Và giờ với lệnh `pull` thông thường."],afterMarkdowns:["Lại một lần nữa, chính xác y hệt như trước!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Quy trình tìm nạp (fetch), bố trí lại/hợp nhất (rebase/merge), và đẩy (push) là khá phổ biết. Ta sẽ xem xét các phiên bản phức tạp hơn của những quy trình này ở các bài học sau, còn bây giờ thì hãy tập trung vào bài này đã.","","Để giải quyết cấp độ này, hãy làm các bước sau:","","* Nhân bản kho chứa của bạn","* Giả lập làm việc nhóm (1 commit)","* Tạo ra 1 commit cục bộ","* Xuất bản thành quả của bạn dùng *rebase*"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Razdeljeno Delo","","Zaenkrat smo videli kako `pullat` dol commite od ostalih in kako `pushat` naše spremembe. Izgleda dokaj preprosto, vendar kako lahko vseeno to mede ljudi?","","Težave nastopijo, ko se zgodovina repozitorijev *razdeli*. Preden se lotimo podrobnosti si poglejmo primer ...",""]}},{type:"ModalAlert",options:{markdowns:["Predstavljaj si, da skloniraš repozitorij v ponedeljek in začneš delati na novi funkcionalnosti. V petek si pripravljen, da objaviš svoje spremembe -- ampak o ne! Tvoji sodelavci so napisali goro kode med tednom in tvoja funkcionalnost je postala zastarela. Prav tako so objavili te commite v skupen repozitorij, tako da sedaj *tvoje* delo izhaja iz *stare* verzije projekta, ki ni več taprava.","","V tem primeru je ukaz `git push` dvoumen. Če bi pognal `git push`, bi git moral spremeniti oddaljeni repozitorij nazaj na stanje iz ponedeljka? Bi moral poizkusiti dodati tvoje delo, brez da odstarani novo kodo? Ali bi moral povsem ignorirati tvoje spremembe, ker so zastarele?","","Ker je toliko dvomov v tej situaciji (kjer se je zgodovina razdelila), ti git ne pusti, da bi `pushal` svoje spremembe. V bistvu te prisili, da vključiš zadnje stanje oddaljenega repozitorija, preden lahko deliš svoje delo."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Toliko govorjenja! Poglejmo stvar v praksi."],afterMarkdowns:["Vidiš? Nič se ni spremenilo, ker je ukaz spodeletel. `git push` spodleti, ker tvoj zadnji commit `C3` izhaja iz oddaljenega `C1`. Oddaljen repozitorij se je med tem posodobil na `C2`, zato git zavrne tvoj push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Kako rešiti to zagato? Enostavno je, vse kar moraš narediti je, da spremeniš, da tvoje delo izhaja iz zadnje verzije oddaljenega brancha.","","Obstaja nekaj načinov, da to narediš, ampak najnaravnejši način je, da to narediš z rebaseom. Poglejmo, kako to izgleda."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Če sedaj rebaseamo, namesto da pushamo ..."],afterMarkdowns:["Boom! Posodobili smo našo lokalno reprezentacijo oddaljenega repozitorija z `git fetch`, rebaseali naše delo, da vsebuje nove spremembe iz oddaljenega repota, nato pa naložili svoje delo z `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["So še drugi načini, da posodobim svoj delo, ko je bil oddaljen repozitorij posodobljen? Seveda! Poglejmo isto stvar, vendar tokrat z `mergeom`.","","Čeprav `git merge` ne premakne tvojega dela (ampak naredi samo merge commit), je to način da sporočiš gitu, da si vključil vse spremembe iz oddaljenega repota. To je zato, ker je oddaljen branch sedaj *prednik* tvojega brancha, kar pomeni, da tvoj commit sedaj vsebuje vse commite iz oddaljenega brancha.","","Poglejmo predstavitev tega ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Če sedaj uporabimo merge namesto rebasea ..."],afterMarkdowns:["Boom! Posodobili smo našo lokalno sliko oddaljenega repozitorija z `git fetch`, *zmergali* novo delo v naše delo (kot odraz novih sprememb na oddaljenem branchu) in jih nato naložili z `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Super! A obstaja način, da naredim vse to brez tipkanja toliko ukazov?","","Seveda -- `git pull` že poznaš in je bližnjica za fetch ter merge. Prikladno je tudi `git pull --rebase` bližnjica za fetch in rebase!","","Poglejmo te kratke ukaze na delu."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Najprej z `--rebase` ..."],afterMarkdowns:["Enako kot prej! Le dosti krajše."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["In sedaj z navadnim `pullom` ..."],afterMarkdowns:["Zopet enako kot prej!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Vse to fetchanje, rebasanje/merganje in pushanje je kar pogosto. V prihodnjih lekcijah bomo preučili težje različice teh postopkov, ampak najprej preizkusimo tega.","","Da rešiš to stopnjo, izvedi sledeče korake:","","* Kloniraj svoj repozitorij","* Naredi lažni commit ostale ekipe (1 commit)","* Commitaj nekaj svojega dela (1 commit)","* Objavi svoje delo z *rebaseom*"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rozbieżna praca","","Widzieliśmy wcześniej, jak `pull` pobiera commity od innych i jak `push` wysyła nasze własne zmiany. Wydaje się to całkiem proste, więc jak ludzie mogą być tak zdezorientowani?","","Trudności pojawiają się, gdy historia repozytorium zaczyna się *rozbiegać*. Zanim omówimy szczegóły tego rozwiązania, zobaczmy przykład...",""]}},{type:"ModalAlert",options:{markdowns:["Wyobraźmy sobie, że klonujesz repozytorium w poniedziałek i zaczynasz pracować nad dodatkową funkcjonalnością. W piątek chcesz opublikować swoje zmiany -- ale, o nie! Współpracownicy napisali w ciągu tygodnia mnóstwo kodu, który sprawił, że twoja praca stała się nieaktualna (przestarzała). Opublikowali również te poprawki we wspólnym zdalnym repozytorium, więc teraz *twoja* praca jest oparta na *starej* wersji projektu, która nie jest już aktualna.","","W tym przypadku komenda `git push` jest niejednoznaczna. Jeśli uruchomisz `git push`, to czy Git powinien zmienić zdalne repozytorium z powrotem na takie, jakie było w poniedziałek? Czy może powinien próbować dodać twój kod, nie usuwając jednocześnie nowego kodu? Czy może też ma całkowicie zignorować twoje zmiany, ponieważ są one zupełnie przestarzałe?","","Ponieważ w tej sytuacji (gdzie historia się rozbiegła) jest tak wiele niejasności, Git nie pozwala ci na `push` twoich zmian. W rzeczywistości zmusza cię do połączenia najnowszego stanu remote'a, zanim pozwoli ci udostępnić swoją pracę."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dość gadania! Zobaczmy tę sytuację w działaniu."],afterMarkdowns:["Spójrz, nic się nie zmieniło, ponieważ wykonanie polecenia nie powiodło się. Polecenie `git push` nie powiedzie się, ponieważ twój najnowszy commit `C3` jest oparty na zdalnym `C1`. Zdalny został jednak zaktualizowany do `C2`, więc Git odrzuca twojego pusha."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Jak rozwiążesz tę sytuację? To proste. Wszystko, co musisz zrobić, to oprzeć swoją pracę na najnowszej wersji remote'a.","","Jest kilka sposobów, aby to zrobić, ale najprostszym jest przeniesienie pracy poprzez rebase. Zobaczmy, jak to wygląda."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zróbmy teraz inaczej: rebase przed wypchnięciem..."],afterMarkdowns:["Tadam! Zaktualizowaliśmy naszą lokalną reprezentację remote'a za pomocą `git fetch`, przebazowaliśmy naszą pracę, aby odzwierciedlić nowe zmiany na zdalnej gałęzi, a następnie wypchnęliśmy je za pomocą `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Czy istnieją inne sposoby na aktualizację naszej pracy, gdy zdalne repozytorium zostało zaktualizowane? Oczywiście! Spróbujmy rozwiązać to również z użyciem `merge`.","","Chociaż `git merge` nie przenosi twojej pracy (a zamiast tego po prostu tworzy commit scalający), jest to sposób na powiedzenie Gitowi, że dołączasz wszystkie zmiany z remote'a. Dzieje się tak dlatego, że zdalna gałąź jest teraz *przodkiem* twojej własnej gałęzi, co oznacza, że twój commit odzwierciedla wszystkie commity w zdalnej gałęzi.","","Zobaczmy, jak to wygląda..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A jeśli użyjemy `merge` zamiast `rebase`..."],afterMarkdowns:["Tadam! Zaktualizowaliśmy naszą lokalną reprezentację remote'a za pomocą `git fetch`, git dołączył (*merge*) nową pracę do naszej pracy (aby odzwierciedlić nowe zmiany na zdalnej gałęzi), a następnie wypchnął je za pomocą `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Wspaniale! Czy jest jakiś sposób, żeby zrobić to bez wpisywania tylu komend?","","Oczywiście -- znasz już `git pull ` - jest po prostu skrótem dla fetch i merge. `git pull --rebase` jest bardzo wygodnym skrótem dla fetch i rebase!","","Zobaczmy, jak działają te skrócone polecenia."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Na początku z `--rebase`..."],afterMarkdowns:["Tak samo jak wcześniej! Tylko o wiele krócej."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A teraz z klasycznym `pull`."],afterMarkdowns:["Jeszcze raz, dokładnie tak samo jak wcześniej!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Ta kolejność fetchowania, rebase/merge i push jest dość powszechna. W kolejnych lekcjach zajmiemy się bardziej skomplikowanymi możliwościami . Na razie wypróbujmy to, czego się nauczyliśmy.","","Aby ukończyć ten poziom, wykonaj następujące kroki:","","* Sklonuj swoje repozytorium","* Zasymuluj pracę zespołową (1 commit)","* Scommituj własną pracę (1 commit)","* Opublikuj swoją pracę, korzystając z *rebase*"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Storico divergente","","Fin'ora abbiamo visto come usare `pull` per scaricare commit di altri e come usare `push` per caricare le nostre modifiche. Sembra abbastanza semplice, come fanno le persone a confondersi?","","La difficoltà si presenta quando lo storico dei repository *diverge*. Prima di discuterne nel dettaglio, vediamo un esempio...",""]}},{type:"ModalAlert",options:{markdowns:["Immagina di clonare un repository di lunedì e di iniziare a lavorare su una nuova funzionalità. È arrivato venerdì e sei pronto a pubblicare la tua nuova feature -- ma oh no! I tuoi colleghi hanno scritto del codice durante la settimana che ha resto la tua feature obsoleta. Inoltre, hanno pubblicato questi commit sul repository remoto, quindi ora il *tuo* lavoro è basato su una versione *vecchia* del progetto che non è più rilevante.","","In questo caso, il comando `git push` è ambiguo. Eseguendo `git push`, git dovrebbe far tornare il repository remoto a come si trovava di lunedì? Dovrebbe cercare di aggiungere le tue modifiche senza rimuovere quelle dei colleghi? O dovrebbe ignorare totalmente le tue modifiche in quanto obsolete?","","Per via di questa ambiguità (dove gli storici divergono), git non ti permette di usare `push` per caricare le tue modifiche. Ti obbliga a scaricare la versione più recente del repository remoto prima di permetterti di condividere il tuo lavoro."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutto questo parlare! Vediamo questa situazione dal vivo."],afterMarkdowns:["Visto? Non è successo nulla in quanto il comando fallisce. `git push` fallisce in quanto il tuo commit più recente, `C3`, è basato sullo stato del repository remoto a `C1`. Nel mentre però il remoto è stato aggiornato a `C2`, quindi git non accetta il tuo push."],command:"git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Come puoi risolvere questa situazione? È facile, tutto ciò che devi fare è far sì che il tuo lavoro sia basato sulla versione più recente del ramo remoto.","","Ci sono più modi per fare ciò, il più diretto dei quali è lo spostare il tuo lavoro tramite rebase. Diamo un'occhiata a come si fa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora se ribasiamo prima di caricare il nostro lavoro..."],afterMarkdowns:["Boom! Abbiamo aggiornato la nostra rappresentazione del remoto tramite `git fetch`, ribasato il nostro lavoro affinché rifletta i nuovi cambiamenti del remoto, e poi li abbiamo caricati con `git push`."],command:"git fetch; git rebase o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Ci sono altri modi per aggiornare il mio lavoro quando il repository remoto è stato modificato? Certamente! Diamo un'occhiata alla stessa situazione sfruttando invece il `merge`.","","Nonostante `git merge` non sposti il tuo lavoro (in quanto va a creare un commit di merge), è un modo per far vedere a git che tutte le modifiche del repository remoto sono state incorporate. Questo in quanto il ramo remoto è ora un *antenato* del tuo ramo locale, per cui il tuo commit comprende tutti i cambiamenti presenti nel ramo remoto.","","Vediamolo in azione..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ora se usiamo merge invece di ribasare..."],afterMarkdowns:["Boom! Abbiamo aggiornato la nostra rappresentazione del remoto con `git fetch`, *fuso* le nuove modifiche al nostro lavoro (per riflettere i cambiamenti del remoto), e caricato quest'ultimo con `git push`."],command:"git fetch; git merge o/main; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Fantastico! C'è per caso un modo per farlo senza dover digitare tutti questi comandi?","","Certamente -- sai già che `git pull` è una scorciatoria per fetch e merge. Possiamo digitare `git pull --rebase` come scorciatoia per un fetch e un rebase, molto comodo!","","Vediamo questi comandi al lavoro."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Prima con `--rebase`..."],afterMarkdowns:["Identico a prima! Solo molto più breve."],command:"git pull --rebase; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E ora con un normale `pull`."],afterMarkdowns:["Di nuovo, esattamente uguale a prima!"],command:"git pull; git push",beforeCommand:"git clone; git fakeTeamwork; git commit"}},{type:"ModalAlert",options:{markdowns:["Questo flusso di lavoro di recuperare cambiamenti, ribasare/fondere, e caricare il proprio lavoro è molto comune. Nelle lezioni future esamineremo delle versioni più complicate di questi flussi di lavoro, ma per ora proviamo a fare questo.","","Per risolvere il livello, compi i seguenti passi:","","* Clona il tuo repository","* Simula del lavoro da parte di altri (1 commit)","* Effettua tu delle modifiche (1 commit)","* Pubblica il tuo lavoro tramite *rebase*"]}}]}}}},{}],144:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"feature":{"target":"C2","id":"feature","remoteTrackingBranchID":"o/feature"},"o/feature":{"target":"C2","id":"o/feature","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"feature","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"feature":{"target":"C2","id":"feature","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git reset --hard o/main;git checkout -b feature C2; git push origin feature",startTree:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}}',hint:{en_US:"Make the feature branch from the local main before resetting it back to be the same as origin's main",de_DE:"Erstelle einen Feature-Branch ausgehend vom lokalen Main-Branch, bevor du den Main-Branch auf den origin/main zurücksetzt.",ru_RU:"Создайте новую feature ветвь от main перед тем, как откатить изменения в main до состояния o/main.",uk:"Створіть нову feature гілку від локального main перед тим, як відкотити зміни в main до стану o/main.",zh_CN:"从本地的main创建一个feature分支, 然后重置main和origin main保持一致。",zh_TW:"從本地的 main 分支建一個 feature 分支, 且記得要重置(同步sync)本地 main 分支和 origin/main, 讓他們保持一致。",es_ES:"Crea la rama feature desde la rama main en local antes de restablecerlo para que sea el mismo que la rama main de origen",pt_BR:"Crie o ramo feature a partir do ramo main no local antes de reestabelecê-lo para que seja o mesmo que o ramo main de origem",fr_FR:"Créer la branche feature à partir du main local, avant de la restaurer dans le même état que o/main",ko:"로컬 저장소의 main 브랜치로부터 feature 브랜치를 만드세요. 그리고 o/main과 같아질 수 있도록 로컬 저장소의 main 브랜치를 reset 하세요.",sl_SI:"Naredi feature branch iz lokalnega masterja preden ga ponastaviš, da bo enak kot origin main.",es_AR:"Crea la rama feature desde la rama main en local antes de restablecerlo para que sea el mismo que la rama main de origen.",ja:"mainブランチをoriginのmainと同じ状態になるようにリセットする前に、ローカルのmainからfeatureブランチを作成します。",pl:"Stwórz boczną gałąź tematyczną (feature) z lokalnego main, a późnej zsynchronizuj ją z main na origin",vi:"Tạo những nhánh tính năng từ nhánh cục bộ trước khi trả chúng về lại giống như o/main",it_IT:"Crea il ramo per la feature a partire dal main locale prima di resettarlo al pari del main remoto"},name:{en_US:"Locked Main",de_DE:"Gesperrter Main-Branch",ru_RU:"Заблокированная ветвь main",uk:"Заблокована гілка main",zh_CN:"锁定的Main(Locked Main)",zh_TW:"被鎖定的 Main(Locked Main)",es_ES:"Main bloqueado",pt_BR:"Main bloqueado",fr_FR:"Main verrouillé",ko:"잠겨버린 main 브랜치",sl_SI:"Zaklenjen Main",es_AR:"Main bloqueado",ja:"ロックされたmain",pl:"Zablokowany main",vi:"Nhánh chính bị khóa (Locked Main)",it_IT:"Main bloccato"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","If you work on a large collaborative team it's likely that main is locked and requires some Pull Request process to merge changes. If you commit directly to main locally and try pushing you will be greeted with a message similar to this:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Why was it rejected?","","The remote rejected the push of commits directly to main because of the policy on main requiring pull requests to instead be used.","","You meant to follow the process creating a branch then pushing that branch and doing a pull request, but you forgot and committed directly to main. Now you are stuck and cannot push your changes."]}},{type:"ModalAlert",options:{markdowns:["## The solution","","Create another branch called feature and push that to the remote. Also reset your main back to be in sync with the remote otherwise you may have issues next time you do a pull and someone else's commit conflicts with yours."]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Gesperrter Main-Branch","","Wenn du in einem großen Team zusammen arbeitest, ist der Main-Branch mit hoher Wahrscheinlichkeit für direkte Änderungen gesperrt. Um Änderungen am Remote-Branch einpflegen zu können, ist ein Pull-Request-Prozess notwendig. Wenn du lokal in deinem Main-Branch einen Commit durchführst und diesen versuchst auf den serverseitigen Main-Branch zu pushen, wirst du folgende Fehlermeldung bekommen:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Wieso wurde diese Aktion zurückgewiesen?","","Auf Grund der serverseitig voreingestellten Richtlinien sind direkte Änderungen am Main-Branch nicht erlaubt und erfordern einen Pull-Request.","","Um die eigenen lokalen Änderungen in den Main-Branch einbringen zu können, ist es erforderlich einen lokalen Feature-Branch zu erstellen. Dieser Feature-Branch muss dann auf den Server hochgeladen werden, damit dann ein Pull-Request eingeleitet werden kann. Dies wurde vorher durch den direkten Push des Main-Branch nicht berücksichtigt, weswegen man die Änderungen nicht hochladen konnte."]}},{type:"ModalAlert",options:{markdowns:["## Die Lösung","","Erstelle einen Branch der feature heißt und pushe diesen auf den Server. Setze den lokalen Main-Branch zurück, dass er mit dem Origin-Main-Branch synchron ist. Dies könnte sonst später zu Komplikationen führen, wenn weitere `pull`s durchgeführt und Commits von anderen mit deinen in Konflikt stehen."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 远程服务器拒绝!(Remote Rejected)","","如果你是在一个大的合作团队中工作, 很可能是main被锁定了, 需要一些Pull Request流程来合并修改。如果你直接提交(commit)到本地main, 然后试图推送(push)修改, 你将会收到这样类似的信息:","","```"," ! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)","```"]}},{type:"ModalAlert",options:{markdowns:["## 为什么会被拒绝?","","远程服务器拒绝直接推送(push)提交到main, 因为策略配置要求 pull requests 来提交更新.","","你应该按照流程,新建一个分支, 推送(push)这个分支并申请pull request,但是你忘记并直接提交给了main.现在你卡住并且无法推送你的更新."]}},{type:"ModalAlert",options:{markdowns:["## 解决办法","","新建一个分支feature, 推送到远程服务器. 然后reset你的main分支和远程服务器保持一致, 否则下次你pull并且他人的提交和你冲突的时候就会有问题."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Когда вы работаете в составе большой команды разработчиков над проектом, то, вероятнее всего, ветвь `main` будет _заблокирована_. Для внесения изменений в неё в git существует понятие запроса на слияние `Pull Request`. В такой ситуации если вы закоммитите свои наработки непосредственно в `main` ветвь, а после выполните `git push`, то будет сгенерировано сообщение об ошибке:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```","","```"," ! [удалённо отклонено] main -> main (TF402455: Изменение этой ветви запрещены; вы можете использовать pull request для обновления этой ветви.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Почему произошло отклонение моих изменений?","","Удалённый репозиторий отклонил загруженные коммиты непосредственно в `main` ветку потому, что на `main` _настроена политика_, которая требует использование `Pull request` вместо обычного `git push`.","","Эта политика подразумевает процесс создания новой ветви разработки, внесение в неё всех необходимых коммитов, загрузка изменений в удалённый репозиторий и _открытие нового_ `Pull request`. Однако вы забыли про это и закоммитили наработки непосредственно в `main` ветвь. Теперь вы застряли и не можете запушить свои изменения :(. "]}},{type:"ModalAlert",options:{markdowns:["## Решение:","","Создайте ещё одну ветвь под названием `feature` и отправьте изменения на удалённый репозиторий. Также не забудьте вернуть вашу локальную `main` ветвь в исходное состояние (чтобы она была синхронизирована с удалённой). В противном случае у вас могут возникнуть проблемы при следующем выполнении `git pull`."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Коли ви працюєте над проектом в складі великої команди розробників, то, швидше за все, гілка `main` буде _заблокована_. Для внесення до неї змін в git існує поняття запиту на злиття `Pull Request`. В такій ситуації, якщо ви закомітите свої зміни безпосередньо в гілку `main`, а потім виконаєте `git push`, то буде згенероване повідомлення про помилку:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```","","```"," ! [віддалено відхилено] main -> main (TF402455: Зміни (push-запити) цієї гілки заборонені; ви повинні використовувати pull-запит для оновлення цієї гілки.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Чому мої зміни були відхилені?","","Віддалений репозиторій відхилив коміти завантажені безпосередньо в гілку `main` через те, що на `main` _налаштована політика_, яка вимагає використання `Pull request` замість звичайного `git push`.","","Ця політика має на увазі процес створення нової гілки розробки, внесення до неї всіх потрібних комітів, завантаження змін в віддалений репозиторій і _відкриття нового_ `Pull request`. Але ви про це забули (чи не знали) і закомітили свої доробки безпосередньо в гілку `main`. Тепер ви застрягли і не можене запушити свої зміни :(. "]}},{type:"ModalAlert",options:{markdowns:["## Рішення:","","Створіть ще одну гілку з назвою `feature` і відправте зміни у віддалений репозиторій. Також не забудьте повернути вашу локальну гілку `main` в вихідне положення (щоб вона була синхронізована з віддаленою). Інакше у вас можуть виникнути складнощі при наступному виконанні запиту `git pull`, коли коміти інших розробників конфліктуватимуть з вашими."]}}]},es_ES:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Si trabajas en un equipo colaborativo, es probable que la rama `main` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `main` e intentas realizar `push`, recibirás un mensaje similar a este:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## ¿Por qué fue rechazado?","","Se rechazó el `push` del `commit` a la rama `main` debido a la política en la rama `main` que requiere el uso de `Pull Requests`.","","Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `main`. Ahora estás atascado y no puedes hacer `push` de tus cambios."]}},{type:"ModalAlert",options:{markdowns:["## La solución","","Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `main` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo."]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Se você trabalha em uma grande equipe colaborativa é provável que o main seja bloqueado e precise de alguns processos de Pull Request para unir mudanças. Se você commitar diretamente para o main localmente e tentar fazer um push você visualizará uma mensagem similar a essa:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Por que foi rejeitado?","","O repositório remoto rejeitou o push dos commits diretamente para o main por causa da política do main necessitando do uso dos pull requests.","","Você pretendia seguir o processo de criação de uma ramificação, fazendo um push dessa ramificação e fazendo um pull request, mas você esqueceu e commitou diretamente para o main. Agora você está preso e não consegue publicar suas mudanças."]}},{type:"ModalAlert",options:{markdowns:["## A solução","","Crie outro branch chamado feature e faça um push dele para o repositório remoto. Além disso, resete o main de volta a estar sincronizado com o repositório remoto para não ter problemas da próxima vez que fizer um pull e os commits de alguém mais conflitarem com o seu."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Si vous travaillez dans une équipe de grande taille, il est probable que `main` soit verrouillée, et que le mécanisme de `Pull Request` soit nécessaire pour `merge` des changements. Si vous faites un `commit` directement sur le main local, et essayez de `push`, vous serez reçu avec un message de la sorte :","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Pourquoi est-ce rejeté?","","Le dépôt distant a rejeté le `push` de `commit` directement sur `main`, à cause de la stratégie mise en place sur `main`, imposant plutôt l'usage des `pull requests`.","","Vous étiez censé suivre le processus suivant : créer une branche, `push`, et faire une `pull request`. Mais vous avez oublié et avez fait un `commit` directement sur `main`. Maintenant vous êtes coincé et ne pouvez pas faire un `push` de vos modifications."]}},{type:"ModalAlert",options:{markdowns:["## La solution","","Créer une autre branche appelée feature, et poussez la sur le serveur distant. Réinitialisez (`reset`) également votre `main` pour être en cohérence avec l'état du serveur distant, sinon vous pourriez avoir des problèmes la prochaine fois que vous faites un `pull`, et que quelqu'un d'autre `commit` des choses en conflit avec vos modifications."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 원격저장소 거부! (Remote Rejected!)","","규모가 큰 개발팀에서 일하는 경우, 보통 원격저장소의 `main` 브랜치는 잠겨있습니다(locked). 그래서 변경사항을 적용하려면 pull request 과정을 거쳐야하죠. 만약에 여러분이 로컬 저장소의 `main`브랜치에서 커밋을 한 후 `push`하려고 시도한다면, 다음과 같은 오류를 받게 될겁니다. :","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## 왜 거부됐나요?","","원격 저장소는 자신의 `main` 브랜치에 대한 직접적인 커밋을 제한합니다. 왜냐하면 `push` 대신에 pull request가 쓰여야 한다는 규칙이 원격 저장소의 `main` 브랜치에는 적용되어 있기 때문이죠.","","여러분은 브랜치를 따로 만들어 작업한 다음, 그것을 `push`하고 pull request를 하려 했습니다. 하지만 그걸 잊고 실수로 `main` 브랜치에서 직접 커밋을 해버렸네요! 이제 변경 사항을 `push` 하지도 못하고 옴짝달싹 못하는 상황이 되어버렸습니다."]}},{type:"ModalAlert",options:{markdowns:["## 해결책","","`feature` 라는 이름의 다른 브랜치를 만들어 원격 저장소에 `push` 하세요. 그리고 원격 저장소와 동기화될 수 있도록 로컬 저장소의 `main` 브랜치를 `reset`하세요. 그렇지 않으면 여러분이 다음에 `pull`을 시도할 때 문제가 발생하거나, 다른 협업자들의 커밋이 여러분의 커밋과 충돌할 수도 있습니다."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote Rejected!","","Si trabajas en un equipo colaborativo, es probable que la rama `main` esté bloqueada y requiera algún proceso de `Pull Request` para poder `mergear` los cambios. Si haces `commit` directamente a `main` e intentas realizar `push`, recibirás un mensaje similar a este:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## ¿Por qué fue rechazado?","","Se rechazó el `push` del `commit` a la rama `main` debido a la política en la rama `main` que requiere el uso de `Pull Requests`.","","Trataste de crear una rama y luego hacer `pushs` creando un `Pull Request`, pero te olvidaste e hiciste `commit` directamente a `main`. Ahora estás atascado y no puedes hacer `push` de tus cambios."]}},{type:"ModalAlert",options:{markdowns:["## La solución","","Crea otra rama llamada `feature` y haz `push` a remoto. También restablece su rama `main` nuevamente para que esté sincronizado con el repositorio remoto; de lo contrario, puedes tener problemas la próxima vez que realices un `pull` y el `commit` de otra persona entre en conflicto con el tuyo."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Oddaljena Zavrnitev!","","Če delaš v veliki ekipi je verjetno, da je main zaklenjen in zahteva Pull Request postopek za merganje sprememb. Če commitaš direktno na main lokalno, poizkusi pushati in dobil boš sporočilo podobno temu:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Zakaj je bil zavrnjen?","","Oddaljen repo je zavrnil pushanje commitov direktno na main zaradi politike, da se uporabljajo le pull requesti.","","Mišljeno je, da slediš temu procesu, da narediš branch, ga pushaš, nato pa narediš pull request, ampak si pozabil in commital direktno na main. Sedaj si zataknjen in ne moreš pushati svojih sprememb."]}},{type:"ModalAlert",options:{markdowns:["## Rešitev","","Naredi še en branch imenovan feature in ga pushaj na remote. Prav tako resetiraj main nazaj, da bo v enakem stanju kot na oddaljenem repozitoriju, drugače imaš lahko težave naslednjič, ko boš pullal spremembe in bo konflikt s commitom nekoga drugega."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## リモートが拒否した!","","もしあなたが大規模な共同作業チームで働いている場合、mainがロックされていて、変更をマージするために何らかのプルリクエストの処理が必要になるかもしれません。ローカルで直接mainにコミットしてプッシュしようとすると、以下のようなメッセージに遭遇するでしょう:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## なぜ拒否されたのか?","","mainに対しては直接でのコミットの代わりにプルリクエストを要求するポリシーによって、リモートはmainに直接コミットしようとするプッシュを拒否しました。","","あなたはブランチを作成し、そのブランチをプッシュしてプルリクエストを行うという手順を踏むつもりでしたが、それを忘れてしまい直接mainにコミットしてしまったのです。あなたは行き詰まってしまい、変更をプッシュすることが出来なくなってしまいました。"]}},{type:"ModalAlert",options:{markdowns:["## 解決策","","featureという名前の別のブランチを作成し、リモートにプッシュしてください。またmainをresetしてリモートと同じ状態になるようにしてください。そうしないとあなたが次にプルを実行したときに問題が発生し、他の誰かのコミットがあなたのコミットと競合する恐れがあります。"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 遠端伺服器拒絕!(Remote Rejected!)","","如果今天你在一個較大型的多人合作專案,那很有可能 main 是被鎖住的,不允許你直接更動 main,你必須藉由 Pull Request(發PR) 來處理更動。如果你嘗試在本地 main 做提交(commit)然後推送(push),你可能會收到這個訊息:","","```"," ! [遠端伺服器拒絕] main -> main (TF402455: 推送(push)到這個分支是不允許的; 你必須使用 pull request(發PR) 來更新這個分支.)","```"]}},{type:"ModalAlert",options:{markdowns:["## 為什麼會被拒絕推送?(Why was it rejected?)","","因為這時候 main 的政策(規則)是必須透過 pull request(發PR) 才能對 main 做更動,遠端伺服器會拒絕直接 push 到 main 這件事。","","你應該按照流程,首先建一個分支(自己的 branch),然後推送(push)這個分支並發起 pull request(發PR),但是你忘記了,並直接提交給了 main,所以現在你的行動停住了,而且你不能推送(push)此次更動。"]}},{type:"ModalAlert",options:{markdowns:["## 解決辦法:","","新建一個叫 feature 的分支,然後推送到遠端伺服器。記得重置(同步一下) 你的 main 分支和遠端伺服器保持一致,不然有可能下一次你拉的時候(pull)會跟別人的提交(commit)產生衝突。"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Remote odrzuca!","","Jeśli pracujesz w dużym zespole, to może się zdarzyć, że main będzie zablokowany i przed scaleniem zmian trzeba będzie zrobić pull request. Jeśli commitujesz bezpośrednio do lokalnego main i spróbujesz zrobić push, to możesz dostać wiadomość podobną do tej:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Skąd to odrzucenie?","","Remote odrzuca pushowanie twoich commitów bezpośrednio do main ze względu na regułę wymagającą korzystania z pull requestów.","","Twoim zamiarem było najpierw stworzyć gałąź, a potem wypchnąć ją do zdalnego repozytorium i zrobić pull request, ale zamiast tego commitujesz bezpośrednio do main. Dlatego masz problem i nie możesz wypchnąć swoich zmian."]}},{type:"ModalAlert",options:{markdowns:["## Rozwiązanie","","Stwórz inną gałąź, nazywaną często boczną albo tematyczną, a po angielsku: feature (funkcyjną), i wypchnij ją do remote. Zresetuj również swój main, tak aby był zsynchronizowany ze zdalnym repozytorium. Jeśli tego nie zrobisz, to możesz mieć problem następnym razem, kiedy zrobisz pull, a czyjś commit będzie miał konflikt z twoim."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Kết nối remote bị từ chối!","","Nếu bạn làm việc trong một nhóm cộng tác lớn, có khả năng nhánh main bị khóa và yêu cầu một số quy trình Pull Request để hợp nhất các thay đổi. Nếu bạn commit trực tiếp với nhánh cục bộ và thử push, bạn sẽ được chào đón bằng một thông báo tương tự như sau:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Tại sao bị từ chối?","","Remote từ chối push các commit trực tiếp đến main vì chính sách của main yêu cầu các pull request được sử dụng thay thế.","","Bạn định tạo một nhánh sau đó đẩy nhánh lên rồi thực hiện pull request theo đúng quy trình, tuy nhiên bạn lại lỡ tay commit trực tiếp vào nhánh main. Bây giờ bạn bị mắc kẹt và không thể đẩy các thay đổi của mình lên."]}},{type:"ModalAlert",options:{markdowns:["## Giải pháp","","Tạo một nhánh khác được gọi là feature và push nhánh đó đến remote. Đồng thời đặt lại nhánh main của bạn để đồng bộ với remote, nếu không bạn có thể gặp sự cố vào lần tiếp theo khi bạn thực hiện pull và commit của người khác xung đột với của bạn."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rifiuto remoto!","","Se fari parte di un team di grandi dimensioni è probabile che il main sia bloccato e che richieda un processo di Pull Request per fondere il proprio lavoro. Se effettui localmente un commit al main e provi a caricare le modifiche al repository remoto troverai come risposta un messaggio di questo tipo:","","```"," ! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)","```"]}},{type:"ModalAlert",options:{markdowns:["## Perché è stato rifiutato?","","Il repository remoto ha rifiutato l'invio di commit direttamente al main in quanto per questo ramo è richiesto di effettuare una pull request: una richiesta di includere le nostre modifiche personali nel repository remoto.","","Avresti dovuto seguire il processo di creare un nuovo ramo, fare il push di quel ramo ed effettuare una pull request, ma ti sei scordato e hai effettuato il commit direttamente sul main. Ora sei bloccato e non puoi caricare le tue modifiche."]}},{type:"ModalAlert",options:{markdowns:["## La soluzione","","Crea un nuovo ramo chiamato feature e carica quest'ultimo sul repository remoto. Inoltre reimposta il tuo ramo main affinché sia al pari con il remoto altrimenti potresti andare in contro a dei problemi la prossima volta che proverai ad effettuare un pull e i commit di qualcun'altro andranno in conflitto con i tuoi."]}}]}}}},{}],145:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C11","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C11","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]},"side1":{"target":"C2","id":"side1","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side2":{"target":"C4","id":"side2","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side3":{"target":"C7","id":"side3","remoteTrackingBranchID":null,"localBranchesThatTrackThis":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":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"},"C8":{"parents":["C1"],"id":"C8"},"C9":{"parents":["C2","C8"],"id":"C9"},"C10":{"parents":["C4","C9"],"id":"C10"},"C11":{"parents":["C10","C7"],"id":"C11"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C11","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C8":{"parents":["C1"],"id":"C8"},"C5":{"parents":["C1"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C2":{"parents":["C1"],"id":"C2"},"C6":{"parents":["C5"],"id":"C6"},"C4":{"parents":["C3"],"id":"C4"},"C9":{"parents":["C2","C8"],"id":"C9"},"C7":{"parents":["C6"],"id":"C7"},"C10":{"parents":["C4","C9"],"id":"C10"},"C11":{"parents":["C10","C7"],"id":"C11"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git checkout main;git pull;git merge side1;git merge side2;git merge side3;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]},"side1":{"target":"C2","id":"side1","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side2":{"target":"C4","id":"side2","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side3":{"target":"C7","id":"side3","remoteTrackingBranchID":null,"localBranchesThatTrackThis":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":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"side3","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C8","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C8":{"parents":["C1"],"id":"C8"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Merging with remotes",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",ja:"リモートとのmerge",fr_FR:"Fusionner avec les branches distantes",ru_RU:"Слияние с удалённым репозиторием",ko:"원격 작업과 merge하기",uk:"Мердж з віддаленим репозиторієм",vi:"Hợp nhất nhánh từ xa",sl_SI:"Merganje z oddaljenim repozitorijem",pl:"Scalanie z remote",it_IT:"Fondere in remoto"},hint:{en_US:"Pay attention to the goal tree!",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!",ja:"ゴールツリーをよく見てください!",fr_FR:"Respectez l'arbre représentant l'objectif !",ru_RU:"Внимательно посмотрите на цель уровня!",ko:"goal을 잘 살펴보세요!",uk:"Уважно подивись як має виглядати результат!",vi:"Hãy để ý đến cây mục tiêu!",sl_SI:"Poglej si ciljno drevo!",pl:"Zwróć uwagę, jak wygląda docelowe drzewo!",it_IT:"Fai attenzione all'albero nell'obiettivo"},compareOnlyMain:!0,startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Why not merge?","","In order to push new updates to the remote, all you need to do is *incorporate* the latest changes from the remote. That means you can either rebase *or* merge in the remote branch (e.g. `o/main`).","","So if you can do either method, why have the lessons focused on rebasing so far? Why is there no love for `merge` when working with remotes?",""]}},{type:"ModalAlert",options:{markdowns:["There's a lot of debate about the tradeoffs between merging and rebasing in the development community. Here are the general pros / cons of rebasing:","","Pros:","","* Rebasing makes your commit tree look very clean since everything is in a straight line","","Cons:","","* Rebasing modifies the (apparent) history of the commit tree.","","For example, commit `C1` can be rebased *past* `C3`. It then appears that the work for `C1'` came after `C3` when in reality it was completed beforehand.","","Some developers love to preserve history and thus prefer merging. Others (like myself) prefer having a clean commit tree and prefer rebasing. It all comes down to preferences :D"]}},{type:"ModalAlert",options:{markdowns:["For this level, let's try to solve the previous level but with *merging* instead. It may get a bit hairy but it illustrates the point well."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Pourquoi pas merge ?","","Dans le but d'envoyer de nouvelles modifications sur le dépôt distant, la seule étape préliminaire est *d'incorporer* les derniers changements de ce dépôt dans le nôtre. Concrètement, vous pouvez faire un rebase *ou* un merge de la branche distante (c'est à dire de `o/main`).","","Donc si l'on peut faire les deux méthodes, pourquoi les leçons se sont-elles concentrées sur rebase jusqu'à présent ? Pourquoi préfère-t-on souvent éviter `merge` lorsque l'on travaille avec les branches distantes ?",""]}},{type:"ModalAlert",options:{markdowns:["Au sein de la communauté des développeurs, il y a beaucoup de débats à propos des avantages et inconvénients de l'utilisation de merge ou de rebase. Voici les principaux arguments pour et contre rebase:","","Pour :","","* Rebase rend votre arbre de commits très propre puisqu'il ressemble à une ligne droite.","","Contre :","","* Rebase modifie l'historique (apparent) de l'arbre des commits.","","Par exemple, le commit `C1` peut être rebasé *après* `C3`. Cela fait croire que le travail de `C1'` est arrivé après `C3` alors qu'en réalité il était achevé et commité avant.","","Certains développeurs aiment préserver l'historique et préfèrent donc merge. Les autres (comme moi) préfèrent avoir un arbre des commits propre et préfèrent rebase. C'est une question de goûts :D"]}},{type:"ModalAlert",options:{markdowns:["Pour ce niveau, essayons de résoudre la même situation qu'au niveau précédent, mais cette fois en utilisant *merge*. Cela peut être un peu périlleux mais cela illustre bien le problème."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## ¿Por qué no mergear?","","Para pushear tus novedades al remoto, todo lo que tenés que hacer es *integrar* los últimos cambios del remoto con los tuyos. Eso significa que podés hacer tanto rebase como merge con la rama remota (por ejemplo, `o/main`).","","Así que si podés hacer cualquiera de las dos, ¿por qué las lecciones sólo se centraron 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. Acá tenemos 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 realidad se había hecho antes.","","Algunos desarrolladores aman preservar la historia, por lo que prefieren 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 ponerse un poco oscuro, pero ilustra la idea bastante bien."]}}]},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/main`).","","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:[{type:"ModalAlert",options:{markdowns:["## Por que não um merge?","","Para enviar novas atualizações ao repositório remoto, tudo que você precisa é *incorporar* as últimas mudanças ali presentes. Isso significa que você pode tanto fazer um rebase *quanto* um merge no ramo remoto (ex. `o/main`).","","Então, se você pode escolher qualquer um desses métodos, por que as lições focaram no rebase até o momento? Por que não demos nenhum amor ao `merge` quando trabalhamos com repositórios remotos?",""]}},{type:"ModalAlert",options:{markdowns:["Há muito debate na comunidade de desenvolvedores sobre as vantagens e desvantagens do merge e do rebase. Aqui estão os prós e contras gerais do rebase:","","Prós:","","* O rebase faz a sua árvore de commits parecer bastante limpa, já que tudo fica em uma linha reta","","Contras:","","* O rebase modifica o histórico *aparente* da sua árvore de commits.","","Por exemplo, o commit `C1` pode aparecer *depois do* `C3` após sofrer rebase. Então, fica parecendo que alguém trabalhou em `C1` apenas depois de `C3` estar completo, quando na realidade o que ocorreu foi o contrário.","","Alguns desenvolvedores adoram preservar o histórico e, portanto, preferem o merge. Outros (como eu) preferem ter uma árvore de commits limpa, obtida usando rebase. Tudo se resume ao gosto pessoal :D"]}},{type:"ModalAlert",options:{markdowns:["Para este nível, tente resolver o mesmo problema do nível anterior, mas usando *merge* em vez de rebase. A árvore pode ficar um pouco cabeluda, mas isso ilustra bem o nosso ponto."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## ¿Por qué non mesturar?","","Para empurrar as túas novidades ó remoto, todo o que tes que facer é *integrar* os últimos cambios do remoto cos teus. Eso significa que podes facer tanto rebase como merge ca rama remota (por exemplo, `o/main`).","","Así que podes facer calquera das dúas, ¿por qué as leccións só se centraron en rebasar ata agora? ¿Por qué non adicarlle algo de amor ó `merge` cando traballamos con remotos?",""]}},{type:"ModalAlert",options:{markdowns:["Hai moito debate entre os desenvolvedores sobre os pros e contras de mesturar vs rebasar. Aquí temos os pros e os contras de rebasar:","","Pros:","","* Rebasar fai que a túa árbore de commits sexa bastante limpa, xa que tódolos commits seguen unha única línea.","","Contras:","","* Rebasar modifica a historia (aparente) da túa árbore de commits.","","Por exemplo, o commit `C1` pode rebasarse para que apareza *despois* de `C3`. Entón, parece que o traballo de `C1'` fíxose despois de `C3`, inda que na realidade fixérase antes.","","Algúns desenvolvedores aman preservar a historia, polo que prefiren mesturar. Outros (coma min) preferimos ter unha árbore de commits limpos, e preferimos rebasar. Todo é unha cuestión de preferencias :D"]}},{type:"ModalAlert",options:{markdowns:["Para este nivel, tratemos de resolvelo nivel anterior, pero *mesturando*. Pode poñerse un pouco oscuro, pero ilustra a idea bastante ben."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## 為何不要 merge?","","為了要 push 新的 commit 給 remote,你只需要做的是先同步 remote 的更新,那就表示你可以使用 rebase *或者*是 merge remote branch (例如,`o/main`)。","","所以假如你已經學會使用其中一個方式了,那為什麼我們到目前為止還在強調 `rebase`?為什麼當提到 remote 的時候,反而 `merge` 比較沒有受到關注?",""]}},{type:"ModalAlert",options:{markdowns:["在程式發展的社群中,關於 `merge` 以及 `rebase` 的孰優孰劣有很多的爭論。這裡我們會提到關於 `rebase` 的優點及缺點:","","優點:","","* `rebase` 使得你的 commit tree 看起來更為簡潔,因為任何的 commit 都在一條直線上面。","","缺點:","","* `rebase` 修改了 commit tree 的歷史紀錄。","","舉例來說,我們可以 rebase commit `C1`,將 `C1` 接在*過去的* `C3` 上面,那麼就可以表現出 `C1` 是出現在 `C3` 的後面。","","有一些程式設計師喜歡保留歷史紀錄,因此他們會比較喜歡 `merge`; 其他人(例如我自己)比較喜歡一個簡潔的 commit tree,因此他們比較喜歡 `rebase`。這些都是擇你所愛。:D"]}},{type:"ModalAlert",options:{markdowns:["在這個關卡中,我們面對的是之前關卡的題目,但是我們採用的是 `merge`,這可能會讓你感覺到有點困難,但是確實有講到重點。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Warum nicht Merge?","","Um neue Dinge auf das Remote zu schieben musst du erst alle Änderungen vom Remote holen und bei dir integrieren. Das bedeutet du kannst den entfernten Branch (z.B. `o/main`) entweder Rebasen *oder* Mergen.","","Wenn du also beide Methoden benutzen kannst, warum haben sich die Level bisher auf Rebase konzentriert? Warum mag keiner `merge` wenn es um Remotes geht?",""]}},{type:"ModalAlert",options:{markdowns:["Es gibt eine Menge Diskussionen unter Entwicklern über die Vor- und Nachteile beim Mergen und Rebasen. Hier ein paar Vor- und Nachteile zum Rebasen:","","Vorteile:","","* Rebasen macht den Commit-Baum sehr übersichtlich, weil alles linear aufeinander aufbaut.","","Nachteile:","","* Rebasen verändert die History eines Branches.","","Zum Beispiel kann durch Rebasen Commit `C1` an Commit `C3` *vorbei* bewegt werden, bzw. eine Kopie von `C1`. Es sieht dann so aus als wären die Änderungen in `C1` nach denen in `C3` gemacht worden, obwohl das nicht stimmt.","","Manche Entwickler möchten lieber die Historie lassen, wie sie ist und ziehen daher das Mergen vor. Andere (wie ich) haben lieber einen sauberen Commit-Baum und ziehen Rebase vor. Am Ende ist es eine Geschmacksfrage. :D"]}},{type:"ModalAlert",options:{markdowns:["In diesem Level wollen wir versuchen die Aufgabe vom letzten Level erneut zu lösen, aber diesmal mit einem *Merge*. Das wird vielleicht etwas haariger, stellt aber gut die Implikationen dar."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 为什么不用 merge 呢?","","为了 push 新变更到远程仓库,你要做的就是**包含**远程仓库中最新变更。意思就是只要你的本地分支包含了远程分支(如 `o/main`)中的最新变更就可以了,至于具体是用 rebase 还是 merge,并没有限制。","","那么既然没有规定限制,为何前面几节都在着重于 rebase 呢?为什么在操作远程分支时不喜欢用 `merge` 呢?",""]}},{type:"ModalAlert",options:{markdowns:["在开发社区里,有许多关于 merge 与 rebase 的讨论。以下是关于 rebase 的优缺点:","","优点:","","* Rebase 使你的提交树变得很干净, 所有的提交都在一条线上","","缺点:","","* Rebase 修改了提交树的历史","","比如, 提交 C1 可以被 rebase 到 C3 之后。这看起来 C1 中的工作是在 C3 之后进行的,但实际上是在 C3 之前。","","一些开发人员喜欢保留提交历史,因此更偏爱 merge。而其他人(比如我自己)可能更喜欢干净的提交树,于是偏爱 rebase。仁者见仁,智者见智。 :D"]}},{type:"ModalAlert",options:{markdowns:["本关,我们还是解决上一关卡中的问题,但是要用 merge 替换 rebase。这显然有点画蛇添足,但这只是为了更好的说明上面的观点。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## なぜマージではいけないのか?","","新しい更新をリモートにプッシュするため、あなたがする必要があるのはリモートからの最近の変更の*組み込み*です。それは、リモートブランチ(例えば、`o/main`)にリベース*か*マージのどちらかをあなたがする必要があるということを意味します。","","もしどっちの方法でも行うことができるなら、なぜこれまでのレッスンでは、リベースに焦点を当ててきたのでしょう?リモートへの作業で、なぜ`merge`を推してこなかったのでしょうか?",""]}},{type:"ModalAlert",options:{markdowns:["開発コミュニティで、マージとリベースの間でのトレードオフについては多くの議論がなされています。ここでは一般的なリベースのメリット/デメリットを紹介しましょう:","","メリット:","","* リベースは全てが直線上にあるので、あなたのコミットツリーをとても綺麗にみせます。","","デメリット:","","* リベースは、コミットツリーの(見ため上の)履歴を改変してしまいます。","","例えば、`C1`コミットは`C3`コミットの後ににリベースすることができます。現実とは逆に、`C1'`の作業がまるで`C3`の後に行われたものであるかのように見えるようになります。","","開発者によっては、履歴をそのまま保持するのを好むので、マージを選びます。他の人は(例えば私は)きれいなコミットツリーを好むのでリベースを選びます。つまるところ、好みの問題というわけですね :D"]}},{type:"ModalAlert",options:{markdowns:["このレベルでは、前回のレベルを*マージ*を代わりに使って解いてみてください。ちょっと難しいかもしれませんが、このレッスンのポイントを把握するのに十分な知見を得られるはずです。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Merge? Нет, нет, спасибо.","","Чтобы закачать (push) новые изменения в удалённый репозиторий, всё, что вам нужно сделать - это *смешать* последние изменения из удалённого репозитория. Это значит, что вы можете выполнить rebase *или* merge на удалённом репозитории (например, `o/main`).","","Если мы можем воспользоваться одним из двух методов, то почему же эти упражнения сфокусированы в основном на rebase? К чему такая нелюбовь к `merge`, когда речь идёт о работе с удалёнными репозиториями?",""]}},{type:"ModalAlert",options:{markdowns:["В среде разработчиков существует огромное количество дебатов около merging и rebasing. Ниже приведены основные за / против метода rebasing:","","За:","","* Rebasing делает дерево коммитов более чистым и читабельным, потому что всё представляется единой прямой линией.","","Против:","","* Метод rebasing явно изменяет историю коммитов в дереве.","","Например, коммит `C1` может быть перебазирован *после* `C3`. Соответственно, в дереве работа над `C1'` будет отображаться как идущая после `C3`, хотя на самом деле она была выполнена раньше.","","Некоторые разработчики любят сохранять историю и предпочитают слияние (merging). Другие (такие как я) предпочитают иметь чистое дерево коммитов, и пользуются перебазировкой (rebasing). Всё зависит от ваших предпочтений и вкусов :D"]}},{type:"ModalAlert",options:{markdowns:["Чтобы пройти этот уровень, решите предыдущие задачи, но с помощью *слияния (merging)*. Может быть, получится слегка неказисто, однако такое упражнение хорошо отразит суть различий."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## 왜 merge하지 않는거죠?","","새로운 작업들을 원격 저장소로 push하기위해서 여러분은 원격 저장소의 최근 변경들을 *합치기*만 하면 됩니다. 이 말은 즉 원격 브랜치로(예:`o/main`) rebase를 할 수도 merge를 할 수도 있다는 것입니다.","","두가지를 다 할 수 있다면, 왜 지금까지 배운 레슨들은 rebase를 하는것에 집중한거죠? 원격 저장소와 작업을 할때는 왜 `merge`에게 관심을 가져주지 않는건가요?",""]}},{type:"ModalAlert",options:{markdowns:["개발 커뮤니티에서 merge를 하는것과 rebase 사이의 트레이드 오프에 대해 많은 논의가 이루어지고 있습니다. 여기 rebase의 일반적인 장 / 단점을 소개하겠습니다:","","장점:","","* rebase는 여러분의 커밋 트리를 깔끔하게 정리해서 보기가 좋습니다 모든게 한 줄에 있기때문이죠.","","단점:","","* rebase를 하게 되면 커밋 트리의 (보이는)히스토리를 수정합니다.","","예를 들어, 커밋 `C1`는 *과거*의`C3`로 rebase 될 수 있습니다. `C1'`의 작업이 `C3`의 다음에 있는것으로 보이게 되는겁니다. 실제로는 `C1`이 먼저 완료된거인데 말이죠.","","어떤 개발자들은 이력이 보존되는것을 좋아하기 때문에 merge를 선호합니다. 그 이외는(저 처럼) 커밋 트리가 깔끔한것을 선호해서 rebase를 선호합니다. 자기 입맛에 맞추면 되겠습니다 :D"]}},{type:"ModalAlert",options:{markdowns:["이번 레벨에서는 이전의 레벨을 해결 해봅시다. 대신 이번에는 *merge*를 사용하겠습니다. 조금 복잡할 수 있지만 지금 배운 내용의 포인트를 파악하기 좋을것 입니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Чому б не змерджити?","","Для того, щоб віддалений сервер прийняв твої зміни, треба *об'єднати* їх з останніми змінами на сервері. Це означає ребейс *або* мердж з віддаленою гілкою (напр. `o/main`).","","Хмм, якщо можна використати один із цих методів, для чого нам додаткові уроки про ребейс? Чому ніхто не любить `merge`, працюючи з віддаленим сервером?",""]}},{type:"ModalAlert",options:{markdowns:["В спільноті розробників давно ведуться суперечки щодо переваг і недоліків мерджингу і ребейсу. Ось головні з них для ребейсу:","","За:","","* Ребейс дозволяє тримати дерево комітів чистим, оскільки все вибудовується в пряму лінію;","","Проти:","","* Ребейс змінює історію в дереві комітів.","","Наприклад, коміт `C1` можна ребейснути *на* `C3`. Як результат `C1'` буде йти після `C3`, хоча насправді його зробили раніше.","","Деякі розробники люблять зберігати історії і тому вибирають мерджинг. Інші (як і я) воліють мати чисте дерево комітів і віддають перевагу ребейсу. Це питання смаку :D"]}},{type:"ModalAlert",options:{markdowns:["На цьому рівні спробуймо вирішити попереднє завдання з використанням *мерджу*. Можливо вийде не так охайно, але добре покаже різницю в підходах."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tại sao không hợp nhất?","","Để có thể đẩy cập nhật của bạn lên kho nhánh từ xa, tất cả những gì bạn cần làm là *kết nạp* thay đổi mới nhất từ nhánh từ xa. Nghĩa là bạn có thể dùng rebase *hoặc* merge với nhánh từ xa (ví dụ `o/main`).","","Vậy ta có thể sử dụng một trong 2 cách, thì tại sao đến giờ ta chỉ tập trung vào rebase trong các bài học? Tại sao khi làm việc với nhánh từ xa lại ta lại không thích `hợp nhất` (`merge`)?",""]}},{type:"ModalAlert",options:{markdowns:["Trong cộng đồng phát triển phần mềm có rất nhiều tranh luận về ưu, nhược, khuyết của việc sử dụng tái bố trí (`rebase`) hay hợp nhất (`merge`). Dưới đây là một vài ưu / nhược cơ bản của rebase:","","Ưu điểm:","","* Rebase làm cây commit của bạn trông gọn gàng hơn nhiều vì mọi thứ được xếp theo đường thẳng","","Nhược điểm:","","* Rebase sửa đổi lịch sử của cây commit.","","Ví dụ, commit `C1` có thể bố trí lên *sau* `C3`. Thế là `C1'` biểu hiện như là nó xuất hiện sau `C3` trong khi thực tế nó được hoàn thành trước đó.","","Một số nhà phát triển thích lưu giữ lịch sử nên họ ưa thích merge hơn. Những người khác (như tôi chẳng hạn) thì thiên về rebase hơn vì muốn có cây commit gọn gàng. Rốt cuộc cũng chỉ phụ thuộc vào sở thích cá nhân thôi :D"]}},{type:"ModalAlert",options:{markdowns:["Ở cấp độ này, hãy thử giải bài tập trước đó nhưng dùng *hợp nhất*. Có lẽ bài này hơi thừa nhưng mà nó minh họa quan điểm trên rõ ràng hơn."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zakaj ne merganje?","","Da bi poslal nove spremembe na oddaljen repo, je vse kar moraš narediti, da *vključiš* zadnje spremembe iz oddaljenega repota. To pomeni, da lahko rebaseaš *ali* mergeaš v oddaljeni branch (npr. `o/main`).","","Torej če lahko narediš katero izmed metod, zakaj imeti lekcijo, ki se zaenkrat osredotoča na rebaseanje? Zakaj ni nobene ljubezni do `mergea` pri delanju z oddaljenimi repoti?",""]}},{type:"ModalAlert",options:{markdowns:["Veliko govora je o kompromisih med merganjem in rebasanjem med razvijalci. Tu so splošne prednosti / slabosti rebaseanja:","","Prednosti:","","* Rebasanje naredi tvoje drevo lepo in pregledno, ker je vse v ravni črti","","Slabosti:","","* Rebasanje spremeni (navidezno) zgodovino drevesa commitov.","","Naprimer, commit `C1` je lahko rebasean *mimo* `C3`. Potem izgleda, kot da je delo za `C1'` prišlo za `C3`, čeprav je v resnici bilo končano prej.","","Nekateri razvijalci imajo radi ohranjanje zgodovine in imajo posledično rajši merganje. Drugi (kot jaz) imajo rajši čisto drevo commitov in posledično rebasanje. Na koncu prevlada osebna preferenca. :D"]}},{type:"ModalAlert",options:{markdowns:["Za to stopnjo, poizkusimo rešiti prešnjo stopnjo z *merganjem*. Mogoče bo malo zakomplicirano, vendar bo lepo ponazorilo poanto."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Dlaczego nie merge?","","Aby wypchnąć nowe wersje, musisz tylko *nanieść* najnowsze zmiany ze zdalnego repozytorium. A to znaczy, że możesz zrobić albo rebase, *albo* merge gałęzi w zdalnym repozytorium (np. `o/main`).","","Skoro można to zrobić na oba sposoby, to dlaczego lekcje skupiały się do tej pory na przebazowaniu? Dlaczego `merge` nie jest lubianym poleceniem przy pracy na zdalnych repo?",""]}},{type:"ModalAlert",options:{markdowns:["Wśród osób zajmujących się programowaniem toczą się spory, co jest lepsze: merge czy rebase. Oto ogólne za i przeciw rebase'owania:","","Za:","","* Przebazowanie sprawi, że twoje drzewo commitów będzie wyglądać bardzo czysto, ponieważ wszystko znajdzie się w jednej linii","","Przeciw:","","* Rebase zmienia (pozornie) historię drzewa commitów.","","Na przykład: commit `C1` można przebazować *za* `C3`. Pozornie będzie to wyglądać tak, jakby praca na `C1'` została wykonana później niż na `C3`, a w rzeczywistości było zupełnie odwrotnie.","","Część osób ceni sobie oryginalną historię i dlatego woli merdżować. Inni (w tym ja) wolą mieć czyste drzewo commitów i dlatego używają rebase. To po prostu kwestia osobistych preferencji :D"]}},{type:"ModalAlert",options:{markdowns:["Na tym poziomie spróbujemy rozwiązać zadanie z poprzedniego, ale tym razem użyjemy *merge*. Może się to wydawać lekko pogmatwane, ale dobrze pokazuje tę metodę."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Perché non fondere?","","Per riuscire a caricare nuovi aggiornamenti al repository remoto, serve solamente *incorporare* le modifiche più recenti avvenute sul remoto. Ciò significa che puoi ribasare *oppure* fondere le nuove modifiche al ramo remoto (e.g. `o/main`).","","Quindi, se entrambi i metodi sono validi, perché le lezioni si sono concentrate sul ribasare? Perché non c'è amore per il `merge` quando si lavora con i repository remoti?",""]}},{type:"ModalAlert",options:{markdowns:["C'è abbastanza dibattito sui compromessi tra il fondere e il ribasare nell'ambiente degli sviluppatori. Qui presentiamo in generale i pro e contro del ribasare:","","Pro:","","* Ribasare rende il tuo albero dei commit più semplice da leggere in quanto tutto rientra in una linea dritta","","Cons:","","* Ribasare modifica lo storico (apparente) dell'albero dei commit.","","Ad esempio, il commit `C1` può essere ribasato *dopo* di `C3`. Apparirà che il lavoro per `C1` è avvenuto dopo `C3` quando in realtà era stato completato in precedenza.","","Alcuni sviluppatori amano preservare lo storico e perciò prediligono la fusione di commit. Altri (come il sottoscritto) preferiscono avere un albero dei commit più pulito, e perciò preferiscono ribasare. È una questione di gusti :D"]}},{type:"ModalAlert",options:{markdowns:["Per questo livello, prova a risolvere il livello precedente ma usando il *merge* invece che il *rebase*. L'albero apparirà più \"ingarbugliato\", ma dovrebbe riuscire a rendere bene l'idea."]}}]}}}},{}],146:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C3","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git pull",startTree:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Git Pullin'",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",ja:"Git Pull",fr_FR:"Git pull",ru_RU:"Git pull",uk:"Git pull",ko:"Git pull",vi:"Git pull",sl_SI:"Git Pull",pl:"Git pull",it_IT:"Git Pull"},hint:{en_US:"Just run git pull!",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.",ja:"単にgit pullを実行!",fr_FR:"Utilisez facilement git pull !",ru_RU:"Запустите комманду git pull !",uk:"Просто виконай git pull !",ko:"그냥 git pull을 하세요!",vi:"Đơn giản là gõ git pull!",sl_SI:"Samo izvedi git pull!",pl:"Po prostu uruchom git pull!",it_IT:"Semplicemente git pull!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Now that we've seen how to fetch data from a remote repository with `git fetch`, let's update our work to reflect those changes!","","There are actually many ways to do this -- once you have new commits available locally, you can incorporate them as if they were just normal commits on other branches. This means you could execute commands like:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","In fact, the workflow of *fetching* remote changes and then *merging* them is so common that git actually provides a command that does both at once! That command is `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's first see a `fetch` and a `merge` executed sequentially."],afterMarkdowns:["Boom -- we downloaded `C3` with a `fetch` and then merged in that work with `git merge o/main`. Now our `main` branch reflects the new work from the remote (in this case, named `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What would happen if we used `git pull` instead?"],afterMarkdowns:["The same thing! That should make it very clear that `git pull` is essentially shorthand for a `git fetch` followed by a merge of whatever branch was just fetched."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["We will explore the details of `git pull` later (including options and arguments), but for now let's try it out in the level.","","Remember -- you can actually solve this level with just `fetch` and `merge`, but it will cost you an extra command :P"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Maintenant que vous avez vu comment rapatrier des données depuis un dépôt distant avec `git fetch`, mettons à jour notre copie de travail pour refléter ces changements !","","Il existe en fait beaucoup de façons de faire cela -- une fois que vous avez de nouveaux commits disponibles localement, vous pouvez les incorporer dans votre branche de travail comme s'ils étaient des commits normaux d'autres branches. Cela signifie que pourriez simplement exécuter des commandes comme :","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","En fait, le principe de *rapatrier* (fetch) les branches distantes puis les *fusionner* (merge) est si commun que Git a en réalité une commande pour faire les deux à la fois ! Cette commande est `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons d'abord un `fetch` puis un `merge` exécutés séquentiellement."],afterMarkdowns:["Boum -- nous avons téléchargé `C3` avec un `fetch` et ensuite nous avons fusionné ce travail dans notre copie avec `git merge o/main`. Maintenant notre branche `main` reflète le nouveau travail du dépôt distant (dans ce cas, nommé `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Que se passerait-il si nous utilisions plutôt `git pull` ?"],afterMarkdowns:["La même chose ! Cela devrait maintenant être clair que `git pull` est surtout un raccourci pour `git fetch` suivi d'un merge de toutes les branches qui viennent d'avoir un fetch."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Nous allons explorer les détails de `git pull` plus tard (y compris options et arguments), mais pour ce niveau pratiquons d'abord la technique de base.","","Rappelez-vous : vous pouvez aussi résoudre ce niveau avec `fetch` et `merge`, mais cela vous coûtera une commande supplémentaire :P"]}}]},es_AR:{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 tenés los commits disponibles localmente, podés integrarlos como si fueran commits comunes de otras ramas. Esto significa que podrías ejecutar comandos como:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 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:["Boom: descargamos `C3` con un `fetch` y luego lo mergeamos con `git merge o/main`. Ahora nuestra rama `main` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Qué pasaría si usáramos `git pull` en cambio?"],afterMarkdowns:["¡Lo mismo! Eso debería dejar bien en claro que `git pull` es básicamente un atajo para hacer `git fetch` seguido por un merge con la rama que sea que hayamos bajado."],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.","","Acordate: podés resolver este comando simplemente con `fetch` y `merge`, pero eso te costaría un comando extra :P"]}}]},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/main`","* `git rebase o/main`","* `git merge o/main`","* 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/main`. Ahora nuestra rama `main` refleja el nuevo trabajo del remoto (en este caso, llamado `origin`)"],command:"git fetch; git merge o/main",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:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Agora que vimos como baixar dados de um repositório remoto com `git fetch`, vamos atualizar nosso trabalho para refletir essas mudanças!","","Há, na verdade, muitas formas de fazê-lo -- uma vez que você tenha os novos commits disponíveis localmente, você pode incorporá-los como se eles fossem commits normais em outros ramos. Isso significa que você pode executar comandos como estes a seguir:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","O fluxo de trabalho de executar *fetch* para baixar as mudanças remotas e depois fazer um *merge* delas é tão comum que o Git na verdade fornece um comando que faz ambas as coisas de uma vez só! Esse comando é o `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos primeiro ver um `fetch` e um `merge` executados sequencialmente."],afterMarkdowns:["Boom -- nós baixamos o `C3` com um `fetch` e então fizemos um merge desse trabalho usando `git merge o/main`. Agora o nosso ramo `main` reflete o trabalho realizado no repositório remoto (neste caso, chamado de `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O que iria acontecer se, em vez disso, usássemos `git pull`?"],afterMarkdowns:["Exatamente o mesmo! Isso deve tornar bem claro que `git pull` é essencialmente um caminho mais curto para executar um `git fetch` seguido de um merge de seja já qual ramo tiver sido baixado."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Vamos explorar os detalhes do `git pull` mais tarde (incluindo opções e parâmetros), mas por enquanto, experimente usá-lo em sua forma mais básica.","","Lembre-se -- você também poderia resolver este nível com um `fetch` e um `merge`, mas isso lhe custaria um comando a mais :P"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Agora que vimos cómo traer os datos dun repositorio remoto con `git fetch`, ¡actualicemos o noso traballo local para reflexar eses cambios!","","Realmente hai varias formas de facer esto: unha vez que teñas os commits dispoñibles localmente, podes integralos coma se foran commits comúns de outras ramas. Esto significa que poderías executar comandos como:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","De feito, o fluxo de traballo de *fetchear* os cambios remotos e depois *mesturalos* é tan común que git inclúe un comando que fai as dúas operacións nunha sola: ¡`giti pull`!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos primeiro un `fetch` e un `merge` executados secuencialmente."],afterMarkdowns:["Boom: descargamos `C3` cun `fetch` e logo mesturámolos con `git merge o/main`. Agora a nosa rama `main` reflexa o novo traballo do remoto (neste caso, chamado `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Qué pasaría se usáramos `git pull` en cambio?"],afterMarkdowns:["¡O mesmo! Eso debía deixar ben claro que `git pull` é básicamente un atallo para facer `git fetch` seguido pola mestura ca rama que houbésemos descargado."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Exploraremos os detalles de `git pull` despois (incluíndo as súas operacións e parámetros), pero por agora probarémolo neste nivel.","","Lémbrate: podes resolver este comando sinxelamente con `fetch` e `merge`, pero eso costaríache un comando extra :P"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git pull","","現在我們已經知道如何利用 `git fetch` 從 remote 抓取 commit,讓我們來看一下如何將這些 commit 更新到我們的檔案!","","只要在你的 local 有 fetch 到新的 commit,便有很多方法可以做到這件事情,你可以把它們視為在其它 branch 上面的一般的 commit,這表示你可以執行像這樣子的指令:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 等等‧‧‧","","事實上,一次*下載 (fetch)* remote 的更新並且*合併(merge)* 這些更新在 git 裡面是很常見的事情!這個命令叫作 `git pull`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來看循序執行一個 `fetch` 和一個 `merge` 的樣子"],afterMarkdowns:["看吧! 我們利用 `fetch` 下載了 `C3` 並且利用 `git merge o/main` 來更新資料,現在我們的 `main` branch 跟 remote 同步了(在這個例子中,remote repository 叫作 `origin`)。"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果用 `git pull` 會發生什麼事情?"],afterMarkdowns:["一樣!很明顯地,`git pull` 其實就是 git fetch 跟 git merge 的循序執行的結果,而且 merge 的 branch 就是 fetch 所更新的 branch。"],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["我們會解釋 `git pull` 的細節(包括可選擇的參數), 但現在先讓我們在這個關卡試試看!","","記住喔,你可以利用循序執行的方式來執行 `fetch` 以及 `merge` 來完成這個關卡,但是相對於 `git pull`,你就得多打一個指令。:P"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","既然我们已经知道了如何用 `git fetch` 获取远程的数据, 现在我们学习如何将这些变化更新到我们的工作当中。","","其实有很多方法的 —— 当远程分支中有新的提交时,你可以像合并本地分支那样来合并远程分支。也就是说就是你可以执行以下命令: ","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 等等","","实际上,由于先抓取更新再合并到本地分支这个流程很常用,因此 Git 提供了一个专门的命令来完成这两个操作。它就是我们要讲的 `git pull`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我们先来看看 `fetch`、`merge` 依次执行的效果"],afterMarkdowns:["我们用 `fetch` 下载了 `C3`, 然后通过 `git merge o/main` 合并了这一提交记录。现在我们的 `main` 分支包含了远程仓库中的更新(在本例中远程仓库名为 `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果使用 `git pull` 呢?"],afterMarkdowns:["同样的结果!这清楚地说明了 `git pull` 就是 git fetch 和 git merge 的缩写!"],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["稍后我们会探索一下 `git pull` 的细节(包括选项和参数),现在咱们先解决这个关卡。","","实际上你完全可以用 `fetch` 和 `merge` 通过本关,但是这会增加你的命令数。 :P"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Jetzt, wo wir wissen, wie wir mit `git fetch` Daten von einem entfernten Repository holen können, wollen wir unsere lokalen Daten aktualisieren, damit sie die Änderungen vom Server beinhalten.","","Tatsächlich gibt es eine Menge Wege dies zu erreichen -- sobald du die neuen Commits lokal verfügbar hast, kannst du sie integrieren wie Commits von ganz normalen anderen Branches. Du kannst also:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* usw. usf. ausführen.","","Änderungen vom Server zu holen und dann in die eigene Arbeit zu mergen wird so häufig benötigt, dass Git einen Befehl kennt, der beides auf einmal erledigt! Das ist `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns erst mal ein `fetch` gefolgt von `merge` an:"],afterMarkdowns:["Bämm -- wir haben `C3` mit `fetch` heruntergeladen und dann in unseren Branch mit `git merge o/main` integriert. Nun bildet unser `main` dieselben Inhalte ab, wie sie auf dem entfernten Server (`origin`) liegen."],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was passiert wohl, wenn wir stattdessen `git pull` benutzen?"],afterMarkdowns:["Dasselbe in Pink. Das sollte recht deutlich machen, dass `git pull` nur eine Abkürzung für `git fetch` gefolgt von einem Merge des gerade aktualisierten Branches ist."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Die Feinheiten von `git pull` werden wir uns später ansehen, für's Erste lass es uns in diesem Level ausprobieren.","","Vergiss nicht -- du kannst diesen Level auch mit `fetch` und `merge` lösen, aber das kostet dich einen Befehl extra. :P"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Теперь, когда мы познакомились с тем, как извлекать данные из удалённого репозитория с помощью `git fetch`, давайте обновим нашу работу, чтобы отобразить все эти изменения!","","Существует множество вариантов решений - как только у вас имеется локальный коммит, вы можете соединить его с другой веткой. Это значит, вы можете выполнить одну из команд:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* и т.д.","","Процедура *скачивания (fetching)* изменений с удалённой ветки и *объединения (merging)* настолько частая и распространённая, что git предоставляет вместо двух команд - одну! Эта команда - `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте рассмотрим, как `fetch` и `merge` выполняются последовательно"],afterMarkdowns:["Опа - мы скачали `C3` с помощью команды `fetch` и затем объединяем эти наработки с помощью `git merge o/main`. Теперь наша ветка `main` отображает изменения с удалённого репозитория (в данном случае — с репозитория `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Что же произойдёт, если вместо этих команд мы воспользуемся `git pull`?"],afterMarkdowns:["Абсолютно то же самое! Нужно чётко понимать, что `git pull` существенно уменьшает вашу рутинную работу, если бы вы использовали `git fetch` и последующее слияние (merging) скаченной ветки."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Мы изучим детали команды `git pull` чуть позже (включая опции и аргументы вызова команды), а пока что давайте просто попробуем эту команду.","","Помните, вы также можете выполнить этот уровень с помощью команд `fetch` и `merge`, но нужно ли делать так, когда можно воспользоваться всего лишь одной командой ? :P"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","今や私たちはリモートリポジトリから`git fetch`でデータを取ってくる方法を知っているので、今度は私たちの作業にその変更を反映することを学びましょう!","","実際には多くの方法があり、ローカルに利用可能なリモートの新しいコミットがある場合、あなたはそのコミットを他のブランチの通常のコミットと同じように、自分の作業に組み込むことができます。これは、あなたが次のようなコマンドを実行することで行えます:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* その他","","実は、リモートの変更を取ってきてマージするという作業の流れはとてもよく行われるので、gitは実際にはその二つを同時に行うコマンドを提供しているのです!それは、`git pull`というコマンドです。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["まずは、連続して`fetch`して`merge`する流れの方を見てみましょう。"],afterMarkdowns:["わーお。私たちは`C3`を`fetch`でダウンロードして、`git merge o/main`でこれをマージしました。今や私たちの`main`ブランチに(この場合、`origin`という名前の)リモートの新しい作業内容が反映されています。"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["では、`git pull`では何が起こるのでしょうか?"],afterMarkdowns:["同じことが起こります!明確に`git pull`は`git fetch`して取ってきたブランチの内容をマージするという流れの短縮系であることが確認できます。"],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["`git pull`の(オプションや引数を含む)詳細はこの後にやりますが、今、このレベルではただ試してみるだけにしておきましょう。","","覚えておいてください。あなたは実際にはこのレベルを`fetch`と`merge`だけでこのレベルを解決することができますが、余計なコマンドのコストがかかるだけです :P"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Тепер, коли ми знаємо як витягувати дані з віддаленого репозиторію за допомогою `git fetch`, спробуймо оновити нашу робочу копію відповідно до цих данних!","","Насправді, є кілька шляхів як цого досягнути -- щойно нові коміти з’явилися локально, ти можеш додавати їх в бранчі так само, як звичайні коміти. Це означає що ти можеш виконувати команди:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* тощо.","","Насправді, процес *витягування* віддалених змін й подальший *мерджинг* їх є настільки популярним, що гіт пропонує спеціальну команду, що виконує ці дві дії за один раз! Ця команда називається `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Спершу виконаймо по черзі `fetch`, а потім `merge`."],afterMarkdowns:["Ка-бум -- ми звантажили `C3` за допомогою `fetch` і потім змерджили їх, використавши `git merge o/main`. Тепер наша гілка `main` відповідає гілці з віддаленого сховища (в цьому випадку, з назвою `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Що трапиться, якщо натомість використати `git pull`?"],afterMarkdowns:["Те саме! Тепер очевидно що `git pull` -- це просто швидкий спосіб зробити `git fetch`, а потім змерджити завантажену гілку."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ми розглянемо `git pull` більш детально пізніше (включаючи різні опції та аргументи), наразі просто спробуймо цю команду.","","Не забувай -- щоб пройти цей рівень, достатньо використати `fetch`, а потім `merge`, але це буде тобі коштувати одну зайву команду :P"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","자 우리는 원격 저장소에서 `git fetch`로 어떻게 데이터를 내려 받는지 보았습니다. 이제 우리의 작업을 업데이트해서 변경들을 반영해 봅시다!","","사실 이걸 하는 방법은 여러가지 있습니다 -- 새 커밋들을 로컬에 내려받은 이후에는 그냥 다른 브랜치에있는 일반 커밋처럼 활용할 수 있습니다. 이런 명령들을 실행할 수 있다는 뜻 입니다 :","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* 기타 등등","","사실 원격 저장소의 변경을 *fetch*하고 그이후에 *merge*하는 작업의 과정이 워낙 자주있는 일이라서 git은 이 두가지를 한번에 하는 명령을 제공합니다! 이 명령어는 `git pull` 입니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["먼저 `fetch` 와 `merge`가 차례로 실행되는것을 확인해 봅시다"],afterMarkdowns:["Boom -- 우리는 `C3`를 `fetch`로 내려 받고 `git merge o/main`로 우리의 작업으로 병합했습니다. 이제 우리의 `main` 브랜치는 원격 저장소의 새 작업들을 반영하게 됩니다(지금 사례에서 `origin`입니다)."],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["대신에 `git pull`을 사용하면 어떻게 될까요?"],afterMarkdowns:["똑같은 일이 일이납니다! 이렇게 `git pull`은 본질적으로 `git fetch`후에 내려받은 브랜치를 병합하는 과정의 단축입니다. 확실하게 느껴지죠?."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["`git pull`의 세부적인 사항들은 나중에 알아보겠습니다 (옵션과 매개변수등) 지금은 이 레벨에서 일단 시도부터 해 봅시다.","","알고 넘어갑시다 -- 이 레벨을 그냥 `fetch`와 `merge`의 조합으로 해결할 수 있습니다. 하지만 명령어가 추가되겠지요 :P"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Ta đã biết cách dùng `git fetch` để nạp các commit từ kho chứa từ xa, giờ hãy cập nhật công việc của chúng ta để phản ánh những thay đổi đó!","","Thực ra thì có nhiều cách đề làm điều này -- một khi bạn đã có các commit này ở kho chứa cục bộ, bạn có thể hợp nhất chúng như với các commit ở các nhánh khác. Nghĩa là bạn có thể sử dụng các câu lệnh sau:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* vân vân và mây mây","","Thực tế thì, quá trình *nạp* commit từ kho chứa từ xa và *hợp nhất* chúng phổ biết đến nỗi Git cung cấp một câu lệnh để làm cả 2 điều này một lúc! Đó là `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Trước tiên hãy xem quá trình `nạp` và `hợp nhất` được thực hiện một cách tuần tự."],afterMarkdowns:["Bùùm -- ta tải xuống commit `C3` với lệnh `git fetch` rồi sau đó hợp nhất nó với lệnh `git merge o/main`. Giờ thì nhánh `main` đã phản ánh trạng thái mới từ kho chứa từ xa (trong trường hợp này là `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu thay vì dó ta dùng `git pull` thì điều gì xảy ra?"],afterMarkdowns:["Cũng như nhau! Điều đó có nghĩa là `git pull` về cơ bản là cách làm tắt cho việc thực hiện tuần tự `git fetch` sau đó là hợp nhất các nhánh từ xa được nạp."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ta sẽ tìm hiểu chi tiết về `git pull` sau (bao gồm các tùy chọn và tham số), còn bây giờ thì cứ dùng thử nó ở cấp độ này đã.","","Nhớ rằng -- bạn có thể giải quyết cấp độ này với `fetch` và sau đó `merge`, nhưng mà như thế thì lại tốn thêm một câu lệnh :P"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Sedaj, ko smo videli kako pridobiti podatke iz oddaljenega repozitorija z `git fetch`, posodobimo naše delo, da bo odsevalo te sprememebe!","","V bistvu je več načinov za izvedbo tega -- ko imaš enkrat lokalno na voljo nove commite, jih lahko vključiš, kot da so normalni commiti na drugem branchu. To pomeni, da lahko izvedeš ukaze, kot so:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* itd., itd.","","Pravzaprav je *fetchanje* oddaljenih sprememb in kasneje *merganje* le-teh tako pogosto, da ima git dejansko ukaz, ki naredi oboje! Ukaz je `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo najprej `fetch` in `merge` izvedena zaporedno:"],afterMarkdowns:["Boom -- prenesli smo `C3` s `fetch` in nato mergali delo z `git merge o/main`. Sedaj naš `main` branch odseva spremembe novega dela iz oddaljenega repoztorija (v tem primeru poimenovan `origin`)."],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj bi se zgodilo, če bi namesto tega uporabili `git pull`?"],afterMarkdowns:["Ista stvar! To bi moralo pokazati, da je `git pull` v bistvu bližnjica za `git fetch`, ki mu sledi merge brancha, ki smo ga ravno fetchali."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Kasneje bomo raziskali podrobnosti ukaza `git pull` (vključno z opcijami in argumenti), ampak zaenkrat poizkusimo brez v tej stopnji.","","Pomni -- to stopnjo lahko rešiš s `fetch` in `merge`, ampak boš rabil en dodaten ukaz :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Teraz, gdy zobaczyliśmy, jak pobierać dane ze zdalnego repozytorium za pomocą `git fetch`, zaktualizujmy naszą pracę, aby odzwierciedlić te zmiany!","","Istnieje wiele sposobów, aby to zrobić - kiedy masz już nowe commity dostępne lokalnie, możesz je dołączyć tak, jakby były zwykłymi commitami na innych gałęziach. Oznacza to, że możesz wykonywać polecenia takie jak:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* itd., itd.","","W rzeczywistości kolejność działań polegająca na *pobieraniu* zdalnych zmian (fetch), a następnie *łączeniu* ich (merge), jest tak powszechna, że sam Git zapewnia polecenie, które robi obie te rzeczy naraz! Jest to `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Zobaczmy najpierw `fetch` i `merge` wykonywane jedno po drugim."],afterMarkdowns:["Tadam -- pobraliśmy `C3` za pomocą `fetch`, a następnie połączyliśmy tę pracę za pomocą `git merge o/main`. Teraz nasza gałąź `main` odzwierciedla nową pracę z remote (w tym przypadku o nazwie `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Co by się stało, gdybyśmy zamiast tego użyli `git pull`?"],afterMarkdowns:["Dokładnie to samo! Chyba bardzo wyraźnie widać, że `git pull` to w zasadzie dwa w jednym: `git fetch`, po którym następuje scalenie przed chwilą pobranej gałęzi."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["W szczegóły `git pull` zagłębimy się później (również w opcje i argumenty), ale na tym poziomie po prostu wypróbujmy, jak działa.","","Pamiętaj -- możesz rozwiązać ten poziom, używając tylko `fetch` i `merge`, ale będzie cię to kosztowało dodatkowe polecenie :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Pull","","Ora che abbiamo visto come recuperare dati da un repository remoto con `git fetch`, vediamo di aggiornare il nostro repository affinché rifletta questi cambiamenti!","","Ci sono più modi per fare ciò -- una volta che i nuovi commit sono disponibili localmente, si possono incorporare come se fossero normali commit da altri rami. Questo significa che possiamo eseguire comandi come:","","* `git cherry-pick o/main`","* `git rebase o/main`","* `git merge o/main`","* etc., etc.","","Infatti, il metodo del *recuperare* cambiamenti remoti e poi *fonderli* nel nostro repository è talmente comune che git fornisce un comando che compie entrambi i passi in uno! Quel comando è `git pull`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diamo prima un'occhiata a `fetch` e `merge` eseguiti uno dopo l'altro."],afterMarkdowns:["Boom -- abbiamo scaricato `C3` con un `fetch` e poi fuso assieme il lavoro con `git merge o/main`. Ora il nostro ramo `main` riflette le nuove modifiche dal ramo remoto (in questo caso, chiamato `origin`)"],command:"git fetch; git merge o/main",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cosa succederebbe se invece usassimo `git pull`?"],afterMarkdowns:["La stessa cosa! Ciò dovrebbe chiarire che `git pull` è essenzialmente una scorciatoia allo scrivere `git fetch` seguito dalla fusione del ramo appena recuperato."],command:"git pull",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Esploreremo i dettagli di `git pull` più tardi (incluse le opzioni e i parametri), ma per ora proviamo ad usarlo nel livello.","","Ricorda -- potresti risolvere questo livello eseguendo `fetch` seguito da `merge`, ma ti costerà un comando in più :P"]}}]}}}},{}],147:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/bar":{"target":"C1","id":"o/bar","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null},"side":{"target":"C2","id":"side","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C4":{"parents":["C1"],"id":"C4"},"C3":{"parents":["C1"],"id":"C3"},"C5":{"parents":["C3","C4"],"id":"C5"},"C2":{"parents":["C1"],"id":"C2"},"C6":{"parents":["C2","C5"],"id":"C6"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null},"bar":{"target":"C3","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"bar","id":"HEAD"}}}',solutionCommand:"git pull origin bar:foo;git pull origin main:side",startTree:'{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/bar":{"target":"C1","id":"o/bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C4":{"parents":["C1"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null},"bar":{"target":"C3","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"bar","id":"HEAD"}}}',name:{en_US:"Pull arguments",zh_CN:"Git pull 的参数",zh_TW:"pull 的參數",es_AR:"Parámetros de pull",es_MX:"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",ja:"Pullの引数",fr_FR:"Arguments de pull",ru_RU:"Аргументы для pull",ko:"pull 인자들",uk:"Аргументи pull",vi:"Tham số pull",sl_SI:"Pull argumenti",pl:"Argumenty pull",it_IT:"Parametri di git pull"},hint:{en_US:"Remember that you can create new local branches with fetch/pull arguments",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_MX:"Recuerda que puedes 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",ja:"Fetchとpullの引数を利用してローカルで新規ブランチを作成できるのをお忘れなく",fr_FR:"Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull",ru_RU:"Напоминаю, что новые ветки можно создавать и с помощью команд fetch/pull",ko:"fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.",uk:"Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами",vi:"Nhớ rằng, bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull",sl_SI:"Zapomni si, da lahko ustvariš nove lokalne branche s fetch/pull argumenti.",pl:"Pamiętaj, że za pomocą argumentów fetch/pull możesz tworzyć nowe lokalne gałęzie",it_IT:"Ricorda che puoi creare nuovi rami locali sfruttando fetch/pull + parametri"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull arguments","","Now that you know pretty much *everything* there is to know about arguments for `git fetch` and `git push`, there's almost really nothing left to cover for git pull :)","","That's because git pull at the end of the day is *really* just shorthand for a fetch followed by merging in whatever was just fetched. You can think of it as running git fetch with the *same* arguments specified and then merging in *where* those commits ended up.","","This applies even when you use crazy-complicated arguments as well. Let's see some examples:"]}},{type:"ModalAlert",options:{markdowns:["Here are some equivalent commands in git:","","`git pull origin foo` is equal to:","","`git fetch origin foo; git merge o/foo`","","And...","","`git pull origin bar~1:bugFix` is equal to:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","See? git pull is really just shorthand for fetch + merge, and all git pull cares about is where the commits ended up (the `destination` argument that it figures out during fetch).","","Lets see a demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["If we specify the place to fetch, everything happens as before with fetch but we merge in whatever was just fetched."],afterMarkdowns:["See! by specifying `main` we downloaded commits onto `o/main` just as normal. Then we merged `o/main` to our currently checked out location which is *not* the local branch `main`. For this reason it can actually make sense to run git pull multiple times (with the same args) from different locations in order to update multiple branches."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Does it work with source and destination too? You bet! Let's see that:"],afterMarkdowns:["Wow, that's a TON in one command. We created a new branch locally named `foo`, downloaded commits from remote's main onto that branch `foo`, and then merged that branch into our currently checked out branch `bar`. It's over 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok to finish up, attain the state of the goal visualization. You'll need to download some commits, make some new branches, and merge those branches into other branches, but it shouldn't take many commands :P"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les arguments de git pull","","Maintenant que vous savez presque *tout* ce qu'il y a à savoir sur les arguments de `git fetch` et `git push`, il n'y a presque plus rien à vous apprendre sur git pull :)","","C'est parce que git pull est en fait *juste* un raccourci pour un fetch suivi d'un merge de tout ce qui vient d'être rapatrié. Vous pouvez vous représenter git pull comme un git fetch avec les *mêmes* arguments, suivi d'un merge qui aura lieu à l'endroit *exact* où ces commits seront arrivés.","","Cela fonctionne même quand vous utilisez des arguments très compliqués. Voyons quelques exemples :"]}},{type:"ModalAlert",options:{markdowns:["Voici quelques commandes équivalentes dans Git :","","`git pull origin foo` est équivalent à :","","`git fetch origin foo; git merge o/foo`","","Et :","","`git pull origin bar~1:bugFix` est équivalent à :","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Vous voyez ? git pull est au fond un simple un raccourci pour fetch + merge, et tout ce qui lui importe est la destination des commits (l'argument `destination` qu'il utilise durant le fetch).","","Voyons une démonstration :"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Si nous précisons l'emplacement à rapatrier tout se passe comme précédemment, avec fetch, mais en sus nous fusionnons tout ce qui a été rapatrié."],afterMarkdowns:["Vu ? En précisant `main` nous avons téléchargé les commits dans `o/main` comme d'habitude. Puis nous avons fusionné `o/main` avec là où nous sommes, *sans nous soucier* de la branche courante."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cela fonctionne-t-il aussi bien avec une source et une destination ? Et oui ! Voyons cela :"],afterMarkdowns:["Wow, INCROYABLE tout ce que nous avons fait en une commande. Nous avons créé une branche locale nommée `foo`, téléchargé les commits depuis la branche main distante dans `foo`, et ensuite fusionné cette branche dans notre branche actuelle de travail (checkoutée) `bar` !!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, pour finir ce niveau reproduisez l'état de la fenêtre Objectif. Vous aurez besoin de télécharger quelques commits, de créer des branches et de les fusionner dans d'autres branches, mais cela ne devrait pas utiliser trop de commandes :P"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de git pull","","Ahora que sabés prácticamente *todo* lo que hay que saber sobre los parámetros de `git fetch` y `git push`, casi que no queda nada para cubrir de git pull :)","","Eso es porque git pull es simplemente un atajo para hacer un fetch seguido de un merge. Podés pensarlo como correr git fetch con los *mismos* parámetros, y después mergear aquello a donde esos commits hayan ido a parar.","","Esto aplica incluso cuando usás parámetros hiper-rebuscados. 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 del que hacer fetch, todo ocurre como antes, pero sólo mergeamos lo que se fetcheó."],afterMarkdowns:["¡Ves! Especificando `main` bajamos los commits a `o/main` como siempre. Después mergeamos `o/main` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo."],command:"git pull origin main",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:["Wow, eso es un MONTÓN en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del main del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["OK: para terminar, alcanzá 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"]}}]},es_MX:{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 revisar del comando git pull :)","","Eso es porque, al final, 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 hacia donde esos commits hayan quedado.","","Esto aplica incluso cuando utilizas parámetros absurdamente complicados. 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 hacemos merge con lo que se obtuvo de fetch."],afterMarkdowns:["¡Ves! Especificando `main` descargamos los commits a `o/main` como siempre. Después hacemos merge de `o/main` a nuestra rama actual, la cual *no* es la rama local `main`. Por este motivo puede hacer sentido ejecutar git pull múltiples ocasiones (con los mismos argumentos) desde diferentes ubicaciones con el fin de actualizar múltiples ramas."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Esto también funciona especificando origen y destino? ¡Puedes apostarlo! Veámoslo:"],afterMarkdowns:["Increible, eso es MUCHISIMO en un único comando. Creamos una nueva rama local llamada `foo`, descargamos los commits del main remoto a la rama `foo`, y después hicimos merge esa rama a nuestra rama actual `bar`. ¡¡¡Su poder es de más de 8000!!!"],command:"git pull origin main: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 hacer merge de esas ramas junto con otras, pero no debería llevarte demasiados comandos :P"]}}]},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 `main` descargamos los commits a `o/main` como siempre. Después mergeamos `o/main` a nuestra rama actual, *sin importar* qué había en nuestra copia de trabajo."],command:"git pull origin main",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 main del remoto a esta rama `foo`, y después mezclamos esa rama a nuestra rama actual `bar`. ¡¡¡Supera los 9000!!!"],command:"git pull origin main: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:[{type:"ModalAlert",options:{markdowns:["## Parâmetros do git pull","","Agora que você sabe praticamente *tudo* que há para saber sobre parâmetros do `git fetch` e `git push`, não há praticamente nada a se abordar a respeito do git pull :)","","Isso é porque o git pull no final das contas é *realmente* apenas um atalho para um fetch seguido de um merge em seja lá o que acabou de ser baixado. Você pode pensar nele como rodar o git fetch recebendo os *mesmos* argumentos, seguido de um merge no lugar *onde* esses commits foram parar.","","Isso se aplica mesmo no caso de argumentos loucamente complicados. Vejamos alguns exemplos:"]}},{type:"ModalAlert",options:{markdowns:["Aqui estão alguns comandos que são equivalente para o Git:","","`git pull origin foo` é igual a:","","`git fetch origin foo; git merge o/foo`","","E...","","`git pull origin bar~1:bugFix` é igual a:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Viu? O git pull é realmente um atalho para fetch + merge, e tudo com o que o git pull se importa é com onde os commits foram parar (o parâmetro de `destino` que ele descobre durante o fetch).","","Vejamos uma demonstração:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Se especificarmos o lugar onde fazer o fetch, tudo acontece como antes com o fetch, mas fazemos o merge naquilo que acabou de ser baixado."],afterMarkdowns:["Veja! Especificando `main` nós baixamos commits em `o/main` como sempre. Então fizemos um merge de `o/main` com o lugar onde estamos, *independente* daquilo que está atualmente em checkout."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Isso também funciona com origem e destino especificados? Sim, você acertou! Vejamos:"],afterMarkdowns:["Wow, isso é MUITA coisa em um comando só. Nós criamos um novo ramo local chamado `foo`, baixamos commits do main remoto nesse ramo `foo`, e então fizemos um merge dele com o ramo atualmente em checkout, `bar`."],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, para terminar, obtenha o estado da visualização do objetivo. Você vai precisar baixar alguns commits, criar novos ramos, e fazer merge de ramos em outros ramos, mas não deve precisar de muitos comandos para isso :P"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de git pull","","Agora que sabes prácticamente *todo* o que hai que saber sobre os parámetros de `git fetch` e `git push`, casi que non queda nada para cubrir os de git pull :D","","Eso é porque git pull é sinxelamente un atallo para facer un fetch seguido dun merge. Podes pensalo como executar git fetch cos *mesmos* parámetros, e logo mesturar aquelo onde esos commits houberan ido ficar.","","Esto aplica incluso cando usas parámetros hiper-complexos. Vexamos algúns exemplos:"]}},{type:"ModalAlert",options:{markdowns:["Estos son algúns comandos equivalentes de git:","","`git pull origin foo` equivale a:","","`git fetch origin foo; git merge o/foo`","","E...","","`git pull origin bar~1:bugFix` equivale a:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","¿Ves? git pull é sinxelamente un atallo para un fetch + merge, e todo o que lle importa a git pull é ónde terminaron eses commits (o parámetro `destino` que indícase durante o fetch).","","Vexamos unha demostración:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Se especificamos o lugar do que facer o fetch, todo ocorre coma antes, pero só mesturamos o que se descargou."],afterMarkdowns:["¡Ves! Indicando `main` baixamos os commits á `o/main` coma sempre. Despois mesturamos `o/main` á nosa rama actual, *sen importar* qué tiñamos na nos copia de traballo."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Esto funciona co orixe e o destino, tamén? ¡Máis lle vale! Vexámolo:"],afterMarkdowns:["Wow, eso es unha CHEA nun único comando. Creamos unha nova rama local chamada `foo`, descargamos os commits do main do remoto a esta rama `foo`, e logo mesturamos esa rama á nosa rama actual `bar`. ¡¡¡Supera os 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["OK: para rematar, alcanza o estado do obxectivo. Vase necesitar descargar algúns commits, crear algunhas ramas novas, e mesturar esas ramas xunto con outras, pero non debería levar demasiados domandos :P"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git pull 的參數","","現在你已經知道關於 `git fetch` 以及 `git push` 的*任何參數*,但是我們還可以再聊聊 `git pull`:)","","那是因為 `git pull` 到目前為止*的確*只是表示 fetch 之後再 merge 所 fetch 的 commit,你可以把它想成,當使用 `git fetch` 時使用*一樣*的參數,之後再從 fetch 下來的 commit *所放置*的位置做 merge。","","這同樣也適用於當你指定相當複雜的參數,讓我們來看一些例子:"]}},{type:"ModalAlert",options:{markdowns:["對於 git 來說,有一些意義一樣的指令:","","`git pull origin foo` 相當於:","","`git fetch origin foo; git merge o/foo`","","而且...","","`git pull origin bar~1:bugFix` 相當於:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","看吧?`git pull` 真的就只是表示 fetch 跟 merge 的一個簡化後的指令,而且 `git pull` 所根據的是這些 commit 要放置的位置(在 fetch 的時候所指定的`destination`)。","","讓我們來看一個例子:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我們在 fetch 的時候有指定`位置`的話,跟之前一樣,fetch 所做的事情沒有變,但是我們會 merge 我們剛剛所 fetch 的該`位置`的commit。"],afterMarkdowns:["看吧!指定位置為 `main`,跟平常一樣,我們下載了 commit 並且放到 `o/main` 上,接著,我們會 merge `o/main` 到我們現在的位置,*不管*我們現在所 checkout 的位置在哪裡。"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["他是不是也可以同時指定 source 以及 destination?你說對了啦!讓我們來看一下:"],afterMarkdowns:["哇!這個指令強而有力,我們在 local 建立了一個新的 `foo` branch,下載了 remote 的 `main` 的 commit,並且放到 local 的 `foo` branch,之後 merge `foo` branch 到我們目前所 checkout 的 `bar` branch。這實在是太超過了!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,達到視覺化目標的要求,你需要下載一些 commit,建立一些新的 branch,並且 merge 這些 branch 到其他的 branch 上面,這個關卡不需要打太多的指令:P"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull 参数","","既然你已经掌握关于 `git fetch` 和 `git push` 参数的方方面面了,关于 git pull 几乎没有什么可以讲的了 :)","","因为 git pull 到头来就是 fetch 后跟 merge 的缩写。你可以理解为用同样的参数执行 git fetch,然后再 merge 你所抓取到的提交记录。","","还可以和其它更复杂的参数一起使用, 来看一些例子:"]}},{type:"ModalAlert",options:{markdowns:["以下命令在 Git 中是等效的:","","`git pull origin foo` 相当于:","","`git fetch origin foo; git merge o/foo`","","还有...","","`git pull origin bar~1:bugFix` 相当于:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","看到了? git pull 实际上就是 fetch + merge 的缩写, git pull 唯一关注的是提交最终合并到哪里(也就是为 git fetch 所提供的 destination 参数)","","一起来看个例子吧:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果我们指定要抓取的 place,所有的事情都会跟之前一样发生,只是增加了 merge 操作"],afterMarkdowns:["看到了吧! 通过指定 `main` 我们更新了 `o/main`。然后将 `o/main` merge 到我们的所在的分支,**无论**我们当前所在的位置是哪。"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["pull 也可以用 source:destination 吗? 当然喽, 看看吧:"],afterMarkdowns:[" 哇, 这个命令做的事情真多。它先在本地创建了一个叫 `foo` 的分支,从远程仓库中的 main 分支中下载提交记录,并合并到 `foo`,然后再 merge 到我们的当前所在的分支 `bar` 上。操作够多的吧?!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["好啦, 该结束了!请按照目标窗口中的状态进行操作。你需要下载一些提交,然后创建一些新分支,再合并这些分支到其它分支, 但这用不了几个命令 :P "]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Optionen für Git Pull","","Da du jetzt so ziemlich *alles* kennst, was es an Optionen für `git fetch` und `git push` gibt, ist kaum noch etwas zu Optionen für `git pull` zu sagen. :)","","Das liegt daran, dass `git pull` letztendlich *wirklich* nur eine Abkürzung für `fetch` gefolgt von einem `merge` von dem, was auch immer gerade heruntergeladen wurde, ist. Denk es dir als ein `git fetch` mit denselben Optionen und einem anschließenden Merge.","","Das trifft sogar zu, wenn du völlig abgedrehte Optionen verwendest. Ein paar Beispiele:"]}},{type:"ModalAlert",options:{markdowns:["Hier sind einige gleichwertige Befehle in Git:","","`git pull origin foo` ist dasselbe wie:","","`git fetch origin foo; git merge o/foo`","","Und ...","","`git pull origin bar~1:bugFix` ist dasselbe wie:","","`git fetch origin bar~1:bugFix; git merge bugFix`","",'Siehst du? `git pull` ist wirklich nur eine Abkürzung von `fetch` + `merge` und es interessiert sich nur dafür, wo die Commits hin sollen (die "Ziel"-Option, die es beim `fetch` auswertet).',"","Schauen wir uns eine Demonstration an:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wenn wir den Ort, auf den das `fetch` ausgeführt werden soll, angeben, passiert alles so wie beim `git fetch`, aber es wird direkt danach auch ein Merge ausgeführt."],afterMarkdowns:["Siehst du? Da wir `main` angegeben haben, sind die Commits in `o/main` heruntergeladen worden. Danach wurde `o/main` gemerged, egal was gerade ausgecheckt war."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Funktioniert das auch wenn man Quelle und Ziel angibt? Aber sicher! Das sehen wir hier:"],afterMarkdowns:["Wow, das ist eine Menge in einem einzelnen Befehl. Wir haben lokal einen neuen Branch namens `foo` erstellt, die Commits vom `main` des Servers dorthin heruntergeladen und ihn danach in unseren aktuell ausgecheckten Branch `bar` gemerged."],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, um's zu Ende zu bringen versuch das Ziel aus der Zielgrafik zu erreichen. Du wirst einige Commits herunterladen, einige neue Branches anlegen und diese in andere mergen müssen, aber das sollte nicht allzu viele Befehle benötigen. :P"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Pullの引数","","`git fetch`と`git pull`の引数について学んできたので、`git pull`について新しく学ばないといけないことは殆ど残っていません!","","なぜなら、実は`git pull`はfetchした後に、fetchしたコミットをマージするための省略形だからです!","","これはとても複雑な引数を与えた場合でも変わりません。いくつか、例を見てみましょう!"]}},{type:"ModalAlert",options:{markdowns:["ここでは同等の働きをするコマンドを紹介します。","","`git pull origin foo` は次のコマンドと同じ働きをします。","","`git fetch origin foo; git merge o/foo`","","他にも...","","`git pull origin bar~1:bugFix` は次のコマンドと同じ働きをします。","","`git fetch origin bar~1:bugFix; git merge bugFix`","","ご覧の通り、`git pull`は単なるfetch + mergeの略語であり、git pullが必要とするのはコミットがどこへ行くのか(fetchにおける``)だけなのです。","","デモを見ていきましょう!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["fetchする場所を指定すると"],afterMarkdowns:["ご覧ください!`main`を指定することで、`o/main`にコミットをダウンロードしてきました。そして`o/main`を現在チェックアウトしている場所にマージしましたが、これはローカルの`main`ブランチではありません。","","このような挙動をするので、複数のブランチを更新するためには異なる場所(かつ同じ引数)で`git pull`を実行しなければいけません。"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["``と``にも対応しているかですって?","","その通りです。実際に見ていきましょう!"],afterMarkdowns:["ひとつのコマンドで実に大量の操作を行っていますね!","ローカルに`foo`ブランチを作成し、リモート上の`main`から`foo`ブランチにコミットをダウンロードして、そのブランチを今、チェックアウトしている`bar`ブランチにmergeしました!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["示されているゴールの状態になるように頑張ってください!","","コミットをいくつかfetchして新しいブランチを作成し、それらのブランチを他のブランチにmergeする必要があります。","","しかし、それほど多くのコマンドは必要ありません!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументы для pull","","Аргументы для `git pull` не покажутся вам чем-то новым, учитывая, что вы уже знакомы с аргументами для `git fetch` и `git push` :)","","Как мы помним, `git pull` сначала выполняет `git fetch`, а следом сразу `git merge` с той веткой, в которую притянулись обновления командой fetch. Другими словами, это все равно, что выполнить git fetch с теми же аргументами, которые вы указали для pull, а затем выполнить git merge с веткой, указанной в аргументе <приемник> команды pull.","","Рассмотрим на примерах:"]}},{type:"ModalAlert",options:{markdowns:["Вот примеры абсолютно эквивалентных команд в git:","","`git pull origin foo` это то же самое, что сделать:","","`git fetch origin foo; git merge o/foo`","","И еще...","","`git pull origin bar~1:bugFix` то же, что:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Как видно, git pull используется, чтобы за одну команду выполнить fetch + merge.","","Посмотрим демонстрацию:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Здесь сначала выполнится fetch с аргументом указанным к pull, а merge выполняется с теми изменениями, которые будут скачаны командой fetch."],afterMarkdowns:["Как видно, мы указали `main`, поэтому как обычно все обновления притянулись на ветку `o/main`. Затем мы слили (merge) обновленную ветку `o/main` с веткой, на которой мы находимся."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Будет ли это работать, если указать `<источник>` и `<приемник>`? Проверим:"],afterMarkdowns:["Ого, сколько всего выполнено всего одной командой!. Мы создали новую ветку `foo` в локальном репозитории, скачали на неё изменения с ветки `main` удаленного репозитория, а затем слили эту ветку с веткой `bar`, на которой мы находились!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["В последнем упражнении необходимо привести дерево к аналогичному в примере. Нужно скачать несколько изменений, создать несколько новых веток, слить одни ветки в другие, но постарайтесь использовать как можно меньше команд. Удачи! :P"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull의 인자들","","`git fetch`와 `git push`의 인자들을 다 알았기 때문에, git pull에서 더 설명할게 사실 없습니다 :)","","git pull은 결국 merge가 따라오는 fetch 그 자체이기 때문이죠. git fetch와 *같은* 인자를 사용하며 커밋들을 *어디*로 merge되는지 알면 됩니다.","","정신나간것마냥-복잡한 인자들도 기본적으로는 똑같다고 보면 됩니다. 예시를 살펴봅시다:"]}},{type:"ModalAlert",options:{markdowns:["git에서 다음 명령어들은 같습니다:","","`git pull origin foo` 는 다음과 같습니다:","","`git fetch origin foo; git merge o/foo`","","그리고...","","`git pull origin bar~1:bugFix` 는 다음과 같습니다:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","보이죠? git pull은 그저 fetch + merge의 축약형일 뿐이에요, 그리고 git pull은 커밋들이 도착하는곳을 신경씁니다(fetch를 하며 지정된 `destination`인자의 위치로 merge가 수행됩니다).","","직접 확인해봅시다:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["place를 지정하면, 이전에 fetch를 하던때와 완전히 똑같이 진행되고 fetch한것을 병합합니다."],afterMarkdowns:["보이죠! `main`를 지정해서 우리는 `o/main`에 평소처럼 커밋들을 내려받았습니다. 그다음 우리가 있는 곳으로 `o/main`를 병합했습니다 현재 체크아웃된 브랜치와 *상관없이* 말이죠"],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["source 와 destination 모두 적용될까요? 추측해보세요! 확인해봅시다:"],afterMarkdowns:["이야, 명령어 하나에 많은게 일어나고있습니다. 로컬에 이름이 `foo`인 새 브랜치를 만들고, 원격 저장소의 main에서 이 브랜치 `foo`에 커밋들을 내려받습니다, 그후 그 브랜치를 우리가 현재 체크아웃한 브랜치 `bar`로 병합했습니다. 오오오!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["좋습니다 마무리하기 위해, 골 시각화와 같은 상태로 만들어 주세요. 커밋을 내려받고, 새 브랜치를 만들고, 그 브랜치들을 다른 브랜치로 병합해야 될겁니다, 하지만 명령어는 그렇게 많이 안써도 되죠 :P"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументи git pull","","Зараз, коли ти знаєш майже *все*, що можна знати про аргументи для `git fetch` і `git push`, дійсно майже нема чого розповідати про git pull :)","","Це тому, що git pull, зрештою, *просто* зручне об'єднання fetch і merge. Його можна собі уявляти як git fetch і git merge виконані з *однаковими* аргументами.","","Це працює незалежно від складності переданих аргументів. Розгляньмо:"]}},{type:"ModalAlert",options:{markdowns:["Ось декілька еквівалентних команд git:","","`git pull origin foo` це те саме, що й:","","`git fetch origin foo; git merge o/foo`","","А...","","`git pull origin bar~1:bugFix` -- це аналог:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Бачиш? git pull -- це просто зручне скорочення для fetch + merge. А все, про що дбає git pull -- це те, куди в результаті підуть коміти (а про це йому говорить аргумент `destination`).","","Розгляньмо демонстрацію:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Якщо ми вказуємо місце призначення для fetch, fetch виконується як звичайно, але мердж відбудеться з тим, що ми щойно стягнули"],afterMarkdowns:["От бачиш, вказавши `main`, ми звантажили коміти в `o/main`, як завжди. Потім змерджили `o/main` в поточну гілку."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Чи це працює також при вказанні `source` і `destination`? І не сумнівайся! Ось приклад:"],afterMarkdowns:["Ого, стільки роботи однією командою. Ми створили локальну гілку з назвою `foo`, звантажили в неї коміти з віддаленого main, а потім змерджили `foo` в поточну гілку `bar`!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Добре, для завершення спробуй досягти стану репозиторію, показаного на візуалізації. Треба буде звантажити відсутні коміти, створити нові гілки і змерджити їх в інші гілки, але не надто великою кількістю команд! :P"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham số git pull","","Giờ thì bạn đã biết gần như là *tất cả* về tham số của `git fetch` và `git push`, thế thì hầu như chẳng còn gì mới cho git pull cả :)","","Đó và vì nói cho cùng thì git pull *về thực tế* cũng chỉ là lệnh tắt cho tìm nạp và sau đó là hợp nhất những gì vừa mới được nạp. Bạn có thể coi nó như là chạy lệnh git fetch với *cùng* tham số được chỉ định và sau đó hợp nhất các commit vào *nơi* được chỉ định.","","Điều này được áp dụng kể cả khi bạn sử dụng những tham số phức tạp đến độ điên rồ. Hãy xem qua một vài ví dụ:"]}},{type:"ModalAlert",options:{markdowns:["Dưới đây là một vài câu lệnh tương đồng nhau trong Git:","","`git pull origin foo` tương đương với:","","`git fetch origin foo; git merge o/foo`","","Và...","","`git pull origin bar~1:bugFix` tương đương với:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Thấy chứ? git pull thực ra chỉ là lệnh tắt cho fetch + merge, và tất cả những gì git pull quan tâm là nơi mà các commit sẽ tới (tham số `đích` mà nó diễn giải được trong quá trình nạp).","","Hãy xem qua một bản giới thiệu:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu ta chỉ định vị trí để nạp, mọi thứ diễn ra như với git fetch nhưng giờ đây có thêm một bước đó là ta hợp nhất những gì mà ta đã nạp"],afterMarkdowns:["Thấy chứ! Bằng cách chỉ định nhánh `main` ta tải các commit xuống nhánh `o/main` như thường lệ. Sau đó hợp nhất nhánh `o/main` vào nhánh cục bộ mà ta đang đứng, nhánh mà *không phải* nhánh cục bộ `main`. Nhờ vậy mà ta có thể chạy cùng một lệnh git pull (với cùng tham số) nhiều lần ở những vị trí khác nhau để áp dụng cùng cập nhật lên các nhánh khác nhau."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Điều này có hoạt động với đích và nguồn không? Đoán đúng rồi đấy! Cùng xem thử nào:"],afterMarkdowns:["Wao, quá NHIỀU trong một câu lệnh. Ta tạo ra một nhánh cục bộ là `foo`, tải commit xuống từ nhánh từ xa main xuống nhánh `foo` đó, và sau đó hợp nhất commit vào nhánh `bar` mà ta đang đứng. Đủ thứ luôn!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Được rồi, để kết thúc khóa học, hãy đạt đến mục tiêu được mô tả. Bạn sẽ cần tải xuống vài commit, tạo ra vài nhánh mới, và hợp nhất những nhánh đó sang những nhánh khác, nhưng mà đừng dùng nhiều lệnh quá nhé :P"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pull argumenti","","Sedaj, ko veš praktično *vse*, kar je za vedeti o argumentih za `git fetch` in `git push`, ni skoraj ničesar za dodati za `git pull` :)","","To je zato, ker je git pull konec koncev *res* samo bližnjica za fetch, ki mu sledi merge tega, kar smo fetchali. Predstavljaš si ga lahko kot ukaz git fetch z *istimi* podanimi argumenti in merganjem, *kjer* bodo tisti commiti končali.","","To velja tudi takrat, ko uporabiš noro komplicirane argumente. Poglejmo nekaj primerov:"]}},{type:"ModalAlert",options:{markdowns:["Tu je nekaj ukazov v gitu:","","`git pull origin foo` je enak:","","`git fetch origin foo; git merge o/foo`","","In ...","","`git pull origin bar~1:bugFix` je enak:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Vidiš? Git pull je res bližnjica za fetch + merge. Vse kar zanima git pull je, kje bodo commiti končali (`ciljni` argument, ki ga ugotovi med fetchem).","","Poglejmo primer:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Če določimo mesto za fetchanje, se zgodi vse kot prej s fetchem, ampak tudi zmergamo, kar smo pravkar fetchali."],afterMarkdowns:["Vidiš! Z določitvijo `main` smo prenesli commite na `o/main` kot ponavadi. Potem smo zmergali `o/main` v našo trenutno checkoutano lokacijo, ki *ni* lokalni branch `main`. Zaradi tega razloga je morda celo logično, da izvedemo git pull večkrat (z istimi argumenti) iz drugi lokacij, da posodobimo več branchev."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ali deluje tudi z izvorom in ciljem? Itak! Poglejmo to:"],afterMarkdowns:["Wow, to je pa RES veliko v enem ukazu. Naredili smo nov lokalen branch imenovan `foo`, prenesli commite iz oddaljenega masterja na ta branch `foo` in potem zmergali ta branch v naš trenutno checkoutan branch `bar`. Je več kot 9000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, da zaključiš, pridi v stanje iz ciljne vizualizacije. Prenesti boš moral nekaj commitov, narediti nekaj novih branchev in zmergati te branche v druge branche, ampak ne bi smelo zahtevati veliko ukazov. :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argumenty git pull","","Teraz, kiedy wiesz już właściwie *wszystko*, co można wiedzieć o argumentach `git fetch` oraz `git push`, naprawdę nie zostało już prawie nic do omówienia przy `git pull` :)","","To dlatego, że w zasadzie `git pull` to *naprawdę* tylko skrót polecenia fetch i scalania wszystkiego, co zostało nim pobrane. Możesz to sobie wyobrazić jako uruchomienie `git fetch` z określonymi *tymi samymi* argumentami, a potem scalenie pobranych commitów *tam*, dokąd trafiły.","","I działa to w ten sposób, nawet jeśli określisz kompletnie szalone argumenty. Zobaczmy kilka przykładów:"]}},{type:"ModalAlert",options:{markdowns:["Oto kilka równoważnych poleceń w Gicie:","","`git pull origin foo` nie różni się od:","","`git fetch origin foo; git merge o/foo`","","A...","","`git pull origin bar~1:bugFix` daje taki sam efekt jak:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Widzisz? Polecenie `git pull` to naprawdę tylko skrót dla fetch + merge i jedyne, co się liczy dla `git pull`, to gdzie trafią commity (argument `celu`, który Git zinterpretuje sobie, wykonując fetch).","","Zobaczmy demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Jeśli określimy dla fetch miejsce, to wszystko potoczy się tak jak wcześniej, ale scalimy wszystko, co zostało pobrane przez fetch."],afterMarkdowns:["Zobacz! Określając `main`, pobraliśmy commity do `o/main` tak jak zawsze. Potem scaliliśmy `o/main` z aktualnie wybranym miejscem, którym *nie* jest lokalna gałąź `main`. Właśnie z tego powodu może mieć sens wykonanie git pull wiele razy (z tymi samymi argumentami) z różnych lokalizacji, aby zaktualizować wiele gałęzi."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Czy w przypadku źródła i celu będzie tak samo? Jasne, że tak! Zobaczmy:"],afterMarkdowns:["No nieźle, jedno polecenie, a tyle się dzieje. Stworzyliśmy nową lokalną gałąź `foo`, pobraliśmy commity ze zdalnej gałęzi `main` do `foo`, a potem jeszcze scaliliśmy ją z aktualnie wybraną gałęzią `bar`. Grubo ponad osiem tysięcy!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Oki, żeby ukończyć poziom, doprowadź drzewo do takiego stanu jak na wizualizacji. Musisz pobrać parę commitów, stworzyć kilka gałęzi i scalić je z innymi, ale nie powinno to wymagać zbyt wielu poleceń :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parametri di git pull","","Ora che conosci praticamente *tutto* quello che c'è da sapere sui parametri per `git fetch` e `git push`, non è rimasto quasi nulla di cui parlare per git pull :)","","Questo perché git pull alla fine non è altro che una scorciatoia per un fetch seguito dalla fusione verso ciò che è stato appena recuperato. Puoi vederlo come eseguire git fetch con gli *stessi* parametri specificati e poi eseguire una fusione *dove* i commit reucperati sono finiti.","","Ciò è valido anche quando vengono usati dei parametri incredibilmente complessi. Vediamo qualche esempio:"]}},{type:"ModalAlert",options:{markdowns:["Ecco alcuni comandi equivalenti in git:","","`git pull origin foo` è equivalente a:","","`git fetch origin foo; git merge o/foo`","","E...","","`git pull origin bar~1:bugFix` è equivalente a:","","`git fetch origin bar~1:bugFix; git merge bugFix`","","Visto? git pull non è altro che una scorciatoia per fetch + merge, e l'unica cosa che interessa a quel comando è la posizione d'arrivo dei commit (il parametro `destination` specificato durante il fetch).","","Vediamo una demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Se specifichiamo il luogo da cui vogliamo recuperare i dati, l'unico cambiamento rispetto alla lezione precedente consiste nella fusione con ciò che è stato appena recuperato."],afterMarkdowns:["Visto! specificando `main` abbiamo scaricato i commit sul ramo `o/main` come sempre. Poi abbiamo fuso `o/main` con il ramo sul quale stavamo lavorando attualmente, il quale *non* è il ramo `main` locale. Per questo motivo può avere effettivamente senso eseguire più volte git pull (con gli stessi parametri) da posizioni differenti per aggiornare così più rami."],command:"git pull origin main",beforeCommand:"git clone; go -b bar; git commit; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Funziona anche con source e destination? Ci puoi scommettere! Vediamolo all'opera:"],afterMarkdowns:["Wow, è tantissimo per un comando solo! Abbiamo creato un nuovo ramo locale chiamato `foo`, scaricato i commit dal main remoto sul nuovo ramo `foo`, e poi fuso quel ramo con `bar`, quello sul quale stavamo lavorando attualmente. È oltre gli 8000!!!"],command:"git pull origin main:foo",beforeCommand:"git clone; git fakeTeamwork; go -b bar; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok per concludere, raggiungi lo stato mostrato nella finestra dell'obiettivo. Dovrai scaricare alcuni commit, creare alcuni rami, e fondere quei rami in altri rami, ma senza usare troppi comandi :P"]}}]}}}},{}],148:[function(e,t,o){o.level={disabledMap:{"git fakeTeamwork":!0},goalTreeString:'{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C3","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C3","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C2"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git commit;git commit;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"tags":{},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Git Pushin'",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",ja:"Git Push",fr_FR:"Git push",ru_RU:"Git push",uk:"Git push",ko:"Git push",vi:"Git push",sl_SI:"Git Push",pl:"Git push",it_IT:"Git Push",tr_TR:"Git Push"},hint:{en_US:"Remember you have to clone before you can push!",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する必要があるのをお忘れなく",fr_FR:"Rappelez-vous que vous devez cloner avant de pouvoir faire un push !",ru_RU:"Помните, что прежде чем push-ить вам нужно склонировать репозиторий!",uk:"Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!",ko:"push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!",vi:"Nhớ rằng bạn phải clone trước khi push!",sl_SI:"Najprej moraš klonirati, preden lahko pushaš!",pl:"Najpierw sklonuj, potem pushuj!",it_IT:"Ricorda di clonare il repository prima di usare push!",tr_TR:"Unutmayın push işlemini yapmadan önce clone işlemini yapmanız gerekiyor!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, so I've fetched changes from remote and incorporated them into my work locally. That's great and all... but how do I share _my_ awesome work with everyone else?","","Well, the way to upload shared work is the opposite of downloading shared work. And what's the opposite of `git pull`? `git push`!","","`git push` is responsible for uploading _your_ changes to a specified remote and updating that remote to incorporate your new commits. Once `git push` completes, all your friends can then download your work from the remote.","",'You can think of `git push` as a command to "publish" your work. It has a bunch of subtleties that we will get into shortly, but let\'s start with baby steps...',"","*note -- the behavior of `git push` with no arguments varies depending on one of git's settings called `push.default`. The default value for this setting depends on the version of git you're using, but we are going to use the `upstream` value in our lessons. This isn't a huge deal, but it's worth checking your settings before pushing in your own projects.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have some changes that the remote does not have. Let's upload them!"],afterMarkdowns:["There we go -- the remote received commit `C2`, the branch `main` on the remote was updated to point at `C2`, and our *own* reflection of the remote (`o/main`) was updated as well. Everything is in sync!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["To finish this level, simply share two new commits with the remote. Strap in though, because these lessons are about to get a lot harder!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, donc j'ai rapatrié les changements du dépôt distant et je les ai incorporés dans mon travail local. C'est super... mais comment je partage _mon_ travail génial avec tous les autres ?","","En fait, la manière d'envoyer du travail à partager fonctionne à l'opposé du téléchargement de travail partagé. Et quel est l'opposé de `git pull` (tire) ? `git push` (pousse) !","","`git push` est responsable de l'envoi de _vos_ changements vers un dépôt distant et de la mise à jour de ce dépôt pour incorporer vos commits. Une fois `git push` terminé, tous vos amis peuvent télécharger votre travail depuis le dépôt distant.","",'Vous pouvez voir `git push` comme une commande qui "publie" votre travail. Elle présente quelques subtilités que nous allons voir rapidement, mais commençons par le B.A.-BA...',"","*Note : le comportement de `git push` avec aucun argument varie selon l'un des réglages de configuration de Git nommé `push.default`. La valeur par défaut de ce réglage dépend de la version de Git utilisée, mais nous allons utiliser la valeur `upstream` dans nos leçons. Cela ne change pas grand chose pour ces exercices, mais vérifiez tout de même vos réglages avant de pusher vos propres projets.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nous avons fait ici quelques changements que le dépôt distant n'a pas. Envoyons-les !"],afterMarkdowns:["Et voilà : le dépôt distant a reçu le commit `C2`, la branche `main` a été mise à jour sur `C2`, et votre *propre* représentation de la branche distante (`o/main`) a aussi été mise à jour. Tout est synchronisé !"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, partagez simplement deux nouveaux commits avec le dépôt distant. Accrochez-vous, parce que ces leçons vont devenir beaucoup plus difficiles !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## git push","","Ok, entonces ya bajé los cambios de un repositorio remoto y los integré en mi trabajo localmente. Esto es genial y todo... 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, cualquiera puede descargar tu trabajo del remoto.","",'Podés pensar en `git push` como un comando para "publicar" tu trabajo. Tiene un par de sutilezas con las que vamos a meternos pronto, pero empecemos de a poco.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Acá tenemos algunos cambios que nuestro remoto no tiene. ¡Subámoslos!"],afterMarkdowns:["Ahí está: el remoto recibió el commit `C2`, la rama `main` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/main`) 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 compartí dos nuevos commits con el remoto. Igual, no te confíes, ¡ya se van a complicar las lecciones!"]}}]},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 `main` de ese remoto se actualizó para apuntar a `C2`, y nuestro *propio* reflejo del remoto (`o/main`) 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:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, então vimos como baixar mudanças do repositório remoto e incorporá-las à árvore local. Isso é ótimo e tal... mas como eu faço para compartilhar o _meu_ trabalho sensacional com as outras pessoas?","","Bem, a forma de subir trabalho a ser compartilhado é a oposta daquela de baixar trabalho que foi compartilhado. E qual o oposto de `git pull` (puxar)? É `git push` (empurrar)!","","O `git push` é responsável por subir as _suas_ mudanças para um repositório remoto especificado, e atualizar esse remoto para incorporar seus novos commits. Uma vez que o `git push` se completa, todos os seus amigos podem baixar o seu trabalho do repositório remoto.","",'Você pode pensar no `git push` como um comando para "publicar" o seu trabalho. Ele tem uma série de nuances que vamos abordar em breve, mas comecemos com passos curtos...',"","*Nota -- o comportamento de `git push` sem argumentos varia dependendo da configuração `push.default` do Git. O valor padrão para essa configuração depende da versão do Git que você estiver usando, mas vamos assumir o valor `upstream` nestas lições. Isso não é um grande problema, mas vale a pena verificar suas configurações antes de fazer push nos seus próprios projetos.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aqui temos algumas mudanças que o repositório remoto não contém. Vamos subi-las!"],afterMarkdowns:["Aqui vamos nós -- o repositório remoto recebeu o commit `C2`, o ramo `main` no repositório remoto foi atualizado para apontar para `C2`, e a *nossa* reflexão do remoto (`o/main`) foi atualizada também. Está tudo sincronizado!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, simplesmente compartilhe dois novos commits com o repositório remoto. No entanto, segure-se no seu assento, pois estas lições estão prestes a ficar mais difíceis!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, entón xa baixamos os cambios dun repositorio remoto e integrámolos na árbore local. Esto está xenial... pero ¿cómo comparto o _meu_ sensacional traballo cas outras persoas?","","Ben, a forma de subir traballo para ser compartido é a oposta daquela de baixar o traballo que foi compartido. E ¿qué é o oposto a `git pull` (tirar)? ¡É `git push` (empuxar)!","","`git push` é o responsable de subilos _teus_ cambios para un repositorio remoto especificado, e atualizar ese repositorio remoto para incorporar os seus novos commits. Unha vez que `git push` complétase, todos os teus amigos poderán baixar o teu traballo do repositorio remoto.","",'Podes pensar en `git push` como un comando para "publicar" o teu traballo. O comando ten unha serie de detalles cos que imos xogar logo, pero comezemos con pasos curtos...',"","*Nota -- o comportamento de `git push` sen argumentos varía dependendo da configuración `push.default` de Git. O valor para esa configuración depende da versión de Git que esteas empregando, pero imos asumir o valor `upstream` nestas leccións. Eso non é un gran problema, pero paga a pena verificalas súas configuracións antes de facer push nos teus propios proxectos.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Aquí temos algúns cambios que o repositorio remoto non contén. ¡Imos subilas!"],afterMarkdowns:["Ahí imos -- o repositorio remoto recibiu o commit `C2`, a rama `main` do repositorio remoto foi actualizado para apuntar para `C2`, e o *noso* reflexo do remoto (`o/main`) foi atualizado tamén. ¡Está todo sincronizado!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, comparte dous novos commits co repositorio remoto. Igual, non te confíes, ¡xa se complicará nas seguintes leccións!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","ok,現在我已經從 remote 下載了一些更新,並且把它們 merge 到我的 local 上面的 branch,這聽起來實在太讚了...,但是我要如何分享 _我_ 所做的更新給其它人呢?","","喔,其實上傳並且分享更新跟下載更新並且 merge 是相反的兩件事情,那什麼是 `git pull` 的相反呢? 那就是 `git push`!","","`git push` 負責上傳 _你的_ commit 到特定 remote 上面並且做出相對應的更新,只要做完了 `git push`,所有你的朋友都可以從 remote 上面下載你所送出去的 commit。","",'你可以把 `git push` 當作是一個"發佈"你的工作進度的指令,還有一些我們即將要講到的細節,但是先讓我們從一些簡單的步驟開始。']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["這裡我們有了一些 remote 所沒有的 commit。讓我們來上傳它們吧!"],afterMarkdowns:["我說的沒錯吧!remote 收到了 commit `C2`,同時在 remote 上的 `main` branch 也一起更新並且指向 `C2`,同時我們*自己的* `o/main` 也一併更新了!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成這個關卡,只要上傳兩個新的 commit 給 remote,不要太得意忘形喔!因為這些課程將會愈來愈難!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","OK,我们已经学过了如何从远程仓库获取更新并合并到本地的分支当中。这非常棒……但是我如何与大家分享**我的**成果呢?","","嗯,上传自己分享内容与下载他人的分享刚好相反,那与 `git pull` 相反的命令是什么呢?`git push`!","","`git push` 负责将**你的**变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。一旦 `git push` 完成, 你的朋友们就可以从这个远程仓库下载你分享的成果了!","","你可以将 `git push` 想象成发布你成果的命令。它有许多应用技巧,稍后我们会了解到,但是咱们还是先从基础的开始吧……","","*注意 —— `git push` 不带任何参数时的行为与 Git 的一个名为 `push.default` 的配置有关。它的默认值取决于你正使用的 Git 的版本,但是在教程中我们使用的是 `upstream`。","这没什么太大的影响,但是在你的项目中进行推送之前,最好检查一下这个配置。*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["这里我们准备了一些远程仓库中没有的提交记录, 咱们开始先上传吧!"],afterMarkdowns:["过去了, 远程仓库接收了 `C2`,远程仓库中的 `main` 分支也被更新到指向 `C2` 了,我们的远程分支 (o/main) 也同样被更新了。所有的分支都同步了!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["要完成本关,需要向远程仓库分享两个提交记录。拿出十二分精神吧,后面的课程还会更难哦!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Nun hab ich also Änderungen vom entfernten Server geholt und in meine lokale Arbeit integriert. Das ist schön und gut ... aber wie teile ich _meine_ Wahnsinns-Entwicklungen mit allen anderen?","","Naja, das Hochladen von Zeug ist das Gegenteil zum Herunterladen von Zeug. Und was ist das Gegenteil von `git pull`? Genau, `git push`!","","`git push` ist dafür verantwortlich _deine_ Änderungen zu einem bestimmten entfernten Server hochzuladen und dort zu integrieren. Sobald das `git push` durch ist, können alle deine Freunde diese Änderungen zu sich herunterladen.","",'Du kannst dir `git push` als einen Befehl zum "Veröffentlichen" deiner Arbeit vorstellen. Es gibt da noch ein paar Feinheiten, aber lass uns mal mit kleinen Schritten anfangen.']}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hier haben wir ein paar Änderungen, die auf dem Remote noch fehlen. Und hoch damit!"],afterMarkdowns:["Na bitte -- das Remote hat den Commit `C2` bekommen, der `main` auf dem Remote ist entsprechend aktualisiert worden und unsere *eigene* Abbildung des `main` auf dem Remote namens `o/main` wurde auch aktualisiert. Alles im Lot!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu schaffen musst du einfach nur zwei neue Commits auf das Remote bringen. Aber stell dich schon mal darauf ein, dass die nächsten Level anspruchsvoller werden!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Хорошо, мы скачали изменения с удалённого репозитория и включили их в наши локальные наработки. Всё это замечательно, но как нам поделиться _своими_ наработками и изменениями с другими участниками проекта?","","Способ, которым мы воспользуемся, является противоположным тому способу, которым мы пользовались ранее для скачивания наработок (`git pull`). Этот способ - использование команды `git push`!","","Команда `git push` отвечает за загрузку _ваших_ изменений в указанный удалённый репозиторий, а также включение ваших коммитов в состав удалённого репозитория. По окончании работы команды `git push` все ваши друзья смогут скачать себе все сделанные вами наработки.","",'Вы можете рассматривать команду `git push` как "публикацию" своей работы. Эта команда скрывает в себе множество тонкостей и нюансов, с которыми мы познакомимся в ближайшее время, а пока что давайте начнём с малого...',"","*замечание - поведение команды `git push` без аргументов варьируется в зависимости от значения `push.default`, указанной в настройках git-а. Значение по умолчанию зависит от версии git, которую вы используете, однако в наших уроках мы будем использовать значение `upstream`. Лучше всегда проверять эту опцию прежде чем push-ить ваши настоящие проекты.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Здесь у нас имеются изменения, которых нет в удалённом репозитории. Давайте же закачаем их туда!"],afterMarkdowns:["Вот так - удалённый репозиторий получил новый коммит `C2`, ветка `main` на удалённом репозитории теперь указывает на `C2`, и наше *собственное* локальное отображение удалённого репозитория (`o/main`) изменилось соответственно. Всё синхронизировалось!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Чтобы выполнить задачу этого упражнения, просто поделитесь своими двумя новыми коммитами с удалённым репозиторием. Соберитесь, потому что все последующие уроки будут намного сложнее предыдущих!"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","さて、私たちは変更をリモートからダウンロードしてきて、ローカルの自分の作業に取り込むことができるようになりました。それは素晴らしいことですが、例えば他の誰かに_自分の_作業を共有する場合はどうすればいいでしょう?","","そうですね、共有する作業をアップロードする方法は作業をダウンロードするものと対照的です。`git pull`の反対はなんでしょう? `git push`です!","","`git push`は_あなたの_変更をリモートに対話的にアップロードし、リモートにあなたの新しい変更を取り込みます。`git push`が完了すれば、全ての友人たちがあなたの作業をリモートからダウンロードすることができます。","","`git push`は、あなたの作業を「公開する」コマンドと考えることができます。このコマンドは微妙な点をいくつか持っていますが、とりあえずは初歩から始めてみましょう。。。","","*注:引数なしの`git push`の挙動は、`push.default`と呼ばれるgitの設定値によって異なります。この設定のデフォルト値は、使用しているgitのバージョンに依存しますが、私たちのレッスンでは`upstream`という値を使用します。これはあまり大きな問題ではありませんが、あなたのプロジェクトにプッシュする前にあなたのgitの設定を確認する価値はあるでしょう。*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["ここにリモートにはないいくつかの変更点があります。これをアップロードしてみましょう!"],afterMarkdowns:["さて、いってみましょう -- リモートはコミット`C2`を受け取り、リモート上の`main`ブランチは`C2`の位置に更新され、私たち*自身*のリモートブランチ(`o/main`)も良い具合に更新されました。全てが同期されました!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルを終えるには、単純に二つの新しいコミットをリモートに共有してください。けれども覚悟しておいてください。なぜなら、レッスンは少々難しいことを取り扱っているからです。"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Гаразд, я витягнув останні зміни та інтегрував їх до своїх локальних напрацювань. Все добре... але як мені поділится _своїми_ змінами з рештою учасників?","","Отже, надсилання данних є, по-суті, протилежним звантажуванню данних. А який антонім до `git pull` (притягнути)? `git push` (відштовхнути)!","","`git push` використовується для надсилання _локальних_ змін на вказаний віддалений репозиторій; ця команда оновлює віддалений репозиторій, інтегруючи нові коміти. Після виконання `git push` всі твої друзі зможуть звантажити твої напрацювання з віддаленого сховища.","",'Ти можеш вважати, що `git push` "публікує" твої напрацювання. В цієї команди є кілька особливостей, які ми скоро розглянемо, але почнімо з початку...',"","*Зауваження: поведінка `git push` без параметрів різниться в залежності від налаштування git з назвою `push.default`. Значення за замовчуванням цього налаштування залежить від версії твого git, але в наших уроках ми будемо вважати що воно дорівнює `upstream`. Це не вкрай важливо, але буде корисно перевірити це налаштування перед тим як пушити свій проект.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ось ми маємо деякі зміни яких нема в віддаленому сховищі. Надішлімо їх!"],afterMarkdowns:["Ось, маєш -- віддалене сховище отримало `C2`, гілку `main` на ньому було оновлено й тепер вона посилається на `C2`, а наше *власне* відображення віддаленого репо (`o/main`) було також оновлено. Все синхронізовано!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, просто надішли два коміти у віддалений репозиторій. Але прищібнись, скоро наші уроки стануть значно важчими!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","좋아요, 원격 저장소에서의 변화들을 가져오는 방법도 알고 로컬의 내 작업과 합칠줄도 알게되었습니다. 아주 좋아요.. 좋은데 이제 _나의_ 훌륭한 작업을 다른 사람들과 공유하려면 어떻게 해야되는거죠?","","공유된 작업을 내려받는것의 반대는 작업을 업로드해 공유하는것입니다. 그렇다면 `git pull` 당기기의 반대는? `git push` 미는겁니다!","","`git push`는 _여러분의_변경을 정한 원격저장소에 업로드하고 그 원격 저장소가 여러분의 새 커밋들을 합치고 갱신하게 합니다. `git push`가 끝나고 나면, 여러분의 친구들은 원격저장소에서 여러분의 작업을 내려받을수 있게됩니다.","",'여러분은 `git push`를 작업을 "공개"하는 과정이라고 생각해도 될것입니다. 곧 알아볼 중요한 세부 요소들이 잔뜩 있지만, 일단은 아기 걸음으로 시작해봅시다...',"","*노트 -- `git push`를 매개변수 없이 사용하는 디폴트 행동은 `push.default`라 불리는 git의 설정에 따라 결정 됩니다. 이 설정의 기본값은 여러분이 사용하는 git 버전에 따라 다릅니다만, 우리 강의에서는 `upstream`을 값으로 사용합니다. 대단한것은 아니지만, 여러분이 프로젝트를 push하기전에 한번쯤 확인해볼 가치가 있습니다.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["여기 원격저장소에는 없는 변경이 있습니다. 이것들을 업로드 해 봅시다!"],afterMarkdowns:["자, 됐습니다 -- 원격 저장소가 커밋 `C2`를 받았고, 원격 저장소의 브랜치 `main`가 `C2`라는 지점까지 갱신 되었습니다. 그리고 원격 저장소의 반영인 *우리의* 원격 브랜치 (`o/main`)또한 잘 갱신 되었습니다. 모든게 동기화되어 있습니다!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨을 마치기 위해, 두개의 새 커밋을 원격 저장소에 공유해봅시다. 마음의 준비를 단단히 하세요, 이제부터 강의들이 훨씬 어려워질거니까요!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Được rồi, ta đã biết cách nạp thay đổi từ kho chứa từ xa và kết hợp chúng vào các nhánh cục bộ. Khá là tuyệt rồi... nhưng nếu tôi muốn chia sẻ tác phẩm tuyệt vời _của tôi_ với mọi người thì sao?","","Chà, cách tải lên thì phải ngược với tải xuống rồi. Vậy thì đối nghịch của `git pull` (kéo) là gì? `git push` (đẩy)!","","`git push` có trách nhiệm tải lên thay đổi _của bạn_ vào nhánh từ xa được chỉ định và cập nhật nhánh đó để kết hợp với commit đẩy lên của bạn. Một khi lệnh `git push` hoàn thành, tất cả bạn bè của bạn có thể tải xuống thay đổi của nhánh từ xa đó đó.","",'Bạn có thể xem `git push` là câu lệnh để "xuất bản" thành quả công việc của bạn. Lệnh này có nhiều tính năng tinh tế mà ta sẽ tìm hiểu nhanh thôi, nhưng giờ hãy cứ bắt đầu với từng bước nhỏ đã...',"","*lưu ý --`git push` mà không có tham số hành xử tùy biến phụ thuộc vào cài đặt của Git là `push.default`. Giá trị mặc định cho cài đặt này phụ thuộc vào phiên bản Git mà bạn đang sử dụng, còn ở bài học của chúng ta thì ta sẽ sử dụng giá trị `upstream` (ngược dòng). Bây giờ thì đó chưa phải là vấn đề gì lớn, nhưng chúng tôi khuyến nghị bạn kiểm tra cài đặt của mình trước khi đẩy lên dự án của bạn.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ở đây ta có một vài thay đổi mà kho chứa từ xa không có. Hãy tải chúng lên!"],afterMarkdowns:["Đó -- kho chứa từ xa đã nhận được commit `C2`, nhánh `main` ở kho chứa từ xa đã được cập nhật lên `C2`, và phản chiếu nhánh từ xa *của ta* (`o/main`) cũng được cập nhật luôn. Mọi thứ đã đồng bộ!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, đơn giản là hãy chia sẻ 2 commit mới với kho chứa từ xa. Chuẩn bị tinh thần nhé, vì các bài học sẽ khó dần lên nhiều đấy!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, sedaj sem fetchal spremembe iz oddaljenega repota in jih vključil v moje lokalno delo. To je že super ... toda kako delim _moje_ super delo z vsemi ostalimi?","","No, način da naložiš deljeno delo, je ravno nasproten, kot da ga preneseš. In kaj je nasprotje `git pull`? `git push`!","","`git push` je odgovoren za nalaganje _tvojih_ sprememb na določen oddaljen repozitorij in posodobitev tega repozitorija, da vključi tvoje nove commite. Ko se `git push` izvede, lahko vsi tvoji prijatelji prenesejo tvoje delo iz repozitorija.","",'`git push` si lahko predstavljaš kot ukaz, ki "objavi" tvoje delo. Ima kopico majhnih stvari, katere bomo raziskali v kratkem, ampak začnimo z majhnimi koraki ...',"","*Opomba -- obnašanje `git push` brez argumentov je odvisno od nastavitev gita imenovanih `push.default`. Privzeta vrednost za to nastavitev je odvisna od različice gita, ki jo uporabljaš, ampak mi bomo uporabljali `upstream` vrednost v naši lekciji. To ni neka velika stvar, ampak jo je vredno preveriti, preden pushamo na svojem projektu.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tu imamo nekaj sprememb, ki jih oddaljen repo nima. Dajmo jih naložiti!"],afterMarkdowns:["Tako je -- oddaljen repo je prejel commit `C2`, branch `main` na oddaljenem repotu je bil posodobljen, da kaže na `C2` in naš *lasten* prikaz oddaljenega repota (`o/main`) je bil prav tako posodobljen. Vse je usklajeno!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, preprosto deli dva nova commita z oddaljenim repotom. Nato pa se pripni, ker bodo lekcije postale dosti težje!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git push","","Ok, pobraliśmy zmiany ze zdalnego repozytorium i włączyliśmy je do naszej pracy lokalnie. Wszystko fajnie, ale... jak mamy się podzielić _naszą_ wspaniałą pracą ze wszystkimi innymi?","","Cóż, wysyłanie współdzielonej pracy jest przeciwieństwem pobierania współdzielonej pracy. A co jest przeciwieństwem `git pull`? `git push`!","","Polecenie `git push` odpowiada za przesłanie i aktualizację _naszych_ zmian na wybranego remote'a, aby zawierał nowe commity. Gdy `git push` zostanie ukończony, wszyscy twoi przyjaciele będą mogli pobrać twoją pracę z serwera zdalnego.","",'Możesz myśleć o `git push` jak o poleceniu do "publikowania" swojej pracy. Ma ono wiele szczegółów, które wkrótce omówimy, ale zacznijmy od małych kroczków...',"","*Uwaga 1 -- zachowanie `git push` bez argumentów różni się w zależności od jednego z ustawień Git o nazwie `push.default`. Domyślna wartość tego ustawienia zależy od wersji Git, której używasz. W naszych lekcjach będziemy używać wartości `upstream`. Nie jest to wielka sprawa, ale warto sprawdzić swoje ustawienia przed użyciem `push` we własnych projektach.*","","*Uwaga 2 -- odpowiednik gałęzi na zdalnym repozytorium będziemy nazywać remote'em. Nazwa ta jest wykorzystywana w Polsce, dlatego będziemy jej używać, aby nie wprowadzać zawiłego nazewnictwa.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Tutaj mamy kilka zmian, których nie ma remote. Załadujmy je!"],afterMarkdowns:["No i proszę -- remote otrzymał commit `C2`, gałąź `main` na zdalnym repozytorium została zaktualizowana do `C2`. Nasze *własne* odzwierciedlenie zdalnego (`o/main`) również zostało zaktualizowane. Wszystko jest zsynchronizowane!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Aby zakończyć ten poziom, wystarczy, że podzielisz się dwoma nowymi commitami z innymi użytkownikami repozytorium. Ale zapnij pasy i przygotuj się na ostrą jazdę na kolejnych lekcjach!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, ho recuperato tutti gli aggiornamenti dal repository remoto e li ho incorporati al mio repository locale. Fin qui tutto apposto ma... come faccio a condividere il _mio_ fantastico lavoro con gli altri?","","Bene, per caricare il lavoro da condividere si deve fare l'opposto dello scaricarlo. E qual è l'opposto di `git pull`? `git push`!","","`git push` è responsabile dell'inviare le _tue_ modifiche ad uno specifico repository remoto e di aggiornarlo per far sì che incorpori i tuoi nuovi commit. Una volta eseguito `git push`, tutti i tuoi amici possono scaricare il tuo lavoro dal repository remoto.","",'Puoi considerare `git push` come un comando per "pubblicare" il tuo lavoro. Ha una serie di sottigliezze che vedremo più avanti, per ora iniziamo dalle basi...',"","*nota -- il comportamento di `git push` senza argomenti dipende da un'impostazione di git chiamata `push.default`. Il valore predefinito di quest'impostazione dipende dalla versione di git in uso; noi andremo ad usare il valore `upstream` nelle lezioni. Non è un problema, ma vale la pena controllare le impostazioni prima di usare push nei tuoi progetti.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Qui abbiamo alcuni cambiamenti che non sono presenti nel repository remoto. Andiamo a caricarli!"],afterMarkdowns:["Ecco qui -- il repository remoto ha ricevuto il commit `C2`, il ramo `main` sul remoto è stato aggiornato a puntare a `C2`, ed anche il *nostro* riflesso del repository remoto (`o/main`) è stato aggiornato. Tutto è stato sincronizzato!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Per terminare questo livello, condividi due nuovi commit con il repository remoto. Preparati però, perché le prossime lezioni saranno belle toste!"]}}]},tr_TR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push","","Ok, so I've fetched changes from remote and incorporated them into my work locally. That's great and all... but how do I share _my_ awesome work with everyone else?","","Well, the way to upload shared work is the opposite of downloading shared work. And what's the opposite of `git pull`? `git push`!","","`git push` is responsible for uploading _your_ changes to a specified remote and updating that remote to incorporate your new commits. Once `git push` completes, all your friends can then download your work from the remote.","",'You can think of `git push` as a command to "publish" your work. It has a bunch of subtleties that we will get into shortly, but let\'s start with baby steps...',"","*note -- the behavior of `git push` with no arguments varies depending on one of git's settings called `push.default`. The default value for this setting depends on the version of git you're using, but we are going to use the `upstream` value in our lessons. This isn't a huge deal, but it's worth checking your settings before pushing in your own projects.*"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Here we have some changes that the remote does not have. Let's upload them!"],afterMarkdowns:["There we go -- the remote received commit `C2`, the branch `main` on the remote was updated to point at `C2`, and our *own* reflection of the remote (`o/main`) was updated as well. Everything is in sync!"],command:"git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["To finish this level, simply share two new commits with the remote. Strap in though, because these lessons are about to get a lot harder!"]}}]}}}},{}],149:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C2","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C3","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"C0","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git push origin main;git push origin foo",startTree:'{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C3","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C3":{"parents":["C1"],"id":"C3"}},"HEAD":{"target":"C0","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',disabledMap:{"git checkout":!0,"git switch":!0},name:{en_US:"Git push arguments",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",ja:"Git pushの引数",fr_FR:"Arguments de git push",ru_RU:"Аргументы git push",ko:"git push의 인자들",uk:"Аргументи git push",vi:"Tham số git push",sl_SI:"Git push argumenti",pl:"Argumenty git push",it_IT:"Parametri di git push"},hint:{en_US:'You can always look at the last slide of the dialog with "objective"',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',ja:'ダイアログの最後のスライドを参照するには"objective"を実行',fr_FR:'Vous pouvez toujours regarder le dernier slide des dialogues en tapant "objective".',ru_RU:'Вы всегда можете ознакомиться с последним слайдом, воспользовавшись "objective".',ko:'대화창의 마지막 슬라이드를 "objective"로 다시 볼 수 있습니다.',uk:'Завжди можна подивитися останній слайд діалогу за допомогою "objective"',vi:'Bạn có thể sử dụng "objective" để đọc trang cuối của cửa sổ hộp thoại',sl_SI:'Vedno lahko pogledaš zadnji dialog z "objective".',pl:'Możesz wpisać "objective", żeby zobaczyć ostatni slajd z każdego poziomu',it_IT:'Puoi sempre guardare l\'ultima slide del dialogo con "objective"'},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push arguments","","Great! Now that you know about remote tracking branches we can start to uncover some of the mystery behind how git push, fetch, and pull work. We're going to tackle one command at a time but the concepts between them are very similar.","",'First we\'ll look at `git push`. You learned in the remote tracking lesson that git figured out the remote *and* the branch to push to by looking at the properties of the currently checked out branch (the remote that it "tracks"). This is the behavior with no arguments specified, but git push can optionally take arguments in the form of:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["What is a `` parameter you say? We'll dive into the specifics soon, but first an example. Issuing the command:","","`git push origin main`","","translates to this in English:","",'*Go to the branch named "main" in my repository, grab all the commits, and then go to the branch "main" on the remote named "origin". Place whatever commits are missing on that branch and then tell me when you\'re done.*',"",'By specifying `main` as the "place" argument, we told git where the commits will *come from* and where the commits *will go*. It\'s essentially the "place" or "location" to synchronize between the two repositories.',"","Keep in mind that since we told git everything it needs to know (by specifying both arguments), it totally ignores where we are checked out!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see an example of specifying the arguments. Note the location where we are checked out in this example."],afterMarkdowns:["There we go! `main` got updated on the remote since we specified those arguments."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What if we hadn't specified the arguments? What would happen?"],afterMarkdowns:["The command fails (as you can see), since `HEAD` is not checked out on a remote-tracking branch."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, for this level let's update both `foo` and `main` on the remote. The twist is that `git checkout` is disabled for this level!","","*Note: The remote branches are labeled with `o/` prefixes because the full `origin/` label does not fit in our UI. Don't worry ","about this... simply use `origin` as the name of the remote like normal.*"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les arguments de push","","Bien ! Maintenant que vous connaissez le suivi des branches, nous pouvons fouiller ce qui se cache derrière le fonctionnement de push, fetch, et pull. Nous allons aborder une commande à la fois, mais elles sont très similaires.","","En premier lieu regardons `git push`. Vous avez appris dans la leçon sur le suivi des branches distantes que Git détermine le dépôt distant *et* la branche à envoyer en regardant les propriétés de la branche courante (c'est à dire la branche distante que cette dernière \"suit\" -- track). C'est le comportement rencontré quand aucun argument n'est spécifié, mais git push accepte aussi des arguments de la forme :","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Qu'est ce que ce paramètre `` ? Avant de passer à l'explication, voyons d'abord un exemple. La commande suivante :","","`git push origin main`","","peut se traduire en français par :","",'*Va dans la branche "main" de mon dépôt, récupère tous les commits, et ensuite va dans la branche distante "main" sur le dépôt nommé "origin". Envoie tous les commits qui lui manquent sur cette branche distante puis préviens-moi quand c\'est terminé.*',"","En spécifiant `main` comme argument ``, nous avons dit à Git *d'où* les commits venaient et où ils *allaient*. C'est en fait \"l'emplacement\" à synchroniser entre les deux dépôts.","","Gardez à l'esprit que nous avons dit à Git tout ce dont il a besoin pour opérer (en précisant les deux arguments), il n'a donc absolument pas besoin de savoir quelle est la branche courante !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons un exemple d'arguments. Notez bien où se trouve `HEAD` dans cet exemple."],afterMarkdowns:["Voilà ! `main` a été mise à jour puisque nous avons spécifié ces arguments."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Et si nous n'avions pas mis d'arguments ? Que ce serait-il passé ?"],afterMarkdowns:["La commande échoue (comme vous pouvez le voir), car `HEAD` ne se trouve pas sur une branche configurée pour suivre une branche distante."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, pour ce niveau mettez à jour `foo` et `main` sur le dépôt distant. La difficulté est que `git checkout` est désactivée pour ce niveau !"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de push","","¡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:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["¿Qué será este parámetro ``, te preguntarás? Ya vamos a entrar en detalle, pero primero un ejemplo. Correr el comando:","","`git push origin main`","","se traduce así al español:","",'*Andá a la rama llamada "main" en mi repositorio, agarrá todos los commits, y después andá a la rama "main" del remoto llamado "origin". Aplicá ahí todos los commits que falten, y avisame cuando termines.*',"",'Especificando `main` 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. Notá en dónde estamos parados en este ejemplo."],afterMarkdowns:["¡Ahí está! Se actualizó `main` en el remoto, porque especificamos esos parámetros."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿Y si no especificábamos los parámetros? ¿Qué hubiera pasado?"],afterMarkdowns:["El comando falla (como podés ver), porque `HEAD` no está sobre ninguna rama que trackee algún remoto."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok. Para este nivel, actualicemos tanto `foo` como `main` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!"]}}]},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 main`","","se traduce así al español:","",'*Vete a la rama llamada "main" en mi repositorio, coge todos los commits, y después vete a la rama "main" del remoto llamado "origin". Copia ahí todos los commits que falten, y avísame cuando termines.*',"",'Especificando `main` 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ó `main` en el remoto, porque especificamos esos parámetros."],command:"git checkout C0; git push origin main",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 `main` en el remoto. El tema está en que ¡tenemos deshabilitado `git checkout` en este nivel!"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parâmetros do push","","Ótimo! Agora que você sabe sobre remote tracking de ramos, podemos começar a revelar um pouco do mistério por trás de como o push, o fetch e o pull funcionam. Vamos lidar com um comando por vez, mas os conceitos são bastante similares.","",'Primeiro, vamos abordar o `git push`. Você aprendeu na lição sobre remote tracking que o Git descobria o repositório remoto *e* o ramo correspondente onde fazer o push olhando nas propriedades do ramo que está atualmente em checkout (verificando o ramo remoto que ele "segue"). Este é o comportamento quando nenhum parâmetro é especificado, mas o git push pode opcionalmente receber parâmetros na seguinte forma:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Você deve estar se perguntando: o que é esse parâmetro ``? Vamos discutir as especifidades em breve, mas vejamos primeiro um exemplo. Executar o comando:","","`git push origin main`","","pode ser traduzido para o seguinte em Português:","",'*Vá ao ramo chamado "main" no meu repositório local, pegue todos os commits, então vá ao ramo "main" no repositório remoto chamado "origin". Coloque quaisquer commits que estiverem faltando nesse ramo, e então me diga quando estiver pronto.*',"",'Especificando `main` como parâmetro "lugar", dizemos ao Git de onde os commits *vão vir* e para onde os commits *irão*. É essencialmente o "lugar" onde sincronizar entre os dois repositórios.',"","Tenha em mente que já que contamos ao Git tudo que ele precisa saber (especificando ambos os parâmetros), ele ignora totalmente o checkout atual!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos um exemplo especificando os argumentos. Preste atenção no commit que sofreu checkout neste exemplo."],afterMarkdowns:["Aqui vamos nós! O `main` foi atualizado no repositório remoto, já que especificamos os parâmetros."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se eu não especificasse parâmetros? O que aconteceria?"],afterMarkdowns:["O comando falha (como você pode ver), já que o `HEAD` não havia sofrido checkout para um ramo com propriedade de remote-tracking definida."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, neste nível vamos atualizar tanto o `foo` como o `main` no repositório remoto. Porém desabilitamos o comando `git checkout` para dificultar um pouco a tarefa!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parámetros de push","","¡Xenial! Agora que sabes acerca das ramas que seguen remotos, podemos empezas a desvelar algo do misterio detrás do git push, fetch e pull. Imos atacar cun só comando dunha vez, pero os conceptos entre eles son moi semellantes.","","Vexamos primeiro `git push`. Xa aprendiches na lección sobre as ramas remotas que git determina o remoto *e* a rama á que empurrar mirando as propiedades da rama actual (o remoto ó que seguir). Este é o comportamento por defecto para cando non se especifican parámetros, pero git push toma, opcionalmente, parámetros da forma:","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["¿Qué será este parámetro ``, fixécheste esa pregunta? Xa imos entrar en detalle, pero primeiro un exemplo. Executa o comando:","","`git push origin main`","","tradúcese así ó galego:","",'*Vai á rama chamada "main" no meu repositorio, colle tódolos commits, e despois vai á rama "main" do remoto chamado "origin". Aplica ahí tódolos commits que falten, e avísame cando remates.*',"",'Indicando `main` como o parámetro "lugar", dixémoslle a git ónde traer os commits, e ónde mandalos. É básicamente, o "lugar" ou "ubicación" que sincroniza entre ámbolos dous repositorios.',"","Ten en conta que, como lle dixemos a git todo o que precisaba saber (indicando ambos parámetros), ¡ignora totalmente ónde andabamos neste momento!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos un exemplo especificando os parámetros. Nota ónde ficamos parados neste exemplo."],afterMarkdowns:["¡Ahí o tes! Actualizouse `main` no remoto, porque especificamos eses parámetros."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿E se non especificáramos os parámetros? ¿Que ocorrería?"],afterMarkdowns:["O comando falla (como podes ver), xa que `HEAD` non está sobre ningunha rama que siga algún remoto."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok. Para este nivel, actualiza tanto `foo` como `main` no remoto. O tema está en que ¡temos deshabilitado `git checkout` neste nivel!"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## push 的參數","","太好了!現在你已經明白了 remote tracking,我們可以開始聊 git push、fetch 以及 pull 的一些有趣的地方,我們一次會講解一個指令,但是它們之間的概念是很類似的。","","首先我們來看一下 `git push`,你已經在 remote tracking 的課程中學習到 git 是根據目前 checkout 的 branch 所 track 的 remote branch 來做 push,這是在沒有任何的參數的情況下的預設動作,但是 git push 允許我們可以加上一些參數:","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["`` 這個參數表示什麼? 我們等一下會提到細節,但是先來看一個例子,執行以下的指令:","","`git push origin main`","","將這段解釋成中文:","",'*先到我的 repo 中的 "main" branch,抓下所有的 commit,然後到叫作 "origin" 的 remote 的 "main" branch,檢查 remote 的 commit 有沒有跟我的 repo 一致,如果沒有,就更新。*',"",'將 `main` 當作 "place" 這個參數,我們告訴 git 這些 commit 是*從哪裡來的*,而且它們要*往哪裡去*。對於要同步兩個 repo, "place" 或者是 "location" 是非常重要的。',"","要記住喔,因為我們告訴 git 它所要知道的(有兩個參數),因此它才不會管你現在所 checkout 的 branch!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們來看一個有加上參數的例子,在這個例子中,要特別注意到我們所 checkout 的位置。"],afterMarkdowns:["我說的沒錯吧!因為我們加上了參數,所以在 remote 上的 `main` branch 更新了。"],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["假如我們沒有特別指令參數會發生什麼事情?"],afterMarkdowns:["指令會失敗(就像你看到的),因為 `HEAD` 並沒有指向一個有 track remote branch 的 branch 上面阿。"],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["好的,在這個關卡中,我們要更新在 remote 上的 `foo` 以及 `main` branch,比較遺憾的是 `git checkout` 在這個關卡中是不被允許的喔!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Push 的参数","","很好! 既然你知道了远程跟踪分支,我们可以开始揭开 git push、fetch 和 pull 的神秘面纱了。我们会逐个介绍这几个命令,它们在理念上是非常相似的。","","首先来看 `git push`。在远程跟踪课程中,你已经学到了 Git 是通过当前所在分支的属性来确定远程仓库以及要 push 的目的地的。这是未指定参数时的行为,我们可以为 push 指定参数,语法是:","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["`` 参数是什么意思呢?我们稍后会深入其中的细节, 先看看例子, 这个命令是:","","`git push origin main`","","把这个命令翻译过来就是:","","*切到本地仓库中的“main”分支,获取所有的提交,再到远程仓库“origin”中找到“main”分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。*","","我们通过“place”参数来告诉 Git 提交记录来自于 main, 要推送到远程仓库中的 main。它实际就是要同步的两个仓库的位置。","","需要注意的是,因为我们通过指定参数告诉了 Git 所有它需要的信息, 所以它就忽略了我们所切换分支的属性!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我们看看指定参数的例子。注意下我们当前分支的位置。"],afterMarkdowns:["好了! 通过指定参数, 远程仓库中的 `main` 分支得到了更新。"],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果不指定参数会发生什么呢?"],afterMarkdowns:["命令失败了(正如你看到的,什么也没有发生)! 因为我们所切换的 HEAD 没有跟踪任何分支。"],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["本关我们要更新远程仓库中的 `foo` 和 `main`, 但是 `git checkout` 被禁用了!","","*注意:远程分支使用 `o/` 开头是因为 `origin/` 对于 UI 来说太长了。不用太在意这个,直接用 `origin` 作为远程仓库的名称就可以了。*",""]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push-Optionen","","Großartig! Da du dich jetzt mit Remote Tracking Branches auskennst, können wir anfangen, die Geheimnisse hinter `git push`, `fetch` und `pull` zu ergründen. Wir werden uns einen Befehl nach dem anderen vornehmen, aber die Funktionsweisen sind sich sehr ähnlich.","",'Zunächst schauen wir uns `git push` an. Du hast im Level über Remote Tracking schon mitbekommen, dass Git den Remote Server *und* den Branch herausbekommt, indem es sich die Eigenschaften des aktuell ausgecheckten Branches ansieht (in denen das Remote steht, das der Branch "trackt"). Das ist das Verhalten bei keiner Angabe weiterer Optionen -- du kannst bei `git push` aber auch folgende setzen:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:['Was "Ort" sein soll, fragst du? Das klären wir später genau, schauen wir uns zunächst ein Beispiel an:',"","`git push origin main`","","Das bedeutet im Klartext:","",'"Geh zum Branch namens `main` in meinem Repository, nimm all seine Commits, dann geh zum Branch `main` auf dem Remote namens `origin`. Lege da alle Commits ab, die fehlen und sage mir, wenn du fertig bist."',"",'Da wir `main` als "Ort" angegeben haben, weiß Git, *woher* die Commits kommen und *wohin* sie sollen. Es ist im Grunde der Name der Orte, die zwischen zwei Repositorys synchronisiert werden sollen.',"","Da wir Git alles explizit gesagt haben, was es für die Operation wissen muss (durch Angabe von Remote und Ort), ist es vollkommen egal, was gerade ausgecheckt ist."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns noch ein Beispiel an. Beachte, was in diesem Fall gerade ausgecheckt ist."],afterMarkdowns:["Da haben wir's! `main` wurde auf dem Remote aktualisiert, weil wir beide Optionen angegeben haben."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was wäre passiert, wenn wir keine Optionen benutzt hätten?"],afterMarkdowns:["Der Befehl schlägt fehlt, da `HEAD` nicht auf einem Branch steht, der ein Remote trackt."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, in diesem Level lass uns sowohl `foo` als auch `main` auf dem Remote aktualisieren. Um's spannender zu machen ist `git checkout` in diesem Level deaktiviert."]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргументы команды Push","","Отлично! Теперь, когда вы знаете, как следить за удалёнными ветками, мы можем начать изучение того, что скрыто под занавесом работы команд git push, fetch и pull. Мы будем рассматривать одну команду за другой, однако принципы у них очень схожи.","","Сперва взглянем на `git push`. В уроке, посвящённом слежению за удалённым репозиторием, вы узнали о том, что git находит удалённый репозиторий *и* ветку, в которую необходимо push-ить, благодаря свойствам текущей ветки, на которой мы находимся. Это так называемое поведение без аргументов, однако команда git push может быть также использована и с аргументами. Вид команды в данном случае:","","`git push <удалённый_репозиторий> <целевая_ветка>`","",""]}},{type:"ModalAlert",options:{markdowns:["Что за такой параметр `<целевая_ветка>`? Мы узнаем об этом через секунду, а пока что рассмотрим пример. Допустим, что мы выполняем такую команду:","","`git push origin main`","","дословный перевод с английского будет таким:","",'*Перейди в ветку с именем "main" в моём локальном репозитории, возьми все коммиты и затем перейди на ветку "main" на удалённом репозитории "origin.". На эту удалённую ветку скопируй все отсутствующие коммиты, которые есть у меня, и скажи, когда ты закончишь.*',"",'Указывая `main` в качестве аргумента "целевая_ветка", мы тем самым говорим git-у откуда будут *приходить* и *уходить* наши коммиты. Аргумент "целевая_ветка" или "местонахождение" - это синхронизация между двумя репозиториями.',"","Имейте в виду, что с тех пор, как мы сказали git-у всё, что ему необходимо (указав оба аргумента), ему - git-у - абсолютно всё равно, что вы зачекаутили до этого!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте взглянем на пример, в котором указаны оба этих аргумента. Обратите внимание на местоположение, в котором мы находимся после чекаута."],afterMarkdowns:["Вот так! Мы обновили `main` на удалённом репозитории, принудительно указав аргументы в push."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А что бы было, ели бы мы не указывали эти аргументы, при этом используя тот же алгоритм?"],afterMarkdowns:["Как вы видите, команда не выполнилась, так как `HEAD` потерялся и не находится на удалённо-отслеживаемой ветке."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Хорошо, для выполнения этого уровня давайте обновим обе ветки `foo` и `main` на удалённом репозитории. Фишка в том, что команда `git checkout` не доступна на этом уровне!","","*Замечание: Удалённые ветки помечены как `o/`, а не `origin/`. Дело в том, что полная метка не помещается на экране. Не волнуйтесь ","по этому поводу... просто используйте знакомый нам `origin` для обращения к удалённому репозиторию.*"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git pushの引数","","すばらしい!リモートトラッキングブランチについて理解したので、次は git push、fetch、pull 動作の謎を追っていきましょう。一つずつ見ていきますが、各コマンドのコンセプトは非常に似ています。","","まずは、`git push`からです。リモートトラッキングブランチのレッスンでは、gitは現在チェックアウトされているブランチのプロパティを参照して、pushするリモートとブランチを決めるということを学びました(そのリモートは、ブランチの追跡対象でもあります)。これは git push の引数が指定されていない場合の動作ですが、git push は次の引数も取ることができます。","","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["``パラメータとは何でしょうか?説明の前に、まずは例をみてみましょう。","","`git push origin main`","","これを日本語訳すると、次のようになります。","",'*リポジトリの "main" ブランチに移動し、すべてのコミットを取得してから、リモートの "origin" にある "main" ブランチへ移動します。存在していないコミットをリモートのリポジトリに反映させて、完了したら私に教えて下さい。*',"",'"place"引数に`main`を指定することで、コミットがどこから来てどこへ行くのかをgitに伝えました。この"place"引数は基本的に、2つのリポジトリ間で同期する場所の名前です。',"","なお、git に(2つの引数を指定して)必要なことを伝えたので、現在チェックアウトされているブランチを無視することに注意してください。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["引数を指定した例を見てみましょう。この例ではチェックアウトされている場所に注意してください。"],afterMarkdowns:["やったね!これらの引数を指定していたので、リモートの`main`が更新されました。"],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["引数を指定しなかった場合、何が起こるでしょうか?"],afterMarkdowns:["(ご覧の通り)コマンドは失敗しました。`HEAD`がリモートトラッキング設定のあるブランチにチェックアウトされていないためです。"],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルでは`foo`と`main`の両方をリモートに更新してみましょう。ここでは`git checkout`が無効になっているので注意してください。","","*注:`origin/`ラベルがUIに収まらないため、リモートブランチには`o/`が付いていますが心配しないでください。","これについては... 通常のようにリモートの名前に`origin`を使用してくださいね。*"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push의 인자들","","좋습니다! 여러분은 이제 원격 추적 브랜치도 알고 있기 때문에 이제 git push, fetch, pull이 어떻게 작동하는지에 관한 숨겨져있는 미스테리를 풀어나갈 준비가 되었습니다. 한번에 하나의 명령어를 알아보도록하겠는데 이것들이 가지고있는 컨셉은 아주 비슷해요.","",'먼저 `git push`입니다. 여러분은 push를 하면 git이 push를 할 대상으로 원격저장소, 브랜치를 현재 작업중인 브랜치에 설정된 속성("추적" 대상)을 통해 알아낸다는것을 이전 추적 레슨에서 배웠습니다. 이것은 인자를 넣지않고 실행할 때 일어나는것 입니다, 그런데 git push에 다음과 같은 형식으로 선택적으로 인자를 사용할수도 있습니다:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["``인자가 무엇을 의미할것 같나요? 세부사항은 알아보기 전에 예시부터 봅시다. 다음 명령어를 보세요:","","`git push origin main`","","해석해 보면:","",'*내 저장소에 있는 "main"라는 이름의 브랜치로 가서 모든 커밋들을 수집합니다, 그다음 "origin"의 "main"브랜치로 가서 이 브랜치에 부족한 커밋들을 채워 넣고 완료 되면 알려줍니다.*',"",'`main`를 "place"인자로 지정해서 우리가 git에게 *어디서부터* 커밋이 오는지, 그리고 *어디로* 커밋이 가야하는지 알려줍니다. 두 저장소간에 동기화 작업을 할 "장소"를 지정해 주는것이라고 볼 수 있습니다.',"","git이 알아야 할 것은 다 알려줬기 때문에(두 인자를 모두 지정했죠), git은 현재 우리가 체크아웃한 브랜치는 무시하고 명령을 수행합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["인자를 지정해주는 예제를 눈으로 직접 확인해 봅시다. 이 예제에서 우리가 체크아웃한 곳이 어디인지를 주의하며 봅시다."],afterMarkdowns:["됐네요! 지정해준 인자들에 의해 원격 저장소의 `main`가 갱신 되었습니다."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["인자를 지정하지 않으면 어떻게 될까요?"],afterMarkdowns:["명령이 실패하며(보시다시피), `HEAD`가 원격저장소를 추적하는 브랜치에 체크아웃 되있지 않기 때문이죠."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["좋습니다, 이번 레벨에서는 원격저장소의 `foo`, `main`브랜치 모두 갱신해봅시다. 이번 문제는 `git checkout`이 비활성화 되있다는 점이 특징이죠!","","*노트: 원격 브랜치들은 `o/`접두어로 분류되어 있습니다. `origin/`으로 생략없이 표현하면 UI에 안맞아서 이렇게 표현했어요. ","그래서... 원격저장소 이름은 원래처럼 `origin`으로 써주세요.*"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Аргумeнти git push","",'Чудово! А зараз, коли ти знаєш все про відслідковування віддалених гілок, ми можемо розглянути "магію", що відбувається при git push, fetch, і pull. Ми розглянемо лише окремі команди для розуміння загального принципу.',"",'Спочатку розгляньмо `git push`. З уроку про відслідковування віддалених гілок ми знаємо, що git визначає куди і в *яку* гілку робити push, дивлячись на локальну поточну гілку (і віддалену, за якою вона "слідкує"). Це поведінка `push` без аргументів, але git push може приймати необов\'язкові аргументи в форматі:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Ви спитаєте, що таке аргумент ``? Ми скоро вдамося в детальні пояснення, але спочатку -- приклад. Виконання команди:","","`git push origin main`","","буквально перекладається як:","",'*Піди в гілку, що називається "main" в моєму репозиторії, візьми всі коміти, піди у віддалений "main", що називається "origin". Додай ті коміти, яких немає в цій гілці і надрукуй, що саме ти зробив.*',"",'Вказуючи `main` в якості аргумента "place", ми сказали git-у, *звідки* взяти коміти і *куди* їх додати. ("Place") - фактично точка синхронізації двох репозиторіїв.',"","Пам'ятайте, що оскільки ми надали git-у всю необхідну інформацію (вказавши обидва аргументи), не має значення яка гілка є зараз поточною!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Розгляньмо приклад використання аргументів. Зверніть увагу на поточну гілку в цьому прикладі."],afterMarkdowns:["Ось так! `main` у віддаленому репозиторії оновився, оскільки ми вказали його в аргументах."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А якщо не вказувати аргументів? Що станеться?"],afterMarkdowns:["Команда поверне помилку (як можна побачити), оскільки локальний `HEAD` не співпадає з відповідною віддаленою гілкою."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Гаразд, на цьому рівні оновімо віддалені гілки `foo` і `main`. Для ускладнення ми заборонимо використовувати `git checkout`!","","*Пам'ятай, віддалені гілки позначені префіксом `o/`, оскільки повний префікс `origin/` не влазить в наш UI. Але не хвилюйся ","про це... ти можеш використовувати `origin` посилаючись на віддалений репозиторій.*"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Tham số đẩy","","Tuyệt! Bạn đã biết đến theo dõi từ xa, giờ thì ta có thể tìm hiểu sâu hơn về cách hoạt động của đẩy (`git push`), tìm nạp (`git fetch`) và kéo (`git pull`). Ta sẽ giải quyết từng câu lệnh một nhưng về căn bản chúng khá là giống nhau.","",'Trước hết hãy xem qua `git push`. Trong bài học về theo dõi từ xa bạn đã biết rằng Git sử dụng thuộc tính (nhánh từ xa mà nó "theo dõi") của nhánh hiện tại để xác định kho và nhánh từ xa để đẩy. Git làm việc này mà không cần tham số chỉ định, nhưng lệnh git push có thể thêm tham số dưới dạng sau:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Tham số `` là gì vậy? Chúng ta sẽ đi sâu vào chi tiết sau, hãy xem ví dụ trước. Câu lệnh:","","`git push origin main`","","được dịch lại là:","",'*Chuyển sang nhánh "main" trong kho lưu trữ cục bộ, nhận tất cả các commit và tìm nhánh "main" trong kho chứa từ xa tên là "origin". Thêm tất cả các commit không có trong nhánh đó và báo cho tôi biết khi nào hoàn tất.*',"",'Bằng cách chỉ định `main` trong tham số "vị trí", ta báo với Git nơi mà commit *xuất phát* và nơi chúng *sẽ đến*. Về căn bản nó là "địa điểm" để đồng bộ hóa 2 kho chứa.',"","Lưu ý rằng ta đã thông báo cho Git tất cả thông tin cần thiết (thông qua chỉ định 2 tham số), nó sẽ không quan tâm nhánh mà ta đang đứng!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy xem xét một ví dụ về việc xác định tham số. Lưu ý vị trí nhánh mà ta đang đứng."],afterMarkdowns:["Được rồi! Bằng cách chỉ định các tham số, nhánh `main` trong kho lưu trữ từ xa đã được cập nhật."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Giả sử ta không chỉ định các tham số thì sao? Điều gì sẽ xảy ra?"],afterMarkdowns:["Lệnh thất bại (như bạn có thể thấy, không có gì xảy ra)! Bởi vì `HEAD` không trỏ đến nhánh nào có theo dõi từ xa."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Được rồi, trong cấp độ này hãy cập nhánh `foo` và `main` trên kho lưu trữ từ xa. Cái khó là ở cấp độ này lệnh `git checkout` đã bị vô hiệu hóa!","","*Chú ý: Các nhánh từ xa được đánh dấu bằng tiền tố `o/` bời vì UI của chúng tôi không chứa được hết `origin/`. Đừng lo ","về vấn đề này... đơn giản cứ dùng `origin` như bình thường thôi.*"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Push argumenti","","Super! Sedaj, ko poznaš oddaljeno sledenje branchev lahko začnemo odkrivati skrivnosti za git pushem, fetchem in pullom. Napadli bomo en ukaz za drugim, ampak koncepti za njimi so si podobni.","",'Najprej bomo pogledali `git push`. V lekciji o oddaljenem sledenju si spoznal, da je git ugotovil oddaljen repo *in* branch za pushat s tem da je pogledal lastnosti trenutno checkoutanega brancha (oddaljen branch, ki ga "sledi"). To je obnašanje brez argumentov, ampak git push lahko sprejme tudi argumente v sledeči obliki:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Kaj je `` parameter praviš? Kmalu bomo zaplavali v podrobnosti, ampak najprej primer. Izvedba ukaza:","","`git push origin main`","","se v slovenščini prevede v:","",'*Pojdi na branch poimenovan "main" na mojem repozitoriju, zgrabi vse commite in nato pojdi na branch "main" na oddaljenem repotu poimenovanem "origin". Postavi vse commite, ki manjkajo na branch in me obvesti, ko končaš.*',"",'Z določanjem `masterja` kot "place" argument, smo povedali gitu iz kje bodo commiti *prišli* in kam bodo commiti *šli*. V bistvu je to "mesto" oziroma "lokacija" za uskladitev med dvema repozitorijema.',"","Imej v mislih, da ker smo gitu povedali vse kar mora vedeti (s podajanjem obeh argumentov), git povsem ignorira mesto, kjer smo checkoutani!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si primer podajanja argumentov. Bodi pozoren na mesto, kjer smo checkoutani v tem primeru."],afterMarkdowns:["Evo ga! `main` je bil posodobljen na oddaljenem repotu, ker smo podali te argumente."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj če ne bi podali argumentov? Kaj bi se zgodilo?"],afterMarkdowns:["Ukaz ne uspe (kot lahko vidiš), ker `HEAD` ni checkoutan na branchu, ki ga oddaljeno sledimo."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, za to stopnjo posodobimo oba `foo` in `main` na oddaljenem repotu. Trik je, da je `git checkout` onemogočen za to stopnjo!","","*Opomba: Oddaljeni branchi so označeni z `o/` predpono, ker celotna `origin/` oznaka ne paše v naš prikaz. Ne skrbi ","glede tega ... preprosto uporabi `origin` kot ime oddaljenega repota kot ponavadi.*"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Argumenty push","","Świetnie! Teraz, kiedy wiesz już, jak działa śledzenie zdalnych gałęzi, możemy zacząć zgłębiać tajemnice pracy z git push, fetch i pull. Zmierzymy się z tymi poleceniami po kolei, ale idea działania każdego z nich jest bardzo podobna.","",'Najpierw spójrzmy na `git push`. Z lekcji o remote tracking wiesz, że Git określa zdalne repozytorium *oraz* gałąź docelową dzięki właściwościom aktualnie wybranej gałęzi ("śledzącej" zdalną). Tak to działa, jeśli nie określisz żadnych argumentów, ale git push może też przyjąć opcjonalnie następujące argumenty:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["Pytasz, czego dotyczy parametr ``? Zaraz zajmiemy się tym konkretnie, ale najpierw przykład. Polecenie Gita:","","`git push origin main`","","to, mówiąc po ludzku:","",'*Przejdź do gałęzi o nazwie "main" w moim repozytorium, weź wszystkie commity, a potem idź do gałęzi "main" na zdalnym repozytorium, które nazywa się "origin". Umieść na tej gałęzi wszystkie commity, których tam jeszcze nie ma, i daj znać, jak skończysz.*',"",'Wpisując `main` w miejscu argumentu "place" (miejsce), powiedzieliśmy Gitowi, *skąd ma wziąć* commity i *gdzie je umieścić*. To w zasadzie właśnie "miejsce", czyli "lokalizacja" do zsynchronizowania na obu repozytoriach.',"","Pamiętaj, że skoro powiedzieliśmy Gitowi wszystko, co musi wiedzieć (podając oba argumenty), będzie kompletnie ignorować, jakie miejsce mamy aktualnie wybrane!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spójrzmy na przykład określający argumenty. Zwróć uwagę na wybrany commit (checkout)."],afterMarkdowns:["No i proszę! Zaktualizowaliśmy `main` na zdalnym repozytorium, ponieważ określiliśmy argumenty."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A gdybyśmy nie określili argumentów? Co by się stało?"],afterMarkdowns:["Polecenie (jak widzisz) nie działa, ponieważ `HEAD` nie jest wybrany na gałęzi śledzącej."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Oki, na tym poziomie uaktualnijmy zarówno `foo`, jak i `main` na zdalnym repozytorium. Haczyk polega na tym, że zablokowaliśmy na tym poziomie `git checkout`!","","*Uwaga: Zdalne gałęzie mają przedrostek `o/`, ponieważ pełna nazwa `origin/` nie mieści się w naszym interfejsie. Nie przejmuj się tym... ","po prostu użyj `origin` jako nazwy zdalnego repozytorium.*"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Parametri di git push","","Ottimo! Ora che hai presente cos'è il tracciamento remoto dei rami possiamo dare un'occhiata ad alcuni dei misteri dietro al funzionamento di git push, fetch e pull. Affronteremo un comando alla volta ma i concetti tra questi saranno molto simili.","",'Come prima cosa daremo un\'occhiata a `git push`. Hai imparato nella lezione sul tracciamento remoto che git decide il ramo remoto *e* il ramo su cui caricare i dati osservando le proprietà del ramo su cui stiamo lavorando attualmente (il remoto che sta "tracciando"). Questo è il comportamento senza parametri aggiunti, ma git push può prendere dei parametri aggiuntivi nella forma di:',"","`git push `","",""]}},{type:"ModalAlert",options:{markdowns:["E cosa indica il parametro ``? Vedremo presto le specifiche, ma prima un esempio. Il comando:","","`git push origin main`","","equivale a questo in italiano:","",'*Vai al ramo chiamato "main" nel mio repository locale, prendi tutti i commit, poi vai nel ramo "main" sul repository remoto chiamato "origin". Mettici tutti i commit che mancano e poi dimmi quando hai finito.*',"",'Specificando `main` come parametro "place", abbiamo detto a git da dove tutti i commit *proverranno* e dove i commit *dovranno andare*. Si tratta essenzialmente del "luogo" o "posizione" da sincronizzare tra i due repository.',"","Tieni a mente che poiché abbiamo detto a git tutto ciò che gli serve sapere (specificando entrambi i parametri), non tiene conto del ramo sul quale ci troviamo attualmente!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo un esempio dove specifichiamo i parametri. Da notare la posizione su cui ci troviamo attualmente in questo esempio."],afterMarkdowns:["Ecco qui! `main` è stato aggiornato sul repository remoto come specificato dai parametri."],command:"git checkout C0; git push origin main",beforeCommand:"git clone; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se non avessimo specificato i parametri? Cosa succederebbe?"],afterMarkdowns:["Il comando fallisce (come puoi vedere), in quanto `HEAD` non si trova su un ramo che traccia il remoto."],command:"git checkout C0; git push",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ok, per questo livello aggiorniamo sia il ramo `foo` che `main` sul remoto. Attenzione perché git checkout è disabilitato per questo livello!","","*Nota: I rami remoti hanno i prefissi `o/` perché `origin/` non si adattava bene alla nostra interfaccia. Non preoccuparti ","... usa pure `origin` come nome del repository remoto come sempre.*"]}}]}}}},{}],150:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C4","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C4","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C5","id":"o/foo","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":["C2","C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C4","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C5","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"},"C5":{"parents":["C2"],"id":"C5"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C2","C3"],"id":"C4"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git push origin main^:foo;git push origin foo:main",startTree:'{"branches":{"main":{"target":"C6","id":"main","remoteTrackingBranchID":"o/main"},"foo":{"target":"C4","id":"foo","remoteTrackingBranchID":"o/foo"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","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":["C2","C3"],"id":"C4"},"C5":{"parents":["C2"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Git push arguments -- Expanded!",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!",ja:"Git pushの引数 -- 拡張編!",fr_FR:"Arguments de git push -- toujours plus !",ru_RU:"Аргументы для push -- расширенная версия!",ko:"git push 인자 -- 확장판!",uk:"Розширені аргументи git push!",vi:"Tham số git push -- bản mở rộng!",sl_SI:"Git push argumenti -- Razširjeni!",pl:"Argumenty git push -- Głębiej!",it_IT:"Parametri di git push - Espansione!"},hint:{en_US:'Remember you can admit defeat and type in "show solution" :P',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',ja:'降参して解説を見るには"show solution"を実行できるのをお忘れなく',fr_FR:'N\'oubliez pas que vous pouvez toujours déclarer forfait avec "show solution" :P',ru_RU:'Помните, Вы всегда можете признать своё поражение, набрав команду "show solution" (показать решение) :P',ko:'혹시 아세요? 패배를 인정하고 "show solution"을 입력할 수 있다는 걸요 :P',uk:'Пам\'ятай, ти завжди можеш визнати поразку і підглянути рішення командою "show solution" :P',vi:'Nhớ rằng, bạn có thể thừa nhận thất bại và gõ "show solution" :P',sl_SI:'Vedno se lahko predaš in napišeš "show solution". :P',pl:'Pamiętaj, że możesz się poddać i zobaczyć gotowe rozwiązanie, wpisując "show solution" :P',it_IT:'Puoi sempre ammettere la tua sconfitta e digitare "show solution" :P'},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` argument details","","Remember from the previous lesson that when we specified `main` as the place argument for git push, we specified both the *source* of where the commits would come from and the *destination* of where the commits would go.","","You might then be wondering -- what if we wanted the source and destination to be different? What if you wanted to push commits from the `foo` branch locally onto the `bar` branch on remote?","","Well unfortunately that's impossible in git... just kidding! Of course it's possible :)... git has tons and tons of flexibility (almost too much).","","Let's see how in the next slide..."]}},{type:"ModalAlert",options:{markdowns:["In order to specify both the source and the destination of ``, simply join the two together with a colon:","","`git push origin :`","","This is commonly referred to as a colon refspec. Refspec is just a fancy name for a location that git can figure out (like the branch `foo` or even just `HEAD~1`).","","Once you are specifying both the source and destination independently, you can get quite fancy and precise with remote commands. Let's see a demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Remember, `source` is any location that git will understand:"],afterMarkdowns:["Woah! That's a pretty trippy command but it makes sense -- git resolved `foo^` into a location, uploaded whatever commits that weren't present yet on the remote, and then updated destination."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["What if the destination you want to push doesn't exist? No problem! Just give a branch name and git will create the branch on the remote for you."],afterMarkdowns:["Sweet, that's pretty slick :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["For this level, try to get to the end goal state shown in the visualization, and remember the format of:","","`:`"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## L'argument `` dans le détail","","Rappelez-vous de notre dernière leçon : quand vous passiez `main` comme argument `` à git push, cela spécifiait à la fois la *source* de provenance des commits et leur *destination*.","","Vous vous demandez peut-être donc : et si nous voulions avoir une source et une destination différentes ? Et si vous voulez envoyez des commits de la branche locale `foo` dans la branche distante `bar` ?","","Malheureusement ce n'est pas possible avec Git... Mais non, je plaisante ! Bien sûr que c'est possible :)... Git a des tonnes de flexibilité (presque trop).","","Voyons cela au prochain slide..."]}},{type:"ModalAlert",options:{markdowns:["Pour spécifier la source et la destination dans ``, on les joint simplement par deux points :","","`git push origin :`","",'On en parle souvent comme d\'un "refspec". Refspec est juste un nom exotique pour un emplacement que Git peut résoudre (comme la branche `foo` ou juste `HEAD~1`)',"","Lorsque vous utilisez cette notation permettant de préciser la source et la destination indépendamment, vous pouvez produire des commandes à la fois très sophistiquées et très précises pour travailler avec les dépôts distants. Faisons une démo !"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Rappelez-vous, `source` peut être n'importe quel emplacement que Git peut résoudre :"],afterMarkdowns:["Woahou ! C'est une commande très alambiquée mais qui a du sens : Git résoud `foo^` en un emplacement, envoie tous les commits qui n'étaient pas encore présents sur le dépôt distant, et met ensuite à jour la branche de destination."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Que se passe-t-il quand la destination du push n'existe pas encore ? Pas de problème ! Donnez simplement un nom de branche et Git va créer la branche distante pour vous."],afterMarkdowns:["Cool, c'est habile :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Pour ce niveau, essayez d'atteindre l'état montré dans la fenêtre d'objectif, et souvenez-vous du format :","","`:`"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Detalles sobre el parámetro ``","","Acordate de la lección anterior que cuando especificamos `main` 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 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 demasiado).","","Veamos cómo hacerlo a continuación..."]}},{type:"ModalAlert",options:{markdowns:["Para especificar tanto el origen como el destino de ``, simplemente unilos usando un dos puntos:","","`git push origin :`","","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 elegante y detallista con los comandos remotos. ¡Veamos una demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Recordá: `origen` es cualquier ubicación que git pueda entender:"],afterMarkdowns:["¡Woow! Ese commando es bastante loco, 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^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿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"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para este nivel, tratá de llegar al objetivo final, y acordate del formato:","","`:`"]}}]},es_ES:{childViews:[{type:"ModalAlert",options:{markdowns:["## Detalles sobre el parámetro ``","","Recuerda de la lección anterior que cuando especificamos `main` 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^:main",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 main: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:[{type:"ModalAlert",options:{markdowns:["## Detalhes sobre ``","","Lembra que na lição anterior especificamos `main` como o parâmetro lugar para o git push? Lá definimos tanto a *origem* de onde os commits viriam quanto o *destino* para onde os commits foram.","","Você pode estar se perguntando -- e se eu quisesse que a origem e o destino fossem diferentes? E se eu quisesse enviar commits do ramo local `foo` para o ramo remoto `bar`?","","Bem, infelizmente isso é impossível no Git... só brincando! Claro que é possível :)... o Git tem muita flexibilidade (até mais do que deveria).","","Veremos como fazê-lo no próximo slide..."]}},{type:"ModalAlert",options:{markdowns:["Para especificar tanto a origem como o destino do ``, simplesmente juntamos os dois usando dois-pontos:","","`git push origin :`","",'Isso é geralmente chamado de "colon refspec" (especificação de referência com dois-pontos). Refspec é só um nome extravagante para um local que o Git consiga entender (como o ramo `foo` ou mesmo `HEAD~1`)',"","Uma vez que você está especificando tanto a origem como o destino independentemente, você pode ser bastante preciso nos comandos relacionados a repositórios remotos. Vejamos uma demonstração!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembre-se, `origem` é qualquer lugar que o Git possa entender:"],afterMarkdowns:["Uau! Esse comando é bastante viajado, mas ele faz sentido -- o Git entendeu a referência `foo^`, enviou quaisquer commits que não estavam presentes no repositório remoto, e então atualizou o destino."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se o destino para o qual você quiser fazer push não existir? Sem problemas! Dê um nome de ramo e o Git criará o ramo no repositório remoto para você."],afterMarkdowns:["Doce, isso é muito bom :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para este nível, tente chegar ao estado do objetivo mostrado na visualização, e lembre-se do formato:","","`:`"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Detalles sobre o parámetro ``","","Lémbrate da lección anterior cando especificamos `main` como o parámetro lugar de git push, especificamos tanto a *orixe* do que sacar os commits como o *destino* ó que envialos.","","Poderías estar a preguntarte ¿E se quixéramos que a orixe e o destino sexan distintos? ¿Se quixéramos empurrar os commits da rama local `foo` á rama `bar` do remoto?","","Bueno, esto non se pode facer en git... ¡Caramboliñas! Claro que se pode :D. git é extremadísimamente flexibe (case case que de máis).","","Vexamos cómo facelo a continuación..."]}},{type:"ModalAlert",options:{markdowns:["Para especificar tanto a orixe como o destino de ``, sinxelamente úneos empregando dous puntos:","","`git push origin :`","","Esto pódeselle chamar refspec con dous puntos. Refspec é sinxelamente un nome cool para unha ubicación que git pode entender (como a rama `foo`, ou incluso `HEAD~1`)","","Unha vez que especificas a orixe e o destino independientemente, podes poñerte cómodo e preciso cos comandos remotos. ¡Vexamos a demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lembra: `orixe` é calquera ubicación que git poida entender:"],afterMarkdowns:["¡Woow! Ese commando é unha tolemia, pero ten sentido: git resolveu `foo^` a unha ubicación, subiu calquera commit de ahí que aún non estivera no remoto, e logo actualizou o destino."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["¿E qué hai se o destino ó que queres empurrar non existise? ¡Non pasa nada! Sinxelamente dalle un nome á rama e git vaise encargar de crealo no remoto."],afterMarkdowns:["Xenial, sinxelamente tira para adiante."],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Para este nivel, intenta chegar o obxectivo final, e lembrate do formato:","","`:`"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` 這個參數的細節","","回想一下,我們在之前的課程中提到,當我們用 `git push` 並且把 `main` 當作 `` 這個參數的時候,我們就相當於告訴 git 我們的所要更新的 commit 要*從哪裡來*(source) 並且要 *往哪裡去*(destination)。","","你可能會很好奇,當我們的 source 以及 destination 是不同的時候,應該怎麼做?當你想要 push `foo` branch 上面的 commit 到 remote 的 `bar` branch 的時候,應該怎麼做?","","很遺憾地,對於 git 來說這是不可能的...開玩笑的啦!當然是有可能的:)... git 有非常非常大的彈性(太超過了啦)。","","讓我們來看看下一頁..."]}},{type:"ModalAlert",options:{markdowns:["為了要指定 `` 的 source 以及 destination,只要利用一個冒號將這兩個連在一起:","","`git push origin :`","","這通常被稱為一個 colon (冒號) refspec,refspec 只是一個表示 location (位置) 的花俏的名稱,這個位置可以被 git 辨別(例如 `foo` branch 或是 `HEAD~1`)。","","一旦你單獨指定了 source 以及 destination,你可以看到花俏且準確的指令。讓我來來看一個例子!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["記住, `source` 表示任意可以被 git 辨識的位置:"],afterMarkdowns:["哇!這實在是一個很花俏的指令但是確很合理,git 把 `foo^` 解讀成一個位置,並且 push 該位置的 commit 到目前 remote 的 main branch。"],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果你想要 push 的 destination 不存在怎麼辦?沒有問題!只要給一個 branch 的名稱,git 就會在 remote 幫你建立。"],afterMarkdowns:["太讚了,實在非常地簡單:D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["對於這個關卡,想辦法達到這個視覺化的目標,而且要記得格式:","","`:`"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## ``参数详解","","还记得之前课程说的吧,当为 git push 指定 place 参数为 `main` 时,我们同时指定了提交记录的来源和去向。","","你可能想问 —— 如果来源和去向分支的名称不同呢?比如你想把本地的 `foo` 分支推送到远程仓库中的 `bar` 分支。","","哎,很遗憾 Git 做不到…… 开个玩笑,别当真!当然是可以的啦 :) Git 拥有超强的灵活性(有点过于灵活了)","","接下来咱们看看是怎么做的……"]}},{type:"ModalAlert",options:{markdowns:["要同时为源和目的地指定 `` 的话,只需要用冒号 `:` 将二者连起来就可以了:","","`git push origin :`","","这个参数实际的值是个 refspec,“refspec” 是一个自造的词,意思是 Git 能识别的位置(比如分支 `foo` 或者 `HEAD~1`)","","一旦你指定了独立的来源和目的地,就可以组织出言简意赅的远程操作命令了,让我们看看演示!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["记住,`source` 可以是任何 Git 能识别的位置:"],afterMarkdowns:["这是个令人困惑的命令,但是它确实是可以运行的 —— Git 将 `foo^` 解析为一个位置,上传所有未被包含到远程仓库里 `main` 分支中的提交记录。"],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果你要推送到的目的分支不存在会怎么样呢?没问题!Git 会在远程仓库中根据你提供的名称帮你创建这个分支!"],afterMarkdowns:["很赞吧!它是不是很聪明?! :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["在这个关卡中,试着完成目标窗口展示的提交树,记住参数格式哟:","","`:`"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Details zum ``-Parameter","",'Du erinnerst dich von dem vorherigen Level, dass, als wir `main` als "Ort" beim `git push` angegeben haben, daraus sowohl die *Quelle* als auch das *Ziel* für die Operation abgeleitet wurden.',"","Daher fragst du dich vielleicht -- was wäre, wenn wir möchten, dass Quelle und Ziel verschieden voneinander sind? Was wäre, wenn du Commits von einem lokalen Branch `foo` in den Branch `bar` auf einem Server schieben möchtest?","","Tja, leider ist das in Git unmöglich .... ein Scherz! Natürlich ist das möglich. Git besitzt tonnenweise Flexibilität (eher zu viel, als zu wenig).","","Und gleich sehen wir, wie das geht ..."]}},{type:"ModalAlert",options:{markdowns:["Um sowohl Quelle als auch Ziel im ``-Parameter anzugeben, gib sie einfach verbunden mit einem Doppelpunkt ein:","","`git push origin :`","","Das wird üblicherweise Refspec (Referenz-Spezifikation) genannt. Refspec ist nur ein anderer Name für einen Ort, mit dem Git etwas anfangen kann (wie mit Branch `foo` oder mit `HEAD~2`).","","Sobald du Quelle und Ziel separat angibst, kannst du flexibel und präzise entfernte Branches ansteuern. Hier eine Demo:"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vergiss nicht, `Quelle` ist jeder mögliche Ort, mit dem Git etwas anfangen kann:"],afterMarkdowns:["Boah! Das ist ein ziemlich abgefahrener Befehl gewesen, aber er ist sinnvoll -- Git hat `foo^` zu einem Commit aufgelöst, alle Commits, die bis zu einschließlich diesem noch nicht auf dem Server waren, hochgeladen und dann dort das Ziel aktualisiert."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Was wäre wenn das Ziel des `push` gar nicht existiert? Kein Problem! Wenn das Ziel ein Branch-Name ist, wird Git den Branch auf dem Server einfach anlegen."],afterMarkdowns:["Schick, das ist ziemlich praktisch. :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Um dieses Level zu schaffen versuche den dargestellten Zielzustand zu erreichen und vergiss nicht das Format:","","`:`"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` 引数","","前のレッスンでmainブランチをpushする際に、pushするコミットがどこから来て(source)、どこへ行くのか(destination)を``引数で指定したことを思い出してください","","では、sourceとdestinationを別々のブランチにしたい場合はどうすればよいのでしょうか?","","ローカルのfooブランチに存在するコミットをリモートのbarブランチにpushするにはどうすればよいのでしょうか?","","残念ながら、Gitでそれをしようと思っても不可能なのです... ","","というのは冗談です!もちろん可能ですし、Gitはすごく柔軟ですから!(正直過剰な程に)","","次の説明に移りましょう"]}},{type:"ModalAlert",options:{markdowns:["``引数でsourceとdestinationを指定するのはとても簡単です。次のようにコロンで連結すればよいのです!","","`git push origin :`","","この書式は一般的にコロンRefspecと呼ばれています。Refspecとは、ブランチや、HEAD~1等といったGitが解決できる場所を表す名称です。","","sourceとdestinationを別々に指定すると、よりきめ細やかなブランチ操作がリモートコマンドで行うことができます。","","それでは実際にデモを見ていきましょう!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["sourceはgitが解決できる場所であればどこでも良いことを思い出してください。"],afterMarkdowns:["うわぁ!これはかなり奇抜な見た目のコマンドです...が実は理にかなっています。","","Gitはfoo^の場所を解決し、リモートに存在していないコミットをアップロードして、destinationに指定されたmainブランチを更新しました。"],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["存在していないブランチにpushしようとするとどうなると思いますか?心配ご無用です!","","Gitは与えられた名前を利用してリモート上にブランチを作成してくれます!"],afterMarkdowns:["うん、とても良いですね。"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["このレベルでは、ゴールで示されている状態になるように挑戦してください。困ったときはこの書き方を思い出してくださいね。","","`:`"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Подробности аргумента `<пункт назначения>`","","Помните, когда в прошлом занятии мы указали в качестве аргумента ветку `main` для команды git push, мы указали совместно *источник*, откуда будут приходить коммиты, и *пункт назначения (получатель)*, куда коммиты будут уходить.","","Однако, вы, наверное, задаётесь вопросом - а что, если я хочу, чтобы мои источник и получатель коммитов были различными? Что, если мы хотим запушить коммиты из локальной ветки `foo` в ветку `bar` на удалённом репозитории?","","К огромному сожалению, это невозможно сделать средствами git... Да ладно! Я пошутил! Конечно, это возможно :)... git сам по себе достаточно гибок (даже слишком).","","Мы увидим, как именно, на следующем слайде..."]}},{type:"ModalAlert",options:{markdowns:["В том случае, когда вам необходимо разделить источник и получатель аргумента `<пункт назначения>`, соедините их вместе, используя двоеточие:","","`git push origin <источник>:<получатель>`","","Обычно это называется `refspec`. Refspec — это всего лишь модное имя для определения местоположения, которое git может распознать (например, ветка `foo` или просто `HEAD~1`)","","Как только вы указали источник и получатель независимо друг от друга, вы можете довольно причудливо и точно использовать команды для работы с удалёнными ветками и репозиториями. Давайте взглянем на демонстрацию!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Помните, `источник` - всего лишь местоположение, которое git должен понять:"],afterMarkdowns:["Вау! Это довольно нетривиальная команда, однако она имеет смысл - git видит в `foo^` не что иное, как местоположение, закачивает все коммиты, которые не присутствуют на удалённом репозитории, и затем обновляет получателя."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А что если пункт назначения, в который вы хотите запушить, не существует? Без проблем! Укажите имя ветки, и git сам создаст ветку на удалённом репозитории для вас."],afterMarkdowns:["Класс! Довольно легко! :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Для выполнения данного уровня попытайтесь привести своё дерево к такому же виду, как на визуализации. И не забудьте о формате:","","`<источник>:<получатель>`"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## `` 인자에 대한 세부사항들","","","기억하세요? 이전 강의에서 우리는 `main`를 커밋의 근원이되는 *source*와 목적지가 되는 *destination*으로 명령어의 인자로 넣어줌으로써 지정해줬습니다.","여러분은 이런 생각이 들 수 있어요 -- 내가 source와 destination이 다르길 원하면 어떻게 해야되지? 로컬의 `foo` 브랜치에서 원격의 `bar` 브랜치로 커밋을 push하고 싶으면 어떻게 해야 되지?","","사실 git에서는 그게 불가능합니다... 네 농담이고! 당연 가능합니다 :)... git의 어마무시하게 유연합니다(지나칠정도로요).","","어떻게 하는지는 다음 슬라이드에서 확인해봅시다..."]}},{type:"ModalAlert",options:{markdowns:["source와 destination을 모두 지정하기 위해서는, 이렇게 간단히 두개를 콜론을 사이에 두고 표현하면 됩니다.","","`git push origin :`","","이것을 일반적으로 colon refspec(콜론 참조스펙)이라고 부릅니다. 참조스펙은 그냥 \"git이 알아낼 수 있는 위치\"를 이름 붙여서 말하는거에요 (브랜치 'foo'라던가 HEAD~1 라던가)","","source와 destination을 따로 지정할 수 있게 되면서, 이제 원격관련 명령어를 좀 멋지고 정확히 사용할수 있게 되었어요. 데모를 봅시다!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["기억하세요, `source`는 git이 이해하는 아무 위치를 말합니다.:"],afterMarkdowns:["워 뭔가 잘 안쓸것 같은 명령이지만 잘 됩니다 -- git은 `foo^`의 위치를 알아내서 원격 저장소에 아직 반영되지 않은 커밋들을 업로드하고 destination 브랜치를 갱신했습니다."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["만약 여러분이 push하고 싶은 destination(목적지)가 없으면 어떻게하죠? 아무 문제 없어요! git이 만들 새 브랜치 이름을 지어주면 git이 원격 저장소에 새 브랜치를 만들어 줄거에요."],afterMarkdowns:["좋네요, 번지르르 삐까뻔쩍 :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["이번 레벨에서는, goal 시각화에 나오는 것처럼 만들어 주세요 인자의 형식은 다음과 같다는걸 기억하세요:","","`:`"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Детальніше про аргумент ``","","З попереднього уроку нам відомо, що коли ми вказуємо `main` в якості аргумента place для git push, ми задаємо і гілку, *з якої* брати нові коміти, і гілку *до якої* їх буде перенесено.","","Тут ти можеш задуматись, а чи можуть гілки, звідки беремо, і куди переносимо, бути різними? Що, коли потрібно коміти з локальної гілки `foo` перенести у віддалену гілку `bar`?","","Нажаль в git це неможливо... жартую! Звісно, що можливо :)... git просто неймовірно гнучкий (іноді аж занадто).","","Подивімося як це робиться..."]}},{type:"ModalAlert",options:{markdowns:["Для того, щоб в одному аргументі `` вказати і місце звідки і куди, треба їх просто розділити двокрапкою:","","`git push origin :`","",'Такий запис називають "colon refspec". Тут refspec - це просто зручна назва місця, яке git може ідентифікувати (наприклад, гілка `foo` чи просто `HEAD~1`)',"","Можливість вказати два різних місця дає велику свободу і гнучкість в роботі з віддаленим репозиторієм. Подивімось демонстрацію!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Пам'ятай, `source` -- це будь-яка назва місця, зрозуміла гіту:"],afterMarkdowns:["Овва! Це доволі незвична команда, але тут все має сенс -- git, знаючи куди вказує `foo^`, завантажив на віддалену сторону ще відсутні там коміти і оновив місце призначення."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["А що, коли вказаного місця призначення не існує? Нема проблем! Просто вкажи назву гілки і гіт створить її на віддаленому сервері."],afterMarkdowns:["Спритно, еге-ж? :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["На цьому рівні спробуй досягти стану ропозиторію, показаного у візуалізації і пам'ятай про формат запису з двокрапкою:","","`:`"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Chi tiết về tham số ``","","Nhớ lại học trước, khi chỉ định tham số `` là `main` cho lệnh `git push`, ta cũng đã chỉ định nguồn và đích cho các commit.","","Có thể bạn sẽ thắng mắc -- Nếu như ta muốn nguồn và đích khác đi thì sao? Nếu như ta muốn đẩy commit từ nhánh cục bộ `foo` lên nhánh từ xa `bar` thì sao?","","Chà đáng tiếc là điều này là bất khả thi tron Git... đùa thôi! Tất nhiên là làm được chứ :)... Git có nhiều và rất nhiều lựa chọn linh động (có lẽ là quá nhiều)","","Hãy xem cách nó hoạt động..."]}},{type:"ModalAlert",options:{markdowns:["Để chỉ định `` cho cả nguồn và đích, chỉ cần sử dụng dấu hai chấm `:` để kết nối cả hai:","","`git push origin :<đích>`","",'Giá trị thực của tham số này là một refspec, "refspec" là một từ tự tạo, nghĩa là một vị trí Git có thể nhận ra (chẳng hạn như nhánh `foo` hoặc `HEAD ~ 1`).',"","Một khi bạn đã chỉ định các nguồn và đích độc lập, bạn có thể thao tác với kho chứa từ xa một cách khá thú vị và chính xác, hãy xem bản demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nhớ rằng, `nguồn` là bất kỳ vị trí nào mà Git hiểu:"],afterMarkdowns:["Wao! Lệnh này khá phức tạp, nhưng mà hợp lý -- Git diễn giải `foo^` thành một vị trí, tải lên tất cả các commit từ đó trở về trước mà chưa có trên nhánh đích rồi cập nhật nó."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nếu như đích đến mà bạn muốn không tồn tại thì sao? Chẳng sao cả! Đơn giản hãy gõ tên nhánh và Git sẽ tạo nhánh đó trên kho chứa từ xa cho bạn."],afterMarkdowns:["Tuyệt vời, thấy Git thú vị không :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Ở cấp độ này, hãy hoàn thành mục tiêu được mô tả, và hãy nhớ cấu trúc:","","`:<đích>`"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Podrobnosti `` argumenta","","Spomni se prejšnje lekcije, kjer smo določili `main` kot place argument za git push, določili smo *izvor* iz kje bodo commiti prišli in *destinacijo*, kamor bodo commiti odšli.","","Morda se sprašuješ -- kaj če želimo, da sta izvor in destinacija različna? Kaj če želiš pushati commite iz lokalnega `foo` brancha na oddaljen `bar` branch?","","Nažalost to v gitu ni možno ... hecam se! Seveda je možno :) ... git ima ogromno opcij (skoraj preveč).","","Poglejmo kako v naslednjem razdelku ..."]}},{type:"ModalAlert",options:{markdowns:["Da bi določili in izvor in destinacijo ``, preprosto združimo oba skupaj z dvopičjem:","","`git push origin :`","","To je pogosto omenjeno kot dvopična referenca. Ta referenca je samo ime za lokacijo, ki jo lahko git razvozla (kot je branch `foo` ali samo `HEAD~1`).","","Ko enkrat določiš izvor in destinacijo neodvisno, lahko oddaljene ukaze uporabljaš zelo natačno in učinkovito. Poglejmo si primer!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pomni, `source` je bilokatera lokacija, ki jo git razume:"],afterMarkdowns:["Woah! To je kar zanimiv ukaz, ampak ima smisel -- git je razrešil `foo^` v lokacijo, naložil commite, ki še niso bili prisotni v oddaljenem repotu in nato posodobil destinacijo."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Kaj če destinacija kamor želiš pushati ne obstaja? Ni problem! Samo podaj ime brancha in git bo naredil branch na oddaljenem repotu zate."],afterMarkdowns:["Lepa, to je kar kul :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Za to stopnjo poizkusi priti v ciljno stanje, prikazano v vizualizaciji in si zapomni obliko:","","`:`"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Szczegóły argumentu ``","","Przypomnij sobie, że na poprzedniej lekcji określając `main` jako argument miejsca dla polecenia git push, wybraliśmy zarówno *źródło*, z którego mają pochodzić commity, jak i *cel*, do którego mają trafić.","","No i może zastanawiasz się teraz -- co by było, gdybyśmy chcieli, żeby źródło i cel były różne od siebie? Co, gdybyśmy chcieli wypchać commity z lokalnej gałęzi `foo` do zdalnej gałęzi `bar`?","","Cóż... niestety w Gicie nie da się tego zrobić... Żart! Jasne, że się da :) Git jest bardzo, bardzo elastyczny (może aż za bardzo).","","Zobaczmy, jak bardzo, na następnym slajdzie..."]}},{type:"ModalAlert",options:{markdowns:["Aby określić zarówno źródło, jak i cel dla ``, po prostu połącz je dwukropkiem:","","`git push origin :`","","To nic innego jak refspec z dwukropkiem. Refspec to tylko wymyślny termin oznaczający lokalizację, którą Git potrafi zidentyfikować (na przykład gałąź `foo` albo po prostu `HEAD~1`).","","Kiedy już zaczniesz określać niezależnie źródła i cele, to możesz trochę zaszaleć na zdalnych repozytoriach. Zobaczmy demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Pamiętaj, że `source` (źródło) to dowolna lokalizacja, którą Git zrozumie:"],afterMarkdowns:["Łaaał! Niezły odlot, ale jest w tym poleceniu jakiś sens -- Git zinterpretował `foo^` jako konkretną lokalizację, wrzucił tam wszystkie commity, jakich brakowało jeszcze w zdalnym repo, i na koniec zaktualizował cel."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["A co, jeśli miejsce, do którego chcesz zrobić push, nie istnieje? Żaden problem! Wybierz tylko nazwę dla gałęzi, a Git stworzy ją dla ciebie w zdalnym repozytorium."],afterMarkdowns:["Pięknie! Całkiem sprytne! :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Na tym poziomie postaraj się uzyskać drzewo takie jak na wizualizacji, i pamiętaj o formacie:","","`<źródło>:`"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Dettagli sul parametro ``","","Ricorderai dalle lezioni precedenti che quando abbiamo specificato `main` come parametro place per git push, abbiamo specificato sia la *fonte* di provenienza dei commit che la *destinazione* d'arrivo.","","Potresti star pensando -- e se volessimo che la fonte e la destinazione fossero distinte? Se volessi caricare con push dei commit dal ramo locale `foo` verso il ramo remoto `bar`?","","Sfortunatamente ciò non è possibile in git... scherzetto! Ovviamente lo possiamo fare :)... git è davvero molto flessibile (forse troppo).","","Vediamo come nella prossima slide..."]}},{type:"ModalAlert",options:{markdowns:["Per specificare sia la fonte che la destinazione di ``, basta unire le due tramite i due punti:","","`git push origin :`","","Questo è comunemente conosciuto come colon refspec (*colon* sono i due punti). Refspec è solo un nome complicato per riferirsi ad una posizione che git può interpretare (come il ramo `foo` o anche solo `HEAD~1`).","","Potendo specificare sia fonte che destinazione in maniera indipendente, puoi sfruttare i comandi remoti in maniera molto precisa. Vediamo una demo!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Ricorda, `source` può essere una qualsiasi posizione che git può capire:"],afterMarkdowns:["Wow! Un comando bello contorto ma sensato -- git ha interpretato `foo^` come una posizione, caricato i commit che non erano presenti nel repository remoto, e poi aggiornato la destinazione."],command:"git push origin foo^:main",beforeCommand:"git clone; go -b foo; git commit; git commit"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["E se la destinazione alla quale vuoi caricare i dati non esiste? Nessun problema! Basta specificare il nome di un ramo e git lo creerà sul remoto per te."],afterMarkdowns:["Facile così :D"],command:"git push origin main:newBranch",beforeCommand:"git clone; git commit"}},{type:"ModalAlert",options:{markdowns:["Per questo livello, prova a raggiungere lo stato finale mostrato nella finestra obiettivo, e ricorda il formato:","","`:`"]}}]}}}},{}],151:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22o/main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22o/main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3A%5B%22main%22%5D%7D%2C%22side1%22%3A%7B%22target%22%3A%22C2%27%22%2C%22id%22%3A%22side1%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22side2%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22side2%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%2C%22side3%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22side3%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C4%22%3A%7B%22parents%22%3A%5B%22C3%22%5D%2C%22id%22%3A%22C4%22%7D%2C%22C5%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C5%22%7D%2C%22C6%22%3A%7B%22parents%22%3A%5B%22C5%22%5D%2C%22id%22%3A%22C6%22%7D%2C%22C7%22%3A%7B%22parents%22%3A%5B%22C6%22%5D%2C%22id%22%3A%22C7%22%7D%2C%22C8%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C8%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C8%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%2C%22localBranchesThatTrackThis%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C8%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C8%22%7D%2C%22C2%27%22%3A%7B%22parents%22%3A%5B%22C8%22%5D%2C%22id%22%3A%22C2%27%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%27%22%5D%2C%22id%22%3A%22C3%27%22%7D%2C%22C4%27%22%3A%7B%22parents%22%3A%5B%22C3%27%22%5D%2C%22id%22%3A%22C4%27%22%7D%2C%22C5%27%22%3A%7B%22parents%22%3A%5B%22C4%27%22%5D%2C%22id%22%3A%22C5%27%22%7D%2C%22C6%27%22%3A%7B%22parents%22%3A%5B%22C5%27%22%5D%2C%22id%22%3A%22C6%27%22%7D%2C%22C7%27%22%3A%7B%22parents%22%3A%5B%22C6%27%22%5D%2C%22id%22%3A%22C7%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D",solutionCommand:"git fetch;git rebase o/main side1;git rebase side1 side2;git rebase side2 side3;git rebase side3 main;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main","localBranchesThatTrackThis":null},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":["main"]},"side1":{"target":"C2","id":"side1","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side2":{"target":"C4","id":"side2","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null},"side3":{"target":"C7","id":"side3","remoteTrackingBranchID":null,"localBranchesThatTrackThis":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":["C1"],"id":"C5"},"C6":{"parents":["C5"],"id":"C6"},"C7":{"parents":["C6"],"id":"C7"}},"HEAD":{"target":"side3","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C8","id":"main","remoteTrackingBranchID":null,"localBranchesThatTrackThis":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C8":{"parents":["C1"],"id":"C8"}},"HEAD":{"target":"main","id":"HEAD"}}}',hint:{en_US:"Remember you can always use the undo or reset commands",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.",ja:"undoやresetコマンドをいつでも使用することができるのをお忘れなく",fr_FR:"Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.",ru_RU:"Помни - ты всегда можешь отменить команды с помощью undo или reset",ko:"명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요",uk:"Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset",vi:"Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh",sl_SI:"Vedno lahko razveljaviš ukaz ali ponastaviš stopnjo.",pl:"Pamiętaj, że zawsze możesz skorzystać z poleceń undo i reset",it_IT:"Ricorda che puoi sempre usare i comandi undo e reset"},name:{en_US:"Push Main!",zh_CN:"推送主分支",zh_TW:"push main!",es_AR:"¡Push Main!",es_ES:"¡Push Main!",pt_BR:"Push Main!",gl:"Empurra ó Main!",de_DE:"Push Main!",ja:"Push Main!",fr_FR:"Maître du push !",ru_RU:"Push Мастер!",ko:"Push Main!",uk:"Push Maйстер!",vi:"Push Main!",sl_SI:"Push Main!",pl:"Wypychanie dla wytrwałych!",it_IT:"Push main!"},compareOnlyMainHashAgnostic:!0,startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Merging feature branches","","Now that you're comfortable with fetching, pulling, and pushing, let's put these skills to the test with a new workflow.","","It's common for developers on big projects to do all their work on feature branches (off of `main`) and then integrate that work only once it's ready. This is similar to the previous lesson (where side branches get pushed to the remote), but here we introduce one more step.","","Some developers only push and pull when on the `main` branch -- that way `main` always stays updated to what is on the remote (`o/main`).","","So for this workflow we combine two things:","","* integrating feature branch work onto `main`, and","* pushing and pulling from the remote"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see a refresher real quick of how to update `main` and push work."],afterMarkdowns:["We executed two commands here that:","","* rebased our work onto new commits from remote, and","* published our work to the remote"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["This level is pretty hefty -- here is the general outline to solve:","","* There are three feature branches -- `side1` `side2` and `side3`","* We want to push each one of these features, in order, to the remote","* The remote has since been updated, so we will need to incorporate that work as well","",":O intense! good luck, completing this level is a big step."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Fusionner les feature branches","","Maintenant que vous êtes habitué à fetch, pull et push, mettons ces compétences à profit avec une autre approche de travail.","","Il est commun pour les développeurs de gros projets de faire tout leur travail dans des \"feature branches\" dédiées à une fonctionnalité (en dehors de `main`) et d'intégrer ce travail au reste seulement une fois qu'il est prêt. C'est similaire à la leçon précédente (où les branches secondaires étaient pushées sur le dépôt distant), mais ici nous introduisons une étape supplémentaire.","",'Certains développeurs utilisent la méthode "push puis pull" uniquement sur la branche `main` : de cette manière `main` reste toujours à jour avec ce qu\'il y a sur le dépôt distant (`o/main`).',"","Cette approche combine donc deux choses :","","* intégrer le travail présent depuis la feature branch (la fonctionnalité développée) vers `main`, puis","* pusher et puller sur le dépôt distant."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Rappelons-nous rapidement comment mettre à jour `main` et envoyer (push) le travail."],afterMarkdowns:["Nous exécutons ici deux commandes :","","* on rebase notre travail sur de nouveaux commits, puis","* on publie notre travail sur le dépôt distant"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ce niveau est assez conséquent; voici l'idée générale de la solution :","","* Il y a trois feature branches : `side1` `side2` et `side3`","* Nous voulons envoyer chacune de ces modifications, dans l'ordre, sur le dépôt distant","* Le dépôt distant a été mis à jour entre-temps, donc nous avons aussi besoin d'intégrer ce travail","",":O difficile ! bonne chance, finir ce niveau est une grande étape."]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mergeando feature branches","","Ahora que fetcheás, pulleás y pusheás sin problemas, pongamos a prueba estas habilidades con un nuevo flujo de trabajo.","","Es bastante común que quienes desarrollan en los grandes proyectos trabajen sobre ramas específicas para cada tarea (feature branches) basadas en `main`, y que las integren sólo cuando están listas. Esto es similar a la lección anterior, en que pusheabamos las ramas periféricas al remoto, pero acá tenemos un paso más.","","Hay quienes sólo pushean y pullean cuando están en `main`: de ese modo, `main` siempre se mantiene actualizado con el remoto (`o/main`).","","Entonces, en este flujo de trabajo combinamos dos cosas:","","* integramos el trabajo de las ramas específicas a `main`, y","* pusheamos y pulleamos del remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Refresquemos un poco cómo actualizar `main` y pushear nuestro trabajo."],afterMarkdowns:["Acá 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. Acá tenés algunos lineamientos para resolverlo:","","* Tenemos tres ramas específicas -- `side1` `side2` and `side3`","* Queremos pushear 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 ¡Intenso! ¡Éxitos! Completar este nivel representa un gran avance."]}}]},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 `main`, 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 `main`: de ese modo, `main` siempre se mantiene actualizado con el remoto (`o/main`).","","Entonces, en este flujo de trabajo combinamos dos cosas:","","* integramos el trabajo de las ramas específicas a `main`, y","* pusheamos y pulleamos del remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Refresquemos un poco cómo actualizar `main` 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:[{type:"ModalAlert",options:{markdowns:["## Merge de ramos de funcionalidades","","Agora que você está confortável com fetch, pull e push, vamos colocar essas habilidades em teste com um novo fluxo de trabalho.","","É comum para desenvolvedores de grande projetos fazer todo o trabalho em ramos de funcionalidades (fora do `main`) e então integrar esse trabalho uma única vez quando ele estiver pronto. Isso é similar à lição anterior (onde ramos laterais eram enviados ao repositório remoto), mas introduzimos mais um passo.","","Alguns desenvolvedores só fazem push e pull quando no ramo `main` -- desta forma o `main` sempre se mantém atualizado com aquilo que está no ramo remoto (`o/main`).","","Então, para este fluxo de trabalho, combinaremos duas coisas:","","* Integrar ramos de funcionalidade no `main`, e","* Realizar push e pull do repositório remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos refrescar a memória sobre como atualizar o `main` e enviar trabalho."],afterMarkdowns:["Nós executamos dois comandos aqui que:","","* Fizeram rebase de nosso trabalho nos novos commits do repositório remoto, e","* Publicaram nosso trabalho no repositório remoto"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Esse nível é um pouco pesado -- aqui está a linha geral de como resolver:","","* Há três ramos de funcionalidades -- `side1`, `side2` e `side3`","* Queremos enviar cada uma dessas funcionalidades, em ordem, para o repositório remoto","* O repositório remoto foi atualizado desde então, então também precisaremos incorporar o trabalho realizado lá","",":O intenso! boa sorte, completar este nível é um grande passo."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Mesturando ramas","","Agora que estás afeito a descargar, mesturar e empurrar, poñamos a proba estas habilidades cun novo fluxo de traballo.","","É bastante común que os desenvolvedores nos grandes proxectos traballen sobre ramas específicas para cada tarefa (feature branches) baseadas en `mater`, e que as integren só cando están preparadas. Esto é similar á lección anterior, na que empurrábamos as ramas periféricas ó remoto, pero acá temos un paso máis.","","Algúns desenvovledores só empurran e descargan cando están en `main`: de ese xeito, `main` sempre mantén actualizado o seu estado co remoto (`o/main`).","","Entón, neste fluxo de traballo combinamos dúas cousas:","","* integramos o traballo das ramas específicas a `main`, e","* empurramos e turramos do remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Refresquemos un pouco cómo actualizar `main` e empurrar o noso traballo."],afterMarkdowns:["Agora executamos dous comandos que:","","* rebasamos o noso traballo sobre os novos commits do remoto, e","* publicamos o noso traballo nese remoto"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Este nivel é bastante pesado. Aquí tes algúns patróns para resolvelo:","","* Temos tres ramas específicas -- `side1` `side2` e `side3`","* Queremos empurrar cada unha de esas ramas, en orde, ó remoto","* O remoto foi actualizado, así que imos ter que integrar eses cambios tamén","",":O ¡Intenso! ¡Éxitos! Completar este nivel representa un grande avance."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## merge feature branch","","現在你已經很熟悉 fetch、pull 以及 push,讓我們來針對一個新的問題來應用這些技巧。","","在一個大型的專案裡面,程式設計師經常會在 feature branch(有別於 main branch)上面做開發,之後等開發完之後,在一次 merge 回去。這跟之前的課程是很類似的(其它的 branch 被 push 到 remote),但是現在我們還要再多介紹一個步驟。","","某些程式設計師只針對 `main` branch 進行 push 或者是 pull。這樣子的話 `main` 一直都保持跟 remote (`o/main`) 同步。","","所以針對這個問題我們結合了兩件事情:","","* merge feature branch 到`main` branch,並且","* push remote 以及 pull remote"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們馬上來實際看一下如何更新 `main` 並且 push 到 remote。"],afterMarkdowns:["我們在這裡執行兩個指令:","","* rebase 我們的 branch 到 remote 的新的 commit 上面,並且","* 發佈到 remote 上面"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["這個關卡很複雜,這裡有一些提示:","","* 總共有三個 feature branch,分別是 `side1`,`side2` 以及 `side3`","* 我們想要將這三個 branch 分別 push 到 remote。","* 但是 remote 已經被事先更新過了,所以我們必須要先同步那些更新。","",":O 很好!祝你好運,完成這個關卡是一個很重要的步驟。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Einen Feature Branch reintegrieren","","Nun da du mit `fetch`, `pull`, und `push` vertraut bist, sollten wir diese Fähigkeiten mit einem neuen Arbeitsablauf auf die Probe stellen.","","Für Entwickler in großen Projekten ist es nicht ungewöhnlich ihre Arbeit in Feature Branches (von `main` abgeleitet) zu erledigen und dann diese Inhalte zu reintegrieren, wenn sie fertig sind. Das ist ähnlich dem vorherigen Level (in dem ein Feature Branch auf den Server geschoben wird), nur mit einem zusätzlichen Schritt.","","Einige Entwickler pushen und pullen nur auf dem `main` -- dadurch ist `main` immer aktuell zu seinem Gegenstück auf dem Server (`o/main`).","","Für diesen Ablauf werden wir also zwei Dinge kombinieren:","","* einen Feature Branch in `main` reintegrieren und","* vom entfernten Server pushen und pullen."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns zur Erinnerung schnell noch mal an, wie man den `main` aktualisiert und seine Commits pusht."],afterMarkdowns:["Wir haben hier zwei Befehle ausgeführt, die:","","* unsere Commits auf die neuen Commits vom Server gepackt und","* unsere Commits zum Server gepusht haben."],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Dieser Level ist ziemlich heftig -- hier ist im Groben der Weg:","","* Es gibt drei Feature Branches -- `side1`, `side2` und `side3`.","* Wir möchten jedes dieser Features, in dieser Reihenfolge, auf den Server bringen.","* Der Server hat Commits, die wir noch nicht haben, diese müssen also bei uns integriert werden.","",":O Krass! Viel Erfolg, diesen Level zu schaffen ist ein großer Schritt."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 合并特性分支","","既然你应该很熟悉 fetch、pull、push 了,现在我们要通过一个新的工作流来测试你的这些技能。","","在大型项目中开发人员通常会在(从 `main` 上分出来的)特性分支上工作,工作完成后只做一次集成。这跟前面课程的描述很相像(把 side 分支推送到远程仓库),不过本节我们会深入一些.","","但是有些开发人员只在 main 上做 push、pull —— 这样的话 main 总是最新的,始终与远程分支 (o/main) 保持一致。","","对于接下来这个工作流,我们集成了两个步骤:","","* 将特性分支集成到 `main` 上","* 推送并更新远程分支"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["让我们看看如何快速的更新 `main` 分支并推送到远程。"],afterMarkdowns:["我们执行了两个命令: ","","* 将我们的工作 rebase 到远程分支的最新提交记录","* 向远程仓库推送我们的工作"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["这个关卡的 Boss 很厉害 —— 以下是通关提示:","","* 这里共有三个特性分支 —— `side1` `side2` 和 `side3`","* 我需要将这三分支按顺序推送到远程仓库","* 因为远程仓库已经被更新过了,所以我们还要把那些工作合并过来","",":O 紧张了?祝你好运!完成了本关, 你就向目标又迈近了一大步啦!"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Слияние фича-бранчей (веток)","","Теперь, когда вы умело владеете командами fetch, pull и push, давайте применим эти навыки в сочетании с новым рабочим процессом (он же workflow).","","Среди разработчиков, вовлечённых в большой проект, довольно распространённ приём — выполнять всю свою работу в так называемых фича-бранчах (вне `main`). А затем, как только работа выполнена, разработчик интегрирует всё, что было им сделано. Всё это, за исключением одного шага, похоже на предыдущий урок (там, где мы закачивали ветки на удалённый репозиторий)","","Ряд разработчиков делают push и pull лишь на локальную ветку `main` - таким образом ветка `main` всегда синхронизирована с тем, что находится на удалённом репозитории (`o/main`).","","Для этого рабочего процесса мы совместили две вещи:","","* интеграцию фича-бранчей в `main`","* закачку (push) и скачку (pull) с удалённого репозитория"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте быстренько вспомним, как нам обновить `main` и закачать выполненную работу."],afterMarkdowns:["Здесь мы выполнили две команды, которые:","","* перебазировали нашу работу на новенький коммит, пришедший с удалённого репозитория, и","* закачали свои наработки в удалённый репозиторий"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Текущая задача является достаточно обильной - здесь представлена общая схема выполнения:","","* Есть три фича-бранчи (фича-ветки) - `side1` `side2` и `side3`","* Нам необходимо закачать каждую из них по очереди на удалённый репозиторий","* При этом удалённый репозиторий хранит в себе какие-то наработки, которые также следует скачать к себе","",":O Сложно! Желаю вам удачи в выполнении этой непростой задачи."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## 機能別のブランチ(フィーチャーブランチ)をマージする","","今や、あなたは`fetch`、`pull`、`push`を十分に使えるようになったでしょうから、そのスキルを新しい作業の流れで試してみましょう。","","大きなプロジェクトの開発者にとって、フィーチャーブランチ(`main`を除く)上で全ての作業を行い、完成したら一度でその作業を統合するというような流れが一般的です。これは前のレッスンの内容(他のブランチからリモートにプッシュされるような状況のところが)に似ていますが、ここではもう一歩踏み込んで解説しましょう。","","開発者は、`main`ブランチにいるときプッシュとプルしかしません -- `main`は常にリモート(`o/main`)に追従した状態のままにします。","","この作業の流れでは、私たちは二つのことを組み合わせています:","","* `main`にフィーチャーブランチの作業を統合し、","* リモートへの`push`と`pull`を行う"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["`main`の更新と作業の反映の方法を手早く復習しましょう。"],afterMarkdowns:["我々はここで二つのコマンドを動かしました:","","* リモートから新しいコミットを我々の作業にリベースし、","* リモートに我々の作業を公開しました"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["このレベルはかなり難しいです -- ここに解答の一般的な道のりを示しておきます:","","* 三つのフィーチャーブランチ、`side1`、`side2`、`side3`があります。","* この機能をそれぞれ、この順に、リモートにプッシュしてください。","* リモートが更新されたなら、次はより良く作業を統合する方法を紹介しましょう。","",":O これはきつそうだ!このレベルを完了させることは大きな一歩となります。幸運を祈ります。"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## feature 브랜치 병합하기","","이제 여러분은 fetch, pull, push하는데에 익숙해졌을겁니다. 연마한 기술들을 새로운 상황에서 시험 해봅시다.","","개발자들은 주로 큰 프로젝트를 개발할때 작업을 feature 브랜치(=토픽브랜치 / `main`브랜치가 아닌 작업을위해 임시로 만든 브랜치를 말합니다)들에 하고 준비가 되면 그 작업을 통합합니다. 이전 강의와 비슷한 모습인데(사이드 브랜치들을 원격저장소로 push한것), 여기서 한 단계 더 나아가 봅시다. ","","어떤 개발자들은 `main` 브랜치에 있을때만 push와 pull을 수행합니다 -- 이렇게하면 `main`는 항상 원격 브랜치 (`o/main`)의 상태와 항상 최신의 상태로 유지될 수 있습니다.","","이런 작업흐름은 두가지 작업을 같이하게됩니다 :","","* feature 브랜치의 작업을 main 브랜치로 통합하는것과","* 원격저장소에서 push하고 pull하는 작업입니다"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["다음을 보고 `main`를 갱신하고 작업을 push하는 방법을 다시 떠올려봅시다."],afterMarkdowns:["여기서 우리는 두개의 명령어를 실행 했습니다 :","","* 우리의 작업을 원격 저장소의 새 커밋들로 리베이스한 후","* 우리 작업을 원격저장소로 push했습니다."],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["이번 레벨은 꽤 덩치가 큽니다 -- 문제에대한 대략적인 설명을 해드리겠습니다 :","","* 세개의 feature 브랜치가 있습니다 -- `side1`, `side2` 그리고 `side3` 가 있습니다.","* 각각의 브랜치를 순서에 맞게 원격 저장소로 push하고 싶습니다.","* 원격 저장소가 최근에 갱신된적이 있기때문에 그 작업또한 포함시켜야 합니다.","",":O 이야 할게 많습니다! 행운을 빕니다, 이번 레벨은 많은걸 요구합니다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Мердж гілок з фічами","","Тепер, коли ти вже впевнено володієш засобами `pull` та `push`, час перевірити ці знання в новому процесі.","","Зазвичай розробники працюють над якимось фічами в окремій гілці (не в `main`), а потім, коли роботу закінчено, інтегрують її. Це схоже на попередній урок (де окремі гілки пушили у віддалений репозиторій), але тут буде ще один додатковий крок.","","Деякі розробники виконують push і pull лише в гілці `main` -- тож `main` завжди буде актуальним і синхронізованим з віддаленою гілкою (`o/main`).","","Отже для цього процесу ми об'єднуємо дві речі:","","* інтеграцію гілки з фічею в `main`, і","* пул та пуш для синхронізації з віддаленим репозиторієм"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Пригадаймо коротко як оновити `main` і запушити свої зміни."],afterMarkdowns:["Ми виконали дві команди, які:","","* заребейсили нашу роботу поверх віддалених комітів, і","* опублікували наші зміни у віддаленому репозиторії"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Цей рівень доволі величенький -- ось, що треба буде зробити:","","* Є три гілки з фічами -- `side1` `side2` та `side3`","* Ми хочемо запушити кожну з них по черзі у віддалений репозиторій","* Віддалений репозиторій теж змінився, тож нам потрібно об'єднати всі ці зміни","",":O Чимале завдання! Успіху! Виконання цього рівня буде великим кроком."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Sáp nhập các nhánh tính năng","","Giờ thì bạn đã quen thuộc với tìm nạp, kéo và đẩy, bây giờ chúng tôi sẽ kiểm tra kỹ năng của bạn với một quy trình làm việc mới.","","Trong các dự án lớn, các nhà phát triển thường làm việc trên các nhánh tính năng (feature branch) (được phân nhánh từ `main`) và chỉ thực hiện tích hợp sau khi công việc hoàn thành. Điều này tương tự như mô tả trong bài học trước (đẩy nhánh bên sang kho lưu trữ từ xa), nhưng chúng ta sẽ đi sâu hơn một chút trong phần này.","","Một vài nhà phát triển chỉ thực hiện đẩy và kéo khi ở trên nhánh `main` -- như vậy thì nhánh `main` luôn luôn được cập nhật với nhánh từ xa (`o/main`).","","Vậy nên với quy trình làm việc này chúng tôi đã kết hợp 2 việc:","","* tích hợp nhánh chức năng lên nhánh `main`, và","* đẩy và kéo từ nhánh từ xa"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy xem qua cách cập nhật nhánh `main` và đẩy lên nhánh từ xa hoạt động như thế nào."],afterMarkdowns:["Ta thực thi 2 câu lệnh làm việc sau:","","* tái bố trí (`rebase`) thành quả của ta lên commit của nhánh từ xa, và","* xuất bản thành quả của ta lên nhánh từ xa"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Cấp độ này khá là phức tạp đấy -- để hoàn thành thì hãy xem qua hướng dẫn cơ bản sau:","","* Có 3 nhánh chức năng là -- `side1`, `side2` và `side3`","* Chúng tôi muốn bạn đẩy từng nhánh chức năng, theo thứ tự, lên nhánh từ xa","* Nhánh từ xa cũng đã được cập nhật, nên ta cũng cần sáp nhập thay đổi đó nữa","",":O khoai đây! Cố lên nhé, hoàn thành cấp độ này là lên trình nhiều lắm đấy."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Merganje funkcionalnih branchev","","Sedaj, ko se počutiš udobno s fetchanjem, pullanjem in pushanjem, preizkusimo ta znanja z novimi primeri.","","Za razvijalce na velikih projektih je pogosto, da delajo vse svoje stvari na funkcionalnih brancih (ne na `main`) in potem vključijo to delo, ko je končano. To je podobno prejšnjim lekcijam (kjer so bili pushani stranski branchi na oddaljen repo), a tu predstavljamo še en korak.","","Nekateri razvijaci samo pushajo in pullajo na `main` branchu -- zato `main` vedno ostane posodobljen z oddaljenim masterjem (`o/main`).","","Torej za tak primer uporabe, združimo dve stvari:","","* vključevanje dela funkcionalnih branchev na `main` in","* pushanje in pullanje iz oddaljenega repota"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Osvežimo si na hitro, kako posodobiti `main` in pushati delo."],afterMarkdowns:["Izvedli smo dva ukaza, ki:","","* rebasata naše delo na nove commite iz oddaljenega repozitorija in","* objavita naše delo na oddaljen repozitorij"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ta stopnja je kar zajetna -- tu je splošno ideja za rešitev:","","* Imamo tri branche -- `side1`, `side2` in `side3`","* Želimo pushati vsako od teh funkcionalnosti po vrstnem redu na oddaljen repo","* Oddaljen repo se je medtem posodobil, zato bomo morali vključiti tudi to delo","",":O Naporno! Srečno, končanje te stopnje je velik korak."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Scalanie gałęzi feature","","Teraz, kiedy fetch, pull ani push nie mają już przed tobą tajemnic, sprawdźmy, jak poradzisz sobie z inną kolejnością działań.","","W dużych projektach często pracuje się na gałęziach tematycznych (zazwyczaj nazywanych `feature`), a nie na `main`, i scala się je dopiero po ukończeniu pracy. To sytuacja zbliżona do tej z poprzedniej lekcji (gałęzie boczne wypychaliśmy do remote), ale tu dodamy jeszcze jeden krok.","","Niektórzy używają push i pull, tylko będąc na gałęzi `main` - dzięki temu `main` zawsze odzwierciedla to, co jest na zdalnej gałęzi (`o/main`).","","Dlatego tym razem połączymy dwie rzeczy:","","* integrację pracy na gałęzi `feature` z `main` oraz","* push i pull ze zdalnego repozytorium"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Przypomnijmy sobie w skrócie, jak uaktualnić `main` i wypchnąć naszą pracę."],afterMarkdowns:["Wykonaliśmy dwa polecenia, które:","","* przebazowały naszą pracę ponad nowymi commitami ze zdalnego repozytorium oraz","* opublikowały naszą pracę na remote"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Ten poziom jest dość ciężki: oto ogólny zarys problemu do rozwiązania:","","* Mamy trzy boczne gałęzie: `side1`, `side2` i `side3`","* Każdą z nich chcemy kolejno wypchnąć do zdalnego repozytorium","* Zdalne repo było w tym czasie zmieniane, więc te zmiany również musimy nanieść","",":O Ciężka sprawa... Powodzenia! Ukończenie tego poziomu to duży krok naprzód."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Fondere rami di funzionalità","","Ora che ti sei ambientato con fetch, pull e push, vediamo di testare queste skill in un nuovo flusso di lavoro.","","È comune che gli sviluppatori di grandi progetti svolgano il loro lavoro su dei rami per le funzionalità (feature branch, basati sul `main`). Questo è simile alla lezione precedente (dove rami secondari vengono caricati nel remoto), ma qui aggiungiamo un ulteriore passo.","","Alcuni sviluppatori caricano e scaricano commit solo quando sono sul ramo `main` -- in questo modo `main` rimane sempre aggiornato allo stato del remoto ('`o/main`).","","Quindi per questo flusso di lavoro devi unire due cose:","","* integrare feature branch a partire dal `main`, e","* usare push e pull verso il repository remoto"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Diamo una rinfrescata veloce su come aggiornare `main` e caricare il nostro lavoro."],afterMarkdowns:["Abbiamo eseguito due comandi:","","* abbiamo ribasato il nostro lavoro sul nuovo commit dal remoto, e","* abbiamo pubblicato il nostro lavoro sul remoto"],command:"git pull --rebase; git push",beforeCommand:"git clone; git commit; git fakeTeamwork"}},{type:"ModalAlert",options:{markdowns:["Questo livello è abbastanza impegnativo -- ecco come risolverlo a grandi linee:","","* Ci sono tre feature branch -- `side1` `side2` e `side3`","* Vogliamo caricare ciascuna di queste funzionalità, in ordine, sul remoto","* Il remoto nel mentre è stato aggiornato, quindi dobbiamo prima incorporare quelle modifiche","","tosto :O! buona fortuna, completare questo livello è un gran passo."]}}]}}}},{}],152:[function(e,t,o){o.level={goalTreeString:'{"branches":{"main":{"target":"C3","id":"main"},"o/main":{"target":"C1","id":"o/main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C3":{"parents":["C1"],"id":"C3"},"C4":{"parents":["C1"],"id":"C4"}},"HEAD":{"target":"C4","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git commit;git checkout o/main;git commit",startTree:'{"branches":{"main":{"target":"C1","id":"main"},"o/main":{"target":"C1","id":"o/main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main"}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Remote Branches",zh_CN:"远程分支",zh_TW:"remote branch (遠端分支)",es_AR:"Ramas remotas",es_MX:"Ramas remotas",es_ES:"Ramas remotas",pt_BR:"Ramos remotos",gl:"Ramas remotas",de_DE:"Branches auf entfernten Servern",ja:"リモートのブランチ",fr_FR:"Les branches distantes",ru_RU:"Удалённые ветки",ko:"원격 브랜치(remote branch)",uk:"Віддалені гілки",vi:"Nhánh từ xa",sl_SI:"Oddaljeni Branchi",pl:"Zdalne gałęzie",it_IT:"Rami Remoti"},hint:{en_US:"Pay attention to the ordering -- commit on main first!",zh_CN:"注意顺序 —— 先在 main 分支上提交!",zh_TW:"注意順序的問題喔!先在 main branch 上面送 commit",es_AR:"Prestá atención al orden: ¡commiteá sobre main primero!",es_MX:"Presta atención al orden: ¡haz commit sobre main primero!",es_ES:"Presta atención al orden: ¡haz commit sobre main primero!",pt_BR:"Preste atenção na ordem: commite no main primeiro!",gl:"Preta atención á orde: fai commit no main primeiro",de_DE:"Beachte die Sortierung -- committe zuerst auf dem main!",ja:"順番に注意 -- まずmainに対してcommitしましょう",fr_FR:"Prêtez attention à l'ordre -- les commits sur main d'abord !",ru_RU:"Уделяйте внимание очерёдности -- сперва commit на main",ko:"순서에 주의하세요: main 브랜치 에서 먼저 커밋하세요!",uk:"Звертайте увагу на послідовність -- спочатку коміт в мастер!",vi:"Chú ý đến thứ tự -- commit trên nhánh main trước!",sl_SI:"Bodi pozoren na vrsti red -- commitaj najprej na main!",pl:"Zwróć uwagę na kolejność -- najpierw zatwierdzaj na main",it_IT:"Presta attenzione all'ordine -- fai prima un commit sul main!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Remote Branches","","Now that you've seen `git clone` in action, let's dive into what actually changed.","","The first thing you may have noticed is that a new branch appeared in our local repository called `o/main`. This type of branch is called a _remote_ branch; remote branches have special properties because they serve a unique purpose.","","Remote branches reflect the _state_ of remote repositories (since you last talked to those remote repositories). They help you understand the difference between your local work and what work is public -- a critical step to take before sharing your work with others.","","Remote branches have the special property that when you check them out, you are put into detached `HEAD` mode. Git does this on purpose because you can't work on these branches directly; you have to work elsewhere and then share your work with the remote (after which your remote branches will be updated).","","To be clear: Remote branches are on your _local_ repository, not on the remote repository."]}},{type:"ModalAlert",options:{markdowns:["### What is `o/`?","","You may be wondering what the leading `o/` is for on these remote branches. Well, remote branches also have a (required) naming convention -- they are displayed in the format of:","","* `/`","","Hence, if you look at a branch named `o/main`, the branch name is `main` and the name of the remote is `o`.","","Most developers actually name their main remote `origin`, not `o`. This is so common that git actually sets up your remote to be named `origin` when you `git clone` a repository.","","Unfortunately the full name of `origin` does not fit in our UI, so we use `o` as shorthand :( Just remember when you're using real git, your remote is probably going to be named `origin`!","","That's a lot to take in, so let's see all this in action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lets check out a remote branch and see what happens."],afterMarkdowns:["As you can see, git put us into detached `HEAD` mode and then did not update `o/main` when we added a new commit. This is because `o/main` will only update when the remote updates."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["To finish this level, commit once off of `main` and once after checking out `o/main`. This will help drive home how remote branches behave differently, and they only update to reflect the state of the remote."]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["## Les branches distantes de Git","","Maintenant que nous avons vu `git clone` en action, plongeons dans ce qui a changé.","","La première chose que vous avez peut-être remarquée est qu'une nouvelle branche est apparue dans votre dépôt local appelée `o/main`. Ce type de branche est appelée une branche _distante_ ; les branches distantes ont des propriétés spécifiques car elles servent à un but précis.","","Les branches distantes reflètent _l'état_ des dépôts distants (depuis la dernière fois où vous avez parlé avec ceux-ci). Elles vous aident à comprendre les différences entre votre travail et le travail public -- une étape critique à effectuer avant de partager son travail avec les autres.","","Les branches distantes ont une propriété particulière: quand vous vous rendez dessus (checkout), `HEAD` est détaché. Git fait cela car vous ne pouvez pas travailler sur ces branches directement ; vous devez travailler ailleurs et ensuite partager votre travail avec le dépôt distant (après quoi vos branches distantes seront mises à jour)."]}},{type:"ModalAlert",options:{markdowns:["### Qu'est-ce que `o/`?","","Vous vous demandez peut-être ce qu'est le préfixe `o/` devant ces branches distantes. En pratique, les branches distantes ont aussi une convention de nommage (obligatoire) -- elles sont affichées avec le format :","","* `/`","","Donc, si vous regardez une branche nommée `o/main`, le nom de la branche est `main` et le nom du dépôt distant est `o`.","","La plupart des développeurs nomment leur principal dépôt distant `origin`, pas `o`. C'est si commun que Git configure en fait votre dépôt local pour être nommé `origin` quand vous faîtes un `git clone` du dépôt.","","Malheureusement le nom complet `origin` ne rentre pas dans notre interface graphique et nous utilisons donc `o` comme raccourci :( Rappelez-vous juste que quand vous utilisez le vrai Git, votre dépôt distant est probablement nommé `origin`!","","Cela fait beaucoup d'un coup, donc voyons cela en action."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Rendons-nous sur une branche et regardons ce qui se passe."],afterMarkdowns:["Comme vous pouvez le voir, Git nous a mis dans le mode \"detached\" (cf. `HEAD`) puis n'a pas mis à jour `o/main` quand nous avons ajouté un nouveau commit. C'est parce que `o/main` va se mettre à jour uniquement quand le dépôt distant sera mis à jour."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Pour finir ce niveau, faites un commit à partir de `main` puis un autre après vous être rendu dans `o/main`. Cela va nous aider à comprendre la différence de comportement des branches distantes, et le fait qu'elles se mettent à jour uniquement pour refléter l'état du dépôt distant."]}}]},es_AR:{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/main`. 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 el resto.","","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)."]}},{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 las muestra con el formato:","","* `/`","","Entonces, si mirás una rama llamada `o/main`, el nombre de la rama es `main`, y el nombre del remoto es `o`.","","La mayoría llama `origin` a su remoto en lugar de `o`. Esto es tan común que git efectivamente crea tu remoto llamándolo `origin` cuando hacés `git clone` de un repositorio.","","Desafortunadamente el nombre `origin` completo no entra en nuestra UI, así que usamos `o` para abreviar :( Simplemente recordá que cuando uses el git real, tu remoto ¡probablemente se llame `origin`!","","Hay mucho para procesar, así que veámoslo en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Checkouteemos una rama remota a ver qué pasa."],afterMarkdowns:["Como ves, git nos puso en el modo detached `HEAD` y no actualizó `o/main` cuando creamos un nuevo commit. Esto es porque `o/main` sólo va a actualizarse cuando el remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, commiteá una vez sobre `main` y una después de checkoutear `o/main`. Esto te va a ayudar a caer en cómo las ramas remotas funcionan distinto, y que sólo se actualizan para reflejar el estado del remoto."]}}]},es_MX:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas remotas de git","","Ahora que viste `git clone` en acción, profundicemos en lo que realmente cambió.","","Lo primero que habrás notado es que apareció una nueva rama en nuestro repositorio local llamada `o/main`. A este tipo de ramas se les llama ramas _remotas_. Las ramas remotas tienen propiedades especiales porque sirven para un propósito específico.","","Las ramas remotas reflejan el _estado_ de los repositorios remotos (como estaban la última vez que te comunicaste 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 cual tus ramas remotas serán actualizadas).","","Para ser claros: Las ramas remotas están en tu repositorio local, no en el repositorio remoto"]}},{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 siguiente formato:","","* `/`","","Entonces, si observas una rama llamada `o/main`, el nombre de la rama es `main`, y el nombre del remoto es `o`.","","Realmente, la mayoría de los desarrolladores llaman `origin` a su remoto en lugar de `o`. Esto es tan común que git directamente crea tu remoto llamándolo `origin` cuando haces `git clone` de un repositorio.","","Desafortunadamente, el nombre `origin` no cabe 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`!","","Eso es mucho para digerir, así que veámoslo en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hagamos checkout sobre una rama remota y veamos qué pasa."],afterMarkdowns:["Como puedes ver, git nos puso en el modo detached `HEAD` y no actualizó `o/main` cuando creamos un nuevo commit. Esto es porque `o/main` sólo va a actualizarse cuando el remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para terminar este nivel, haz un commit sobre `main` y uno después de hacer checkout a `o/main`. Esto te va a ayudar a aprender cómo se comportan las ramas remotas, y que sólo se actualizan para reflejar el estado del remoto."]}}]},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/main`. 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/main`, el nombre de la rama es `main`, 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/main` cuando creamos un nuevo commit. Esto ocurre porque `o/main` sólo va a actualizarse cuando el remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, haz commit una vez sobre `main` y otra vez después de checkoutear `o/main`. 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:[{type:"ModalAlert",options:{markdowns:["## Ramos Remotos no Git","","Agora que vimos o `git clone` em ação, vamos estudar aquilo que realmente mudou.","","A primeira coisa que você pode ter percebido é que um novo ramo chamado `o/main` aparece no nosso repositório local. Esse tipo de ramo é chamado de ramo _remoto_; ramos remotos possuem propriedades especiais pois eles servem a um propósito único.","","Ramos remotos refletem o _estado_ de repositórios remotos (desde a última vez na qual você falou com eles). Eles ajudam a entender as diferenças entre o trabalho local e o trabalho atualmente público -- um passo crítico a ser dado antes de compartilhar seu trabalho com os outros.","",'Ramos remotos possuem a propriedade especial de, ao sofrerem um checkout, colocarem o repositório em modo "Detached HEAD". O Git faz isso de propósito, porque você não pode trabalhar nesses ramos diretamente; você é obrigado a trabalhar em outro lugar e só então compartilhar seu trabalho com o remoto (depois disso, os ramos remotos serão atualizados).']}},{type:"ModalAlert",options:{markdowns:["### O que é `o/`?","","Você pode estar se perguntando o que o `o/` no início do nome dos ramos remotos significa. Bem, ramos remotos possuem uma convenção obrigatória de nomes -- eles são mostrados no seguinte formato:","","* `/`","","Então, se o ramo remoto é chamado `o/main`, o nome do ramo é `main` e o nome do repositório remoto é `o`.","","A maioria dos desenvolvedores na verdade chama o repositório remoto principal de `origin`, e não de `o`. Isso é tão comum que o Git define por padrão o nome `origin` para o repositório remoto quando você usa o comando `git clone` para clonar um repositório.","","Infelizmente o nome completo `origin` não cabe na nossa tela, então usamos `o` como uma abreviação :( Apenas lembre-se que no Git de verdade, o repositório remoto provavelmente será chamado `origin` em vez de `o`!","","É muita informação de uma só vez, então vamos dar uma pausa e ver um pouco de ação."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vamos fazer checkout de um ramo remoto e ver o que acontece."],afterMarkdowns:['Como você pode ver, o Git nos colocou no modo "Detached HEAD", e não atualizou o `o/main` quando adicionamos um novo commit. Isso é porque o `o/main` só será atualizado quando o repositório remoto for atualizado.'],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nível, commite uma vez em `main`, e outra vez depois de fazer checkout em `o/main`. Isso vai ajudá-lo a sentir como os ramos remotos se comportam de forma diferente, e como eles apenas se atualizam para refletir o estado do repositório remoto."]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Ramas remotas de git","","Agora que viches `git clone` en acción, mergullémonos no que realmente mudou.","","O primeiro que notarías é que apareceu unha nova rama no teu repositorio local chamada `o/main`. A este tipo de ramas chámaselle ramas _remotas_. As ramas remotas teñén propiedades especiais porque serven para un propósito específico.","","As ramas remotas reflexan o _estado_ dos repositorios remotos (como estaban á última vez que falaches con eles). Axúdante a entender as diferencias entre o teu traballo local e o teu traballo que xa está publicado - un paso crítico antes de compartir o teu traballo cos demáis.","","As ramas remotas teñen a propiedade especial de que cando fas checkout, pasas o modo detached `HEAD`. Git faino a drede porque non podes traballar nesas ramas directamente: tes que traballar nalgún outro lado e despois compartir o teu traballo co remoto (tras o que as túas ramas remotas actualizaranse)."]}},{type:"ModalAlert",options:{markdowns:["### ¿Qué é `o/`?","","Poderías estar a preguntarte qué significa ese `o/` ó principio das ramas remotas. Bueno, as ramas remotas tamén teñen unha convención de nomes obligatoria -- se as amosas co formato:","","* `/`","","Entonces, se miras unha rama chamada `o/main`, o nome da rama é `main`, e o nome do remoto é `o`.","","A maioría dos desenvolvedores chaman `origin` ó seu remoto no lugar de `o`. Esto é tan común que git efectivamente crea o teu remoto chamandoo `origin` cando fas `git clone` dun repositorio.","","Desafortunadamente o nome `origin` completo non entra na nosa UI, así que empregaremos `o` para acortar: (Sinxelamente recorda que cando uses git na vida real, o teu remote ¡probablemente se chame `origin`!)","","Hai moito para procesar, así que vexámolo en acción."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Fagamos checkout a unha rama remota a ver qué pasa."],afterMarkdowns:["Como ves, git púxonos no modo detached `HEAD` e non actualizou `o/mater` cando creamos un novo commit. Esto é porque `o/mater` só vai actualizarse cando o remoto se actualice."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Para completar este nivel, fai commit unha vez sobre `mater` e despois de facer o checkout a `o/main`. Esto vaite axudar a entender cómo funcionan as ramas remotas, e que só se actualizan para reflexar o estado do remoto."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["## git remote branch","","現在你已經知道 `git clone` 在幹嘛了,讓我們仔細看看到底發生了什麼事。","","你首先看到的是在你的本地端(local repository)出現了一個新的 branch 叫作 `o/main`,這種型態的 branch 叫作 remote branch (遠端分支),因為特殊的需求,因此 remote branch 有特殊的性質。","","remote branch 反應了 remote repository 的狀態(因為你最後接觸的是這些 remote repository),最重要的是,在你想要分享你的 commit 給其他人時,你必須知道你現在的 commit 跟 remote repository 有哪些不同,而 remote branch 的狀態就是在告訴你這些資訊。","","remote branch 有特別的特性,當你移動到 remote branch 時,你就進入到分離 `HEAD` 的狀態,git 這樣做的原因是告訴你不能夠直接影響這些 branch。你必須要在其它的 branch 工作,並且分享到 remote (分享之後,你的 remote branch 就會被更新)。"]}},{type:"ModalAlert",options:{markdowns:["### 什麼是 `o/`?","","你也許會對於 remote branch 前面的 `o/` 感到困惑,喔!remote branch 也(需要) 一個命名法則,或者是一般表示 remote branch 的格式。","","* `/`","","因此,當你看到一個 branch 叫做 `o/main`,就表示這個 branch 叫做 main,而且這個 remote 的名稱叫作 `o`。","","很多程式設計師實際上會把他們的 remote 命名為 `origin`,而不是 `o`,這在 git 是很常見的事情,因為當你使用 `git clone` 時,git 會自動把你的 remote 命名為 `origin`。","","但是很不幸的是 `origin` 並沒有辦法完全顯示在我們的 UI 上面,所以我們用 `o` 來簡化它(只要記住當你使用 git 的時候,實際上是命名為 `origin`)。","","有很多事情需要說明,現在讓我們來看看吧!"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["讓我們移動到(checkout)一個 remote branch 並且看一下會發生什麼事情"],afterMarkdowns:["就像你看到的, git 讓我們進到 detached `HEAD` 狀態,同時,當我們加入一個新的 commit 時,`o/main` 都沒有更新,這是因為只有當 remote 更新的時候,`o/main` 才會更新。"],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["要完成這一關,先在 main branch 上面做一次 commit,再移動到 `o/main` 上做一次 commit,這有助於我們了解到 remote branch 的不同,它們只會反應 remote 的狀態。"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["## Branches auf entfernten Servern","","Nun da du `git clone` in Aktion gesehen hast, lass uns tiefer in die Materie eintauchen.","","Dir ist wahrscheinlich als Erstes aufgefallen, dass ein neuer Branch namens `o/main` in unserem lokalen Repository aufgetaucht ist. Diese Art von Branch nennt sich _Remote_ Branch; er hat besondere Eigenschaften, weil er einem bestimmten Zweck dient.","","Ein Remote Branch bildet den Zustand des entsprechenden Branch in einem entfernten Repository ab (dem Zustand in dem der Branch war, als du das letzte Mal das entfernte Repository angesprochen hast). Er hilft dir, den Unterschied zwischen deinem lokalen Branch und dem Gegenstück auf dem Server zu sehen -- eine nötige Information, bevor du deine Arbeit mit anderen teilen kannst.","",'Remote Branches besitzen die besondere Eigenschaft dein Repository in den "Detached `HEAD`" Zustand zu versetzen, wenn du sie auscheckst. Git macht das absichtlich so, denn du kannst nicht direkt auf Remote Branches arbeiten; du musst auf Kopien von ihnen arbeiten und deine Änderungen von dort auf den entfernten Server schieben (wonach der Remote Branch dann auch bei dir aktualisiert wird).']}},{type:"ModalAlert",options:{markdowns:["### Was heißt `o/`?","","Du fragst dich vielleicht was das `o/` am Anfang des Namens des Remote Branch bedeuten soll. Nun, Namen von Remote Branches folgen einer (zwingenden) Konvention -- sie werden mit diesem Format gebildet:","","* `/`","","Wenn du also einen Remote Branch namens `o/main` hast, ist es eine Abbildung des Branches `main` auf dem Server, der in deinem Repository als `o` bekannt ist.","","Die meisten Entwickler nennen das Haupt-Remote eigentlich `origin` und nicht `o`. Das ist so verbreitet, dass Git den entfernten Server, von dem man ein `git clone` macht, standardmäßig als `origin` im Clone speichert.","","Leider passt der ganze Name, `origin`, nicht in unsere Darstellung, deshalb benutzen wir hier kurz `o`. :( Merk dir einfach: wenn du echtes Git benutzt, werden die Remotes meistens `origin` heißen!","","So, das war eine Menge zu verdauen. Schauen wir uns das in Aktion an."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Checken wir mal einen Remote Branch aus und schauen was passiert."],afterMarkdowns:['Wie du siehst setzt uns Git in den "Detached `HEAD`" Modus und aktualisiert dann nach dem Commit nicht den Branch `o/main`. Das liegt daran, dass der Remote Branch nur aktualisiert wird, wenn sich der entsprechende Branch auf dem Remote verändert.'],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Um diesen Level zu bewältigen, musst du einen Commit in `main` machen und einen, nachdem du `o/main` ausgecheckt hast. Das illustriert noch einmal wie sich Branches und Remote Branches unterschiedlich verhalten und dass letztere sich nur verändern, wenn sich ihr Zustand auf dem entfernten Server ändert."]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["## 远程分支","","既然你已经看过 `git clone` 命令了,咱们深入地看一下发生了什么。","","你可能注意到的第一个事就是在我们的本地仓库多了一个名为 `o/main` 的分支, 这种类型的分支就叫**远程**分支。由于远程分支的特性导致其拥有一些特殊属性。","","远程分支反映了远程仓库(在你上次和它通信时)的**状态**。这会有助于你理解本地的工作与公共工作的差别 —— 这是你与别人分享工作成果前至关重要的一步.","","远程分支有一个特别的属性,在你切换到远程分支时,自动进入分离 HEAD 状态。Git 这么做是出于不能直接在这些分支上进行操作的原因, 你必须在别的地方完成你的工作, (更新了远程分支之后)再用远程分享你的工作成果。"]}},{type:"ModalAlert",options:{markdowns:["### 为什么有 `o/`?","","你可能想问这些远程分支的前面的 `o/` 是什么意思呢?好吧, 远程分支有一个命名规范 —— 它们的格式是: ","","* `/`","","因此,如果你看到一个名为 `o/main` 的分支,那么这个分支就叫 `main`,远程仓库的名称就是 `o`。","","大多数的开发人员会将它们主要的远程仓库命名为 `origin`,并不是 `o`。这是因为当你用 `git clone` 某个仓库时,Git 已经帮你把远程仓库的名称设置为 `origin` 了","","不过 `origin` 对于我们的 UI 来说太长了,因此不得不使用简写 `o` :) 但是要记住, 当你使用真正的 Git 时, 你的远程仓库默认为 `origin`! ","","说了这么多,让我们看看实例。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果切换到远程分支会怎么样呢?"],afterMarkdowns:["正如你所见,Git 变成了分离 HEAD 状态,当添加新的提交时 `o/main` 也不会更新。这是因为 `o/main` 只有在远程仓库中相应的分支更新了以后才会更新。"],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["要通过本关,在 `main` 分支上做一次提交;然后切换到 `o/main`,再做一提交。这有助于你理解远程分支的不同,他们的更新只是反映了远程的状态。"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["## リモートのブランチ","","あなたは今や`git clone`の動作を知ったことでしょうから、次は実際に詳細を見てみましょう。","","まず、もしかしたらもう気付いているかもしれないですが、私たちのローカルリポジトリにo/mainという名前の新しいブランチが追加されています。このようなブランチは、_リモート_ブランチと呼ばれます。リモートブランチは、その固有の役割を担うために特別なプロパティを持っています。","","リモートブランチは、リモートリポジトリの_状態_を反映します(あなたがそのリモートリポジトリから変更を最後に問い合わせてからの)。","","リモートブランチは、あなたがチェックアウトするとき、`HEAD`が分離された状態になるという特殊な性質を持っています。Gitはこの上での動作を保証しません。なぜこのようになるかというと、リモートブランチ上での直接の作業はできないからなのです。あなたは、別の場所で作業をし、その後でリモートブランチに共有するようにしなければなりません(その後であなたのリモートブランチは更新されます)。"]}},{type:"ModalAlert",options:{markdowns:["### `o/`とは何か?","","あなたは、リモートブランチが`o/`で始まることに驚くかもしれません。そう、リモートブランチには固有の(必要な)命名規則も存在するのです。 -- これは次のようなフォーマットで表示されます:","","* `<リモート名>/<ブランチ名>`","","これに基づいて、`o/main`と名付けられたブランチを見てみると、`main`はブランチの名前、`o`はリモートの名前であることが分かります。","","多くの開発者は、実際にはメインのリモート名として`o`ではなく`origin`を使います。これは一般的には、Gitが`git clone`した時に`origin`という名前をリモートに付与するためです。","","残念ながら、`origin`という長い名前は私たちのUIには合いませんでした。なので、私たちは短い`o`を使っています(覚えておいてもらいたいのは、実際のGitでは、リモートはおそらく`origin`と名付けられるであろうということです!)","","理解すべきことはたくさんあるので、ひとまず全ての動作を見てみましょう。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["リモートブランチをチェックアウトすると何が起こるかを見てみましょう"],afterMarkdowns:["見ていた通り、`o/main`に移ってから新しいコミットをしても`HEAD`が分離状態になり`o/main`は更新されていません。これは、`o/main`がリモートの更新時のみ更新されるからです。"],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["このレベルを終えるには、まずコミットを`main`に一回行い、その後`o/main`にチェックアウトしてからもう一度コミットをします。これは、リモートブランチがどれほど違った動きをするか、そしてリモートブランチがリモートの状態を反映する時しか更新されないことを理解するのに役立つでしょう。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["## Удалённые ветки в Git","","Теперь, когда вы уже увидели `git clone` в действии, давайте углубимся в детали и посмотрим что же на самом деле изменилось.","","Во-первых, вы должны были заметить, что у нас в локальном репозитории появилась новая ветка с именем `o/main`. Такой тип ветки называется _удалённой_ веткой. Поскольку удалённые ветки играют важную и уникальную роль, они обладают рядом специальных свойств.","","Удалённые ветки отражают _состояние_ удалённых репозиториев (с того момента, как вы обращались к этим удалённым репозиториям в последний раз). Они позволяют вам отслеживать и видеть разницу между вашими локальными наработками и тем, что было сделано другими участниками - важный шаг, который необходимо делать, прежде чем делиться своими наработками с другими.","","Важным свойством удалённых веток является тот факт, что когда вы извлекаете их, вы отделяете (detaching) `HEAD`. Git делает это потому, что вы не можете работать непосредственно в этих ветках; сперва вам необходимо сделать наработки где-либо, а уж затем делиться ими с удалёнными репозиториями (после чего ваши удалённые ветки будут обновлены)."]}},{type:"ModalAlert",options:{markdowns:["### Что такое `o/` в названии ветки?","","Вы, наверное, догадались, что первый символ `o/` в названии ветки служит для обозначения именно удалённых веток. Да. Удалённые ветки также имеют (обязательное) правило именования - они отображаются в формате:","","* `<удалённый репозиторий>/<имя ветки>`","","Следовательно, если вы взглянете на имя ветки `o/main`, то здесь `main` - это имя ветки, а `o` - это имя удалённого репозитория.","","Большинство разработчиков именуют свои главные удалённые репозитории не как `o`, а как `origin`. Также общепринятым является именование удалённого репозитория как `origin`, когда вы клонируете репозиторий командой `git clone`.","","К сожалению, полное имя `origin` не помещается на элементах дизайна наших уроков, поэтому мы используем краткое `o` :( Просто помните, когда вы пользуетесь git в реальном проекте, ваш удалённый репозиторий скорее всего будет называться `origin`!","","Давайте посмотрим на всё это в действии."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Давайте извлечём (check out) удалённую ветку и посмотрим что произойдёт"],afterMarkdowns:["Как вы можете видеть, git отделил (detached) `HEAD` и не обновил `o/main`, когда мы добавили новый коммит. Всё потому, что `o/main` обновится тогда и только тогда, когда обновится сам удалённый репозиторий."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Для завершения уровня выполните коммит единожды на `main`, а затем на `o/main` (предварительно переключившись на эту ветку). Это наглядно продемонстрирует поведение удалённых веток, а также покажет, как изменения влияют на состояние удалённых репозиториев."]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git 원격 브랜치","","이제 `git clone`을 직접 확인 해 보셨습니다. 이제 무엇이 변했는지 살펴 봅시다.","","가장 먼저 알아차릴만한 변화는 우리의 로컬 저장소에 `o/main`라고하는 새 브랜치가 생긴겁니다. 이런 종류의 브랜치는 _원격_브랜치라고 불립니다; 원격 브랜치는 특정한 목적을 제공하기 때문에 특별한 속성들이 있습니다.","","원격 브랜치는 원격 저장소의 _상태_를 반영합니다(가장 최근 원격 원격저장소와 작업을 했을때를 기준으로). 원격 브랜치는 로컬에서의 작업과 공개적으로 되고있는 작업의 차이를 이해하는데 도와줍니다 -- 다른 사람들과 작업을 공유하기전에 반드시해야할 과정이죠.","","원격 브랜치는 체크 아웃을 하게 되면 분리된 `HEAD` 모드로 가게되는 특별한 속성이 있습니다. Git은 여러분이 이 브랜치들에서 직접 작업할 수 없기 때문에 일부로 이렇게 합니다; 여러분은 다른곳에 작업을 하고 원격 저장소와 여러분의 작업을 공유해야합니다(그 이후에 원격 브랜치가 갱신됩니다)."]}},{type:"ModalAlert",options:{markdowns:["### `o/`가 뭐죠?","","여러분은 원격 브랜치들 앞에 붙는 `o/`가 뭔지 궁금할 것입니다. 음, 원격 브랜치 또한 (필수적인) 이름짓기 규약이 있습니다 -- 다음의 형식으로 나타납니다:","","* `/`","","이런 이유로, 만약 `o/main`라는 이름의 브랜치를 보게되면, 브랜치의 이름은 `main`이고 원격 저장소의 이름은 `o`인겁니다.","","대부분의 개발자들은 자신의 주 원격 저장소를 `o`가 아닌 `origin`이라고 짓습니다. 사실 보통 다 이렇게 쓰기 때문에 git은 저장소를 `git clone`하게 되면 원격 저장소의 이름을 `origin`이라고 자동으로 설정해놓습니다.","","부득이하게도 `origin`이라는 풀네임은 우리 UI에 안 맞아서 `o`로 간략히 표현하겠습니다 :( 진짜 git을 사용하게되면 여러분의 원격저장소가 아마 `origin`이라고 되있다는것을 알아두세요!","","머리속에 넣기엔 너무 많이 떠든것 같습니다. 직접 확인해 봅시다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["원격 브랜치를 체크아웃하고 무엇이 일어나는지 확인해 봅시다"],afterMarkdowns:["보이는것 처럼, git은 우리를 분리된 `HEAD` 모드로 만들고 새로운 커밋을 추가해도 `o/main`를 갱신하지 않습니다. 이것은 `o/main`가 원격 저장소가 갱신될때만 갱신되기 때문입니다."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["다음 레벨로 가기 위해서는 `main`에서 한번 커밋하고 `o/main`를 체크아웃 하고 다시 한번 커밋을 하세요. 이를 통해서 원격 브랜치가 어떻게 다르게 작동하는지 알아보고, 원격 브랜치는 원격 저장소의 상태를 반영하기만 한다는것을 이해해 봅시다."]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["## Віддалені гілки","","Тепер, коли ти познайомився з `git clone` в дії, розгляньмо деталі й подивімося, що дійсно змінилося.","","Перше, що ти міг помітити -- це те, що з’явився новий бранч з назвою `o/main`. Такі гілки називаються _віддаленими_ (remote); віддалені гілки в гіт відіграють в певному сенсі унікальну роль, тому в них є деякі спеціальні властивості, непритаманні іншим гілкам.","","Віддалені гілки відображають _стан_ віддалених репозиторіїв (точніше, стан віддаленого репо на момент останньої синхронізації). Вони дозволяють відрізняти та відслідковувати локальні зміни та зміни інших учасників, що є дуже важливим для успішної синхронізації роботи між різними репозиторіями.","","Важливою властивістю віддалених гілок є те, що коли перейти на них, ти опинишся в стані `detached HEAD`. Git робить це спеціально, так як неможливо працювати з ними напряму; ти маєш працювати в локальній гілці й по необхідності синхронізуватися з віддаленим репозиторієм (після чого віддалену гілку буде оновлено)."]}},{type:"ModalAlert",options:{markdowns:["### Що за `o/`? Або Римський салют","","Ти, можливо, здогадуєшся для чого потрібен префікс `o/` на віддалених гілках. Так, існує (примусове) правило іменування віддалених гілок -- вони відображаються в форматі:","","* `<ім’я віддаленого репо>/<ім’я гілки>`","","Отже, якщо розглянути гілку з назвою `o/main`, то ім’я гілки -- це `main` а ім’я віддаленого репозиторію -- це `o`.","","Більшість розробників насправді називають ім’я головного віддаленого репозиторію `origin` (початок), а не `o`. Це настільки поширена практика, що гіт автоматично називає віддалений репозиторій `origin` коли ти його клонуєш.","","На жаль повністю ім’я `origin` не влазить в наш UI, натомість ми будемо використовувати коротше `o` :( Просто не забудь, коли будеш використовувати звичайний гіт, що твій віддалений репо скоріш за все називається `origin`!","","Це багато інформації, погляньмо як це працює на прикладі."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Зробімо checkout віддаленої гілки й подивімось, що буде"],afterMarkdowns:["Як бачиш, git перейшов в стан `detached HEAD` і не оновив `o/main` коли ми зробили новий коміт. Це тому, що `o/main` буде оновлено лише тоді, коли буде оновлено віддалений репозиторій."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Щоб пройти цей рівень, зроби один коміт в `main`, а потім переключись в `o/main` і закомітся ще раз. Це наглядно продемонструє поведінку віддалених гілок, а також покаже як зміни впливають на стан віддаленого репозиторію."]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["## Nhánh Git từ xa","","Giờ bạn đã thấy cách thức hoạt động của `git clone`, cùng xem xét kỹ hơn những gì đã xảy ra.","","Điều đầu tiên mà có thể bạn để ý là một nhánh mới xuất hiện trong kho chứa cục bộ của ta là `o/main`. Loại nhánh này được gọi là nhánh _từ xa_ (_remote_); nhánh từ xa có những thuộc tính đặc biệt vì chúng phục vụ một mục đích duy nhất.","","Nhánh từ xa phản ánh _trạng thái_ (_state_) của kho chứa từ xa (kể từ lần cuối cùng bạn tương tác với kho chứa từ xa). Chúng giúp bạn hiểu về sự khác biệt giữa công việc trên kho chứa cục bộ với kho chứa từ xa -- một bước quan trọng trước khi chia sẻ công việc của bạn với người khác.","","Nhánh từ xa có một thuộc tính đặc biệt đó là khi bạn chuyển sang chúng, bạn sẽ vào trạng thái tách rời `HEAD`. Mục đích của Git là để bạn không thể làm việc trực tiếp trên nhánh từ xa; bạn phải làm việc ở nơi khác và chia sẻ thành quả lên kho chứa từ xa (sau đó nhánh từ xa sẽ được cập nhật).","","Nói rõ một chút: Các nhánh từ xa nằm trên kho lưu trữ cục bộ của bạn, không phải trên kho lưu trữ từ xa."]}},{type:"ModalAlert",options:{markdowns:["### `o/` là gì vậy?","","Có thể bạn sẽ thắc mắc về ký tự `o/` ở đầu tên nhánh từ xa có ý nghĩa gì. Chà, tên nhánh từ xa cũng có (ràng buộc) quy tắc đặt tên -- chúng được hiển thị dưới dạng:","","* `/`","","Do đó, đối với `o/main` thì `main` là tên nhánh còn `o` là tên kho chứa từ xa.","","Thực tế thì hầu hết các nhà phát triển đặt tên kho chứa từ xa là `origin` chứ không phải `o`. Nó trở thành thông lệ đến nỗi Git đặt tên `origin` cho kho chứa từ xa khi bạn dùng `git clone` để sao chép một kho chứa.","","Đáng tiếc là `origin` không khớp trong giao diện của chúng tôi, nên chúng tôi đành phải viết tắt là `o` :( Nhưng hãy nhớ rằng khi dùng Git thật sự thì chắc hẳn tên của kho chứa từ xa sẽ là `origin`!","","Lý thuyết hơi nhiều rồi, đi vào thực hành thôi."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy thử chuyển sang nhánh từ xa xem điều gì xảy ra."],afterMarkdowns:["Như bạn thấy, Git đưa ta vào trạng thái tách rời `HEAD` và không cập nhật nhánh `o/main` khi ta thêm một commit. Đó là bởi vì `o/main` chỉ cập nhật khi kho chứa từ xa cập nhật."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Để hoàn thành cấp độ này, commit một lần trên `main` và một lần nữa sau khi chuyển sang `o/main`. Điều này sẽ giúp ta hiểu cách nhánh từ xa hành xử, chúng chỉ cập nhật để phản ánh trạng thái của kho chứa từ xa."]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["## Git Oddaljeni Branchi","","Sedaj ko smo videli `git clone` v praksi se poglobimo v dejanske spremembe.","","Prva stvar, ki si jo morda opazil je, da se je pojavil nov branch na našem lokalnem repotu imenovan `o/main`. Temu tipu brancha pravimo _oddaljen_ (remote) branch; oddaljeni branchi imajo posebne lastnosti, ker služijo določenim namenom.","","Oddaljeni branchi odražajo _stanje_ oddaljenega repozitorija (od kar si nazadnje komuniciral z oddaljenim repotom). To ti morda pomaga razumeti razliko med tvojim lokalnim delom in delom, ki je javno -- ključni korak, preden deliš svoje delo z ostalimi.","","Oddaljeni branchi imajo posebno lastnost, da ko jih checkoutaš, si postavljen v stanje z ločenim `HEAD-om`. Git naredi to zanalašč, ker ne moreš delati neposredno na teh branchih; moreš delati drugje in nato deliti svoje delo z oddaljenim repotom (po tem bodo oddaljeni branchi bili posodobljeni)."]}},{type:"ModalAlert",options:{markdowns:["### Kaj je `o/`?","","Morda se sprašuješ, kaj je ta `o/` spredaj pred oddaljenmi branchi. Tudi oddaljeni branchi imajo (zahtevano) pravilo za poimenovanje -- predstavljeni so v sledečem formatu:","","* `/`","","Posledično, če pogledamo branch poimenovan `o/main`, je ime brancha `main`, ime oddaljenega repota pa `o`.","","Večina razvijalcev v bistvu poimenuje njihov glavni oddaljeni repozitorij `origin`, ne `o`. To je takoj pogosto, da git ubistvu nastavi tvoj oddaljen repo z imenom `origin` ko izvedeš `git clone` nad repozitorijem.","","Nažalost polno ime `origin` ne paše v naš prikaz, zato uporabljamo `o` kot bližnjico :( Samo zapomni si, ko uporabljaš pravi git, bo tvoj oddaljen repo verjetno poimenovan `origin`!","","To je kar veliko za razumeti, zato si poglejmo stvar v akciji."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Checkoutajmo oddaljen branch in poglejmo kaj se zgodi."],afterMarkdowns:["Kot lahko vidiš, nas git postavi v stanje ločenega `HEAD-a` in ne posodobi `o/main`, ko dodamo nov commit. To je zato, ker se bo `o/main` posodobil šele, ko se bo posodobil oddaljen repo."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Za dokončanje te stopnje, commitaj enkrat iz `main` in enkrat, ko checkoutaš `o/main`. To ti bo pomagalo osvojiti, kako se oddaljeni branchi obnašajo drugače in se posodobijo le da odražajo stanje na oddaljenem repozitoriju."]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["## Zdalne gałęzie Git","","Teraz, gdy zobaczyliśmy już, jak działa `git clone`, przyjrzyjmy się temu, co faktycznie się zmieniło.","","Pierwszą rzeczą, która mogła ci się rzucić w oczy, jest to, że w naszym lokalnym repozytorium pojawiła się nowa gałąź o nazwie `o/main`. Ten typ gałęzi nazywany jest gałęzią _zdalną_. Gałęzie zdalne mają specjalne właściwości, ponieważ służą do wyjątkowego celu.","","Zdalne gałęzie odzwierciedlają _stan_ zdalnych repozytoriów (od czasu ostatniej komunikacji z nimi). Pomagają zrozumieć różnicę między pracą lokalną a dostępną publicznie -- to niezwykle ważna sprawa przed udostępnieniem swojej pracy innym.","","Zdalne gałęzie mają specjalną właściwość. Kiedy je checkoutujesz, Git wprowdza cię w tryb odłączonego `HEADa`. Robi to celowo, ponieważ nie możesz pracować bezpośrednio na tych gałęziach; musisz pracować w innym miejscu, a następnie udostępnić swoją pracę zdalnie (i wtedy twoje zdalne gałęzie zostaną zaktualizowane)."]}},{type:"ModalAlert",options:{markdowns:["### Czym jest `o/`?","","Możesz się zastanawiać, do czego służy początkowy znak `o/` w zdalnych gałęziach. Otóż zdalne gałęzie również mają (wymaganą) konwencję nazewnictwa -- są wyświetlane w formacie:","","* `/`","","Więc jeśli spojrzysz na gałąź o nazwie `o/main`, nazwą gałęzi (branch name) jest `main`, a nazwą zdalną (remote name) jest `o`.","","Większość programistów w rzeczywistości nazywa główną (main) zdalną gałąź `origin`, a nie `o`. Jest to tak powszechne, że Git w praktyce sam ustawia zdalną nazwę na `origin`, kiedy wykonujesz `git clone` na repozytorium.","","Niestety pełna nazwa `origin` nie zmieści się w naszym interfejsie, więc używamy `o` jako skrótu :( Pamiętaj więc, że kiedy używasz prawdziwego Gita, twoja zdalna nazwa najprawdopodobniej brzmi `origin`!","","To dużo do przyswojenia, więc przyjrzyjmy się, jak to wszystko działa."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Wyciągnijmy (check out) zdalną gałąź i zobaczmy, co się stanie."],afterMarkdowns:["Jak widzisz, git przełączył nas w tryb odłączonego `HEADa` i nie zaktualizował `o/main`, kiedy dodaliśmy nowy commit. Dzieje się tak, ponieważ `o/main` zaktualizuje się tylko przy aktualizacji zdalnego repozytorium."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Aby ukończyć ten poziom, zrób jeden commit z `main` i drugi, po przełączeniu się (check out) na `o/main`. Pomoże ci to zrozumieć różnice w zachowaniu zdalnych gałęzi i zapamiętać, że aktualizują się wyłącznie, aby odzwierciedlić stan zdalnego repozytorium."]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["## Rami remoti di Git","","Adesso che hai visto `git clone` in azione, tuffiamoci all'interno di quello che è effettivamente cambiato.","","Come potrai aver notato un nuovo ramo è apparso nel nostro repository locale chiamato `o/main`. Questo tipo di ramo è chiamato ramo remoto; i rami remoti hanno proprietà speciali perché servono ad un unico scopo.","","I rami remoti riflettono lo _stato_ dei repository remoti (dall'ultima volta che hai comunicato con quei repository remoti). Ti aiutano a capire la differenza tra il tuo lavoro locale e quello pubblico -- un passo fondamentale da fare prima di condividere il tuo lavoro con gli altri.","","I rami remoti hanno la proprietà speciale che quando li controlli, `HEAD` viene inserito nella modalità di distacco. Git fa questo di proposito così che tu non possa lavorare direttamente su questi rami; ma dovrai lavorare altrove per poi condividere il tuo lavoro con il remoto (dopodiché i tuoi rami remoti verranno aggiornati)."]}},{type:"ModalAlert",options:{markdowns:["### Cos'è o/?","","Ti starai chiedendo a cosa serve `o/` su questi rami remoti. Bene, i rami remoti hanno anche un nome convenzionale (obbligatorio) -- vengono visualizzati nel formato:","","* `/`","","Quindi, se guardi ad un ramo chiamato `o/main`, il nome del ramo è `main` e il nome del remoto è `o`.","","La maggior parte degli sviluppatori in realtà nomina il loro main remoto `origin`, non `o`. Questo è così comune che git in realtà configura il remoto per essere chiamato `origin` quando viene eseguito `git clone` su un repository.","","Sfortunatamente il nome completo di `origin` non si adatta alla nostra interfaccia utente, quindi usiamo `o` come abbreviazione :( Ricorda solo che quando usi git realmente, il tuo remoto probabilmente si chiamerà `origin`!","","Tutto questo è molto da elaborare, quindi vediamolo in azione."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dai un'occhiata ad un ramo remoto e vedi che cosa fa."],afterMarkdowns:["Come puoi vedere, git ci ha messo im modalità `HEAD` distaccata e poi non ha aggiornato `o/main` quando abbiamo aggiunto un nuovo commit. Questo perché `o/main` si aggiornerà solo quando lo farà anche il remoto."],command:"git checkout o/main; git commit",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Per completare questo livello, fai un commit una volta dal `main` e una volta dopo aver eseguito il checkout su `o/main`. Questo ti aiuterà a capire come i rami remoti si comportano differentemente, e si aggiornano solo per riflettere lo stato del remoto"]}}]}}}},{}],153:[function(e,t,o){o.level={compareAllBranchesAndEnforceBranchCleanup:!0,disabledMap:{"git branch":!0,"git checkout":!0,"git switch":!0},goalTreeString:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"bar":{"target":"C1","id":"bar","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',solutionCommand:"git push origin :foo;git fetch origin :bar",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null},"o/foo":{"target":"C1","id":"o/foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":null},"foo":{"target":"C1","id":"foo","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Source of nothing",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",ja:"無のsource",fr_FR:"Source de rien du tout",ru_RU:"Пустой источник",ko:"Source가 없다",uk:"Нема джерела",vi:"Không có nguồn",sl_SI:"Izvor Ničesar",pl:"Źródło nicości",it_IT:"Fonte del nulla"},hint:{en_US:"The branch command is disabled for this level so you'll have to use fetch!",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",ja:"このレベルではbranchコマンドが無効になっているのでfetchを使うしかない!",fr_FR:"La commande branch est désactivée pour ce niveau, vous devrez donc utiliser fetch !",ru_RU:"Команда branch недоступна на этом упражнении, пользуйтесь командой fetch!",ko:"branch 명령이 비활성화 되어있습니다. fetch를 사용해야 돼요!",uk:"Команда branch недоступна на цьому уроці, користуйся командою fetch!",vi:"Lệnh branch đã bị vô hiệu hóa ở cấp độ này nên bạn sẽ phải dùng fetch!",sl_SI:"Ukaz za branchanje je v tej stopnji onemogočen, zato boš moral uporabiti fetch!",pl:"Polecenie branch jest zablokowane na tym poziomie, musisz skorzystać z fetch!",it_IT:"Il comando branch è disabilitato per questo livello quindi dovrai usare fetch!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Oddities of ``","",'Git abuses the `` parameter in two weird ways. These two abuses come from the fact that you can technically specify "nothing" as a valid `source` for both git push and git fetch. The way you specify nothing is via an empty argument:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Let's see what these do..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['What does pushing "nothing" to a remote branch do? It deletes it!'],afterMarkdowns:['There, we successfully deleted the `foo` branch on remote by pushing the concept of "nothing" to it. That kinda makes sense...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finally, fetching "nothing" to a place locally actually makes a new branch.'],afterMarkdowns:["Very odd / bizarre, but whatever. That's git for you!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["This is a quick level -- just delete one remote branch and create a new branch with `git fetch` to finish!"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Les bizarreries de ``","","Git permet de faire deux choses contre-intuitives avec le paramètre ``. Ces deux astuces viennent du fait que vous pouvez techniquement ne *rien* spécifier comme `source` valide pour git push et git fetch. Autrement dit laisser vide la partie gauche de la refspec (avant le deux-points) :","","* `git push origin :side`","* `git fetch origin :bugFix`","","Voyons ce que cela fait..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Qu'est-ce que produit l'envoi de \"rien\" sur une branche distante ? Cela la détruit !"],afterMarkdowns:['Ici, nous avons brillamment supprimé la branche `foo` du dépôt distant en lui envoyant le concept de "rien". Cela paraît à peu près logique...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Ensuite, un fetch de "rien" dans un emplacement local crée une nouvelle branche.'],afterMarkdowns:["Très étrange, mais peu importe. C'est Git !"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["L'exercice pour ce niveau est simple : supprimez d'abord une branche distante puis terminez en en créant une nouvelle (locale) avec `git fetch` !"]}}]},es_AR:{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 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`","","Veamos qué hacen estos..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['¿Qué hace el pushear "nada" a una rama remota? ¡La elimina!'],afterMarkdowns:['Ahí está, borramos la rama `foo` exitosamente del remoto pusheándole el concepto de "nada". Tiene algo de sentido...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finalmente, fetchear "nada" a un lugar local en realidad crea una nueva rama.'],afterMarkdowns:["Bastante bizarro, pero, meh, da igual. Así es git."],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Este es un nivel rápido: simplemente borrá una rama remota y creá una nueva usando `git fetch` para completarlo."]}}]},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 main: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:[{type:"ModalAlert",options:{markdowns:["### Coisas estranhas do ``","",'O Git abusa do parâmetro `` de duas formas estranhas. Esses dois abusos vem do fato de que tecnicamente você pode especificar "nada" como uma `origem` válida tanto para o git push como para o git fetch. A forma como você especifica "nada" é por meio de um argumento vazio:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Vejamos o que esses comandos fazem..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['O que fazer push de "coisa nenhuma" para um ramo remoto significa? Deletar o ramo!'],afterMarkdowns:['Aqui, excluímos com sucesso o ramo `foo` do repositório remoto por meio de um push de "coisa nenhuma" direcionado a ele. Até que faz sentido...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finalmente, fazer um fetch de "coisa nenhuma" para uma referência local cria um novo ramo.'],afterMarkdowns:["Bastante estranho / bizarro, mas de qualquer forma. É assim que o Git é!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Este é um nível rápido de resolver -- basta remover um ramo remoto com `git push` e criar um novo ramo local com `git fetch` para terminar!"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rarezas do ``","",'Git abusa do parámetro `` de dúas maneiras extranas. Estos dous abusos veñen do feito de que técnicamente podes especificar "á nada" como un `orixe` válido tanto para git push como para git fetch. O modo de especificar a nada é a través dun parámetro vacío:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Vexamos qué fan..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['¿Qué fai cando se empurra a "nada" a unha rama remota? ¡Eliminaa!'],afterMarkdowns:['Ahí está, borramos a rama `foo` exitosamente do remoto empurrando o concepto da "nada". Ten algo de sentido...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Finalmente, descargar a "nada" a un lugar local na realidade crea unha nova rama.'],afterMarkdowns:["Bastante bizarro, pero, meh, da igual. Así é git."],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Este é un nivel rápido: simplemente borra unha rama remota e crea unha nova empregando `git fetch` para completalo."]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["###`` 奇怪的地方","",'在兩個奇怪的情況下,git 不使用 `` 參數,事實上,在`git push`以及`git fetch`的情況下,可以允許你"不用"指定` source`,你可以藉由把參數留空,來表示你不想指定 source:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","讓我們來看看這些在做什麼..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["當*沒有*指定 source 的時候,`push` 對於 remote branch 做了什麼?`push`把它刪除掉了!"],afterMarkdowns:['看吧,我們藉由把 source "留空",成功用 `push` 刪除了 `foo` branch,這合理吧...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['最後,對於 `fetch` 來說,source "留空" 表示我們要在 local 上建立一個新的 branch。'],afterMarkdowns:["很奇怪吧!但那正是 git 為你做的事情!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["這是一個很簡單的關卡,只需要利用 `git push` 刪除一個 remote 的 branch,並且利用 `git fetch` 建立一個新的 local 的 branch!"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 古怪的 ``","","Git 有两种关于 `` 的用法是比较诡异的,即你可以在 git push 或 git fetch 时不指定任何 `source`,方法就是仅保留冒号和 destination 部分,source 部分留空。","","* `git push origin :side`","* `git fetch origin :bugFix`","","我们分别来看一下这两条命令的作用……"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果 push 空 到远程仓库会如何呢?它会删除远程仓库中的分支!"],afterMarkdowns:["就是这样子, 我们通过给 push 传空值 source,成功删除了远程仓库中的 `foo` 分支, 这真有意思..."],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["如果 fetch 空 到本地,会在本地创建一个新分支。"],afterMarkdowns:["很神奇吧!但无论怎么说, 这就是 Git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["这个关卡很容易 —— 只要删除一个远程的分支, 再用 `git fetch` 在本地创建一个新分支就可以了!"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Die Eigentümlichkeiten von ``","",'Git "missbraucht" den ``-Parameter in zwei Fällen. Dies rührt daher, dass man technisch gesehen "nichts" als gültige `` sowohl für `git push` als auch für `git fetch` angeben kann. Das macht man so:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Schauen wir, was das bewirkt ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Was passiert, wenn man "nichts" auf einen entfernten Branch pusht? Er wird gelöscht!'],afterMarkdowns:['Und schon haben wir `foo` erfolgreich auf dem Remote gelöscht, weil wir "Leere" darauf geschoben haben. Ist auf seine Weise irgendwie logisch ...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Und weiter: indem man "nichts" von einem Remote in sein lokales Repository zieht, erstellt man tatsächlich einen neuen Branch.'],afterMarkdowns:["Ziemlich abgefahren / bizarr, aber was soll's. Das ist halt Git."],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Das ist ein kurzer Level -- lösch einfach den Remote Branch und erstelle einen neuen Branch mit `git fetch`, um ihn zu lösen."]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### ``の変わり種","","Gitは`git push`や`git fetch`の引数としてsourceに何も指定しないことで悪用することができます。","","何も指定しない方法は次のようにsourceに空の引数を渡すことです。","","* `git push origin :side`","* `git fetch origin :bugFix`","","こうするとどうなるでしょうか..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["リモートブランチに「無」をpushするとどうなるでしょうか?","","結果はそのブランチが削除されてしまいます!"],afterMarkdowns:["「無」という概念をブランチに押し付けることで、リモートの`foo`ブランチを削除することに成功しました。"],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["最後に「無」をローカル上に`fetch`すると、実際に新しいブランチが作られます。"],afterMarkdowns:["非常に奇妙ですが、気にする程のことでもありません。"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["このレベルは難しくありません!リモートのブランチを削除して`git fetch`で新しいブランチを作成するだけで完了します。"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Странный `<источник>`","","Git использует параметр `<источник>` странным образом. Странность заключается в том, что Вы можете оставить пустым параметр `<источник>` для команд git push и git fetch:","","* `git push origin :side`","* `git fetch origin :bugFix`","","Посмотрим, что же из этого выйдет..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Что же будет с веткой, на которую мы делаем git push с пустым аргументом `<источник>`? Она будет удалена!"],afterMarkdowns:['Как видите, мы удалили ветку `foo` в удаленном репозитории, попытавшить протолкнуть(git push) в неё "ничего".'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Наконец, если мы попытаемся притянуть изменения(git fetch) из "ничего" к нам в локальный репозиторий, то это создаст у нас новую ветку'],afterMarkdowns:["Вот такой вот чудной git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Это легкое упражнение - нужно всего лишь удалить одну ветку в удаленном репозитории и создать новую ветку в локальном, с помощью команд `git push` и `git fetch` соответственно!"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["###``의 이상함","",'Git은 `` 인자를 두가지 방법으로 이상하게 사용합니다. 이 두가지 오용은 여러분이 git push와 git fetch에 `source`에 "없음"을 지정할 수 있기 때문에 나타납니다. "없음"을 지정하는 방법은 인자로 아무것도 안쓰면 됩니다:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","위에 처럼 말이죠, 뭘 할 수 있는지 확인해봅시다..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['"없음"을 원격 브랜치로 push하면 무엇을 할까요? 원격저장소의 그 브랜치를 삭제합니다!'],afterMarkdowns:['됐습니다, 원격 저장소의 `foo`브랜치를 성공적으로 삭제했습니다. "없음"을 push한다는것이 이것을 이뤘습니다. 흠 말이 되는것 같네요 null을 push했어요...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['마지막으로, "nothing"을 fetch하면 로컬에 새 브랜치를 만듭니다'],afterMarkdowns:["기괴합니다... 뭐어때요. git이 이런데요 뭐!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["이번 레벨은 금방 넘어가는 레벨입니다 -- 원격저장소의 브랜치하나를 삭제하고 `git fetch`를 이용해서 새 브랜치를 만들어보세요!"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Неочевидні способи використання ``","","Git має два хитрі способи використання ``. Обидва випливають з факту, що формально (і цілком легально) ти можеш не вказувати джерело (`source`) як для git push так і для git fetch. Ось, як саме ти можеш це зробити:","","* `git push origin :side`","* `git fetch origin :bugFix`","","Погляньмо, що в результаті вийде..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Що буде, якщо спробувати запушити "ніщо" у гілку віддаленого репозиторію? Git її видалить!'],afterMarkdowns:['Ось, ми успішно видалили гілку `foo` на віддаленому сервері, запушивши в неї "ніщо". Ну, ніби все правильно...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['І останнє, звантаження "нічого" в локальний репозиторій створює нову гілку'],afterMarkdowns:["Дуже дивно, але такий він, git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Це швидкий рівень -- просто видали одну віддалену гілку і створи нову локальну гілку, використовуючи `git fetch`!"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Sự kỳ quặc của ``","",'Git lợi dụng tham số `` theo 2 cách khá dị. Hai cách lợi dụng này bắt nguồn từ thực tế là bạn có thể "không chỉ định" `nguồn` cho cả git push và git fetch. Bạn có thể làm điều này bằng cách để trống tham số như sau:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Hãy xem thử 2 câu lệnh này làm việc gì..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Nếu ta đẩy "không gì cả" lên một nhánh từ xa thì nó sẽ làm gì? Nó xóa nhánh đó!'],afterMarkdowns:['Đó, ta đã xóa thành công nhánh `foo` trên kho chứa từ xa bằng cách đẩy "không gì cả" lên nó. Khá là hợp lý...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Cuối cùng, nạp "không gì cả" vào một kho chứa cục bộ thực tế sẽ tạo ra một nhánh mới'],afterMarkdowns:["Khá là quái và dị. Nhưng mà đó là những gì Git làm!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Ở cấp độ đơn giản này -- bạn chỉ cần xóa một nhánh từ xa và tạo ra một nhánh mới với `git fetch` để hoàn thành!"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Čudnosti ``","",'Git zlorablja `` parameter na dva čudna načina. Te dve zlorabi nastaneta iz dejstva, da lahko tehnično določiš "nič" kot veljaven `izvor` za git push in git fetch. Način, da določiš nič je z uporabo praznega argumenta:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Poglejmo, kaj to naredi ..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Kaj naredi pushanje "ničesar" na oddaljen branch? Izbriše ga!'],afterMarkdowns:['Tako, uspešno smo izbrisali `foo` branch na oddaljenem repotu s konceptom pushanja "ničesar" nanj. To ima nekako smisel ...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['In končno, fetchanje "ničesar" lokalno dejansko naredi nov branch.'],afterMarkdowns:["Zelo čudno / bizarno, ampak kakorkoli. Tak je git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["To je hitra stopnja -- samo izbriši en oddaljen branch in naredi novega z `git fetch`, da zaključiš!"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Osobliwości ``","",'Git pozwala wykorzystać parametr `` (źródło) na dwa osobliwe sposoby. Oba są dziwaczne dlatego, że - technicznie rzecz biorąc - możesz określić "nic" jako poprawne `źródło` zarówno dla `git push`, jak i `git fetch`. Tę "nicość" określasz za pomocą pustego argumentu:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Zobaczmy, co z tego wyniknie..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Co daje wypchnięcie "nicości" na zdalną gałąź? Usuwa ją!'],afterMarkdowns:['Oto właśnie usunęliśmy skutecznie gałąź `foo` na zdalnym repozytorium, wypychając do niej ideę "nicości". To nawet ma jakiś sens...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Natomiast ściągnięcie "nicości" za pomocą fetch do lokalnego miejsca tworzy nową gałąź.'],afterMarkdowns:["Osobliwe i dziwaczne, ale nic nie poradzisz... Git tak ma!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["To jest krótki poziom -- żeby go ukończyć, po prostu usuń jedną zdalną gałąź i stwórz jedną nową, używając `git fetch`!"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Stranezze di ``","",'Git abusa del parametro `` in due strani modi. Questi due abusi derivano dal fatto che tu puoi tecnicamente specificare "nulla" come una fonte valida sia per git push che per git fetch. Si può fare ciò lasciando il parametro vuoto:',"","* `git push origin :side`","* `git fetch origin :bugFix`","","Vediamo cosa fanno questi..."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['In cosa consiste il caricare "nulla" ad un ramo remoto? Lo elimina!'],afterMarkdowns:['Ecco, abbiamo eliminato con successo il ramo `foo` avendovi caricato il concetto di "nulla". Ha senso effettivamente...'],command:"git push origin :foo",beforeCommand:"git clone; git push origin main:foo"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:['Infine, scaricare il "nulla" in una posizione locale va a creare un nuovo ramo.'],afterMarkdowns:["Molto strano, ma vabbé. Questo e altro da git!"],command:"git fetch origin :bar",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["Questo è un livello rapido -- elimina un ramo remoto e creane uno localmente tramite `git fetch` per terminare il livello!"]}}]}}}},{}],154:[function(e,t,o){o.level={goalTreeString:"%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C1%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%7D%2C%22o/main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22o/main%22%2C%22remoteTrackingBranchID%22%3Anull%7D%2C%22side%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22side%22%2C%22remoteTrackingBranchID%22%3A%22o/main%22%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C3%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C3%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22side%22%2C%22id%22%3A%22HEAD%22%7D%2C%22originTree%22%3A%7B%22branches%22%3A%7B%22main%22%3A%7B%22target%22%3A%22C3%27%22%2C%22id%22%3A%22main%22%2C%22remoteTrackingBranchID%22%3Anull%7D%7D%2C%22commits%22%3A%7B%22C0%22%3A%7B%22parents%22%3A%5B%5D%2C%22id%22%3A%22C0%22%2C%22rootCommit%22%3Atrue%7D%2C%22C1%22%3A%7B%22parents%22%3A%5B%22C0%22%5D%2C%22id%22%3A%22C1%22%7D%2C%22C2%22%3A%7B%22parents%22%3A%5B%22C1%22%5D%2C%22id%22%3A%22C2%22%7D%2C%22C3%27%22%3A%7B%22parents%22%3A%5B%22C2%22%5D%2C%22id%22%3A%22C3%27%22%7D%7D%2C%22HEAD%22%3A%7B%22target%22%3A%22main%22%2C%22id%22%3A%22HEAD%22%7D%7D%7D",solutionCommand:"git checkout -b side o/main;git commit;git pull --rebase;git push",startTree:'{"branches":{"main":{"target":"C1","id":"main","remoteTrackingBranchID":"o/main"},"o/main":{"target":"C1","id":"o/main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"}},"HEAD":{"target":"main","id":"HEAD"},"originTree":{"branches":{"main":{"target":"C2","id":"main","remoteTrackingBranchID":null}},"commits":{"C0":{"parents":[],"id":"C0","rootCommit":true},"C1":{"parents":["C0"],"id":"C1"},"C2":{"parents":["C1"],"id":"C2"}},"HEAD":{"target":"main","id":"HEAD"}}}',name:{en_US:"Remote Tracking",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",ja:"リモートのトラッキング",fr_FR:"Suivi de branche distante",ru_RU:"Слежка за удалённым репозиторием",ko:"원격 저장소 추적하기",uk:"Слідкуємо за віддаленим репозиторієм",vi:"Theo dõi từ xa",sl_SI:"Sledenje Oddaljenega Repota",pl:"Śledzenie zdalnych repo",it_IT:"Tracciamento remoto"},hint:{en_US:"Remember there are two ways to set remote tracking!",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!",ja:"リモートトラッキングを設定する方法が二つあるのをお忘れなく!",fr_FR:"Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !",ru_RU:"Помни, есть два способа установить слежку за удалённым репозиторием!",ko:"원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!",uk:"Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!",vi:"Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!",sl_SI:"Spomni se, da obstajata dva načina za sledenje oddaljenega repota.",pl:"Pamiętaj, zdalne repo można śledzić na dwa sposoby!",it_IT:"Ricorda che ci sono due modi per impostare il tracciamento remoto!"},startDialog:{en_US:{childViews:[{type:"ModalAlert",options:{markdowns:["### Remote-Tracking branches","",'One thing that might have seemed "magical" about the last few lessons is that git knew the `main` branch was related to `o/main`. Sure these branches have similar names and it might make logical sense to connect the `main` branch on the remote to the local `main` branch, but this connection is demonstrated clearly in two scenarios:',"","* During a pull operation, commits are downloaded onto `o/main` and then *merged* into the `main` branch. The implied target of the merge is determined from this connection.","* During a push operation, work from the `main` branch was pushed onto the remote's `main` branch (which was then represented by `o/main` locally). The *destination* of the push is determined from the connection between `main` and `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'Long story short, this connection between `main` and `o/main` is explained simply by the "remote tracking" property of branches. The `main` branch is set to track `o/main` -- this means there is an implied merge target and implied push destination for the `main` branch.',"","You may be wondering how this property got set on the `main` branch when you didn't run any commands to specify it. Well, when you clone a repository with git, this property is actually set for you automatically. ","","During a clone, git creates a remote branch for every branch on the remote (aka branches like `o/main`). It then creates a local branch that tracks the currently active branch on the remote, which is `main` in most cases.","","Once git clone is complete, you only have one local branch (so you aren't overwhelmed) but you can see all the different branches on the remote (if you happen to be very curious). It's the best of both worlds!","","This also explains why you may see the following command output when cloning:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Can I specify this myself?","","Yes you can! You can make any arbitrary branch track `o/main`, and if you do so, that branch will have the same implied push destination and merge target as `main`. This means you can run `git push` on a branch named `totallyNotMain` and have your work pushed to the `main` branch on the remote!","","There are two ways to set this property. The first is to checkout a new branch by using a remote branch as the specified ref. Running","","`git checkout -b totallyNotMain o/main`","","Creates a new branch named `totallyNotMain` and sets it to track `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Enough talking, let's see a demonstration! We will checkout a new branch named `foo` and set it to track `main` on the remote."],afterMarkdowns:["As you can see, we used the implied merge target of `o/main` to update the `foo` branch. Note how main doesn't get updated!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["This also applies for git push."],afterMarkdowns:["Boom. We pushed our work to the `main` on the remote even though our branch was named something totally different."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Way #2","","Another way to set remote tracking on a branch is to simply use the `git branch -u` option. Running","","`git branch -u o/main foo`","","will set the `foo` branch to track `o/main`. If `foo` is currently checked out you can even leave it off:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Let's see this other way of specifying remote tracking real quick..."],afterMarkdowns:["Same as before, just a more explicit command. Sweet!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! For this level let's push work onto the `main` branch on remote while *not* checked out on `main` locally. I'll let you figure out the rest since this is the advanced course :P"]}}]},fr_FR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Le suivi des branches distantes","",'Dans les dernières leçons, Git savait que la branche `main` était reliée à `o/main`, et cela a pu vous paraître "magique". Il est certain que ces deux branches ont des noms similaires et il peut être logique de croire que la branche locale `main` est liée à la branche distante `main`, mais la relation n\'est avérée que dans deux scénarios :',"","* Pendant un pull, les commits sont téléchargés dans `o/main` et ensuite *fusionnés* (merge) dans la branche `main`. La cible impliquée dans cette fusion est déterminée par cette relation.","* Pendant un push, le travail de la branche `main` a été envoyé sur la branche distante `main` (qui est localement représentée par `o/main`). La *destination* du push est déterminée par la relation entre `main` and `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","","Pour faire court, cette relation entre `main` et `o/main` est simplement portée par la propriété \"remote tracking\" (suivi distant) des branches. La branche `main` est configurée pour suivre `o/main` : cela signifie qu'il y a une cible de fusion et une destination d'envoi implicites pour la branche `main`.","","Vous vous demandez peut-être comment cette propriété a été configurée pour la branche `main` alors que vous n'avez exécuté aucune commande pour le faire. Eh bien, quand vous clonez un dépôt avec Git, cette propriété est configurée automatiquement. ","","Pendant le clonage, Git crée une branche distante pour chaque branche du dépôt distant (c'est à dire des branches comme `o/main`). Il crée ensuite une branche locale qui suit la branche actuellement active sur le dépôt distant, qui se trouve être `main` dans la plupart des cas.","","Une fois que git clone est terminé, vous avez seulement une branche locale (comme ça vous n'êtes pas submergé) mais vous pouvez voir toutes les branches distantes (si vous êtes très curieux). C'est le compromis idéal !","","Cela explique aussi pourquoi vous avez peut-être vu la sortie suivante pendant le clonage :","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Puis-je configurer cette relation moi-même ?","","Absolument ! Vous pouvez suivre `o/main` depuis n'importe quelle branche, et si vous le faîtes, cette branche va avoir la même destination de push et cible de merge que pour `main`. Cela signifie que vous pouvez exécuter `git push` sur une branche nommée `totallyNotMain` mais envoyer tout de même votre travail sur la branche `main` du dépôt distant !","","Il y a deux façons de configurer cette propriété. La première est de créer une nouvelle branche en la branchant immédiatement sur la branche distante, à l'aide de `git checkout -b` :","","`git checkout -b totallyNotMain o/main`","","Cette commande crée une nouvelle branche nommée `totallyNotMain` et la configure pour suivre `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Assez parlé, faisons une démonstration ! Nous allons nous placer sur une nouvelle branche nommée `foo` et la configurer pour suivre `main` du dépôt distant."],afterMarkdowns:["Comme vous pouvez le voir, nous avons utilisé la cible de fusion déclarée pour `o/main` afin de mettre à jour la branche `foo`. Remarquez que la branche `main` n'a pas été mise à jour !!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Cela s'applique aussi pour git push :"],afterMarkdowns:["Boum. Nous avons envoyé notre travail sur `main` vers le dépôt distant alors que notre branche avait un nom totalement différent."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Méthode n°2","","Une autre façon de configurer le suivi d'une branche est d'utiliser l'option `git branch -u`. La commande est alors :","","`git branch -u o/main foo`","","Ce qui va configurer la branche `foo` (déjà existante) en la faisant suivre `o/main`. Si `foo` est la branche courante, vous pouvez même ne pas la préciser :","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Voyons cette autre manière de paramètrer le suivi d'une branche distante..."],afterMarkdowns:["C'est la même chose, et c'est juste un peu plus explicite. Cool !"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok ! Pour ce niveau, envoyons notre travail sur la branche distante `main` en ne se trouvant *pas* sur la branche `main` locale. Je vous laisse chercher comment faire, puisque c'est une leçon de niveau avancé :P"]}}]},es_AR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Ramas que trackean remotos","",'Una de las cosas que pueden haber parecido "mágicas" de las últimas lecciones es que git sabía que la rama `main` estaba relacionada con `o/main`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `main` del remoto con la rama `main` local, pero esta conexión es bien evidente en dos escenarios:',"","* Durante una operación de pull, los commits se descargan a `o/main` y después se *mergean* a la rama `main`. El objetivo implícito del merge se determina con esta conexión.","* Durante un push, el trabajo de la rama `main` se sube a la rama `main` del remoto (que estaba representada localmente por `o/main`). El *destino* del push se determina con esta conexión entre `main` y `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Trackeando remotos","",'Haciéndola corta, esta conexión entre `main` y `o/main` se explica simplemente por la propiedad de "trackear (seguir) remotos" de las ramas. La rama `main` está configurada para trackear `o/main` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `main`.',"","Podrías estar pensando cómo esa propiedad apareció en tu rama `main` si vos no corriste ningún comando para especificarlo. Bueno, cuando clonás un repositorio con git, esta propiedad se asigna por vos automáticamente.","","Durante un clone, git crea una rama remota por cada rama en el remoto (por ejemplo, ramas como `o/main`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `main`.","","Una vez completado el git clone, sólo tenés una única rama local (para que no te asustes) pero podés ver todas las ramas del remoto (si fueras tan 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 "main" set to track remote branch "o/main"',"",' rama local "main" establecida para trackear la rama remota "o/main"']}},{type:"ModalAlert",options:{markdowns:["### ¿Puedo especificarlo yo?","","¡Claro que sí! Podés hacer que cualquier rama que quieras trackee `o/main`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `main`. Eso significa que podés correr `git push` en una rama llamada `absolutamenteNoEsMain` y ¡que tu trabajo se pushee a la rama `main` 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","","`git checkout -b absolutamenteNoEsMain o/main`","","Crea una nueva rama llamada `absolutamenteNoEsMain` y la hace trackear a `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Suficiente charla, ¡veamos una demo! Vamos a checkoutear una nueva rama llamada `foo` y hacer que trackee a `main` en el remoto."],afterMarkdowns:["Como podés ver, usamos el objetivo implícito de merge `o/main` para actualizar la rama `foo`. ¡Notá cómo `main` no fue actualizada!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lo mismo aplica para git push."],afterMarkdowns:["Boom. Pusheamos nuestro trabajo a la rama `main` del remoto incluso cuando nuestra rama se llamaba totalmente distinto."],command:"git checkout -b foo o/main; 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/main foo`","","establecemos que la rama `foo` trackee a `o/main`. Si encima estás parado en `foo`, incluso podés obviarlo:","","`git branch -u o/main`",""]}},{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. ¡Una belleza!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["¡Ok! Para este nivel, pusheá tu trabajo a la rama `main` del remoto *sin* estar parado sobre `main` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P"]}}]},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 `main` estaba relacionada con `o/main`. Obviamente, estas ramas tienen nombres parecidos, y podría parecer lógico conectar la rama `main` del remoto con la rama `main` local, pero esta conexión es bien evidente en dos escenarios:',"","* Durante una operación de pull, los commits se descargan a `o/main` y después se *mergean* a la rama `main`. El objetivo implícito del merge se determina con esta conexión.","* Durante un push, el trabajo de la rama `main` se sube a la rama `main` del remoto (que estaba representada localmente por `o/main`). El *destino* del push se determina con esta conexión entre `main` y `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Trackeando remotos","",'Resumiendo, esta conexión entre `main` y `o/main` se explica simplemente por la propiedad de "trackear (seguir) remotos" de las ramas. La rama `main` está configurada para trackear `o/main` -- osea, que hay un objetivo implícito para el merge y un destino implícito para de la rama `main`.',"","Podrías estar pensando cómo esa propiedad apareció en tu rama `main` 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/main`). Pero después crea una rama local que trackea la rama activa del remote, que suele ser `main`.","","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 "main" set to track remote branch "o/main"',"",' rama local "main" establecida para trackear la rama remota "o/main"']}},{type:"ModalAlert",options:{markdowns:["### ¿Puedo especificarlo yo?","","¡Claro que sí! Puedes hacer que cualquier rama que quieras trackee `o/main`, y si lo hicieras, esa rama va a tener el mismo destino implícito de push y objetivo implícito de merge que `main`. Eso significa que puedes ejecutar `git push` en una rama llamada `absolutamenteNoEsMain` y ¡que tu trabajo se pushee a la rama `main` 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 absolutamenteNoEsMain o/main`","","Crea una nueva rama llamada `absolutamenteNoEsMain` y la hace trackear a `o/main`."]}},{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 `main` en el remoto."],afterMarkdowns:["Como puedes ver, usamos el objetivo implícito de merge `o/main` para actualizar la rama `foo`. ¡Observa cómo `main` no fue actualizada!"],command:"git checkout -b foo o/main; 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 `main` del remoto incluso cuando nuestra rama se llamaba totalmente distinto."],command:"git checkout -b foo o/main; 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/main foo`","","establecemos que la rama `foo` trackee a `o/main`. Si encima estás parado en `foo`, incluso puedes obviarlo:","","`git branch -u o/main`",""]}},{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/main 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 `main` del remoto *sin* estar parado sobre `main` localmente. Te dejo que te des cuenta del resto solo, que para algo este es el curso avanzado :P"]}}]},pt_BR:{childViews:[{type:"ModalAlert",options:{markdowns:["### Seguindo ramos remotos","",'Uma coisa que pode ter parecido "mágica" nas lições passadas é que o Git sabia que o ramo `main` estava relacionado com o `o/main`. Certamente esses ramos possuem nomes similares, e tem todo sentido lógico conectar o ramo `main` do lado remoto com o ramo `main` local, mas essa conexão é demonstrada claramente em dois cenários:',"","* Durante uma operação de pull, os commits são baixados em `o/main` e então são *mergidos* no ramo `main`. O alvo do merge é determinado a partir dessa conexão.","* Durante uma operação de push, o trabalho do ramo `main` local é enviado para o ramo `main` remoto (que é representado localmente por `o/main`). O *destino* do push é determinado da conexão entre `main` e `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'Resumindo a história, essa conexão entre `main` e `o/main` é explicada pela propriedade de "remote tracking" dos ramos. O ramo `main` é configurado para seguir o ramo `o/main` -- isso significa que existe um alvo implícito de merge e um destino implícito de push para o ramo `main`.',"","Você pode estar se perguntando como essa propriedade foi configurada no ramo `main` se você não executou nenhum comando ordenando que isso fosse feito. Bem, quando você clona um repositório com o Git, essa propriedade é configurada para você automaticamente. ","","Durante a clonagem, o Git cria um ramo remoto para cada ramo que existe no repositório remoto (ou seja, ramos como o `o/main`). Ele cria então um ramo local que segue o ramo atualmente ativo no repositório remoto, que geralmente é o `main`.","","Uma vez que a clonagem esteja completa, você terá apenas um único ramo local (para que você não seja sobrecarregado), mas você pode ver todos os ramos diferentes que existem no repositório remoto (caso você esteja curioso). É o melhor dos dois mundos!","","Isso também explica porque você vê a seguinte mensagem quando clona um repositório:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Posso eu mesmo especificar isso?","","Sim, você pode! Você pode fazer com que qualquer ramo arbitrário siga o `o/main`, e se você fizer isso, esse ramo terá o mesmo destino de push implícito que e o mesmo alvo de merge que o `main`. Isso significa que você pode executar `git push` em um ramo chamado `realmenteNaoSouOMain` e ainda assim ter seu trabalho enviado ao ramo `main` do repositório remoto!","","Há duas formas de configurar essa propriedade. A primeira consiste em fazer checkout de um novo ramo usando o ramo remoto como especificação de referência. Executar","","`git checkout -b realmenteNaoSouOMain o/main`","","Cria um novo ramo chamado `realmenteNaoSouOMain` e o configura para seguir o `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Já foi conversa o suficiente, vamos ver uma demonstração! Vamos fazer checkout de um novo ramo chamado `foo` e configurá-lo para seguir o `main` do repositório remoto."],afterMarkdowns:["Como você pode ver, usamos o alvo implícito de merge do `o/main` para atualizar o ramo `foo`. Veja como o main local não sofreu atualização!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Isso também se aplica ao git push."],afterMarkdowns:["Boom. Nós enviamos nosso trabalho para o ramo remoto `main` ainda que nosso ramo local tivesse um nome completamente diferente."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Forma #2","","Outra maneira de configurar remote tracking em um ramo é utilizando `git branch -u`. Executando","","`git branch -u o/main foo`","","configuraremos o ramo local `foo` para seguir o `o/main`. Se `foo` for o que estiver atualmente em checkout, você pode inclusive omiti-lo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vejamos outra forma realmente rápida de configurar remote tracking..."],afterMarkdowns:["O mesmo de antes, apenas um comando mais explícito. Doce!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! Para este nível, vamos fazer push no ramo remoto `main` *sem estar* em um checkout do `main` local. Vou deixar você descobrir o resto, já que isto é um curso avançado :P"]}}]},gl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Ramas que trackean os remotos","",'Unha das cousas que poden semellar "máxicas" das últimas leccións é que git sabía que a rama `main` estaba relacionada co `o/main`. Obviamente, estas ramas teñen nomes semellantes, e podería semellar lóxico conectar a rama `main` do remoto ca rama `main` local, pero esta conexión é ben evidente nos dous escenarios:',"","* Durante unha operación de pull, os commits descarganse ó `o/main` e logo *mesturanse* á rama `main`. O obxectivo implícito do merge determinase con esta conexión.","* Durante un push, o traballo da rama `main` súbese á rama `main` do remoto (que estaba representada localmente por `o/main`). O *destino* do push determinouse con esta conexión entre `main` e `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Trackeando remotos","",'Facéndoa curta, esta conexión entre `main` e `o/main` ensínase pola propiedade de "trackear (seguir) remotos" das ramas. A rama `main` está configurada para trackear `o/main` -- o que quere dicir, que hai un obxectivo implícito para o merge e un destino implícito para a rama `main`.',"","Poderías estar pensando cómo esa propiedade apareceu na túa rama `main` se ti non executaches ningún comando para especificalo. Bueno, cando clonas un repositorio co git, esta propiedade asignase por ti automáticamente.","","Durante un clone, git crea unha rama remota por cada rama no remoto (por exemplo, ramas como `o/main`). Pero despois crea unha rama local que trakea a rama activa do remoto, que habitúa ser `main`.","","Una vez completado o git clone, só tés unha única rama local (para que non te asustes) pero podes ver todalas ramas que do remoto (se fora tan curioso). ¡É o mellor de ámbolos dous mundos!","","Esto tamén explica por qué poderías ver unha mensaxe como este durante a clonación:","",' local branch "main" set to track remote branch "o/main"',"",' rama local "main" establecida para trackear a rama remota "o/main"']}},{type:"ModalAlert",options:{markdowns:["### ¿Podo especificalo eu?","","¡Claro que sí! Podes facer que calquera rama que quixeras seguir `o/main`, e se o fixeras, esa rama vai ter o mesmo destino implícito de push e obxectivo implícito de merge que `main`. Eso significa que podes executar `git push` nunha rama chamada `nonMain` e ¡que o teu traballo se empurre á rama `main` do remoto!","","Hai dúas formas de establecer esta propiedade. A primeira é facer checkout a unha nova rama empregando unha rama remota como a referencia especificada. Executar","","`git checkout -b nonMain o/main`","","Crea unha nova rama chamada `nonMain` e persigue a `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Suficiente charla, ¡vexamos unha demo! Imos facer checkout a unha nova rama chamada `foo` e facer que siga a `main` no remoto."],afterMarkdowns:["Como podes ver, empregamos o obxectivo implícito de merge `o/main` para actualizar a rama `foo`. ¡Nota como `main` non foi actualizada!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["O mismo aplica para git push."],afterMarkdowns:["Boom. Empurramos o noso traballo á rama `main` do remoto incluso cando a nosa rama se chamaba totalmete distinto."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Forma número 2","","Outra forma de especificar a rama a seguir é usar a opción `git branch -u`. Executando","","`git branch -u o/main foo`","","establecemos que a rama `foo` segue a `o/mater`. Se por riba estás parado en `foo`, incluso podes obvialo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vexamos rápidamente está outra forma de especificar a rama a seguir..."],afterMarkdowns:["O mesmo que antes, só que un comando bastante máis explícito. ¡Unha cousa preciosa!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["¡Ok! Para este nivel, empurra o teu traballo á rama `main` do remoto *sen* estar parado sobre `main` localmente. Déixote que te decates do resto ti só, que para algo estás nun nivel avanzado :P"]}}]},zh_TW:{childViews:[{type:"ModalAlert",options:{markdowns:["### remote tracking branch","",'在之前的課程中,有一件事情看起來很"神奇",那就是 git 知道 `main` branch 是對應到 `o/main` branch。當然這些 branch 有類似的名稱,所以可以大概猜到, local 的 `main` branch 可以對應到 remote 的 `main branch`,但是我們是在兩種情況下可以確定有這個對應關係:',"","* 在使用 `pull` 的時候,下載 commit 到 `o/main`,並且 `merge` 這些 commit 到 `main` branch,這就表示這個 merge 的目標是決定於這個對應關係。","* 在使用 `push` 的時候,在 `main` branch 上面的 commit 被 push 到 remote 上面的 `main` branch (它在 local 被表示成 `o/main`),這就表示 push 的目標是決定於 `main` 以及 `o/main` 之間的對應關係。",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'長話短說,我們可以用 branch 上面的 "remote tracking" 特性來表示介於 `main` 以及 `o/main` 的對應關係,`main` branch 被設定用來追蹤(track) `o/main`,這就表示對於 `main` branch 來說的話,有一個 merge 的目標以及 push 的目標。',"","你可能會覺得很奇怪,當你沒有下任何指令去設定的時候,關於 `main` branch 的對應關係是如何被設定的。喔!其實當你 clone 一個 repo 的時候,其實就已經自動幫你做設定了。 ","","在做 clone 的時候,git 會針對每一個在 remote 上面的 branch 建立一個 branch (例如 `o/main`),之後它會建立一個 local branch 來追蹤目前在 remote 上面的 active branch,在大部份的情況下,幾乎都是設定 `main` branch。","","一旦 git 完成這個動作,你就只會有一個 local branch ,但是你可以看到所有在 remote 上面的不同的 branch,對於 local 和 remote 來說的話,這樣子是最好的!","","這也解釋了為什麼當你 clone 的時候可能會看到以下被輸出的指令:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### 我可以自己設定嗎?","","是的你可以!你可以設定任何的 branch 來 track `o/main`, 假如你真的這麼做的話,那麼該 branch 的 push 及 merge 的目標就會跟 `main` 一樣。這就表示說你可以在 `totallyNotMain` branch 上面執行 `git push`,並且 push 你的 commit 到 remote 的 `main` branch!","","有兩個方式可以設定,第一個就是藉由參考一個 remote branch 來 checkout 一個新的 branch。執行","","`git checkout -b totallyNotMain o/main`","","建立一個新的 `totallyNotMain` branch 並且它會 track `o/main`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["說的好多,我們現在來看一個例子!我們會 checkout 一個新的 `foo` branch,而且該 branch 會被用來 track remote 上的 `main` branch。"],afterMarkdowns:["就像你看到的,當 `o/main` 更新的時候,`foo` branch 也跟著一起被更新,要注意 main 並沒有被更新!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["同樣適用於 `git push`"],afterMarkdowns:["哇,即使我們的 branch 名稱完全一點關係都沒有,但我們還是 push 了 commit 到 remote 的 `main` branch 上面。"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 方法 #2","","另外一個設定 remote tracking 的方法是使用 `git branch -u` 這一個指令,執行","","`git branch -u o/main foo`","","你就會看到 `foo` branch 被設定成 track `o/main`,如果你現在已經 checkout 到 foo 這個 branch 上面了,你就可以省略掉它:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["我們來看這個快速設定 remote tracking 的方法..."],afterMarkdowns:["跟之前一樣,就只是一個更加明確的指令,讚啦!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["好!在這個關卡中,我們要 push 我們的 commit 到 remote 上面的 `main` branch,但是我們*不* checkout 到 local 的 `main` branch。因為這是一個進階的課程,所以我會讓你明白其它的東西。:P"]}}]},zh_CN:{childViews:[{type:"ModalAlert",options:{markdowns:["### 远程跟踪分支","","在前几节课程中有件事儿挺神奇的,Git 好像知道 `main` 与 `o/main` 是相关的。当然这些分支的名字是相似的,可能会让你觉得是依此将远程分支 main 和本地的 main 分支进行了关联。这种关联在以下两种情况下可以清楚地得到展示:","","* pull 操作时, 提交记录会被先下载到 o/main 上,之后再合并到本地的 main 分支。隐含的合并目标由这个关联确定的。","* push 操作时, 我们把工作从 `main` 推到远程仓库中的 `main` 分支(同时会更新远程分支 `o/main`) 。这个推送的目的地也是由这种关联确定的!",""]}},{type:"ModalAlert",options:{markdowns:["## 远程跟踪","","直接了当地讲,`main` 和 `o/main` 的关联关系就是由分支的“remote tracking”属性决定的。`main` 被设定为跟踪 `o/main` —— 这意味着为 `main` 分支指定了推送的目的地以及拉取后合并的目标。","","你可能想知道 `main` 分支上这个属性是怎么被设定的,你并没有用任何命令指定过这个属性呀!好吧, 当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。","","当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支(比如 `o/main`)。然后再创建一个跟踪远程仓库中活动分支的本地分支,默认情况下这个本地分支会被命名为 `main`。","","克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的),但是可以查看远程仓库中所有的分支(如果你好奇心很强的话)。这样做对于本地仓库和远程仓库来说,都是最佳选择。","","这也解释了为什么会在克隆的时候会看到下面的输出:","",' local branch "main" set to track remote branch "o/main"',""]}},{type:"ModalAlert",options:{markdowns:["### 我能自己指定这个属性吗?","","当然可以啦!你可以让任意分支跟踪 `o/main`, 然后该分支会像 `main` 分支一样得到隐含的 push 目的地以及 merge 的目标。 这意味着你可以在分支 `totallyNotMain` 上执行 `git push`,将工作推送到远程仓库的 `main` 分支上。","","有两种方法设置这个属性,第一种就是通过远程分支切换到一个新的分支,执行: ","","`git checkout -b totallyNotMain o/main`","","就可以创建一个名为 `totallyNotMain` 的分支,它跟踪远程分支 `o/main`。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["闲话少说,咱们先看看演示!我们切换到一个名叫 `foo` 的新分支,让其跟踪远程仓库中的 `main`"],afterMarkdowns:["正如你所看到的, 我们使用了隐含的目标 `o/main` 来更新 `foo` 分支。需要注意的是 main 并未被更新!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git push 同样适用"],afterMarkdowns:["我们将一个并不叫 `main` 的分支上的工作推送到了远程仓库中的 `main` 分支上"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 第二种方法","","另一种设置远程追踪分支的方法就是使用:`git branch -u` 命令,执行:","","`git branch -u o/main foo`","","这样 `foo` 就会跟踪 `o/main` 了。如果当前就在 foo 分支上, 还可以省略 foo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["看看这种方式的实际的效果..."],afterMarkdowns:["跟之前一样, 但这个命令更明确!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["OK! 本节我们在**不**切换到 `main` 分支的情况下将工作推送到的远程仓库中的 `main` 分支上。因为这是高级课程, 就不做过多的提示了! :P"]}}]},de_DE:{childViews:[{type:"ModalAlert",options:{markdowns:["### Remote Tracking Branches","",'In den letzten paar Leveln wirkte es womöglich etwas "magisch", dass Git automatisch wusste, dass der Branch `main` irgendwie mit `o/main` verwandt ist. Klar, sie haben ähnliche Namen und daher mag es logisch erscheinen sie in Verbindung zu bringen, aber offensichtlich wird es in zwei Szenarien:',"","* Beim `pull` werden Commits in `o/main` heruntergeladen und dann per *Merge* in den Branch `main` gebracht. Aus der Verbindung zwischen den beiden Branches leitet sich das Ziel des Merges ab.","* Beim `push` werden Commits vom `main` auf den `main` des Remote Servers geschoben (und die Änderung _danach_ im lokalen `o/main` Branch abgebildet). Das *Ziel* des Push wird aus der Verbindung zwischen `main` und `o/main` abgeleitet.",""]}},{type:"ModalAlert",options:{markdowns:['Langer Rede kurzer Sinn, die Verbindung zwischen `main` und `o/main` ist einfach die Eigenschaft des "Remote Tracking" von Branches. `main` ist so eingestellt, dass er `o/main` trackt -- das heißt es gibt ein implizites Ziel für `pull` und `push` Operationen auf dem `main` Branch.',"","Du fragst dich vielleicht wieso diese Eigenschaft auf dem `main` definiert ist, wenn du das doch gar nicht explizit gemacht hast. Naja, beim Clonen eines Repository macht Git das für den `main` automatisch.","","Während des Clonens erstellt Git einen Remote Branch für jeden Branch, den es auf dem Remote Server findet (also Branches wie `o/main`); dann erstellt es für den Branch, auf den auf dem entfernten Server `HEAD` zeigt (meistens `main`) automatisch einen lokalen Branch und stellt ihn so ein, dass er sein Gegenstück auf dem Server trackt. Deswegen hast du beim Clonen vielleicht schon mal dies gesehen:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Kann ich das auch selbst machen?","","Na klar! Du kannst jeden beliebigen Branch so einstellen, dass er `o/main` trackt, und wenn du das tust wird der Branch dieselben impliziten Zielangaben für `push` und `pull` haben wie `main`. Du kannst also `git push` auf dem Branch `absolut_nicht_main` ausführen und deine Commits auf `main` des entfernten Servers schieben lassen.","","Es gibt zwei Möglichkeiten diese Eigenschaft zu definieren. Die erste ist, einen neuen lokalen Branch von einem Remote Branch auszuchecken. Wenn man",""," git checkout -b absolut_nicht_main o/main","","eingibt, wird ein neuer lokaler Branch namens `absolut_nicht_main` angelegt, der `o/main` trackt."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Genug gequatscht, schauen wir uns eine Demonstration an! Wir checken einen neuen Branch `foo` aus, so dass er `main` auf dem Server trackt."],afterMarkdowns:["Wie du siehst, benutzen wir das implizite Ziel beim `pull` um `foo` zu aktualisieren. Beachte, dass `main` nicht aktualisiert wird."],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Das gilt auch für `git push`."],afterMarkdowns:["Bämm. Wir haben unsere Commits auf den `main` auf dem Server geschoben, obwohl unser lokaler Branch völlig anders heißt."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Methode 2","","Noch eine Möglichkeit um Remote Tracking auf einem Branch einzustellen, ist `git branch -u`. Wenn man",""," git branch -u o/main foo","","eingibt, wird damit der lokale Branch `foo` so eingestellt, dass er `o/main` trackt. Den Namen des lokalen Branch kannst du auch weglassen, falls du ihn eh aktuell ausgecheckt hast:",""," git branch -u o/main",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Schauen wir uns auch diese Methode noch an ..."],afterMarkdowns:["Genau wie vorher, nur ist der Befehl ein bisschen eindeutiger. Schick!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok. In diesem Level musst du Commits auf den `main` auf dem Server schieben, *ohne* den lokalen `main` ausgecheckt zu haben. Den Rest kannst du selbst herausfinden, schließlich ist das hier für Fortgeschrittene. :P"]}}]},ru_RU:{childViews:[{type:"ModalAlert",options:{markdowns:["### Удалённые-отслеживаемые ветки","",'Единственное, что могло бы показаться вам "магией" в нескольких предыдущих уроках - это то, как git знает, что ветка `main` соответствует `o/main`. Конечно, эти ветки имеют схожие имена и связь между локальной и удалённой ветками `main` выглядит вполне логично, однако, эта связь наглядно продемонстрирована в двух сценариях:',"","* Во время операции pull коммиты скачиваются в ветку `o/main` и затем *соединяются* в ветку `main`. Подразумеваемая цель слияния определяется исходя из этой связи.","* Во время операции push наработки из ветки `main` закачиваются на удалённую ветку `main` (которая в локальном представлении выглядит как `o/main`). *Пункт назначения* операции push определяется исходя из связи между `main` и `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Удалённые-отслеживаемые ветки","",'Короче, связь между `main` и `o/main` объясняется не иначе как свойство "удалённое отслеживание" веток. Ветка `main` настроена так, чтобы следить за `o/main` -- это подразумевает наличие источника для merge и пункта назначения для push в контексте ветки `main`.',"","Вы, должно быть, удивлены, как это отслеживание появилось на ветке `main`, если мы не запускали ни одной специфической команды. На самом деле, когда вы клонируете репозиторий, это слежение включается автоматически.","","В процессе клонирования git локально создаёт удалённые ветки для каждой ветки с удалённого репозитория (такие как `o/main`). Затем он - git - создаёт локальные ветки, которые отслеживают текущую, активную ветку на удалённом репозитории. В большинстве случаев - это `main`.","","К тому моменту как `git clone` завершит своё выполнение, у вас будет лишь одна локальная ветка (так что вы ещё не сильно перегружены), но, если вам будет интересно, вы сможете увидеть все удалённые ветки (при желании).","","Именно это объясняет, почему сразу после клонирования вы видите в консоли надпись:","",' local branch "main" set to track remote branch "o/main"',"",' (локальная ветка "main" теперь следит за удалённой веткой "o/main") ']}},{type:"ModalAlert",options:{markdowns:["### А могу ли я сделать это самостоятельно?","","Само собой! Вы можете сказать любой из веток, чтобы она отслеживала `o/main`, и если вы так сделаете, эта ветка будет иметь такой же пункт назначения для push и merge как и локальная ветка `main`. Это значит, что вы можете выполнить `git push`, находясь на ветке `totallyNotMain`, и все ваши наработки с ветки `totallyNotMain` будут закачены на ветку `main` удалённого репозитория!","","Есть два способа сделать это. Первый - это выполнить checkout для новой ветки, указав удалённую ветку в качестве ссылки. Для этого необходимо выполнить команду","","`git checkout -b totallyNotMain o/main`","",", которая создаст новую ветку с именем `totallyNotMain` и укажет ей следить за `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Хватит болтовни, давайте взглянем на демонстрацию! Мы выполним checkout для новой ветки `foo` и укажем ей, чтобы она отслеживала `main` с удалённого репозитория."],afterMarkdowns:["Как вы увидели, мы использовали `o/main`, чтобы обновить ветку `foo`. Обратите внимание, как обновился `main`!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Это работает также и для git push."],afterMarkdowns:["Оп! Мы закачали наши наработки на ветку `main` нашего удалённого репозитория. При том, что наша локальная ветка называется абсолютно по-другому."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Способ №2","","Другой способ указать ветке отслеживать удалённую ветку — это просто использовать команду `git branch -u`. Выполнив команду","","`git branch -u o/main foo`","","вы укажете ветке `foo` следить за `o/main`. А если вы ещё при этом находитесь на ветке `foo`, то её можно не указывать:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Как видно, второй способ указать слежение за веткой намного быстрее..."],afterMarkdowns:["Словом, всё как и раньше, просто отдельная, специальная команда. Здорово!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Отлично! Для выполнения этого уровня давайте выполним push наших наработок в ветку `main` на удалённом репозитории, при этом *не* скачивая и не создавая ветку `main` локально. Я объясню вам оставшееся чуть позже, т.к. это продвинутый курс :P"]}}]},ja:{childViews:[{type:"ModalAlert",options:{markdowns:["### リモートトラッキングブランチ","","もしかしたら直近の幾つかの章で、「魔法」の様に見えた現象があるかもしれません:gitが`main`ブランチは`o/main`に関連していることを知っていたということです。確かにこれらのブランチは似た名前を持っていて、リモートの`main`ブランチとローカルの`main`ブランチを繋ぐ論理的な意味を成すかもしれません。以下の2例がこれらブランチが明確に繋がっている事を示します:","","* プルの実行時は、コミットを`o/main`上にダウンロードし、`main`ブランチにそれを*マージ*します。マージのターゲットはこの繋がりから求められます。","* プッシュの実行時は、`main`ブランチの作業はリモートの`main`ブランチにプッシュされます(その後に`o/main`によってローカルに反映されています)。プッシュ先の決定は、`main`と`o/main`の繋がりから求められます。",""]}},{type:"ModalAlert",options:{markdowns:["## リモートトラッキング","",'端的に言えば、`main`と`o/main`の繋がりの正体はそれぞれのブランチの"remote traking"というプロパティです。`main`ブランチは`o/main`に追跡するように設定されているのです。これは、`main`ブランチのための暗黙のプッシュ先と暗黙の取り込み先が存在することを意味します。',"","特にそのような設定を行うコマンドを走らせていないのに、`main`ブランチにこのプロパティが設定されていたことに疑問を持つかもしれません。そう、gitによってリポジトリをクローンした時、gitはこのプロパティを自動的に設定してくれるのです。","","クローンしている間、gitはリモートブランチをリモートリポジトリのブランチ全てに対して作ります(`o/main`のように)。その後、リモート上でアクティブなブランチを追跡するローカルブランチを作成します。多くの場合それは`main`ブランチになります。","","gitのクローンが完了した時、一つのローカルブランチしか存在しません(なので、情報量に圧倒される事はありません)。しかし、全てのリモートのブランチを見ることもできるのです(もしあなたが十分な好奇心を持っていれば、ですが)。いわゆるwin-winの関係ですね!","","クローン中に次のような出力が表示されることの説明にもなりますね:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### 自分でトラッキング元を設定できますか?","","はい、できます!`o/main`を追跡するブランチを作成できますし、そのブランチは`main`と同じ暗黙のプッシュ先とマージターゲットを持ちます。例えば`tottallyNotMain`という名前のブランチで`git push`を走らせ、リモートの`main`ブランチにプッシュするといったことができるということを意味しています!","","このプロパティを設定するには2つの方法があります。一つ目は、リモートブランチをリファレンスとして新しいブランチをチェックアウトするというものです。例えば","","`git checkout -b totallyNotMain o/main`","","を実行する事で`totallyNotMain`という名前のブランチを新しく作り、`o/main`への追跡プロパティを設定します。"]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["説明は十分でしょう、デモを見ていきましょう!`foo`という名前の新しいブランチをチェックアウトし、リモートの`main`への追跡プロパティを設定してみます。"],afterMarkdowns:["見ての通り、暗黙の取り込み先である`o/main`を使って`foo`ブランチを更新しました。`main`が更新されないことに注意してください!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["これは`git push`にも適用されます"],afterMarkdowns:["わーお。全く違う名前がつけられているブランチですが、リモートの`main`に内容をプッシュできました。"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 二番目の方法","","ブランチのリモートトラッキングを設定するもう一つの方法は、単に`git branch -u`オプションを使うというものです。例えば","","`git branch -u o/main foo`","","を実行する事で`foo`ブランチが`o/main`を追跡するように設定できます。もし、`foo`が現在チェックアウトしているブランチだった場合、以下のように省略することができます:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["もう一つの方法でリモートトラッキングを指定する様子を見てみましょう..."],afterMarkdowns:["前回と一緒で、より明示的なコマンドですね。とてもいい感じです!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["OK!このレベルでは、ローカルで`main`にチェックアウトしていない状態で、リモートの`main`ブランチに作業をプッシュしてみましょう。これは高度な課題ですから、理解するのに少し時間をおく必要があると言っておきます:P"]}}]},ko:{childViews:[{type:"ModalAlert",options:{markdowns:["### 원격-추적 브랜치","",'지난 몇개의 레슨에서 "마법"처럼 보일 수 있는게 하나 있었는데, git이 `main`브랜치가 `o/main`와 연관 되어있는걸 안다는 것입니다. 물론 이 두 브랜치가 이름이 비슷하기 때문에 로컬 `main`브랜치가 원격의 `main`브랜치와 연결 되어있다고 하자면 어찌 논리적으로 말이 되긴 합니다만..., 이 연결은 두가지 시나리오를 통해 뚜렷하게 확인이 됩니다:',"","* pull 작업을 하는 도중, 커밋들은 `o/main`에 내려받아 지고 그다음 `main` 브랜치로 *merge*됩니다. merge에서 내재된 타겟은 이 연결에서 결정합니다.","* push 작업을 하는 도중, `main` 브랜치의 작업은 원격의 `main`브랜치(로컬에서 `o/main`로 표현되는)로 push 됩니다. push의 *목적지*는 main와 `o/main`의 연결에서 결정됩니다.",""]}},{type:"ModalAlert",options:{markdowns:["## 원격 추적","",'간단히 말해서, 이 `main`와 `o/main`사이의 연결은 브랜치의 "원격 추적" 속성을 통해 간단하게 설명됩니다. `main`브랜치는 `o/main`브랜치를 추적하도록 설정되어 있습니다 -- 이것은 `main`가 merge와 push할 내재된 목적지가 생겼다는 뜻 입니다.',"","여러분은 어떻게 이 속성을 지정해주는 그 어떤 명령어 없이 `main` 브랜치에 설정되있는지 궁금할것 입니다. 사실, 여러분이 git으로 저장소를 clone할때 이 속성이 여러분을 위해 자동으로 설정 됩니다.","","clone을 진행하면서 git은 원격 저장소에있는 모든 브랜치에 대해 로컬에 원격 브랜치를 생성합니다(`o/main`같은것들 말이죠). 그 후 원격 저장소에서 현재 active한 브랜치를 추적하는 로컬 브랜치를 생성합니다, 대부분의 경우 `main`가 됩니다.","","git clone이 완료되면, 여러분은 오로지 하나의 로컬 브랜치를 가지게 됩니다(부담스럽지 않도록) 물론 원격 저장소에있는 여러 다른 브랜치도 여전히 확인할 수 있습니다(호기심이 많으시다면). 로컬, 원격 저장소 양쪽에 최적화 되있는거죠!","","여러분이 clone을 할 때 아래의 명령어를 볼 수도 있는 이유입니다:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### 내 스스로 지정할수도 있나요?","","당연하죠! 여러분은 아무 임의의 브랜치를 `o/main`를 추적하게 만들 수 있습니다. 이렇게 하면 이 브랜치 또한 내재된 push,merge 목적지를 `main`로 할 것입니다. 여러분은 이제 `totallyNotMain`라는 브랜치에서 `git push`를 수행해서 원격 저장소의 브랜치 `main`로 작업을 push할 수 있습니다!","","이 속성을 설정하는데에는 두가지 방법이 있습니다. 첫 번째는 지정한 원격 브랜치를 참조해서 새로운 브랜치를 생성하여 checkout 하는 방법 입니다. 다음을 실행하면","","`git checkout -b totallyNotMain o/main`","","`totallyNotMain`라는 이름의 새 브랜치를 생성하고 `o/main`를 추적하게 설정합니다."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["설명은 충분히 한듯 합니다. 직접 확인해 봅시다! `foo`라는 이름의 새 브랜치를 checkout하고 이것을 원격 저장소의 `main`를 추적하도록 설정하겠습니다."],afterMarkdowns:["보이듯이, 우리는 `o/main`를 `foo` 브랜치를 갱신하기 위한 내재된 merge 타겟으로 사용하고 있습니다. main이 갱신되지 않는다는것을 눈치챘죠?"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["git push에도 적용이 됩니다"],afterMarkdowns:["Boom. 브랜치의 이름을 전혀 다른것으로 지었는데도 불구하고 우리 작업이 `main`로 push 되었습니다."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### 방법 #2","","브랜치에 원격 추적 설정을 하는 또 다른 방법으로는 간단하게 `git branch -u` 옵션을 사용하는 방법이 있습니다. 다음을 실행하면","","`git branch -u o/main foo`","","가 `foo` 브랜치가 `o/main`를 추적하도록 설정합니다. 만약 `foo`가 현재 작업하고 있는 브랜치라면 생략해도 됩니다:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["자 이 다른 방법이 작동하는 모습을 확인해 봅시다..."],afterMarkdowns:["이전과 같습니다, 좀 더 분명하게 알 수 있는 명령어죠. 좋아요!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:[" 이번 레벨에서는 로컬의 `main`브랜치가 아닌 다른 브랜치에서 작업을 원격 저장소의 `main`브랜치로 push하세요. 고급 과정이니 더 길게 설명하지는 않을게요 :p"]}}]},uk:{childViews:[{type:"ModalAlert",options:{markdowns:["### Гілки віддаленого стеження","",'Одна з речей в попередніх уроках, яка могла виглядати, наче "магія" -- це те, що гіт якось знає, що локальна гілка `main` відповідає віддаленій `o/main`. Звичайно, ці гілки мають схожі назви, і виглядає логічним співставити віддалену гілку `main` з локальною `main`, однак цей зв\'язок найкраще видно в двох випадках:',"","* Під час операції `pull`, коміти попадають в `o/main`, а вже потім *мерджаться* в локальний `main`. Гілка в яку відбудеться мердж якраз і визначається цим зв'язком.","* Під час операції `push`, коміти з гілки `main` переносяться у віддалений `main` (який локально представлений як `o/main`). *Гілка-призначення* для `push` визначена зв'язком між `main` і `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Гілки віддаленого стеження","",'В двох словах, цей зв\'язок між `main` та `o/main` і є тим "віддаленим стеженням", визначеним для гілки. Гілка `main` налаштована стежити за `o/main` -- це визначає неявну ціль для мерджу і неявне призначення під час операції `push` для гілки `main`.',"","Ви можете подумати, а як же такий зв'язок було встановлено, якщо я не виконував жодної команди? Ну, коли гіт клонує репозиторій, він встановлює цей зв'язок автоматично.","","Під час клонування гіт створює гілки для стеження за кожною гілкою віддаленого репозиторію (напр. `o/main`). Потім він створює локальну гілку, що пов'язана і стежить за активною гілкою у віддаленому репозиторії, яка в більшості випадків називається `main`.","","Після закінчення клонування у вас буде лише одна локальна гілка (щоб не перевантажувати) але ви можете переглянути всі віддалені гілки (якщо буде цікаво). Такий собі розумний компроміс!","","Це пояснює чому ви бачите наступне повідомлення під час клонування:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### А можу я сам вибирати?","","Так, можеш! Ти можеш вибрати довільну гілку, яка слідкуватиме за `o/main`, і тоді для цієї гілки `push` та `merge` автоматично працюватимуть з `main`. Це означає, що виконання `git push` в гілці з назвою `totallyNotMain` (зовсім не main) може зберегти локальні коміти у віддалену гілку `main`!","","Є два шляхи встановити такий зв'язок. Перший - створити нову гілку з явним вказанням зв'язку (за ким слідкувати). Виконання","","`git checkout -b totallyNotMain o/main`","","створить гілку `totallyNotMain`, яка слідкує за `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Досить розмов, подивімось в дії! Створімо нову гілку `foo` і змусьмо її слідкувати за віддаленою гілкою `main`."],afterMarkdowns:["Як видно з результату, при оновленні `foo` було використано автоматичний зв'язок з `o/main` під час операції `merge`. Зверніть увагу, `main` не було оновлено!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Це також справджується і для git push."],afterMarkdowns:["Ка-бум!. Ми запушили наші зміни у віддалений `main`, незважаючи на те, що локальна гілка називалась зовсім по-іншому."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Спосіб №2","","Інший спосіб вказати за якою віддаленою гілкою слідкувати -- просто використовувати опцію `git branch -u`. Виконання","","`git branch -u o/main foo`","","змусить гілку `foo` слідкувати за `o/main`. Якщо `foo` є поточною гілкою, її можна навіть не вказувати:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Подивімось на цей спосіб швидко вказати віддалену гілку для відслідковування..."],afterMarkdowns:["Як і перший спосіб, але своя окрема команда."],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Гаразд! На цьому рівні збережімо свою роботу у віддалену гілку `main` *без* переходу на локальну `main`. Про решту здогадайся сам, раз ти вже дойшов до цього рівня :P"]}}]},vi:{childViews:[{type:"ModalAlert",options:{markdowns:["### Theo dõi nhánh từ xa","",'Trong những bài học vừa qua có một điểu có vẻ như là "ma thuật" đó là Git lại biết được nhánh `main` có liên kết đến nhánh `o/main`. Dù các nhánh này có tên giống nhau và có vẻ hợp lý để kết nối nhánh `main` trên remote với nhánh `main` trên local, nhưng điều này được thể hiện rõ ràng qua hai tình huống sau:',"","* Trong quá trình thực hiện thao tác kéo, các commit được tải xuống nhánh `o/main` và sau đó *hợp nhất* vào nhánh `main`. Mục tiêu hợp nhất dược ngầm định bởi kết nối này.","* Trong quá trình thực hiện thao tác đẩy, thảnh quả trên nhánh `main` được đẩy lên nhánh `main` từ xa (sau đó được biểu thị bằng nhánh `o/main` ở kho chứa cục bộ). *Đích đến* của lệnh đẩy được xác định bằng kết nối giữa nhánh `main` và nhánh `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Theo dõi từ xa","",'Nói tóm lại, kết nối giữa nhánh `main` và nhánh `o/main` đơn giản được giải thích bằng thuộc tính "theo dõi từ xa" ("remote tracking") của các nhánh. Nhánh `main` được thiết lập để theo dõi nhánh `o/main` -- Điều này có nghĩa là có điểm đến ngụ ý cho việc hợp nhất (merge) và đẩy lên (push) của nhánh `main`.',"","Có thể bạn sẽ thắc mắc rằng tại sao thuộc tính này được thiết lập lên nhánh `main` trong khi bạn chẳng hề chạy một câu lệnh nào chỉ định điều này. Chà, khi bạn dùng Git để nhân bản kho chứa, thì thuộc tính này đã được tự động thiết lập cho bạn rồi. ","","Trong quá trình thực hiện nhân bản, Git tạo ra nhánh từ xa trên kho chứa cục bộ cho tất cả các nhánh trên kho chứa từ xa (các nhánh như `o/main`). Sau đó nó sẽ tạo một nhánh cục bộ theo dõi nhánh hoạt động hiện tại của kho chứa từ xa, đa phần các trường hợp là nhánh `main`.","","Một khi quá trình nhân bản hoàn thành, bạn sẽ chỉ có một nhánh cục bộ (để bạn không thấy quá tải) nhưng bạn có thể thấy tất cả các nhánh trên kho chứa từ xa (phòng trường hợp bạn thấy tò mò). Đây là phương án tối ưu!","","Điều này giải thích việc sau khi nhân bản bạn có thể thấy dòng lệnh sau xuất hiện:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Tôi có thể tự chỉ định chứ?","","Tất nhiên là được chứ! Bạn có thế khiến bất kỳ nhánh nào theo dõi nhánh `o/main`, và nếu bạn làm vậy, nhánh đó sẽ được được chỉ định đích của lệnh đẩy và mục tiêu hợp nhất giống như nhánh `main`. Điều này có nghĩa là bạn có thể chạy lệnh `git push` trên nhánh có tên là `totallyNotMain` và thành quả của bạn sẽ được đẩy lên nhánh `main` ở kho chứa từ xa!","","Có 2 cách để thiết lập thuộc tính này. Cách đầu tiên là chuyển sang một nhánh mới từ một nhánh từ xa bằng cách thực hiện","","`git checkout -b totallyNotMain o/main`","","Tạo ra một nhánh mới `totallyNotMain` và thiết lập cho nó theo dõi nhánh `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Nói vậy là đủ rồi, hãy xem thử một mô tả nào! Ta sẽ chuyển sang một nhánh tên là `foo` và thiết lập cho nó theo dõi nhánh `main` trên kho chứa từ xa."],afterMarkdowns:["Như bạn đã thấy, chúng tôi đã sử dụng mục tiêu ngầm `o / main` để cập nhật nhánh `foo`. Để ý rằng nhánh `main` không được cập nhật!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Điều này cũng được áp dụng cho lệnh git push."],afterMarkdowns:["Bùùm. Ta đã đẩy thành quả lên nhánh `main` ở kho chứa tù xa mặc dù nhánh của ta có tên hoàn toàn khác biệt"],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Cách thứ #2","","Cách khác để thiết lập theo dõi trên một nhánh đó là sử dụng lệnh `git branch -u`. Thực hiện","","`git branch -u o/main foo`","","sẽ thiết lập nhánh `foo` theo dõi nhánh `o/main`. Nếu nhánh `foo` đang được `HEAD` trỏ tới bạn có thể bỏ tham số này:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Hãy xem thử cách này để thiết lập theo dõi..."],afterMarkdowns:["Y hệt như trước, nhưng biểu hiện rõ ràng hơn. Tuyệt!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Được rồi! Ở cấp độ này hãy để thành quả lên nhánh `main` trên kho lưu trữ từ xa mà không chuyển sang nhánh `main` tại kho chứa cục bộ. Hãy tự tìm ra cách nhé, giờ là khóa học nâng cao rồi :P"]}}]},sl_SI:{childViews:[{type:"ModalAlert",options:{markdowns:["### Sledenje oddaljenih branchev","",'Stvar, ki se je morda zdela "čarobna" v zadnjih lekcijah je, da je git vedel, da je `main` branch povezan z `o/main`. Seveda imata brancha podobno ime in morda deluje logično, da se poveže `main` branch na oddaljenem repotu z lokalnim `main` branchem, toda ta povezava je jasno predstavljena v dveh scenarijih:',"","* Med pull operacijo so commiti preneseni na `o/main` in nato *zmergani* v `main` branch. Implicirana tarča merga je določena iz te povezave.","* Med push operacijo je delo iz `main` brancha naloženo na oddaljen `main` branch (ki je bil prej predstavljen kot `o/main` lokalno). *Destinacija* pusha je določena iz povezave med `main` in `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Sledenje oddaljenega repota","",'Če povzamem, ta povezava med `main` in `o/main` je preprosto razložena z lastnostnjo "oddaljenega sledenja" branchev. `main` branch je nastavljen, da sledi `o/main` -- to pomeni, da obstaja impliciran cilj merga in impliciran cilj pusha za `main` branch.',"","Morda se sprašuješ, kako se je nastavila ta lastnost na `main` branchu, čeprav nisi izvedel nobenega ukaza za to. No, ko kloniraš repo z gitom, je ta lastnost v bistvu nastavljena zate avtomatično. ","","Med kloniranjem git ustvari oddaljen branch za vsak branch na oddaljenem repotu (branchi kot `o/main`). Nato ustvari lokalen branch, ki sledi trenutno aktivnemu branchu na oddaljenem repotu, ki je v večini primerov `main`.","","Ko git clone zaključi, imaš samo en lokalen branch (da nisi zasipan), ampak lahko vidiš vse različne branche na oddaljenem repotu (če si zelo radoveden). Najboljše iz obeh svetov!","","To tudi razloži, zakaj lahko vidiš sledeč izpis ukaza med kloniranjem:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Ali ga lahko določim sam?","","Seveda se da! Narediš lahko, da bilokateri branch sledi `o/main`. V tem primeru bo imel ta branch enak impliciran cilj za push in merge kot `main`. To pomeni, da lahko poženeš `git push` na branchu poimenovanem `splohNiMain` in pushas svoje delo na `main` branch na oddaljenem repotu!","","Obstajata dva načina, da nastaviš to lastnost. Prvi je, da checkoutaš nov branch z uporabo oddaljenega brancha kot določeno referenca. Izvedba","","`git checkout -b splohNiMain o/main`","","Ustvari nov branch imenovan `splohNiMain` in nastavi, da sledi `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dovolj besedičenja, poglejmo primer! Checkoutali bomo nov branch poimenovan `foo` in ga nastavili, da sledi `main` na oddaljenem repotu."],afterMarkdowns:["Kot lahko vidiš, smo uporabili impliciran cilj mergea `o/main`, da posodobi `foo` branch. Opazi, kako se main ne posodobi!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["To velja tudi za git push."],afterMarkdowns:["Boom. Naše delo smo naložili na `main` na oddaljenem repotu, čeprav je ime našega brancha nekaj povsem drugega."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Način #2","","Še en način, da se nastavi oddaljeno sledenje na branchu, je, da se uporabi `git branch -u` opcija. Izvedba","","`git branch -u o/main foo`","","bo nastavila `foo` branch, da sledi `o/main`. Če je `foo` trenutno checkoutan, ga lahko celo izpustiš","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Poglejmo si na hitro še ta drug način določanja oddaljenega sledenja ..."],afterMarkdowns:["Enako kot prej, le bolj natančno. Lepa!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! Za to stopnjo pushajmo delo na `main` branch na oddaljenem repotu, medtem ko lokalno *nismo* na `masterju`. Ostalo prepustim tebi, ker je to vseeno napredna stopnja :P"]}}]},ta_IN:{childViews:[{type:"ModalAlert",options:{markdowns:["### தூரத்திலுள்ள கிளையை கண்காணித்தல்","",'கடந்த சில பாடங்களில் கிட் `main` மற்றும் `o/main` தொடர்பை கிட் அறிந்திருந்தது ஒரு "தந்திரம் போன்று" தோன்றி இருக்கலாம். நிச்சயமாக இரு கிளைகளுக்கும் ஒத்த பெயர்கள் உள்ளன, மேலும் தொலைதூரத்தில் உள்ள `main` கிளையை நமது கணினில் உள்ள `main` கிளையுடன் இணைக்க இது சரியான காரணமாக தெரியலாம், ஆனால் இந்த இணைப்பு இரண்டு காரணிகளில் தெளிவாக நிரூபிக்கப்பட்டுள்ளது:',"","* புல் செயல்பாட்டின் போது, கமிட்ஸ் `o/main` மீது பதிவிறக்கம் செய்யப்பட்டு `main` உடன் *ஒன்றிணைக்கப்படுகின்றது *. கிளைகளுக்கு இடையிலான இணைப்பின் மறைமுக இலக்கு இந்த தொடர்பினால் தீர்மானிக்கப்படுகிறது.","* புஸ் செயல்பாட்டின் பொது, `main` கிளையில் உள்ள மாற்றங்கள் தூரத்திலுள்ள `main` கிளைக்கு தள்ளப்படிகிரது (அது பின்னர் `o/main` என்று நம்மிடத்தில் குறித்துக்காட்டப்படும்).`main` மற்றும் `o/main` இடையிலான தொடர்பினை பொருத்து புஸ் செயலின் இலக்கு தீர்மானிக்கப்படுகிறது.",""]}},{type:"ModalAlert",options:{markdowns:["## தொலைதூர இலக்கை கண்காணித்தல்","",'சுருக்கமாக கூரினால், `main` மற்றும் `o/main` இடையிலான தொடர்பு "remote tracking" குணத்தினால் விளக்கப்பட்டுகிறது. `main` கிளை `o/main` கிளையை கண்காணிக்குமாரு அமைக்கப்பட்டுள்ளது -- என்றால் இணைப்பிற்க்கான இலக்கும் புஸ்க்கான இலக்கும் மறைமுகமாக குறிக்கப்பட்டுள்ளது.',"","எந்த ஓரு கட்டளையும் கொடுக்கப்படாமல் இந்த குணம் எப்படி கிடைத்தது என்ற குழப்பன் வேண்டாம், அது நீங்கள் ஒரு களஞ்சியத்தை நகல் எடுக்கும் போது தானாக பொறுத்த படுகிறது. ","","நகல் எடுக்கும் பொலுது, கிட் தூரத்திலுள்ள கிளைகளுக்கும் ஒரு கிளையை உருவாக்குகிறது (`o/main` கிளையை போன்று). பின்பு அது தூரத்தில் நடைமுறையில் உள்ள கிளையை கண்காணிக்கும் படி ஒரு கிளையை நமது இடத்தில் உருவாக்கும், அது பொதுவாக `main`ஆக இருக்கும்.","","நகால் எடுத்த பின்பு, நம்மிடம் உள்ள கிளை மட்டும் மீதம் இருக்கும் (எனவே நீங்கள் அதிகபடியாக எதையும் பெரவில்லை) ஆயினும் தேவைப்பட்டால் நீங்கள் தூரத்தில் உள்ள அனைத்து கிளைகளையும் காணலாம். இது இரு நிளைககளிலும் சிறந்தது!","","இதுதான் பின் வரும் கட்டளை நகல் எடுக்கும் போது பதிவு செயப்படுவதன் காரனம்:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### இதை நானே குறிப்பிட முடியுமா?","","ஆமாம் கண்டிப்பாக! உங்களால் எந்த ஒரு கிளையையும் `o/main` கண்காணிக்கும் படி அமைக்க முடியும், அப்படி செய்தால் அதிலும் இணைப்பிற்க்கான இலக்கு மற்றும் புஸ்க்கான இலக்கு் இரண்டும் மறைமுகமாக `main`ஐ குறிக்கும் படி இருக்கும். அதலான் `totallyNotMain` கிளையில் செய்யப்படும் `git push` தூரத்தில் உள்ள `main` கிளையில் மாற்றங்களை இணைத்துவிடும்.","","இதனை இரண்டு வகையாக செய்யலாம். முதலாவதாக புதிய கிளையை பின் வரும் கட்டளை கொண்டு பதிப்பித்தல்","","`git checkout -b totallyNotMain o/main`","","அல்லது `totallyNotMain` என்ற கிளையை உருவாக்கி `o/main` கண்காணிக்கு படி அமைத்தல்."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["விளக்கங்கள் போதும், இப்போது செயல்முறையை காண்போம்! `foo` கிளையை `main` கண்காணிக்கு படி பதிப்பிப்போம்."],afterMarkdowns:["நீங்கள் பார்ப்பதை போன்று, `foo` கிளை `o/main`ஐ மறைமுக இணை்ப்பு இல்க்காக அமைக்கப்பட்டுள்ளது. எவ்வளவு `main` புதுப்பிக்கப்படவில்லை என்பதை நினைவில் கொள்க!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["கிட் புஸ்-ஐயும் செயல் படுத்துங்கள்."],afterMarkdowns:["சிரப்பு. நமது கிளைக்கு முற்றிலும் வேறுபட்ட பெயரிடப்பட்டிருந்தாலும், நமது மாற்றங்களை தொலைதூரத்தில் உள்ள `main`தள்ளினோம்."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### வழி #2","","தூரத்திலுள்ள கிளையை கண்காணிக்கும் மற்றும் ஒரு முறை `git branch -u`ஐ பயன்படுத்துவது. பின்வருமாரு கட்டளையிட்டு","","`git branch -u o/main foo`","","இது `foo` `o/main`ஐ கண்காணிக்கும் படி செய்யும். `foo` ஏற்க்கனவே பதிப்பிட பட்டு இருந்தால் அதையும் நீ்ங்கள் உள்ளீடாக தர அவசியம் இல்லை:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["இப்போது இந்த இரண்டாவது முறையை விரைவாக காண்போம்..."],afterMarkdowns:["முன்பு குறிப்பிட்டது போன்றுதான், மேலும் சற்று வெளிப்படையன கட்டளையாக!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["சரி! இந்த நிலைக்கு நாம் தூரத்தில் உள்ள `main` கிளைக்கு அதனை பதிப்பிடாமல் மாற்றங்களை தள்ளுவோம். இது உயர்நிலை பாட பகுதி என்பதால் அதை எவ்வாரு செய்யலாம் என்பது உங்களிடமெ விட்டு விடுகின்றேன் :P"]}}]},pl:{childViews:[{type:"ModalAlert",options:{markdowns:["### Gałęzie śledzące","",'Może ci się wydawać od kilku lekcji, że Git jakoś "magicznie" wie, że gałąź `main` jest powiązana z `o/main`. Co prawda nazwy tych gałęzi są podobne i, logicznie rzecz biorąc, `main` na zdalnym repo można skojarzyć z lokalną gałęzią `main`, ale na dwóch przykładach pokażemy, jak to działa w rzeczywistości:',"","* Podczas operacji pull commity są pobierane do `o/main`, a następnie za pomocą *merge* scalane z gałęzią `main`. Na podstawie tego połączenia określa się pośrednio cel scalania.","* Podczas operacji push praca z gałęzi `main` jest wypychana do zdalnej gałęzi `main` (lokalnie reprezentowanej przez `o/main`). *Cel* polecenia push jest określony przez połączenie pomiędzy `main` a `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Remote tracking","",'Żeby nie przedłużać: połączenie pomiędzy `main` i `o/main` da się wyjaśnić po prostu jedną z właściwości gałęzi: "remote tracking". Gałąź `main` ma ustawione śledzenie gałęzi `o/main` -- a to oznacza, że dla operacji merge i push określony jest domyślny cel.',"","Może się zastanawiasz, jak to się stało, że `main` ma już ustawione śledzenie, skoro nie robiliśmy tego żadnym poleceniem. Otóż, kiedy klonujesz repozytorium w Gicie, ta właściwość jest ustawiana za ciebie automatycznie. ","","Przy klonowaniu Git tworzy zdalną gałąź dla każdej z gałęzi zdalnego repozytorium (czyli gałęzie takie jak `o/main`). Następnie tworzy lokalną gałąź, która śledzi aktualnie aktywną gałąź na zdalnym repo - czyli najczęściej `main`.","","Po zakończeniu klonowania lokalnie masz tylko jedną gałąź (żeby nie zawracać sobie niepotrzebnie głowy), ale możesz zobaczyć wszystkie gałęzie na zdalnym repozytorium (jeśli aż tak cię to ciekawi). To idealne dwa w jednym!","","A przy okazji to wyjaśnia, dlaczego przy klonowaniu możesz zobaczyć:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### A czy mogę to określić samodzielnie?","","Jasne, że tak! Możesz kazać dowolnej gałęzi śledzić `o/main`, i w takim wypadku będzie miała taki sam domyślny cel operacji push i merge co `main`. To znaczy, że możesz zrobić `git push` na gałęzi o nazwie `totallyNotMain`, a twoja praca i tak zostanie wypchnięta do gałęzi `main` w zdalnym repozytorium!","","Są dwa sposoby ustawienia tej właściwości. Pierwszym jest checkout nowej gałęzi wykorzystujący zdalną gałąź jako określoną referencję. Polecenie","","`git checkout -b totallyNotMain o/main`","","tworzy nową gałąź o nazwie `totallyNotMain` i każe jej śledzić `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dość gadania, pora zobaczyć, jak to działa! Będziemy checkoutować nową gałąź o nazwie `foo` i każemy jej śledzić `main` na zdalnym repozytorium."],afterMarkdowns:["Jak widzisz, użyliśmy domyślnego celu scalania `o/main`, żeby zaktualizować gałąź `foo`. Zwróć uwagę, że `main` się nie aktualizuje!!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Dotyczy to również git push."],afterMarkdowns:["Tadam! Wypchnęliśmy naszą pracę do `main` na `remote`, mimo że nasza gałąź nazywała się zupełnie inaczej."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Sposób #2","","Inny sposób na ustawienie remote tracking na branchu to po prostu użycie opcji `git branch -u`. Polecenie","","`git branch -u o/main foo`","","spowoduje, że gałąź `foo` będzie śledzić `o/main`. Jeśli aktualnie wybraną gałęzią jest `foo`, to możesz nawet pominąć jej nazwę:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Spójrzmy jeszcze szybko, jak to wygląda w praktyce..."],afterMarkdowns:["Tak samo jak poprzednio, tylko wyraźniej, widać to w poleceniu. Pięknie!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Oki! Na tym poziomie wypchnijmy (push) pracę do gałęzi `main` na zdalnym repozytorium, *nie* checkoutując `main` lokalnie. Wymyśl samodzielnie, jak to zrobić. To przecież zaawansowana część kursu :P"]}}]},it_IT:{childViews:[{type:"ModalAlert",options:{markdowns:["### Rami che tracciano il remoto","",'Una cosa che può esser sembrata "magica" riguardo le ultime lezioni è come git sapesse che il ramo `main` fosse connesso a `o/main`. Certo questi rami hanno dei nomi simili e avrebbe senso collegare il ramo `main` sul repository remoto al ramo `main` locale, ma questa connessione è chiaramente dimostrata in due scenari:',"","* Durante un'operazione di pull, i commit sono scaricati su `o/main` e poi *fusi* al ramo `main`. Il destinatario del merge è determinato da questa connessione.","* Durante un'operazione di push, il lavoro proveniente dal ramo `main` è stato caricato sul ramo `main` remoto (rappresentato localmente da `o/main`). La *destinazione* del push è determinata dalla connessione tra `main` e `o/main`.",""]}},{type:"ModalAlert",options:{markdowns:["## Tracciamento remoto","",'Per farla breve, questa connessione tra `main` e `o/main` viene spiegata facilmente dalla proprietà di "tracciamento remoto" dei rami. Il ramo `main` è impostato per tracciare `o/main` -- questo significa che sono presenti un destinatario implicito della fusione e una destinazione implicita del push per il ramo `main`.',"","Potresti chiederti come questa proprietà è stata impostata sul ramo `main` quando tu non hai eseguito alcun comando per specificarlo. Quando cloni un repository con git, questa proprietà viene impostata automaticamente.","","Durante un clone, git crea un ramo remoto per ciascun ramo presente sul repository remoto (aka rami come `o/main`). Crea poi un ramo locale che traccia il ramo attivo al momento sul remoto, che risulta essere `main` nella maggior parte dei casi.","","Una volta terminato git clone, di questi rimane solo un ramo locale (per non sovraccaricarti) ma puoi vedere tutti i vari rami presenti sul remoto (in caso tu fossi curioso). È come prendere due piccioni con una fava!","","Questo spiega inoltre perché potresti ricevere questo output durante la clonazione:","",' local branch "main" set to track remote branch "o/main"']}},{type:"ModalAlert",options:{markdowns:["### Posso specificarlo io?","","Sì che puoi! Puoi decidere arbitrariamente di far tracciare a qualsiasi ramo `o/main`, e se lo fai, quel ramo avrà le stesse destinazioni implicite per push e merge di `main`. Ciò significa che puoi eseguire `git push` su un ramo chiamato `perNienteIlMain` e vedere il tuo lavoro caricato sul ramo `main` nel repository remoto!","","Ci sono due modi per impostare questa proprietà. Il primo è creare il nuovo ramo tramite checkout specificando un ramo remoto come riferimento. Eseguire","","`git checkout -b perNienteIlMain o/main`","","Crea un nuovo ramo chiamato `perNienteIlMain` e lo imposta a tracciare `o/main`."]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Abbiamo parlato abbastanza, vediamo una dimostrazione! Creeremo tramite checkout un nuovo ramo chiamato `foo` e verrà impostato a tracciare `main` sul remoto."],afterMarkdowns:["Come puoi vedere, abbiamo usato il destinatario implicito di `o/main` per aggiornare il ramo `foo`. Se vedi il main non è stato aggiornato!!"],command:"git checkout -b foo o/main; git pull",beforeCommand:"git clone; git fakeTeamwork"}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Lo stesso vale per git push."],afterMarkdowns:["Boom. Abbiamo caricato il nostro lavoro al ramo `main` sul repository remoto nonostante il nostro ramo avesse un nome totalmente diverso."],command:"git checkout -b foo o/main; git commit; git push",beforeCommand:"git clone"}},{type:"ModalAlert",options:{markdowns:["### Way #2","","Un altro modo per impostare il tracciamento remoto su un ramo è tramite l'opzione `git branch -u`. Eseguire","","`git branch -u o/main foo`","","imposterà il ramo `foo` a tracciare `o/main`. Se stiamo attualmente lavorando su `foo` possiamo ometterlo:","","`git branch -u o/main`",""]}},{type:"GitDemonstrationView",options:{beforeMarkdowns:["Vediamo al volo quest'altro metodo per specificare il tracciamento remoto..."],afterMarkdowns:["Come prima, solo tramite un comando più esplicito. Bene dai!"],command:"git branch -u o/main foo; git commit; git push",beforeCommand:"git clone; git checkout -b foo"}},{type:"ModalAlert",options:{markdowns:["Ok! Per qusto livello carica del lavoro sul ramo `main` del remoto mentre *non* sei attualmente sul ramo `main` locale. Al resto devi arrivarci tu, d'altronde questo è il corso avanzato :P"]}}]}}}},{}]},{},[48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,84,85,86,87,88,89,90,91,92,93,94,95,96,98,97,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,77,79,78,80,81,82,83]); \ No newline at end of file diff --git a/index.html b/index.html index 32ffdc67d..20e32281f 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Learn Git Branching
$  

Git Hg
\ No newline at end of file +Learn Git Branching
$  

Git Hg
\ No newline at end of file