mirror of
https://github.com/pcottle/learnGitBranching.git
synced 2025-07-06 12:44:28 +02:00
Merge branch 'master' of https://github.com/pcottle/learnGitBranching
# Conflicts: # src/levels/remote/pushArgs.js
This commit is contained in:
commit
e415fd29a5
38 changed files with 673 additions and 138 deletions
|
@ -14,6 +14,12 @@ var GlobalStateActions = {
|
|||
});
|
||||
},
|
||||
|
||||
levelSolved: function() {
|
||||
AppDispatcher.handleViewAction({
|
||||
type: ActionTypes.LEVEL_SOLVED,
|
||||
});
|
||||
},
|
||||
|
||||
changeFlipTreeY: function(flipTreeY) {
|
||||
AppDispatcher.handleViewAction({
|
||||
type: ActionTypes.CHANGE_FLIP_TREE_Y,
|
||||
|
|
|
@ -25,7 +25,13 @@ module.exports = {
|
|||
CHANGE_FLIP_TREE_Y: null,
|
||||
SUBMIT_COMMAND: null,
|
||||
CHANGE_LOCALE: null,
|
||||
CHANGE_LOCALE_FROM_HEADER: null
|
||||
CHANGE_LOCALE_FROM_HEADER: null,
|
||||
/**
|
||||
* only dispatched when you actually
|
||||
* solve the level, not ask for solution
|
||||
* or solve it again.
|
||||
*/
|
||||
SOLVE_LEVEL: null
|
||||
}),
|
||||
|
||||
PayloadSources: keyMirror({
|
||||
|
|
|
@ -443,7 +443,7 @@ exports.dialog = {
|
|||
markdowns: [
|
||||
'## Partager, c\'est se soucier!',
|
||||
'',
|
||||
'Partagez des arbres avec vous amis via `export tree` et `import tree`',
|
||||
'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`',
|
||||
'',
|
||||
|
|
|
@ -36,7 +36,7 @@ exports.strings = {
|
|||
'zh_TW': '太強了,您的答案符合我們的預期甚至更好!',
|
||||
'es_AR': '¡Fabuloso! Igualaste o superaste nuestra solución.',
|
||||
'fr_FR': 'Fabuleux ! Votre solution a égalé ou surpassé notre solution.',
|
||||
'ru_RU': 'Отлично! Ваше решение соответсвует или превосходит наше.'
|
||||
'ru_RU': 'Отлично! Ваше решение соответствует или превосходит наше.'
|
||||
},
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
'finish-dialog-lose': {
|
||||
|
@ -917,6 +917,12 @@ exports.strings = {
|
|||
'ru_RU': 'Спрятать цель'
|
||||
},
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
'objective-button': {
|
||||
'__desc__': 'button label to show objective',
|
||||
'en_US': 'Objective',
|
||||
'ru_RU': 'Задача'
|
||||
},
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
'goal-to-reach': {
|
||||
'__desc__': 'title of window that shoes the goal tree to reach',
|
||||
'en_US': 'Goal To Reach',
|
||||
|
@ -940,7 +946,7 @@ exports.strings = {
|
|||
'zh_CN': '<span class="fwber">注意:</span>本关卡中,只检查 master 分支,其他分支只是用作 reference 存在(以虚线标签表示)。照常,你可以用 “hide goal” 来隐藏此窗口。',
|
||||
'zh_TW': '在這個關卡中,只有 master branch 會被檢查,別的 branch 只是用來做為 reference (下面用虛線符號表示)。一如往常,你可以利用 "hide goal" 來隱藏這個對話視窗',
|
||||
'ja': '<span class="fwber">Note:</span> masterブランチだけをこのlevelではチェックします。その他のブランチ(以下では、破線で示されています)に関しては、参照のためにあります。また、いつでもこのウィンドウは"hide goal"と打つかクリックで閉じれます',
|
||||
'ru_RU': '<span class="fwber">Важно:</span> В этом уровне провреяется только ветка master. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"'
|
||||
'ru_RU': '<span class="fwber">Важно:</span> В этом уровне проверяется только ветка master. Остальные ветки просто для наглядности. Как обычно, можно скрыть это сообщение при помощи "hide goal"'
|
||||
},
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
'hide-goal': {
|
||||
|
|
|
@ -10,6 +10,7 @@ var React = require('react');
|
|||
var Errors = require('../util/errors');
|
||||
var Sandbox = require('../sandbox/').Sandbox;
|
||||
var GlobalStateActions = require('../actions/GlobalStateActions');
|
||||
var GlobalStateStore = require('../stores/GlobalStateStore');
|
||||
var LevelActions = require('../actions/LevelActions');
|
||||
var LevelStore = require('../stores/LevelStore');
|
||||
var Visualization = require('../visuals/visualization').Visualization;
|
||||
|
@ -446,6 +447,32 @@ var Level = Sandbox.extend({
|
|||
this.wasResetAfterSolved;
|
||||
var skipFinishAnimation = this.wasResetAfterSolved;
|
||||
|
||||
if (!skipFinishAnimation) {
|
||||
GlobalStateActions.levelSolved();
|
||||
}
|
||||
|
||||
/**
|
||||
* Speed up the animation each time we see it.
|
||||
*/
|
||||
var speed = 1.0;
|
||||
switch (GlobalStateStore.getNumLevelsSolved()) {
|
||||
case 2:
|
||||
speed = 1.5;
|
||||
break;
|
||||
case 3:
|
||||
speed = 1.8;
|
||||
break;
|
||||
case 4:
|
||||
speed = 2.1;
|
||||
break;
|
||||
case 5:
|
||||
speed = 2.4;
|
||||
break;
|
||||
}
|
||||
if (GlobalStateStore.getNumLevelsSolved() > 5) {
|
||||
speed = 2.5;
|
||||
}
|
||||
|
||||
var finishAnimationChain = null;
|
||||
if (skipFinishAnimation) {
|
||||
var deferred = Q.defer();
|
||||
|
@ -457,10 +484,10 @@ var Level = Sandbox.extend({
|
|||
);
|
||||
} else {
|
||||
GlobalStateActions.changeIsAnimating(true);
|
||||
finishAnimationChain = this.mainVis.gitVisuals.finishAnimation();
|
||||
finishAnimationChain = this.mainVis.gitVisuals.finishAnimation(speed);
|
||||
if (this.mainVis.originVis) {
|
||||
finishAnimationChain = finishAnimationChain.then(
|
||||
this.mainVis.originVis.gitVisuals.finishAnimation()
|
||||
this.mainVis.originVis.gitVisuals.finishAnimation(speed)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ var LevelToolbarView = React.createClass({
|
|||
<button
|
||||
onClick={this.props.onObjectiveClick}
|
||||
type="button">
|
||||
Objective
|
||||
{intl.str('objective-button')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -10,6 +10,7 @@ var ActionTypes = AppConstants.ActionTypes;
|
|||
|
||||
var _isAnimating = false;
|
||||
var _flipTreeY = false;
|
||||
var _numLevelsSolved = 0;
|
||||
|
||||
var GlobalStateStore = assign(
|
||||
{},
|
||||
|
@ -24,6 +25,10 @@ AppConstants.StoreSubscribePrototype,
|
|||
return _flipTreeY;
|
||||
},
|
||||
|
||||
getNumLevelsSolved: function() {
|
||||
return _numLevelsSolved;
|
||||
},
|
||||
|
||||
dispatchToken: AppDispatcher.register(function(payload) {
|
||||
var action = payload.action;
|
||||
var shouldInform = false;
|
||||
|
@ -37,6 +42,10 @@ AppConstants.StoreSubscribePrototype,
|
|||
_flipTreeY = action.flipTreeY;
|
||||
shouldInform = true;
|
||||
break;
|
||||
case ActionTypes.LEVEL_SOLVED:
|
||||
_numLevelsSolved++;
|
||||
shouldInform = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (shouldInform) {
|
||||
|
|
|
@ -9,6 +9,8 @@ var toGlobalize = {
|
|||
LevelActions: require('../actions/LevelActions'),
|
||||
LevelStore: require('../stores/LevelStore'),
|
||||
LocaleActions: require('../actions/LocaleActions'),
|
||||
GlobalStateActions: require('../actions/GlobalStateActions'),
|
||||
GlobalStateStore: require('../stores/GlobalStateStore'),
|
||||
LocaleStore: require('../stores/LocaleStore'),
|
||||
Levels: require('../graph/treeCompare'),
|
||||
Constants: require('../util/constants'),
|
||||
|
|
|
@ -208,7 +208,12 @@ GitVisuals.prototype.animateAllAttrKeys = function(keys, attr, speed, easing) {
|
|||
return deferred.promise;
|
||||
};
|
||||
|
||||
GitVisuals.prototype.finishAnimation = function() {
|
||||
GitVisuals.prototype.finishAnimation = function(speed) {
|
||||
speed = speed || 1.0;
|
||||
if (!speed) {
|
||||
throw new Error('need speed by time i finish animation' + speed);
|
||||
}
|
||||
|
||||
var _this = this;
|
||||
var deferred = Q.defer();
|
||||
var animationDone = Q.defer();
|
||||
|
@ -247,7 +252,7 @@ GitVisuals.prototype.finishAnimation = function() {
|
|||
return this.animateAllAttrKeys(
|
||||
{ exclude: ['circle'] },
|
||||
{ opacity: 0 },
|
||||
defaultTime * 1.1
|
||||
defaultTime * 1.1 / speed
|
||||
);
|
||||
}.bind(this))
|
||||
// then make circle radii bigger
|
||||
|
@ -255,7 +260,7 @@ GitVisuals.prototype.finishAnimation = function() {
|
|||
return this.animateAllAttrKeys(
|
||||
{ exclude: ['arrow', 'rect', 'path', 'text'] },
|
||||
{ r: nodeRadius * 2 },
|
||||
defaultTime * 1.5
|
||||
defaultTime * 1.5 / speed
|
||||
);
|
||||
}.bind(this))
|
||||
// then shrink em super fast
|
||||
|
@ -263,16 +268,16 @@ GitVisuals.prototype.finishAnimation = function() {
|
|||
return this.animateAllAttrKeys(
|
||||
{ exclude: ['arrow', 'rect', 'path', 'text'] },
|
||||
{ r: nodeRadius * 0.75 },
|
||||
defaultTime * 0.5
|
||||
defaultTime * 0.5 / speed
|
||||
);
|
||||
}.bind(this))
|
||||
// then explode them and display text
|
||||
.then(function() {
|
||||
makeText();
|
||||
return this.explodeNodes();
|
||||
return this.explodeNodes(speed);
|
||||
}.bind(this))
|
||||
.then(function() {
|
||||
return this.explodeNodes();
|
||||
return this.explodeNodes(speed);
|
||||
}.bind(this))
|
||||
// then fade circles (aka everything) in and back
|
||||
.then(function() {
|
||||
|
@ -305,11 +310,11 @@ GitVisuals.prototype.finishAnimation = function() {
|
|||
return animationDone.promise;
|
||||
};
|
||||
|
||||
GitVisuals.prototype.explodeNodes = function() {
|
||||
GitVisuals.prototype.explodeNodes = function(speed) {
|
||||
var deferred = Q.defer();
|
||||
var funcs = [];
|
||||
_.each(this.visNodeMap, function(visNode) {
|
||||
funcs.push(visNode.getExplodeStepFunc());
|
||||
funcs.push(visNode.getExplodeStepFunc(speed));
|
||||
});
|
||||
|
||||
var interval = setInterval(function() {
|
||||
|
|
|
@ -376,15 +376,18 @@ var VisNode = VisBase.extend({
|
|||
}, this);
|
||||
},
|
||||
|
||||
getExplodeStepFunc: function() {
|
||||
getExplodeStepFunc: function(speed) {
|
||||
if (!speed) {
|
||||
throw new Error('need speed by now');
|
||||
}
|
||||
var circle = this.get('circle');
|
||||
|
||||
// decide on a speed
|
||||
var speedMag = 20;
|
||||
var speedMag = 20 / speed;
|
||||
// aim upwards
|
||||
var angle = Math.PI + Math.random() * 1 * Math.PI;
|
||||
var gravity = 1 / 5;
|
||||
var drag = 1 / 100;
|
||||
var gravity = (1 / 5) * speed;
|
||||
var drag = (1 / 100) * speed;
|
||||
|
||||
var vx = speedMag * Math.cos(angle);
|
||||
var vy = speedMag * Math.sin(angle);
|
||||
|
@ -393,7 +396,7 @@ var VisNode = VisBase.extend({
|
|||
|
||||
var maxWidth = this.gitVisuals.paper.width;
|
||||
var maxHeight = this.gitVisuals.paper.height;
|
||||
var elasticity = 0.8;
|
||||
var elasticity = 0.8 / speed;
|
||||
var dt = 1.0;
|
||||
|
||||
var stepFunc = function() {
|
||||
|
@ -417,7 +420,7 @@ var VisNode = VisBase.extend({
|
|||
cy: y
|
||||
});
|
||||
// continuation calculation
|
||||
if ((vx * vx + vy * vy) < 0.01 && Math.abs(y - maxHeight) === 0) {
|
||||
if ((vx * vx + vy * vy) < 0.1 && Math.abs(y - maxHeight) <= 0.1) {
|
||||
// dont need to animate anymore, we are on ground
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -662,7 +662,7 @@ exports.level = {
|
|||
"(*На нашей визуализации первый родитель находится прямо над коммитом*)"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Просто -- прямо как мы любим."
|
||||
"Просто - прямо как мы любим."
|
||||
],
|
||||
"command": "git checkout master^",
|
||||
"beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
|
||||
|
@ -698,7 +698,7 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Более того, эти модификаторы можно применять вместе. Например так:"
|
||||
"Более того, эти модификаторы можно применять вместе. Например, так:"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Сделаем то же самое, что перед этим, только в одну команду."
|
||||
|
|
|
@ -113,7 +113,7 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
'pt_BR': 'Push & Pull -- repositórios remotos no Git!',
|
||||
'zh_CN': 'Push & Pull -- Git Remotes!',
|
||||
'zh_TW': 'Push & Pull -- Git Remotes!',
|
||||
'ru_RU': 'Push & Pull -- Git Remotes!'
|
||||
'ru_RU': 'Push & Pull - удалённые репозитории в Git!'
|
||||
},
|
||||
about: {
|
||||
'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social',
|
||||
|
@ -124,7 +124,7 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
'pt_BR': 'Hora de compartilhar seus 1\'s e 0\'s, crianças; programar agora é social!',
|
||||
'zh_CN': '是时候分享你的代码了',
|
||||
'zh_TW': '是時候分享你的程式碼了',
|
||||
'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования.'
|
||||
'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования'
|
||||
}
|
||||
},
|
||||
remoteAdvanced: {
|
||||
|
@ -138,7 +138,7 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
'pt_BR': 'Até a origin e além -- repositórios remotos avançados!',
|
||||
'zh_CN': '关于origin 和 其它仓库 -- Git Gemotes 高级命令',
|
||||
'zh_TW': '關於 origin 和其它 repo,git remote 的進階指令',
|
||||
'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes.'
|
||||
'ru_RU': 'Через origin – к звёздам. Продвинутое использование Git Remotes'
|
||||
},
|
||||
about: {
|
||||
'en_US': 'And you thought being a benevolent dictator would be fun...',
|
||||
|
|
|
@ -422,7 +422,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Branches Git",
|
||||
"",
|
||||
"Les branches sous Git sont incroyablement légères. Elles sont simplment des références sur un commit spécifique -- rien de plus. C'est pourquoi beaucoup d'enthousiastes répètent en cœur :",
|
||||
"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",
|
||||
|
@ -430,7 +430,7 @@ exports.level = {
|
|||
"",
|
||||
"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 banches 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.\""
|
||||
"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.\""
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
|
@ -429,9 +429,9 @@ exports.level = {
|
|||
"## Коммиты в GIT",
|
||||
"Коммит в git репозитории хранит снимок всех файлов в директории. Почти как огромная копия, только лучше",
|
||||
"",
|
||||
"Git пытается быть лёгким и быстрым насколько это только возможно, так что он не просто слепо копирует всю директорию какждый раз, а ужимает (когда это возможно) коммит в набор изменений или \"дельту\" между текущей версией и предыдущей.",
|
||||
"Git пытается быть лёгким и быстрым насколько это только возможно, так что он не просто слепо копирует всю директорию каждый раз, а ужимает (когда это возможно) коммит в набор изменений или \"дельту\" между текущей версией и предыдущей.",
|
||||
"",
|
||||
"Также Git хранит всю историю о том, когда какой коммит был сделан. Вот почему большинство коммитов имеют предков -- мы указываем на предков стрелками при визуализации. Поддержка истории коммитов более чем важна для всех, кто работает над проектом!",
|
||||
"Также Git хранит всю историю о том, когда какой коммит был сделан. Вот почему большинство коммитов имеют предков - мы указываем на предков стрелками при визуализации. Поддержка истории коммитов более чем важна для всех, кто работает над проектом!",
|
||||
"",
|
||||
"Можно ещё долго рассказывать о коммитах, но для простоты будем считать их полными снимками проекта. Коммиты очень легки, так что переключение между ними происходит предельно быстро!"
|
||||
]
|
||||
|
|
|
@ -660,7 +660,7 @@ exports.level = {
|
|||
"",
|
||||
"Ок! Теперь мы знаем как создавать ветки и коммитить наши изменения. Теперь надо понять как объединять изменения из двух разных веток. Очень удобно создать ветку, сделать свою часть работы в ней и потом объединить изменения из своей ветки с общими.",
|
||||
"",
|
||||
"Первый способ объединения изменений, который мы рассмотрим - это `git merge` - слияние или просто мердж. Слияния в Git создают особый вид коммита, который имеет сразу двух родителей. Коммит с двумя родителями обычно означает, что мы хотим объединить изменения из одного коммита, с другим коммитом и всеми их родителскими коммитами.",
|
||||
"Первый способ объединения изменений, который мы рассмотрим - это `git merge` - слияние или просто мердж. Слияния в Git создают особый вид коммита, который имеет сразу двух родителей. Коммит с двумя родителями обычно означает, что мы хотим объединить изменения из одного коммита, с другим коммитом и всеми их родительскими коммитами.",
|
||||
"",
|
||||
"Слишком запутанно =) На схеме всё проще и понятнее."
|
||||
]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
exports.level = {
|
||||
exports.level = {
|
||||
"goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C7\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"},\"C7\":{\"parents\":[\"C6\"],\"id\":\"C7\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
|
||||
"solutionCommand": "git commit ",
|
||||
"startTree": "{\"branches\":{\"master\":{\"target\":\"C2\",\"id\":\"master\",\"remoteTrackingBranchID\":null},\"side\":{\"target\":\"C4\",\"id\":\"side\",\"remoteTrackingBranchID\":null},\"bugFix\":{\"target\":\"C6\",\"id\":\"bugFix\",\"remoteTrackingBranchID\":null}},\"commits\":{\"C0\":{\"parents\":[],\"id\":\"C0\",\"rootCommit\":true},\"C1\":{\"parents\":[\"C0\"],\"id\":\"C1\"},\"C2\":{\"parents\":[\"C1\"],\"id\":\"C2\"},\"C3\":{\"parents\":[\"C1\"],\"id\":\"C3\"},\"C4\":{\"parents\":[\"C3\"],\"id\":\"C4\"},\"C5\":{\"parents\":[\"C3\"],\"id\":\"C5\"},\"C6\":{\"parents\":[\"C5\"],\"id\":\"C6\"}},\"tags\":{\"v0\":{\"target\":\"C0\",\"id\":\"v0\",\"type\":\"tag\"},\"v1\":{\"target\":\"C3\",\"id\":\"v1\",\"type\":\"tag\"}},\"HEAD\":{\"target\":\"bugFix\",\"id\":\"HEAD\"}}",
|
||||
|
@ -11,7 +11,8 @@ exports.level = {
|
|||
"pt_BR": "Git Describe",
|
||||
"zh_TW": "git describe",
|
||||
"zh_CN": "git describe",
|
||||
"ru_RU": "Git describe"
|
||||
"ru_RU": "Git describe",
|
||||
"ko" : "Git describe(묘사)"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Just commit once on bugFix when you're ready to move on",
|
||||
|
@ -22,7 +23,8 @@ exports.level = {
|
|||
"pt_BR": "Simplesmente commite uma vez em bugFix quando quiser parar de experimentar",
|
||||
"zh_TW": "當你要移動的時候,只要在 bugFix 上面 commit 就好了",
|
||||
"zh_CN": "当你要移动的时候,只要在 bugFix 上面 commit 就好了",
|
||||
"ru_RU": "Когда закончишь, просто сделай commit"
|
||||
"ru_RU": "Когда закончишь, просто сделай commit",
|
||||
"ko" : "다음으로 넘어가고 싶으면 bugFix를 한번 커밋하면 됩니다."
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -539,7 +541,7 @@ exports.level = {
|
|||
"",
|
||||
"Теги являются прекрасными ориентирами в истории изменений, поэтому в git есть команда, которая показывает как далеко текущее состоянии от ближайшего тега. И эта команда называется `git describe`",
|
||||
"",
|
||||
"Git describe помогает сориентироваться, после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали git bisect или если вы недавно вернулись из отпуска =)"
|
||||
"Git describe помогает сориентироваться после отката на много коммитов по истории изменений. Такое может случиться, когда вы сделали git bisect или если вы недавно вернулись из отпуска =)"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -547,7 +549,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Git describe выглядить примерно так:",
|
||||
"Git describe выглядит примерно так:",
|
||||
"",
|
||||
"`git describe <ref>`",
|
||||
"",
|
||||
|
@ -572,7 +574,6 @@ exports.level = {
|
|||
"",
|
||||
"`v1_2_gC2`",
|
||||
"",
|
||||
"Whereas `git describe side` would output:",
|
||||
"Тогда как `git describe side` выведет:",
|
||||
"",
|
||||
"`v2_1_gC4`"
|
||||
|
@ -592,6 +593,69 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ko": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"### Git Describe",
|
||||
"",
|
||||
"커밋 트리에서 태그가 훌륭한 \"닻\"역할을 하기 때문에, git에는 여러분이 가장 가까운 \"닻(태그)\"에 비해 상대적으로 어디에 위치해있는지 *describe(묘사)*해주는 명령어가 있습니다. 이 명령어는 `git describe` 입니다!",
|
||||
"",
|
||||
"Git describe는 커밋 히스토리에서 앞 뒤로 여러 커밋을 이동하고 나서 커밋 트리에서 방향감각을 다시 찾는데 도움을 줍니다; 이런 상황은 git bisect(문제가 되는 커밋을 찾는 명령어라고 간단히 생각하자)를 하고 나서라던가 휴가를 다녀온 동료의 컴퓨터에 앉는경우가 있습니다."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Git describe 는 다음의 형태를 가지고 있습니다:",
|
||||
"",
|
||||
"`git describe <ref>`",
|
||||
"",
|
||||
"`<ref>`에는 commit을 의미하는 그 어떤것이던 쓸 수 있습니다. 만약 ref를 특정 지어주지 않으면, git은 그냥 지금 체크아웃된곳을 사용합니다 (`HEAD`).",
|
||||
"",
|
||||
"명령어의 출력은 다음과 같은 형태로 나타납니다:",
|
||||
"",
|
||||
"`<tag>_<numCommits>_g<hash>`",
|
||||
"",
|
||||
"`tag`는 가장 가까운 부모 태그를 나타냅니다. `numCommits`은 그 태그가 몇 커밋 멀리있는지를 나타냅니다. `<hash>`는 묘사하고있는 커밋의 해시를 나타냅니다."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"간단한 예제를 확인해 봅시다. 아래의 트리에서:"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"`git describe master` 명령은 다음을 출력합니다:",
|
||||
"",
|
||||
"`v1_2_gC2`",
|
||||
"",
|
||||
"`git describe side`는 다음을 출력합니다:",
|
||||
"",
|
||||
"`v2_1_gC4`"
|
||||
],
|
||||
"command": "git tag v2 C3",
|
||||
"beforeCommand": "git commit; go -b side HEAD~1; gc; gc; git tag v1 C0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"이정도면 git describe를 충분히 활용할 수 있습니다! 이 레벨의 몇 지점을 describe 명령어를 통해 확인해보면서 느낌을 익혀 봅시다.",
|
||||
"",
|
||||
"준비가 되면 커밋을 한번해서 레벨을 종료하세요. 자유롭게 연습해보세요 :P"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -411,7 +411,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Надо заставить git копировать тольк один из коммитов. Это почти как в предыдущем уровне – мы можем использовать уже известные нам команды: ",
|
||||
"Надо заставить git копировать только один из коммитов. Это почти как в предыдущем уровне – мы можем использовать уже известные нам команды: ",
|
||||
"",
|
||||
"* `git rebase -i`",
|
||||
"* `git cherry-pick`",
|
||||
|
|
|
@ -375,7 +375,7 @@ exports.level = {
|
|||
"",
|
||||
"Этот уровень можно закончить несколькими способами, но в этом уровне нужно сосредоточиться на вышеописанном методе.",
|
||||
"",
|
||||
"Обрати внимание на итоговое состояние в этом уровне – так как мы дважды перемещаем коммиты, они каждый получать по апострофу. Ещё один апостроф добавляется, когда мы делаем commit --amend.",
|
||||
"Обрати внимание на итоговое состояние в этом уровне – так как мы дважды перемещаем коммиты, они каждый получат по апострофу. Ещё один апостроф добавляется, когда мы делаем commit --amend.",
|
||||
"",
|
||||
"Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."
|
||||
]
|
||||
|
|
|
@ -428,11 +428,11 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Жонглируем коммитами №2",
|
||||
"",
|
||||
"*Перед прохождением этого уровня обязательно надо пройти предыдущий уровен – 'Жонглиуем коммитами №1'*",
|
||||
"*Перед прохождением этого уровня обязательно надо пройти предыдущий уровен – 'Жонглируем коммитами №1'*",
|
||||
"",
|
||||
"В прошлом уровне мы использовали `rebase -i`, чтобы переставлять коммиты. Как только нужный нам коммит оказывался в конце, мы могли спокойно изменить его при помощи --ammend и переставить обратно.",
|
||||
"",
|
||||
"Единственная проблема тут - это множеств перестановок, которые могут спровоцировать конфликты. Посмотрим, как с этой же задачей справиться cherry-pick"
|
||||
"Единственная проблема тут - это множество перестановок, которые могут спровоцировать конфликты. Посмотрим, как с этой же задачей справится cherry-pick"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -440,7 +440,7 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Важно помнить, что cherry-pick поместить любой коммит сразу после HEAD (только, если этот коммит не является предком HEAD)",
|
||||
"Важно помнить, что cherry-pick поместит любой коммит сразу после HEAD (только, если этот коммит не является предком HEAD)",
|
||||
"",
|
||||
"Вот небольшое демо для напоминания:"
|
||||
],
|
||||
|
@ -455,7 +455,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Итек, в этом уровне нужно достичь того же эффекта, но без использования `rebase -i`. Остальное – по усмотрению.",
|
||||
"Итак, в этом уровне нужно достичь того же эффекта, но без использования `rebase -i`. Остальное – по усмотрению.",
|
||||
"",
|
||||
"Важно, чтобы совпадало не только дерево коммитов, но и количество апострофов."
|
||||
]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
exports.level = {
|
||||
exports.level = {
|
||||
"goalTreeString": "{\"branches\":{\"master\":{\"target\":\"C5\",\"id\":\"master\",\"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 master~2;git checkout v1",
|
||||
"startTree": "{\"branches\":{\"master\":{\"target\":\"C5\",\"id\":\"master\",\"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\":\"master\",\"id\":\"HEAD\"}}",
|
||||
|
@ -11,7 +11,8 @@ exports.level = {
|
|||
"fr_FR": "Git Tags",
|
||||
"zh_CN": "Git Tags",
|
||||
"zh_TW": "git tag",
|
||||
"ru_RU": "git tag"
|
||||
"ru_RU": "git tag",
|
||||
"ko" : "Git 태그"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "you can either check out the commit directly or simply checkout the tag!",
|
||||
|
@ -22,7 +23,8 @@ exports.level = {
|
|||
"pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!",
|
||||
"zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上",
|
||||
"zh_CN": "你可以直接 checkout 到 commit 上,或是简单的 checkout 到 tag 上",
|
||||
"ru_RU": "Можно сделать checkout напрямую на коммит или же на тег"
|
||||
"ru_RU": "Можно сделать checkout напрямую на коммит или же на тег",
|
||||
"ko" : "커밋을 직접 또는 태그를 이용해서 체크아웃할수 있습니다!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -449,7 +451,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Теги",
|
||||
"",
|
||||
"В прошлый уроках мы усвоили, что ветки просто двигать туда-сюда и они часто ссылаются на разные коммиты, как на изменения данных в ветке. Ветки просто изменить, они часто временны и постоянно меняют своё состояние.",
|
||||
"В прошлых уроках мы усвоили, что ветки просто двигать туда-сюда и они часто ссылаются на разные коммиты, как на изменения данных в ветке. Ветки просто изменить, они часто временны и постоянно меняют своё состояние.",
|
||||
"",
|
||||
"В таком случае, где взять *постоянную* ссылку на момент в истории изменений? Для таких вещей, как релиз, большие слияния нужно нечто более постоянное, чем ветка.",
|
||||
""
|
||||
|
@ -472,10 +474,10 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Создадим тег на `C1`, который бутед нашей версией 1"
|
||||
"Создадим тег на `C1`, который будет нашей версией 1"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Готово! Всё просто. Мы назвали тег `v1` и заставили его ссылкаться на `C1` явным образом. Если конкретный коммит не указан, гит пометит тегом `HEAD`"
|
||||
"Готово! Всё просто. Мы назвали тег `v1` и заставили его ссылаться на `C1` явным образом. Если конкретный коммит не указан, гит пометит тегом `HEAD`"
|
||||
],
|
||||
"command": "git tag v1 C1",
|
||||
"beforeCommand": "git commit"
|
||||
|
@ -485,13 +487,65 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Чтобы пройти этот уровень, просто создай теги как показано на визуализации и потом перейди на тег `v1`. Обрати внимание, что ты перейдёшь в состояние `detached HEAD`, так как нельзя сделать коммит прамо в тег v1.",
|
||||
"Чтобы пройти этот уровень, просто создай теги как показано на визуализации и потом перейди на тег `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` 태그에 직접 커밋을 할 수 없기 때문입니다.",
|
||||
"",
|
||||
"다음 레벨에서는 태그의 더 흥미로운 활용 방법을 확인해 볼 것입니다."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
exports.level = {
|
||||
exports.level = {
|
||||
"goalTreeString": "%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C7%27%22%2C%22id%22%3A%22master%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%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",
|
||||
"solutionCommand": "git cherry-pick C3 C4 C7",
|
||||
"compareOnlyMasterHashAgnostic": true,
|
||||
|
@ -15,7 +15,8 @@ exports.level = {
|
|||
"pt_BR": "Introdução ao cherry-pick",
|
||||
"zh_CN": "介绍 Cherry-pick",
|
||||
"zh_TW": "介紹 cherry-pick",
|
||||
"ru_RU": "Введение в Cherry-pick"
|
||||
"ru_RU": "Введение в Cherry-pick",
|
||||
"ko" : "Cherry-pick 소개"
|
||||
},
|
||||
"hint": {
|
||||
"fr_FR": "git cherry-pick suivis par les noms de commits",
|
||||
|
@ -26,7 +27,8 @@ exports.level = {
|
|||
"pt_BR": "git cherry-pick seguido dos nomes dos commits",
|
||||
"zh_CN": "git cherry-pick 后面跟着 commit 的名字",
|
||||
"zh_TW": "git cherry-pick 後面要接著 commit 的名稱",
|
||||
"ru_RU": "git cherry-pick основывается на именах коммитов!"
|
||||
"ru_RU": "git cherry-pick основывается на именах коммитов!",
|
||||
"ko" : "커밋의 이름들로 git cherry-pick 하세요!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -509,7 +511,7 @@ exports.level = {
|
|||
"",
|
||||
"* `git cherry-pick <Commit1> <Commit2> <...>`",
|
||||
"",
|
||||
"Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммтов на место, где сейчас находишься (`HEAD`). Мы обожаем `cherry-pick` за то, что в нём очень мало магии и его очень просто понять и применять.",
|
||||
"Это очень простой и прямолинейный способ сказать, что ты хочешь копировать несколько коммитов на место, где сейчас находишься (`HEAD`). Мы обожаем `cherry-pick` за то, что в нём очень мало магии и его очень просто понять и применять.",
|
||||
"",
|
||||
"Посмотрим на демонстрацию.",
|
||||
""
|
||||
|
@ -539,6 +541,63 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ko": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## 작업을 여기저기로 옮기기",
|
||||
"",
|
||||
"지금까지 우리는 git의 기초를 배웠습니다. -- 커밋을하고, 브랜치를 만들고, 소스 트리 여기저기를 돌아다녔습니다. 이런 개념들을 아는 것만으로도 git repository의 힘을 90%이상 사용하고 개발자들이 필요로하는 작업의 대부분을 할 수 있습니다.",
|
||||
"",
|
||||
"그 나머지 10% 기능이, 복잡한 작업(또는 작업중 막혔을때)중에 꽤 유용할 수 있습니다. 이제 배워 볼 다음 개념은 \"작업을 여기저로 올기기\" 다시 말해, 개발자들의 언어로 \"이 일은 여기에 저 일은 저기에 두고 싶어\" 정확하고 우아하고 유연하게.",
|
||||
"",
|
||||
"다소 과해 보일 수 있는데, 간단한 개념입니다."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Git 체리-픽 (Cherry-pick)",
|
||||
"",
|
||||
"이 시리즈의 첫 명령어는 `git cherry-pick` 입니다. 다음 과 같은 형태로 사용합니다:",
|
||||
"",
|
||||
"* `git cherry-pick <Commit1> <Commit2> <...>`",
|
||||
"",
|
||||
"현재 위치(`HEAD`) 아래에 있는 일련의 커밋들에대한 복사본을 만들겠다는 것을 간단히 줄인 말입니다. 개인적으로 저는 `cherry-pick`을 아주 좋아합니다 왜냐하면 조금의 마법이 첨가되있고 이해하기 쉽기 때문입니다.",
|
||||
"",
|
||||
"데모를 확인해봅시다",
|
||||
""
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"여기 repository가 있습니다. `master`와 master로 복사하고 싶은 작업이 있는 브랜치 `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 master; git commit;"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"이 레벨을 통과하기 위해서는 몇개의 작업을 세개의 브랜치들에서 master로 복사해와야합니다. 어떤 커밋들이 필요한지는 goal을 보고 확인하면 됩니다.",
|
||||
""
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -11,7 +11,8 @@ exports.level = {
|
|||
"zh_TW": "分離 HEAD",
|
||||
"de_DE": "Den Kopf abtrennen",
|
||||
"ja" : "HEADの分離",
|
||||
"ru_RU": "Теряем \"голову\" или detached HEAD"
|
||||
"ru_RU": "Теряем \"голову\" или detached HEAD",
|
||||
"ko" : "HEAD 분리하기"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Use the label (hash) on the commit for help!",
|
||||
|
@ -22,7 +23,8 @@ exports.level = {
|
|||
"fr_FR": "Utiiser le label (identifiant) du commit pour aider !",
|
||||
"zh_TW": "使用 commit 上的標籤(hash)來幫助你!",
|
||||
"zh_CN": "使用提交记录上的标签(hash)来求助!",
|
||||
"ru_RU": "Ориентируйся по идентификаторам (hash) коммитов."
|
||||
"ru_RU": "Ориентируйся по идентификаторам (hash) коммитов.",
|
||||
"ko" : "커밋에 있는 라벨(hash)을 활용하세요!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -718,6 +720,84 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"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가 `master`브랜치 아래에 숨어 있던 거군요."
|
||||
],
|
||||
"command": "git checkout C1; git checkout master; git commit; git checkout C2",
|
||||
"beforeCommand": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"### HEAD 분리하기",
|
||||
"",
|
||||
"HEAD를 분리한다는 것은 HEAD를 브랜치 대신 커밋에 붙이는 것을 의미합니다. 명령을 사용하기 전의 모습은 다음과 같습니다:",
|
||||
"",
|
||||
"HEAD -> master -> C1",
|
||||
""
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"이제는 이렇게 되는군요",
|
||||
"",
|
||||
"HEAD -> C1"
|
||||
],
|
||||
"command": "git checkout C1",
|
||||
"beforeCommand": ""
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"다음 레벨로 넘어가기 위해서는, HEAD를 `bugfix`에서 분리하고 그 커밋에 붙이세요.",
|
||||
"",
|
||||
"각 커밋은 그것의 해시값으로 특정지을수 있습니다. 각 커밋의 해시값은 각 커밋을 나타내는 원안에 나타나있습니다."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
exports.level = {
|
||||
exports.level = {
|
||||
"goalTreeString": "%7B%22branches%22%3A%7B%22master%22%3A%7B%22target%22%3A%22C4%27%22%2C%22id%22%3A%22master%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%22master%22%2C%22id%22%3A%22HEAD%22%7D%7D",
|
||||
"solutionCommand": "git rebase -i overHere --solution-ordering C3,C5,C4",
|
||||
"compareOnlyMasterHashAgnostic": true,
|
||||
|
@ -15,7 +15,8 @@ exports.level = {
|
|||
"zh_CN": "你可以使用 branch 或者是相对位置(HEAD~)來指定 rebase 的目标",
|
||||
"zh_TW": "你可以指定 branch 或者是相對位置(HEAD~)來表示 rebase 的目標",
|
||||
"ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase",
|
||||
"ja" : "リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます"
|
||||
"ja" : "リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます",
|
||||
"ko" : "리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다"
|
||||
},
|
||||
"name": {
|
||||
"en_US": "Interactive Rebase Intro",
|
||||
|
@ -26,7 +27,8 @@ exports.level = {
|
|||
"fr_FR": "Introduction à rebase",
|
||||
"zh_CN": "Rebase 交互命令介绍 ",
|
||||
"zh_TW": "介紹互動式的 rebase",
|
||||
"ru_RU": "Введение в интерактивный Rebase"
|
||||
"ru_RU": "Введение в интерактивный Rebase",
|
||||
"ko" : "인터랙티브 리베이스 소개"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -559,7 +561,7 @@ exports.level = {
|
|||
"",
|
||||
"Git cherry-pick прекрасен, когда точно известно, какие коммиты нужны (и известны их точные хеши)",
|
||||
"",
|
||||
"Но как быть в случае, когда точно не известно какие коммиты нужны? К счастью, Git позаботился о таких ситуациях! Можно использовать интерактивный rebase для этого -- лучший способ, чтобы отобрать набор коммитов для rebase.",
|
||||
"Но как быть в случае, когда точно не известно какие коммиты нужны? К счастью, Git позаботился о таких ситуациях! Можно использовать интерактивный rebase для этого - лучший способ, чтобы отобрать набор коммитов для rebase.",
|
||||
"",
|
||||
"Углубимся в детали."
|
||||
]
|
||||
|
@ -584,8 +586,8 @@ exports.level = {
|
|||
"После открытия окна интерактивного rebase, есть три варианта для каждого коммита:",
|
||||
"",
|
||||
"* Можно сменить положение коммита по порядку, просто переставив строчку с ним в редакторе (у нас в окошке строку с коммитом можно перенести просто мышкой).",
|
||||
"* Можно \"выкинуть\" коммит из ребейза. Для этого есть pick -- переключение его означает, что нужно выкинуть коммит.",
|
||||
"* Наконец, можно соединить коммиты. В этом уровне игры у нас не реализована эта возможность, но, если кратко -- при помощи этой функции можно объединять изменения двух коммитов.",
|
||||
"* Можно \"выкинуть\" коммит из ребейза. Для этого есть pick - переключение его означает, что нужно выкинуть коммит.",
|
||||
"* Наконец, можно соединить коммиты. В этом уровне игры у нас не реализована эта возможность, но, если кратко - при помощи этой функции можно объединять изменения двух коммитов.",
|
||||
"",
|
||||
"Ну что ж, посмотрим на примеры!"
|
||||
]
|
||||
|
@ -613,6 +615,71 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"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"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -11,7 +11,8 @@ exports.level = {
|
|||
"es_AR": "Referencias relativas (^)",
|
||||
"pt_BR": "Referências relativas (^)",
|
||||
"de_DE": "Relative Referenzen (^)",
|
||||
"ru_RU": "Относительные ссылки (^)"
|
||||
"ru_RU": "Относительные ссылки (^)",
|
||||
"ko" : "상대 참조 (^) (Relative Refs)"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Remember the Caret (^) operator!",
|
||||
|
@ -22,7 +23,8 @@ exports.level = {
|
|||
"pt_BR": "Não se esqueça do operador circunflexo (^)",
|
||||
"zh_CN": "记住插入(^)操作符!",
|
||||
"zh_TW": "不要忘記插入(^)符號!",
|
||||
"ru_RU": "Не забудь оператор `^`"
|
||||
"ru_RU": "Не забудь оператор `^`",
|
||||
"ko" : "(^)연산자를 기억하세요!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -633,7 +635,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Относительные ссылки",
|
||||
"",
|
||||
"Передвигаться по дереву Git при помощи указания хешей коммитов немного неудоно. В реальной ситуации у вас вряд ли будет красивая визуализация дерева в терминале, так что придётся каждый раз использовать `git log`, чтобы найти хеш нужного коммита",
|
||||
"Передвигаться по дереву Git при помощи указания хешей коммитов немного неудобно. В реальной ситуации у вас вряд ли будет красивая визуализация дерева в терминале, так что придётся каждый раз использовать `git log`, чтобы найти хеш нужного коммита",
|
||||
"",
|
||||
"Более того, хеши в реальном репозитории Git сильно более длинные. Например, хеш для коммита, который приведён в предыдущем уровне - `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Не очень просто для произношения =)",
|
||||
"",
|
||||
|
@ -647,7 +649,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"Как мы уже говорили, указание на коммит при помощи его хеша - не самый удобный способ, поэтому Git поддерживает относительные ссылки и они прекрасны!",
|
||||
"",
|
||||
"С относительными ссылками можно начать с какого-либо удобного места (например с ветки `bugFix` или от HEAD) и двигаться от него",
|
||||
"С относительными ссылками можно начать с какого-либо удобного места (например, с ветки `bugFix` или от HEAD) и двигаться от него",
|
||||
"",
|
||||
"Относительные ссылки - мощный инструмент, но мы покажем два простых способа использования:",
|
||||
"",
|
||||
|
@ -699,6 +701,81 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ko": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## 상대 참조",
|
||||
"",
|
||||
"Git에서 여기저기 이동할 때 커밋의 해시를 사용하는 방법은 조금 귀찮습니다. 실제로 Git을 사용할 때는 터미널화면 옆에 예쁘장하게 커밋트리가 보이진 않으니까요. 매번 해시를 확인하려고 `git log` 명령어를 치고 있을 겁니다.",
|
||||
"",
|
||||
"나아가서, 실제 Git에서는 해시들이 훨씬 더 깁니다. 예를 들어 이전 레벨에 소개했던 커밋의 해시는 `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`입니다. 쓰기 쉬워 보이진 않네요....",
|
||||
"",
|
||||
"다행히도, Git은 똑똑합니다. 해시가 커밋의 고유한 값임을 보여줄 수 있을 만큼만 명시해주면 됩니다. 위의 긴 문자열 대신 `fed2`만 입력해도 되는 겁니다."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"말했듯이, 커밋들을 해시로 구분하고 사용하는것이 아주 편하다고 볼 수는 없습니다. Git의 상대 참조(Relative Ref)가 여기서 등장합니다. 굉장한 기능입니다.",
|
||||
"",
|
||||
"상대 참조로 우리가 기억할 만한 지점(브랜치 `bugFix`라던가 `HEAD`라던가)에서 출발해서 이동하여 다른 지점에 도달해 작업을 할 수 있습니다.",
|
||||
"",
|
||||
"상대 커밋은 강력한 기능인데, 여기서 두가지 간단한 방법을 소개하겠습니다.",
|
||||
"",
|
||||
"* 한번에 한 커밋 위로 움직이는 `^`",
|
||||
"* 한번에 여러 커밋 위로 올라가는 `~<num>`"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"먼저 캐럿 (^) 연산자 부터 알아보겠습니다. 참조 이름에 하나씩 추가할 때마다, 명시한 커밋의 부모를 찾게 됩니다.",
|
||||
"",
|
||||
"`master^`는 \"`master`의 부모\"와 같은 의미 입니다.",
|
||||
"",
|
||||
"`master^^` 는 \"`master`의 조부모(부모의 부모)\"를 의미합니다",
|
||||
"",
|
||||
"master 위에 있는 부모를 체크아웃 해 봅시다."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Boom! 됬습니다. 커밋의 해시를 입력하는 것보다 훨씬 쉬운 방법입니다."
|
||||
],
|
||||
"command": "git checkout master^",
|
||||
"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`가 분리 될 것입니다.",
|
||||
"",
|
||||
"해시를 이용해서도 할 수 있지만, 상대 참조를 활용하는 것을 연습해 보세요!"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -11,7 +11,8 @@ exports.level = {
|
|||
"pt_BR": "Você precisará usar pelo menos uma referência direta (hash) para completar este nível",
|
||||
"de_DE": "Du musst mindestens einen Hash benutzen, um dieses Level zu schaffen",
|
||||
"ja" : "このレベルをクリアするには少なくとも一つの直接リファレンス(hash)を使用する必要があります",
|
||||
"ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень"
|
||||
"ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень",
|
||||
"ko" : "이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다."
|
||||
},
|
||||
"name": {
|
||||
"en_US": "Relative Refs #2 (~)",
|
||||
|
@ -22,7 +23,8 @@ exports.level = {
|
|||
"fr_FR": "Références relatives #2 (~)",
|
||||
"zh_CN": "相对引用2(~)",
|
||||
"zh_TW": "相對引用二(~)",
|
||||
"ru_RU": 'Относительные ссылки №2'
|
||||
"ru_RU": 'Относительные ссылки №2',
|
||||
"ko" : "상대 참조 #2 (~)"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -614,6 +616,74 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"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 master HEAD~3`",
|
||||
"",
|
||||
"(강제로) master 브랜치를 HEAD에서 세번 뒤로 옮겼습니다. (three parents behind HEAD)."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"방금의 커맨드를 직접 확인해 봅시다."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"됬네요! 우리는 상대 참조를 통해 `C1`을 간결한 방법으로 참조할 수 있었고 브랜치 강제(`-f`)를 통해 브랜치를 저 위치로 빠르게 옮길 수 있었습니다." ],
|
||||
"command": "git branch -f master HEAD~3",
|
||||
"beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"자 이제 상대 참조와 브랜치 강제의 조합을 봤으니 다음 레벨을 해결해 봅시다.",
|
||||
"",
|
||||
"이 레벨을 통과하기 위해서, `HEAD`와 `master`와 `bugFix`를 제시되는 골지점으로 옮겨 주십시오."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -652,7 +652,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"Чтобы пройти этот уровень, отмени два последних коммита и в `local` и в `pushed`",
|
||||
"",
|
||||
"Помни, что `pushed` - это remote ветка, а `local` - это локальная ветка -- это поможет выбрать способ отмены изменений."
|
||||
"Помни, что `pushed` - это remote ветка, а `local` - это локальная ветка - это поможет выбрать способ отмены изменений."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -223,7 +223,7 @@ exports.level = {
|
|||
"",
|
||||
"У нас тут по несколько коммитов в ветках `one`, `two` и `three`. Не важно почему, но нам надо видоизменить эти три ветки при помощи более поздних коммитов из ветки `master`.",
|
||||
"",
|
||||
"Ветка `one` нуждается в изменении порядка и удалении `C5`. `two` тредует полного перемешивания, а `three` хочет получить только один коммит",
|
||||
"Ветка `one` нуждается в изменении порядка и удалении `C5`. `two` требует полного перемешивания, а `three` хочет получить только один коммит",
|
||||
"",
|
||||
"Как пройти этот уровень – решать тебе, а как найдёшь решение – сравни его с нашим при помощи `show solution`."
|
||||
]
|
||||
|
|
|
@ -487,15 +487,15 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Удалённые репозитории в Git",
|
||||
"",
|
||||
"На самом деле Remote удалённые репозитории в Git не так сложны, как кажутся на первый взгляд. Кажется, что в современно мире облачных вычислений под термином удалённых репозиторий подразумевается что-то сложное и загадочное. Однако, удалённые репозитории всего-навсего копии вашего репозитория, хранящиеся на другом компьютере. Обычно вы можете связываться с этим другим компьютеров через Интернет, что позволяет вам передавать коммиты туда и сюда.",
|
||||
"На самом деле удалённые репозитории в Git не так сложны, как кажутся на первый взгляд. Кажется, что в современном мире облачных вычислений под термином удалённый репозиторий подразумевается что-то сложное и загадочное. Однако, удалённые репозитории всего-навсего копии вашего репозитория, хранящиеся на другом компьютере. Обычно вы можете связываться с этим другим компьютером через Интернет, что позволяет вам передавать коммиты туда и сюда.",
|
||||
"",
|
||||
"Как уже было сказано, удалённые репозитории обладают рядом замечательных свойств:",
|
||||
"",
|
||||
"- В первую очередь, удалённые репозитории это замечательное средство резервного копирования! На сколько Вам известно локальные репозитории способны восстанавливать файлы, использую предыдущие состояния, но вся эта информация хранится локально. Потеряв все свои локальные данные, вы способны восстановить их при наличии копии своего репозитория на другом компьютере.",
|
||||
"- В первую очередь, удалённые репозитории - это замечательное средство резервного копирования! На сколько Вам известно локальные репозитории способны восстанавливать файлы, используя предыдущие состояния, но вся эта информация хранится локально. Потеряв все свои локальные данные, вы способны восстановить их при наличии копии своего репозитория на другом компьютере.",
|
||||
"",
|
||||
"- Что ещё более важно, удалённые репозитории позволяют сделать процесс разработки более социальным! Теперь, когда копия вашего проекта размещена в другом месте, Ваши друзья запросто могут внести свой вклад в Ваш проект или забрать последние и актуальные изменения.",
|
||||
"",
|
||||
"Набирает популярность использование web сайтов для визуализации активности удалённых репозиторий (например [Github](https://github.com/) или [Phabricator](http://phabricator.org/)), однако удалённые репозитории _всегда_ выступают в качестве базы для таких инструментов. Поэтому так важно понимать как устроены удалённые репозитории!"
|
||||
"Набирает популярность использование web сайтов для визуализации активности удалённых репозиториев (например, [GitHub](https://github.com/) или [Phabricator](http://phabricator.org/)), однако удалённые репозитории _всегда_ выступают в качестве базы для таких инструментов. Поэтому так важно понимать как устроены удалённые репозитории!"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -505,9 +505,9 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Наша команда для создания удалённого репозитория",
|
||||
"",
|
||||
"До настоящего момента мы были сфокусированы на изучении основ работы с _локальным_ репозиторием (ветвление, слияние, перемещение и тд.). Однако, теперь, когда мы хотим научиться работать с удалёнными репозиториями, нам нужны новые команды для настройки рабочей среды для этих упражнений. В качестве такой команды нам послужит `git clone`",
|
||||
"До настоящего момента мы были сфокусированы на изучении основ работы с _локальным_ репозиторием (ветвление, слияние, перемещение и т.д.). Однако, теперь, когда мы хотим научиться работать с удалёнными репозиториями, нам нужны новые команды для настройки рабочей среды для этих упражнений. В качестве такой команды нам послужит `git clone`",
|
||||
"",
|
||||
"Технически, `git clone` в реальной жизни - это команда, которая создаст _локальную_ копию удалённого репозитория (например, с github). На наших занятиях в Learn Git Branching мы используем эту команду немного иначе -- `git clone` создаёт удалённый репозиторий на основе Вашего локального репозитория. Это на самом деле является полной противоположностью реальной команды, однако, такой подход поможет нам наладить связь между склонированным и удалённым репозиторием. Давайте просто запустим эту команду.",
|
||||
"Технически, `git clone` в реальной жизни - это команда, которая создаст _локальную_ копию удалённого репозитория (например, с GitHub). На наших занятиях в Learn Git Branching мы используем эту команду немного иначе - `git clone` создаёт удалённый репозиторий на основе Вашего локального репозитория. Это на самом деле является полной противоположностью реальной команды, однако, такой подход поможет нам наладить связь между склонированным и удалённым репозиторием. Давайте просто запустим эту команду.",
|
||||
""
|
||||
]
|
||||
}
|
||||
|
@ -516,11 +516,11 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Давайте начнём постепенное изучение и взглянем на то, что собой представляет удалённый репозиторий (в нащем представлении).",
|
||||
"Давайте начнём постепенное изучение и взглянем на то, что собой представляет удалённый репозиторий (в нашем представлении).",
|
||||
""
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Вот так! Теперь у нас есть удалённый репозиторий нашего проекта. Выглядит всё довольно одинаковым за исключением некоторых визуальных различий -- в последующих уровнях Вы увидите как мы разделяем работу по этим репозиториям."
|
||||
"Вот так! Теперь у нас есть удалённый репозиторий нашего проекта. Выглядит всё довольно одинаковым за исключением некоторых визуальных различий - в последующих уровнях Вы увидите как мы разделяем работу по этим репозиториям."
|
||||
],
|
||||
"command": "git clone",
|
||||
"beforeCommand": ""
|
||||
|
|
|
@ -22,7 +22,7 @@ exports.level = {
|
|||
"pt_BR": "Lembre-se que você pode especificar quantos commits quer simular",
|
||||
"zh_CN": "记住为fake中的commit指定数量",
|
||||
"zh_TW": "你要記得指定要送多少個 commit 出去",
|
||||
"ru_RU": "помните, Вы можете указать колличество фейковых коммитов"
|
||||
"ru_RU": "помните, Вы можете указать количество фейковых коммитов"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -409,13 +409,13 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Simulating collaboration",
|
||||
"## Симуляция совместной работы",
|
||||
"",
|
||||
"В данном уроке мы находимся в немного затруднительном положении -- для выполнения ряда упражнений нам нужно обучить Вас как скачивать наработки и изменения, которые были сделаны в удалённом репозитории.",
|
||||
"В данном уроке мы находимся в немного затруднительном положении - для выполнения ряда упражнений нам нужно обучить Вас как скачивать наработки и изменения, которые были сделаны в удалённом репозитории.",
|
||||
"",
|
||||
"Это означает, что нам следует \"сделать вид\", как будто мы знаем о том, что наш удалённый репозиторий, с которым мы работаем, был изменён наработками, сделанными одним из Ваших коллег / друзей / единомышленников. Это может быть какая-то ветка либо же какой-то конкретный коммит.",
|
||||
"Это означает, что нам следует \"сделать вид\", как будто мы знаем о том, что наш удалённый репозиторий, с которым мы работаем, был изменён наработками, сделанными одним из Ваших коллег / друзей / единомышленников. Это может быть какая-то ветка, либо же какой-то конкретный коммит.",
|
||||
"",
|
||||
"Для того, чтобы добится своих целей, нам предоставляется комманда со звучным именем `git fakeTeamwork`! Имя комманды однозначно даёт понят что она выполняет. Давайте ознакомимся с демо..."
|
||||
"Для того, чтобы добиться своих целей, нам предоставляется команда со звучным именем `git fakeTeamwork`! Имя команды однозначно даёт понять что она выполняет. Давайте ознакомимся с демо..."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -423,10 +423,10 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Поведение комманды `fakeTeamwork` по-умолчанию заключаентся в том, чтобы просто \"инициировать\" коммит на master-е"
|
||||
"Поведение команды `fakeTeamwork` по умолчанию заключается в том, чтобы просто \"инициировать\" коммит на master-е"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Ну вот -- удалённый репозиторый был изменён при помощи добавления нового коммита, и мы не ещё не скачали этот коммит, потому что не запустили комманду `git fetch`."
|
||||
"Ну вот - удалённый репозиторый был изменён при помощи добавления нового коммита, и мы ещё не скачали этот коммит, потому что не запустили команду `git fetch`."
|
||||
],
|
||||
"command": "git fakeTeamwork",
|
||||
"beforeCommand": "git clone"
|
||||
|
@ -436,10 +436,10 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"В данной комманде Вам доступна возможность указать ветку и колличество добавляемых коммитов"
|
||||
"В данной команде Вам доступна возможность указать ветку и количество добавляемых коммитов"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"С помощью одной лишь комманды мы симулируем добавление трёх коммитов в ветку `foo` на удалённом репозитории"
|
||||
"С помощью одной лишь команды мы симулируем добавление трёх коммитов в ветку `foo` на удалённом репозитории"
|
||||
],
|
||||
"command": "git fakeTeamwork foo 3",
|
||||
"beforeCommand": "git branch foo; git clone"
|
||||
|
|
|
@ -615,11 +615,11 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Git Fetch",
|
||||
"",
|
||||
"Работа с удалёнными git репозиториями сводится к передаче данных _в_ и _из_ других репозиториев. До тех пор, пока мы может отправлять коммиты туда-обратно, мы можем делиться любыми изменениями, которые отслеживает git (следовательно, делиться новыми файлами, свежими идеями, любовными письмами и тд.).",
|
||||
"Работа с удалёнными git репозиториями сводится к передаче данных _в_ и _из_ других репозиториев. До тех пор, пока мы можем отправлять коммиты туда-обратно, мы можем делиться любыми изменениями, которые отслеживает git (следовательно, делиться новыми файлами, свежими идеями, любовными письмами и т.д.).",
|
||||
"",
|
||||
"В этом уроке Вы научитесь тому, как извлекать данные _из_ удалённого репозитория -- и для этого у нас есть соответсвтующая команда `git fetch`.",
|
||||
"В этом уроке Вы научитесь тому, как извлекать данные _из_ удалённого репозитория - и для этого у нас есть соответствующая команда `git fetch`.",
|
||||
"",
|
||||
"Вы увидете, что как только мы изменим представление нашего удалённого репозитория, наши _удалённые_ ветки обновятся соответствующим образом и отобразят это представление. Это связывает воедино предыдущий урок про удалённые репозитории"
|
||||
"Вы увидите, что как только мы изменим представление нашего удалённого репозитория, наши _удалённые_ ветки обновятся соответствующим образом и отобразят это представление. Это связывает воедино предыдущий урок про удалённые репозитории."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -645,13 +645,13 @@ exports.level = {
|
|||
"`git fetch` выполняет две и только две основные операции. А именно:",
|
||||
"",
|
||||
"* связывается с указанным удалённым репозиторием и забирает все те данные проекта, которых у вас ещё нет, при этом...",
|
||||
"* у вас должны появиться ссылки на все ветки из этого удалённого репозиториея (например, `o/master`)",
|
||||
"* у вас должны появиться ссылки на все ветки из этого удалённого репозитория (например, `o/master`)",
|
||||
"",
|
||||
"Фактически `git fetch` синхранизирует _локальное_ представление удалённых репозиториев с тем, что является _актуальным_ на текущий момент времени.",
|
||||
"Фактически `git fetch` синхронизирует _локальное_ представление удалённых репозиториев с тем, что является _актуальным_ на текущий момент времени.",
|
||||
"",
|
||||
"На сколько Вы помните, в предыдущем уроке мы сказали о том, что удалённые ветки отображают состояние удалённых репозиториев _на тот момент_ когда вы 'общались' с ними в последний раз. `git fetch` является тем механизмом, который даёт Вам возможность общатся с удалёнными репозиториями! Надеюсь, что связь между удалёнными ветками и коммандой `git fetch` теперь прояснилась.",
|
||||
"Насколько Вы помните, в предыдущем уроке мы сказали о том, что удалённые ветки отображают состояние удалённых репозиториев _на тот момент_ когда вы 'общались' с ними в последний раз. `git fetch` является тем механизмом, который даёт Вам возможность общаться с удалёнными репозиториями! Надеюсь, что связь между удалёнными ветками и командой `git fetch` теперь прояснилась.",
|
||||
"",
|
||||
"`git fetch` обычно 'общается' с удалёнными репозиториями по средствам Интернета (через такие протоколы как `http://` или `git://`).",
|
||||
"`git fetch` обычно 'общается' с удалёнными репозиториями посредством Интернета (через такие протоколы, как `http://` или `git://`).",
|
||||
""
|
||||
]
|
||||
}
|
||||
|
@ -664,9 +664,9 @@ exports.level = {
|
|||
"",
|
||||
"Важно отметить, что команда `git fetch` забирает данные в ваш _локальный_ репозиторий, но не сливает их с какими-либо вашими наработками и не модифицирует то, над чем вы работаете в данный момент.",
|
||||
"",
|
||||
"Важно это помнить и понимать, потому что многие разработчики думают, что, запустив комманду `git fetch`, они приведут всю свою локальную работу к такому же виду как и на удалённом репозитории. Комманда всего-лишь скачивает все необходимые данные, но Вам необходимо вручную слить эти данные с вашими, когда вы будете готовы. В следующих уроках мы научимся это делать :D",
|
||||
"Важно это помнить и понимать, потому что многие разработчики думают, что, запустив команду `git fetch`, они приведут всю свою локальную работу к такому же виду как и на удалённом репозитории. Команда всего-лишь скачивает все необходимые данные, но Вам необходимо вручную слить эти данные с вашими, когда вы будете готовы. В следующих уроках мы научимся это делать :D",
|
||||
"",
|
||||
"Одним словом вы можете относится к `git fetch` как к процедуре скачивания."
|
||||
"Одним словом вы можете относиться к `git fetch` как к процедуре скачивания."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -674,7 +674,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Чтобы выполнить уровень просто запустите `git fetch` и скачайте все коммиты!"
|
||||
"Чтобы выполнить уровень, просто запустите `git fetch` и скачайте все коммиты!"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1034,9 +1034,9 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Когда наработки расходятся",
|
||||
"",
|
||||
"Вот мы и познакомились с тем, как забирать (`pull`) чужие коммиты и как закачивать (`push`) свои наработки и изменения. Выглядит всё довольно просто, и не ясно какие же могу возникать у людей трудности со всем этим ?",
|
||||
"Вот мы и познакомились с тем, как забирать (`pull`) чужие коммиты и как закачивать (`push`) свои наработки и изменения. Выглядит всё довольно просто, и не ясно какие же могут возникать у людей трудности со всем этим?",
|
||||
"",
|
||||
"Сложности возникают тогда, когда история репозитория *расходится*. Давайте посмотрим на пример прежде чем идти дальше...",
|
||||
"Сложности возникают тогда, когда история репозитория *расходится*. Прежде чем идти дальше, давайте посмотрим на пример...",
|
||||
""
|
||||
]
|
||||
}
|
||||
|
@ -1045,9 +1045,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Представьте себе, Вы склонировали репозиторий в понедельник и начали разрабатывать какую-то новую и уникальную часть приложения (на сленге разработчиков - `фича`). В пятницу вечером Вы наконец-то готовы опубликовать Вашу фичу. Но, о нет! Ваш коллега в течении недели написал кучу кода, который делает все Ваши наработки устарелыми. Этот код был также закоммичен и опубликован на общедоступном удалённом репозитории, поэтому теперь *Ваш* код базируется на *устаревшей* версии проект и более не уместен.",
|
||||
"Представьте себе, Вы склонировали репозиторий в понедельник и начали разрабатывать какую-то новую и уникальную часть приложения (на сленге разработчиков - `фича`). В пятницу вечером Вы наконец-то готовы опубликовать Вашу фичу. Но, о нет! Ваш коллега в течении недели написал кучу кода, который делает все Ваши наработки устарелыми. Этот код был также закоммичен и опубликован на общедоступном удалённом репозитории, поэтому теперь *Ваш* код базируется на *устаревшей* версии проекта и более не уместен.",
|
||||
"",
|
||||
"В этому случае использование комманды `git push` является сомнительным. Как поведёт себя комманда `git push` если Вы её выполните ? Может быть она изменит удалённый репозиторий и вернёт всё к тому состоянию, которое было в понедельник ? А может быть комманда попробует добавить Ваш код, не удаляя при этом новый? Или же она проигнорирует Ваши изменения, так как они уже устарели?",
|
||||
"В этом случае использование команды `git push` является сомнительным. Как поведёт себя команда `git push`, если Вы её выполните? Может быть она изменит удалённый репозиторий и вернёт всё к тому состоянию, которое было в понедельник? А может быть команда попробует добавить Ваш код, не удаляя при этом новый? Или же она проигнорирует Ваши изменения, так как они уже устарели?",
|
||||
"",
|
||||
"По причине того, что в данной ситуации (когда история расходится) слишком много двусмысленностей и неопределённостей, git не даст Вам закачать (`push`) Ваши изменения. Чтобы поделится и закачать свои наработки, git будет принуждать Вас включить в состав своей работы все те последние наработки и изменения, находящиеся на удалённом репозитории."
|
||||
]
|
||||
|
@ -1057,10 +1057,10 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Слишком много болтавни! Давайте посмотрим, как всё работает на живом примере"
|
||||
"Слишком много болтовни! Давайте посмотрим, как всё работает на живом примере"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Видите? Ничего не произошло. Всё потому, что комманда `git push` не выполнилась успешно. Дело в том, что Ваш последний коммит `C3` основан на удалённом коммите `C1`. В свою очередь удалённый репозиторий уже изменился под воздействием `C2`. Вот почему git отклонил Ваш push."
|
||||
"Видите? Ничего не произошло. Всё потому, что команда `git push` не выполнилась успешно. Дело в том, что Ваш последний коммит `C3` основан на удалённом коммите `C1`. В свою очередь удалённый репозиторий уже изменился под воздействием `C2`. Вот почему git отклонил Ваш push."
|
||||
],
|
||||
"command": "git push",
|
||||
"beforeCommand": "git clone; git fakeTeamwork; git commit"
|
||||
|
@ -1070,9 +1070,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Как же разрешит данную ситуацию? Всё очень просто! Всё что Вам нужно - перебазировать свою работу на наиболее последнюю версию удалённой ветки.",
|
||||
"Как же разрешить данную ситуацию? Всё очень просто! Всё что Вам нужно - перебазировать свою работу на наиболее последнюю версию удалённой ветки.",
|
||||
"",
|
||||
"Существует множество путей, как сделать это, но наиболее простой способ 'сдвинуть' свои наработки - через пребазировку или rebasing. Давайте посмотрим, как это выглядит."
|
||||
"Существует множество путей, как сделать это, но наиболее простой способ 'сдвинуть' свои наработки - через перебазировку или rebasing. Давайте посмотрим, как это выглядит."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -1093,9 +1093,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"А есть ещё какие-либо варианты чтобы обновить мои наработки, к тому моменту как удалённый репозиторий был обновлён? Конечно есть! Давайте ознакомимся с парочкой новых штучек, но в этот раз с помощью комманды `merge`.",
|
||||
"А есть ещё какие-либо варианты чтобы обновить мои наработки, к тому моменту как удалённый репозиторий был обновлён? Конечно есть! Давайте ознакомимся с парочкой новых штучек, но в этот раз с помощью команды `merge`.",
|
||||
"",
|
||||
"Не смотря на то, что `git merge` не передвигает ваши наработки (а всего лишь создаёт новый коммит, в котором Ваши и удалённые изменения объеденены), этот способ помогает указать git-у на то, что Вы собираетесь включить в состав Ваших наработок все изменения с удалённого репозитория. Это значит, что Ваш коммит отразится на всех коммитах удалённой ветки, поскольку удалённая ветка является *предком* Вашей собственной локальной ветки.",
|
||||
"Несмотря на то, что `git merge` не передвигает ваши наработки (а всего лишь создаёт новый коммит, в котором Ваши и удалённые изменения объединены), этот способ помогает указать git-у на то, что Вы собираетесь включить в состав Ваших наработок все изменения с удалённого репозитория. Это значит, что Ваш коммит отразится на всех коммитах удалённой ветки, поскольку удалённая ветка является *предком* Вашей собственной локальной ветки.",
|
||||
"",
|
||||
"Давайте взглянем на демонстрацию..."
|
||||
]
|
||||
|
@ -1105,7 +1105,7 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Таким образм если мы объеденим (merge) вместо перебазирования (rebase)..."
|
||||
"Таким образом, если мы объединим (merge) вместо перебазирования (rebase)..."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Опа! Мы обновили наше локальное представление удалённого репозитория с помощью `git fetch`, *объединили* Ваши новые наработки с нашими наработками (чтобы отразить изменения в удалённом репозитории), и затем опубликовали их с помощью `git push`"
|
||||
|
@ -1118,9 +1118,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Здорово! А можно ли как-то зделать всё тоже самое, но с меньшим количеством комманд?",
|
||||
"Здорово! А можно ли как-то сделать всё тоже самое, но с меньшим количеством команд?",
|
||||
"",
|
||||
"Конечно -- ведь Вы уже знаете комманду `git pull`, которая является аналогом и более кратким аналогом для совместных fetch и merge. А команда `git pull --rebase` - аналог для совместно вызванных fetch и rebase!",
|
||||
"Конечно -- ведь Вы уже знаете команду `git pull`, которая является аналогом и более кратким аналогом для совместных fetch и merge. А команда `git pull --rebase` - аналог для совместно вызванных fetch и rebase!",
|
||||
"",
|
||||
"Давайте взглянем на эти оба варианта."
|
||||
]
|
||||
|
@ -1156,13 +1156,13 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Рабочий процесс получения изменений (fetching), перебазирования/объединения (rebase/merging) и публикации изменений (pushing) довольно часто используемый. В последующий уроках мы изучим более сложные варианты этих рабочих процессов, но пока что, давайте остановимся на том, что есть.",
|
||||
"Рабочий процесс получения изменений (fetching), перебазирования/объединения (rebase/merging) и публикации изменений (pushing) довольно часто используемый. В последующих уроках мы изучим более сложные варианты этих рабочих процессов, но пока что, давайте остановимся на том, что есть.",
|
||||
"",
|
||||
"Выполните следующее, чтобы выполнить задание уровня:",
|
||||
"",
|
||||
"* Склонируйте репозиторий",
|
||||
"* Сфабрикуйте командную работу (1 коммит)",
|
||||
"* Сделайте свой собственный коммит (1 commit)",
|
||||
"* Сделайте свой собственный коммит (1 коммит)",
|
||||
"* Опубликуйте свои наработки посредствам *перебазировки rebasing*"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -394,9 +394,9 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Merge? Нет, нет, спасибо.",
|
||||
"",
|
||||
"Чтобы закачать (push) новые изменения в удалённый репозиторий, всё что Вам нужно сделать - это *смешать* последние изменения из удалённого репозитория. Это значит что Вы можете выполнить rebase *или* merge на удалённом репозитории (например, `o/master`).",
|
||||
"Чтобы закачать (push) новые изменения в удалённый репозиторий, всё что Вам нужно сделать - это *смешать* последние изменения из удалённого репозитория. Это значит, что Вы можете выполнить rebase *или* merge на удалённом репозитории (например, `o/master`).",
|
||||
"",
|
||||
"Если мы можем воспользоваться одним из двух методов, то почему же эти упражнения сфокусированы в основном на rebase? К чему такая нелюбовь к `merge`, когда речь идёт о работе с удалённым репозиториями?",
|
||||
"Если мы можем воспользоваться одним из двух методов, то почему же эти упражнения сфокусированы в основном на rebase? К чему такая нелюбовь к `merge`, когда речь идёт о работе с удалёнными репозиториями?",
|
||||
""
|
||||
]
|
||||
}
|
||||
|
@ -415,9 +415,9 @@ exports.level = {
|
|||
"",
|
||||
"* Метод rebasing явно изменяет историю коммитов в дереве.",
|
||||
"",
|
||||
"Например, коммит `C1` может быть перебазирован *после* `C3`. Соответственно, в дереве работа над `C1'` будет отображатся как идущая после `C3`, хотя на самом деле она была выполнена раньше.",
|
||||
"Например, коммит `C1` может быть перебазирован *после* `C3`. Соответственно, в дереве работа над `C1'` будет отображаться как идущая после `C3`, хотя на самом деле она была выполнена раньше.",
|
||||
"",
|
||||
"Некоторые разработчики любят сохранять историю и, таким образом, предпочитают слияние (merging). Другие (такие как я) предпочитают иметь чистое дерево коммитов, и пользуются перебазировкой (rebasing). Всё зависит от Ваших предпочтений и вкусов :D"
|
||||
"Некоторые разработчики любят сохранять историю, и таким образом, предпочитают слияние (merging). Другие (такие как я) предпочитают иметь чистое дерево коммитов, и пользуются перебазировкой (rebasing). Всё зависит от Ваших предпочтений и вкусов :D"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -425,7 +425,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Для этого уровня, давайте решим предыдущие задачи но с помощью *слияния (merging)*. Может быть поулчится слегка неказисто, однако такое упражнение хорошо отразит суть различий."
|
||||
"Для этого уровня, давайте решим предыдущие задачи, но с помощью *слияния (merging)*. Может быть получится слегка неказисто, однако такое упражнение хорошо отразит суть различий."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -448,7 +448,7 @@ exports.level = {
|
|||
"",
|
||||
"Теперь, когда мы познакомились с тем, как извлекать данные из удалённого репозитория с помощью `git fetch`, давайте обновим нашу работу чтобы отобразить все эти изменения!",
|
||||
"",
|
||||
"Существует множество вариантов решений -- как только у вас имеется локальный коммит, Вы можете соединить его с другой веткой. Это значит Вы можете выполнить одну из комманд:",
|
||||
"Существует множество вариантов решений -- как только у вас имеется локальный коммит, Вы можете соединить его с другой веткой. Это значит Вы можете выполнить одну из команд:",
|
||||
"",
|
||||
"* `git cherry-pick o/master`",
|
||||
"* `git rebase o/master`",
|
||||
|
@ -489,9 +489,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Мы изучим детали комманды `git pull` чуть позже (включая опции и аргументы вызова команды), а пока что давайте просто попробуем эту комманду.",
|
||||
"Мы изучим детали команды `git pull` чуть позже (включая опции и аргументы вызова команды), а пока что давайте просто попробуем эту команду.",
|
||||
"",
|
||||
"Помните -- мы также можете выполнить этот уровень с помощью комманд `fetch` и `merge`, но нужно ли делать так, когда можно воспользоваться всего-лишь одной коммандой ? :P"
|
||||
"Помните -- Вы также можете выполнить этот уровень с помощью команд `fetch` и `merge`, но нужно ли делать так, когда можно воспользоваться всего лишь одной командой ? :P"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@ exports.level = {
|
|||
"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-ить вам нужно сколнировать репозиторий!"
|
||||
"ru_RU": "Помните, что прежде чем push-ить вам нужно склонировать репозиторий!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -328,13 +328,13 @@ exports.level = {
|
|||
"",
|
||||
"Хорошо, мы скачали изменения с удалённого репозитория и включили их в наши локальные наработки. Всё это замечательно, но, как нам поделиться _своими_ наработками и изменениями с другими участниками проекта?",
|
||||
"",
|
||||
"Способ, которым мы воспользуемся, является противоположным тому способу, которым мы пользовались ранее для скачивания наработок (`git pull`). Этот способ - использование комманды `git push`!",
|
||||
"Способ, которым мы воспользуемся, является противоположным тому способу, которым мы пользовались ранее для скачивания наработок (`git pull`). Этот способ - использование команды `git push`!",
|
||||
"",
|
||||
"Комманда `git push` отвечает за загрузку _Ваших_ изменений в указанный удалённый репозиторий, а также включение Ваших коммитов в состав удалённого репозитория. По окончанию работы комманды `git push` все Ваши друзья смогут скачать себе все сделанные Вами наработки.",
|
||||
"Команда `git push` отвечает за загрузку _Ваших_ изменений в указанный удалённый репозиторий, а также включение Ваших коммитов в состав удалённого репозитория. По окончанию работы команды `git push` все Ваши друзья смогут скачать себе все сделанные Вами наработки.",
|
||||
"",
|
||||
"Вы можете рассматривать комманду `git push` как \"публикацию\" своей работы. Эта комманда скрывает в себе множество тонкостей и ньюансов, с которыми мы познакомимся в ближайшее время, а пока что давайте начнём с малого...",
|
||||
"Вы можете рассматривать команду `git push` как \"публикацию\" своей работы. Эта команда скрывает в себе множество тонкостей и нюансов, с которыми мы познакомимся в ближайшее время, а пока что давайте начнём с малого...",
|
||||
"",
|
||||
"*замечание -- поведение комманды `git push` без аргументов варьируется в зависимости он значения `push.default`,указанной в настройках git-а. Значение по-умолчанию зависит от версии git, которую Вы используете, однако в наших уроках мы будем использовать значение `upstream`. Лучше всегда проверят эту опцию прежде чем push-ить Ваши настоящие проекты.*"
|
||||
"*замечание -- поведение команды `git push` без аргументов варьируется в зависимости от значения `push.default`, указанной в настройках git-а. Значение по умолчанию зависит от версии git, которую Вы используете, однако в наших уроках мы будем использовать значение `upstream`. Лучше всегда проверять эту опцию прежде чем push-ить Ваши настоящие проекты.*"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
|
@ -525,7 +525,7 @@ exports.level = {
|
|||
"",
|
||||
"Помните, когда в прошлом занятии мы указали в качестве аргумента ветку `master` для команды git push, мы указали совместно *источник* откуда будут приходить коммиты и *пункт назначения (получатель)*, куда коммиты будут уходить.",
|
||||
"",
|
||||
"Однако, Вы, наверное, задаётесь вопросом -- а что, если я хочу, чтобы мои источник и получатель коммитов были различными? Что если мы хотм запушить коммиты из локальной ветки `foo` в ветку `bar` на удалённом репозитории?",
|
||||
"Однако, Вы, наверное, задаётесь вопросом -- а что, если я хочу, чтобы мои источник и получатель коммитов были различными? Что если мы хотим запушить коммиты из локальной ветки `foo` в ветку `bar` на удалённом репозитории?",
|
||||
"",
|
||||
"К огромному сожалению, это невозможно сделать средствами git... Да ладно! Я пошутил! Конечно это возможно :)... git сам по себе достаточно гибок (даже слишком).",
|
||||
"",
|
||||
|
|
|
@ -11,7 +11,7 @@ exports.level = {
|
|||
"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"
|
||||
"ru_RU": "Помни - ты всегда можешь отменить команды с помощью undo или reset"
|
||||
},
|
||||
"name": {
|
||||
"en_US": "Push Master!",
|
||||
|
@ -405,7 +405,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Слияние фича-бранчей (веток)",
|
||||
"",
|
||||
"Теперь, когда Вы умело владеете коммандами fetch, pull и push давайте применим эти навыки в сочетании с новым рабочим процессом (он же workflow).",
|
||||
"Теперь, когда Вы умело владеете командами fetch, pull и push давайте применим эти навыки в сочетании с новым рабочим процессом (он же workflow).",
|
||||
"",
|
||||
"Для разработчиков, вовлечённых в большой проект, является довольно распространённым выполнять всю свою работу в так называемых фича-бранчах (вне `master`). А затем, как только работа выполнена, разработчик интегрирует всё что было им сделано. Всё это, за исключением одного шага, довольно похоже на предыдущий урок (там, где мы закачивали ветки на удалённый репозиторий)",
|
||||
"",
|
||||
|
@ -425,7 +425,7 @@ exports.level = {
|
|||
"Давайте быстренько вспомним, как нам обновить `master` и закачать выполненную работу."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Здесь мы выполнили две комманды, которые:",
|
||||
"Здесь мы выполнили две команды, которые:",
|
||||
"",
|
||||
"* перебазировали нашу работу на новенький коммит, пришедший с удалённого репозитория, и",
|
||||
"* закачали свои наработки в удалённый репозиторий"
|
||||
|
|
|
@ -541,7 +541,7 @@ exports.level = {
|
|||
"",
|
||||
"* `<удалённый репозиторий>/<имя ветки>`",
|
||||
"",
|
||||
"Следовательно, если Вы взгляние на имя ветки `o/master`, то здесь `master` - это имя ветки, а `o` - это имя удалённого репозитория.",
|
||||
"Следовательно, если Вы взглянете на имя ветки `o/master`, то здесь `master` - это имя ветки, а `o` - это имя удалённого репозитория.",
|
||||
"",
|
||||
"Большинство разработчиков именуют свои главные удалённые репозитории не как `o`, а как `origin`. Также общепринятым является именование удалённого репозитория как `origin`, когда Вы клонируете репозиторий командой `git clone`.",
|
||||
"",
|
||||
|
|
|
@ -866,15 +866,15 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Удалённые-отслеживаемые ветки",
|
||||
"",
|
||||
"Короче, связь между `master` и `o/master` объясняется не инчае как свойство \"удалённое отслеживание\" веток. Ветка `master` настроена так, чтобы следить за `o/master` -- это подразумевает наличие источника для merge и пункта назначения для, в контексте ветки `master`.",
|
||||
"Короче, связь между `master` и `o/master` объясняется не иначе как свойство \"удалённое отслеживание\" веток. Ветка `master` настроена так, чтобы следить за `o/master` -- это подразумевает наличие источника для merge и пункта назначения для, в контексте ветки `master`.",
|
||||
"",
|
||||
"Вы должно быть удивлены, как это отслеживание появилось на ветке `master`, если мы не запускали ни одной специфической команды. На самом деле, когда Вы клонируете репозиторий это слежение включается автоматически.",
|
||||
"",
|
||||
"В процессе клонирования, git локально создаёт удалённые ветки для каждой ветки с удалённого репозитория (такие как `o/master`). Затем он - git - создаёт локальные ветки, которые отслеживают текущую, активную ветку на удалённом репозитории. В большинстве случаев - это `master`.",
|
||||
"",
|
||||
"К тому моменту как git clone завершит своё выполнение, у Вас будет лишь одна локальная ветка (так что вы ешё не сильно перегружены), но, если Вам будет интересно Вы сможете увидить все удалённые ветки (при желании).",
|
||||
"К тому моменту как git clone завершит своё выполнение, у Вас будет лишь одна локальная ветка (так что вы ещё не сильно перегружены), но, если Вам будет интересно, Вы сможете увидеть все удалённые ветки (при желании).",
|
||||
"",
|
||||
"Именно это объясняет, почему сразу после клонирования Вы видите в консоле надпись:",
|
||||
"Именно это объясняет, почему сразу после клонирования Вы видите в консоли надпись:",
|
||||
"",
|
||||
" local branch \"master\" set to track remote branch \"o/master\"",
|
||||
"",
|
||||
|
@ -902,7 +902,7 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Хватит болтавни, давайте взглянем на демонстрацию! Мы выполним checkout для новой ветки `foo` и укажем ей, чтобы она отслеживала `master` с удалённого репозитория."
|
||||
"Хватит болтовни, давайте взглянем на демонстрацию! Мы выполним checkout для новой ветки `foo` и укажем ей, чтобы она отслеживала `master` с удалённого репозитория."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Как вы увидели, мы использовали `o/master` чтобы обновить ветку `foo`. Обратите внимание, как обновился master!!"
|
||||
|
@ -918,7 +918,7 @@ exports.level = {
|
|||
"Это работает также и для git push"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Оп! Мы закачали наши наработки на ветку `master` нашего удалённого репозитория. При том, что наша локальная ветка называется асболютно по другому."
|
||||
"Оп! Мы закачали наши наработки на ветку `master` нашего удалённого репозитория. При том, что наша локальная ветка называется абсолютно по-другому."
|
||||
],
|
||||
"command": "git checkout -b foo o/master; git commit; git push",
|
||||
"beforeCommand": "git clone"
|
||||
|
@ -958,7 +958,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Отлично! Для выполнения этого уровня давайте выполним push наших наработок в ветку `master` на удалённом репозитории при этом *не* скачивая и не создавай ветку `master` локально. Я объясню Вам оставшееся чуть позже, тк это продвинутый курс :P"
|
||||
"Отлично! Для выполнения этого уровня давайте выполним push наших наработок в ветку `master` на удалённом репозитории при этом *не* скачивая и не создавая ветку `master` локально. Я объясню Вам оставшееся чуть позже, т.к. это продвинутый курс :P"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue