mirror of
https://github.com/pcottle/learnGitBranching.git
synced 2025-06-28 17:00:04 +02:00
Merge branch 'master' into mzJPTranslate3
This commit is contained in:
commit
03db0de6bb
24 changed files with 283 additions and 58 deletions
3
.travis.yml
Normal file
3
.travis.yml
Normal file
|
@ -0,0 +1,3 @@
|
|||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
|
@ -1,5 +1,8 @@
|
|||
# LearnGitBranching
|
||||
|
||||
|
||||
[](https://travis-ci.org/pcottlele/learnGitBranching)
|
||||
|
||||
LearnGitBranching is a git repository visualizer, sandbox, and series of educational tutorials and challenges. Its primary purpose is to help developers understand git through the power of visualization (something that's absent when working on the command line).
|
||||
|
||||
You can input a variety of commands into LearnGitBranching (LGB) -- as commands are processed, the nearby commit tree will dynamically update to reflect the effects of each command:
|
||||
|
@ -114,6 +117,7 @@ And the following heroes for assisting in translating:
|
|||
* Marc-Olivier Arsenault ("marcolivierarsenault")
|
||||
* Eroany H Leader ("lhyqy5")
|
||||
* Honorat ("ahonorat")
|
||||
* Vasil Kulakov ("coyl") & Lyubov Agadjanyan ("shayenblue")
|
||||
|
||||
Also huge shoutout for everyone who has put up a pull request that was pulled! Check out the 30+ contributors we have in the [Contributors View](https://github.com/pcottle/learnGitBranching/graphs/contributors)
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
"name": "LearnGitBranching",
|
||||
"version": "0.8.0",
|
||||
"scripts": {
|
||||
"start": "node_modules/react-native/packager/packager.sh"
|
||||
"start": "node_modules/react-native/packager/packager.sh",
|
||||
"test": "grunt test"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
|
|
@ -34,7 +34,7 @@ var str = exports.str = function(key, params) {
|
|||
var locale = LocaleStore.getLocale();
|
||||
if (!strings[key]) {
|
||||
console.warn('NO INTL support for key ' + key);
|
||||
return 'NO INTL support for key ' + key;
|
||||
return 'NO INTL support for key ' + key + '. this is probably a dev error';
|
||||
}
|
||||
|
||||
if (!strings[key][locale]) {
|
||||
|
@ -55,7 +55,7 @@ var str = exports.str = function(key, params) {
|
|||
);
|
||||
};
|
||||
|
||||
var getIntlKey = exports.getIntlKey = function(obj, key) {
|
||||
var getIntlKey = exports.getIntlKey = function(obj, key, overrideLocale) {
|
||||
if (!obj || !obj[key]) {
|
||||
throw new Error('that key ' + key + 'doesnt exist in this blob' + obj);
|
||||
}
|
||||
|
@ -68,7 +68,8 @@ var getIntlKey = exports.getIntlKey = function(obj, key) {
|
|||
);
|
||||
}
|
||||
|
||||
return obj[key][LocaleStore.getLocale()];
|
||||
var locale = overrideLocale || LocaleStore.getLocale();
|
||||
return obj[key][locale];
|
||||
};
|
||||
|
||||
exports.todo = function(str) {
|
||||
|
@ -80,11 +81,17 @@ exports.getDialog = function(obj) {
|
|||
};
|
||||
|
||||
exports.getHint = function(level) {
|
||||
return getIntlKey(level, 'hint') || str('error-untranslated');
|
||||
if (!getIntlKey(level, 'hint')) {
|
||||
return getIntlKey(level, 'hint', getDefaultLocale()) + ' -- ' + str('error-untranslated');
|
||||
}
|
||||
return getIntlKey(level, 'hint');
|
||||
};
|
||||
|
||||
exports.getName = function(level) {
|
||||
return getIntlKey(level, 'name') || str('error-untranslated');
|
||||
if (!getIntlKey(level, 'name')) {
|
||||
return getIntlKey(level, 'name', getDefaultLocale()) + ' -- ' + str('error-untranslated');
|
||||
}
|
||||
return getIntlKey(level, 'name');
|
||||
};
|
||||
|
||||
exports.getStartDialog = function(level) {
|
||||
|
|
|
@ -744,7 +744,7 @@ exports.strings = {
|
|||
'es_AR': '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',
|
||||
'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}" не найде! Открываю выбор уровней'
|
||||
'ru_RU': 'Уровень с id "{id}" не найден! Открываю выбор уровней'
|
||||
},
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
'undo-stack-empty': {
|
||||
|
@ -900,7 +900,7 @@ exports.strings = {
|
|||
'pt_BR': 'Mostrar objetivo',
|
||||
'es_AR': 'Mostrar objetivo',
|
||||
'ja' : 'ゴールを表示',
|
||||
'ru_RU': 'Показать цель уровня'
|
||||
'ru_RU': 'Цель уровня'
|
||||
},
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
'hide-goal-button': {
|
||||
|
|
|
@ -81,6 +81,12 @@ var IntlHelperBarView = React.createClass({
|
|||
onClick: function() {
|
||||
this.fireCommand('locale de_DE; levels');
|
||||
}.bind(this)
|
||||
}, {
|
||||
text: 'Русский',
|
||||
testID: 'russian',
|
||||
onClick: function() {
|
||||
this.fireCommand('locale ru_RU; levels');
|
||||
}.bind(this)
|
||||
}, {
|
||||
icon: 'signout',
|
||||
onClick: function() {
|
||||
|
|
|
@ -63,6 +63,10 @@ var MainHelperBarView = React.createClass({
|
|||
shownBar: BARS.INTL
|
||||
});
|
||||
}.bind(this)
|
||||
}, {
|
||||
newPageLink: true,
|
||||
icon: 'twitter',
|
||||
href: 'https://twitter.com/petermcottle'
|
||||
}, {
|
||||
newPageLink: true,
|
||||
icon: 'facebook',
|
||||
|
|
|
@ -203,7 +203,7 @@ var sequenceInfo = exports.sequenceInfo = {
|
|||
'ko': 'Git을 다루는 다양한 팁과 테크닉을 다양하게 알아봅니다',
|
||||
'zh_CN': 'Git技术、技巧与贴士杂烩',
|
||||
'zh_TW': 'git 的技術,招數與技巧',
|
||||
'ru_RU': 'Ассорти из приёмов работы с гит, хитростей и советов'
|
||||
'ru_RU': 'Ассорти из приёмов работы с Git, хитростей и советов'
|
||||
}
|
||||
},
|
||||
advanced: {
|
||||
|
|
|
@ -10,7 +10,8 @@ exports.level = {
|
|||
"pt_BR": "Ramos no Git",
|
||||
"fr_FR": "Gérer les branches avec Git",
|
||||
"zh_CN": "建立Git分支",
|
||||
"zh_TW": "建立 git branch"
|
||||
"zh_TW": "建立 git branch",
|
||||
"ru_RU": "Ветвление в Git"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Make a new branch with \"git branch [name]\" and check it out with \"git checkout [name]\"",
|
||||
|
@ -21,7 +22,8 @@ exports.level = {
|
|||
"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 [브랜치명]\"로 그 브랜치로 이동하세요"
|
||||
"ko": "\"git branch [브랜치명]\"으로 새 브랜치를 만들고, \"git checkout [브랜치명]\"로 그 브랜치로 이동하세요",
|
||||
"ru_RU": "Создай новую ветку при помощи \"git branch [name]\" и перейди на неё при помощи \"git checkout [name]\""
|
||||
},
|
||||
"disabledMap": {
|
||||
"git revert": true
|
||||
|
@ -35,7 +37,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Git Branches",
|
||||
"",
|
||||
"Branches in Git are incredibly lightweight as well. They are simply references to a specific commit -- nothing more. This is why many Git enthusiasts chant the mantra:",
|
||||
"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",
|
||||
|
@ -740,7 +742,7 @@ exports.level = {
|
|||
"",
|
||||
"Так как создание множества веток никак не отражается на памяти или жестком диске, удобнее и проще разбивать свою работу на много маленьких веток, чем хранить все изменения в одной огромной ветке.",
|
||||
"",
|
||||
"Чуть позже мы попробуем использовать ветки и коммиты и вы увидите как две эти возможности сочетаются. Можно сказать, что создание ветка хранит изменения текущих коммитов и всех его родителей."
|
||||
"Чуть позже мы попробуем использовать ветки и коммиты и вы увидите как две эти возможности сочетаются. Можно сказать, что созданная ветка хранит изменения текущих коммитов и всех его родителей."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -748,7 +750,7 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Посмотрим что такое ветки на практике",
|
||||
"Посмотрим, что такое ветки на практике",
|
||||
"",
|
||||
"Создадим здесь новую ветку с именем newImage"
|
||||
],
|
||||
|
@ -766,7 +768,7 @@ exports.level = {
|
|||
"Теперь попробуем сделать некоторые изменения в этой ветке. Для этого нажми кнопку ниже."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"О-оу! Ветка master сдвинулся тогда как ветка newImage - нет! Всё из-за того, что мы не перешли на новую ветку, на что указывает звёздочка около ветки master"
|
||||
"О-оу! Ветка master сдвинулась тогда как ветка newImage - нет! Всё из-за того, что мы не переключились на новую ветку, а остались в старой, о чём говорит звёздочка около ветки master"
|
||||
],
|
||||
"command": "git commit",
|
||||
"beforeCommand": "git branch newImage"
|
||||
|
@ -795,7 +797,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Ну что ж, теперь вы готовы к работе с ветками. Как только это окно закроется,",
|
||||
"Ну что ж, теперь ты готов к работе с ветками. Как только это окно закроется,",
|
||||
"создай ветку с именем bugFix и переключись на неё"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -431,7 +431,7 @@ exports.level = {
|
|||
"",
|
||||
"Git пытается быть лёгким и быстрым насколько это только возможно, так что он не просто слепо копирует всю директорию какждый раз, а ужимает (когда это возможно) коммит в набор изменений или \"дельту\" между текущей версией и предыдущей.",
|
||||
"",
|
||||
"Также Git хранит всю историю о том, когда какой коммит был сделан. Вот почему большинство коммитов имеют предков -- мы указываем на предков стрелками при визуализации. Поддержка истории коммитов более чем важна для всех, кто работает на проектом!",
|
||||
"Также Git хранит всю историю о том, когда какой коммит был сделан. Вот почему большинство коммитов имеют предков -- мы указываем на предков стрелками при визуализации. Поддержка истории коммитов более чем важна для всех, кто работает над проектом!",
|
||||
"",
|
||||
"Можно ещё долго рассказывать о коммитах, но для простоты будем считать их полными снимками проекта. Коммиты очень легки, так что переключение между ними происходит предельно быстро!"
|
||||
]
|
||||
|
@ -441,12 +441,12 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Посмотрим, как это выглядит на практике. Справа расположена визуализация небольшого git репозитория. Сейчас в нём два коммита -- первый, исходны коммит, С0 и один коммит после него С1, содержащий изменения. ",
|
||||
"Посмотрим, как это выглядит на практике. Справа расположена визуализация небольшого git репозитория. Сейчас в нём два коммита -- первый, исходный коммит, С0 и один коммит после него С1, содержащий изменения. ",
|
||||
"",
|
||||
"Нажми на кнопку, чтобы совершить коммит"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Отлично. Мы только что внесли изменения в репозиторий и сохранили их как коммит. У коммит, который мы только что сделали, есть родитель, С1, который указывает на предыдущий коммит."
|
||||
"Отлично. Мы только что внесли изменения в репозиторий и сохранили их как коммит. У коммита, который мы только что сделали, есть родитель, С1, который указывает на предыдущий коммит."
|
||||
],
|
||||
"command": "git commit",
|
||||
"beforeCommand": ""
|
||||
|
|
|
@ -656,10 +656,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Branches and Merging",
|
||||
"## Ветки и слияния",
|
||||
"",
|
||||
"Ок! Теперь мы знаем как создавать ветки и коммитить наши изменения. Теперь надо понять как объединять изменения из двух разных ветко. Очень удобно создать ветку, сделать свою часть работы в ней и потом объединить изменения из своей ветки с общими.",
|
||||
"Ок! Теперь мы знаем как создавать ветки и коммитить наши изменения. Теперь надо понять как объединять изменения из двух разных веток. Очень удобно создать ветку, сделать свою часть работы в ней и потом объединить изменения из своей ветки с общими.",
|
||||
"",
|
||||
"Первый способ объединения изменений, который мы рассмотрим - это `git merge` - слияние или просто мердж. Слияния в Git создают особый вид коммита, который имеет сразу двух родителей. Коммит с двумя родителями обычно означает, что мы хотим объединить изменения из одного коммита, с другим коммитом и всеми их родителскими коммитами.",
|
||||
"",
|
||||
|
@ -680,7 +679,7 @@ exports.level = {
|
|||
"",
|
||||
"Во-вторых, обрати внимание как изменились цвета коммитов. Мы ввели цветовую дифференциацию, чтобы помочь помниманию. Каждая ветка своего цвета. Каждый коммит становится того цвета, какого его ветка. Если в нём изменения сразу двух веток - он становится цветом, смешанным из цветов родительских веток.",
|
||||
"",
|
||||
"И вот мы видим, что цвет ветки `master` подмешан к каждому коммиту, а ветки `bugFix` - нет. Это можно попроавить."
|
||||
"И вот мы видим, что цвет ветки `master` подмешан к каждому коммиту, а ветки `bugFix` - нет. Это можно поправить."
|
||||
],
|
||||
"command": "git merge bugFix",
|
||||
"beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
|
||||
|
@ -707,14 +706,14 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"Чтобы пройти этот уровень сделай следующее:",
|
||||
"",
|
||||
"* Создай новыю ветку под названием `bugFix`",
|
||||
"* Создай новую ветку под названием `bugFix`",
|
||||
"* Переключись на новую ветку `bugFix` командой `git checkout bugFix`",
|
||||
"* Сделай один коммит",
|
||||
"* Вернись на ветку `master` при помощи `git checkout`",
|
||||
"* Сделай ещё один коммит",
|
||||
"* Слей ветку `bugFix` с веткой `master` при помощи `git merge`",
|
||||
"",
|
||||
"* Если что-то пошло не так - можешь подглядеть в жту шпаргалку командой \"objective\"!*"
|
||||
"* Если что-то пошло не так - можешь подглядеть в эту шпаргалку командой \"objective\"!*"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -642,7 +642,7 @@ exports.level = {
|
|||
"",
|
||||
"Несмотря на то, что это звучит достаточно непонятно, преимущество rebase в том, что при его помощи можно делать чистые и красивые линейные последовательности коммитов. История коммитов будет чище, если вы применяете rebase.",
|
||||
"",
|
||||
"ПОсмотрим, как это работает..."
|
||||
"Посмотрим, как это работает..."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -661,7 +661,7 @@ exports.level = {
|
|||
"",
|
||||
"Обрати внимание, что коммит С3 до сих пор существует где-то, а С3' - это его \"копия\" в ветке master",
|
||||
"",
|
||||
"Единственная проблема - ветка master не обновлена до последних изнменений. Это легко исправить."
|
||||
"Единственная проблема - ветка master не обновлена до последних изменений. Это легко исправить."
|
||||
],
|
||||
"command": "git rebase master",
|
||||
"beforeCommand": "git commit; git checkout -b bugFix C1; git commit"
|
||||
|
@ -684,7 +684,7 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Чтобы пройти этот уровен, сделай следующее:",
|
||||
"Чтобы пройти этот уровень, сделай следующее:",
|
||||
"",
|
||||
"* Переключись на ветку `bugFix`",
|
||||
"* Сделай коммит",
|
||||
|
|
|
@ -23,7 +23,7 @@ exports.level = {
|
|||
"ja": "一つのコミットのみを取得",
|
||||
"zh_CN": "只取一个 commit",
|
||||
"zh_TW": "只取一個 commit",
|
||||
"кг_КГ": "Выберем один коммит."
|
||||
"ru_RU": "Выберем один коммит."
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Remember, interactive rebase or cherry-pick is your friend here",
|
||||
|
|
|
@ -10,7 +10,8 @@ exports.level = {
|
|||
"pt_BR": "Tags no Git",
|
||||
"fr_FR": "Git Tags",
|
||||
"zh_CN": "Git Tags",
|
||||
"zh_TW": "git tag"
|
||||
"zh_TW": "git tag",
|
||||
"ru_RU": "git tag"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "you can either check out the commit directly or simply checkout the tag!",
|
||||
|
@ -20,7 +21,8 @@ exports.level = {
|
|||
"es_AR": "Podés checkoutear directamente el commit, ¡o simplemente el tag!",
|
||||
"pt_BR": "Você pode fazer checkout diretamente no commit ou na tag correspondente!",
|
||||
"zh_TW": "你可以直接 checkout 到 commit 上,或是簡單的 checkout 到 tag 上",
|
||||
"zh_CN": "你可以直接 checkout 到 commit 上,或是简单的 checkout 到 tag 上"
|
||||
"zh_CN": "你可以直接 checkout 到 commit 上,或是简单的 checkout 到 tag 上",
|
||||
"ru_RU": "Можно сделать checkout напрямую на коммит или же на тег"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
|
|
@ -15,7 +15,7 @@ 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"
|
||||
},
|
||||
"hint": {
|
||||
"fr_FR": "git cherry-pick suivis par les noms de commits",
|
||||
|
@ -491,9 +491,9 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Поперемещаем изменения",
|
||||
"",
|
||||
"Итак, мы уже освоили основы Git: коммиты, ветки, перемещение по дереву изменений. Уже этих знаний достаточно, чтобы овладеть 90% мощу Git-репозиториев и покрыть нужды разработчиков.",
|
||||
"Итак, мы уже освоили основы Git: коммиты, ветки, перемещение по дереву изменений. Уже этих знаний достаточно, чтобы овладеть 90% мощью Git-репозиториев и покрыть нужды разработчиков.",
|
||||
"",
|
||||
"А оставщиеся 10% будут очень полезны при сложных workfow (или если ты попал в сложную ситуацию). Теперь речь пойдёт о перемещении изменений, другими словами, возможности, позволяющие разработчику сказать \"Хочу, чтобы эти изменения были вот тут, а вот эти вот тут\" и получить точные, правильные результаты, не теряя при этому гибкости разработки.",
|
||||
"А оставшиеся 10% будут очень полезны при сложных workfow (или если ты попал в сложную ситуацию). Теперь речь пойдёт о перемещении изменений, другими словами, возможности, позволяющие разработчику сказать \"Хочу, чтобы эти изменения были вот тут, а вот эти вон там\" и получить точные, правильные результаты, не теряя при этом гибкости разработки.",
|
||||
"",
|
||||
"На первый взгляд запутано, но на самом деле всё просто."
|
||||
]
|
||||
|
|
|
@ -668,9 +668,9 @@ exports.level = {
|
|||
"",
|
||||
"В первую очередь, поговорим о \"HEAD\". HEAD - это символическое имя текущего выбранного коммита -- это, по сути, тот коммит, над которым мы в данным момент работаем.",
|
||||
"",
|
||||
"HEAD всегда указывает на последний коммит, из вашего локального дерева. Большинство комманд Git, изменяющих рабочее дерево, начнут с изменения HEAD.",
|
||||
"HEAD всегда указывает на последний коммит, из вашего локального дерева. Большинство команд Git, изменяющих рабочее дерево, начнут с изменения HEAD.",
|
||||
"",
|
||||
"Обычно HEAD указывает на имя ветки (например bigFix). Когда вы делаете коммит, статус ветки bugFix меняется и это изменение видно через HEAD."
|
||||
"Обычно HEAD указывает на имя ветки (например bugFix). Когда вы делаете коммит, статус ветки bugFix меняется и это изменение видно через HEAD."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -678,7 +678,7 @@ exports.level = {
|
|||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Посмотрим как это работает. Посмотрим где находится HEAD до и почле коммита."
|
||||
"Посмотрим как это работает. Посмотрим где находится HEAD до и после коммита."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Вот! HEAD всё это время скрывался за веткой master."
|
||||
|
|
|
@ -556,7 +556,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Git Interactive Rebase",
|
||||
"",
|
||||
"Git cherry-pick прекрасен, когда точно извесно, какие коммиты нужны (и известны их точные хеши)",
|
||||
"Git cherry-pick прекрасен, когда точно известно, какие коммиты нужны (и известны их точные хеши)",
|
||||
"",
|
||||
"Но как быть в случае, когда точно не известно какие коммиты нужны? К счастью, Git позаботился о таких ситуациях! Можно использовать интерактивный rebase для этого -- лучший способ, чтобы отобрать набор коммитов для rebase.",
|
||||
"",
|
||||
|
@ -570,7 +570,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"Всё, что нужно для интерактивного rebase - это опция -i",
|
||||
"",
|
||||
"Если добавить эту опцию, Git откроет интерфейс просмотра того, какие коммиты готовы к копированию на цель rabse (target). Также показываются хеши коммитов и комментарии к ним, так что можно легко понять что к чему.",
|
||||
"Если добавить эту опцию, Git откроет интерфейс просмотра того, какие коммиты готовы к копированию на цель rebase (target). Также показываются хеши коммитов и комментарии к ним, так что можно легко понять что к чему.",
|
||||
"",
|
||||
"Для \"реального\" Git, этот интерфейс означает просто открытие файла в редакторе типа vim. Для этой обучалки, я сделал небольшое диалоговое окно, которое по сути делает то же, что и редактор."
|
||||
]
|
||||
|
@ -582,9 +582,9 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"После открытия окна интерактивного rebase, есть три варианта для каждого коммита:",
|
||||
"",
|
||||
"* Можно сменить положение коммита по порядку, просто переставив строчку с ним в редакторе (у нас в окоше строку с коммитом можно перенести просто мышкой).",
|
||||
"* Можно сменить положение коммита по порядку, просто переставив строчку с ним в редакторе (у нас в окошке строку с коммитом можно перенести просто мышкой).",
|
||||
"* Можно \"выкинуть\" коммит из ребейза. Для этого есть pick -- переключение его означает, что нужно выкинуть коммит.",
|
||||
"* Наконец, можно соединить коммиты. В этом уровне игры у нас не реализована эта возможность, но, если кратко -- при помощи этой функции можно объедниять изменения двух коммитов.",
|
||||
"* Наконец, можно соединить коммиты. В этом уровне игры у нас не реализована эта возможность, но, если кратко -- при помощи этой функции можно объединять изменения двух коммитов.",
|
||||
"",
|
||||
"Ну что ж, посмотрим на примеры!"
|
||||
]
|
||||
|
|
|
@ -633,11 +633,11 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Относительные ссылки",
|
||||
"",
|
||||
"Передвигаться по дерево Git при помощи указания хешей коммитов немного неудоно. В реальной ситуации у вас вряд ли будет красивая визуализация дерева в терминале, так что придётся каждый раз использовать `git log`, чтобы найти хеш нужного коммита",
|
||||
"Передвигаться по дереву Git при помощи указания хешей коммитов немного неудоно. В реальной ситуации у вас вряд ли будет красивая визуализация дерева в терминале, так что придётся каждый раз использовать `git log`, чтобы найти хеш нужного коммита",
|
||||
"",
|
||||
"Более того, хеши в реальном репозитории Git сильно более длинные. Например, хеш для коммита, который приведён в предыдущем уровне - `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Не очень просто для произношения =)",
|
||||
"",
|
||||
"Хорошая новость в том, что Git достаточно умён в работе хешей. Ему нужно лишь первые несколько символов для того, чтобы идентифицировать конкретный коммит. Так что можно написать просто `fed2` вместо колбасы выше."
|
||||
"Хорошая новость в том, что Git достаточно умён в работе с хешеми. Ему нужно лишь первые несколько символов для того, чтобы идентифицировать конкретный коммит. Так что можно написать просто `fed2` вместо колбасы выше."
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -647,7 +647,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"Как мы уже говорили, указание на коммит при помощи его хеша - не самый удобный способ, поэтому Git поддерживает относительные ссылки и они прекрасны!",
|
||||
"",
|
||||
"С относительными ссылками можно начать с какого-либо удобновго места (например с ветки `bugFix` или от HEAD) и двигаться о него",
|
||||
"С относительными ссылками можно начать с какого-либо удобного места (например с ветки `bugFix` или от HEAD) и двигаться от него",
|
||||
"",
|
||||
"Относительные ссылки - мощный инструмент, но мы покажем два простых способа использования:",
|
||||
"",
|
||||
|
@ -662,7 +662,6 @@ exports.level = {
|
|||
"beforeMarkdowns": [
|
||||
"Для начала рассмотрим оператор каретки (^). Когда мы добавляем его к имени ссылки, Git поспринимает это как указание найти родителя указанного коммита.",
|
||||
"",
|
||||
"So saying `master^` is equivalent to \"the first parent of `master`\".",
|
||||
"Так что `master^` означает \"первый предок ветки `master`\".",
|
||||
"",
|
||||
"`master^^` означает предок предка ветки `master`",
|
||||
|
|
|
@ -21,7 +21,8 @@ exports.level = {
|
|||
"pt_BR": "Referências relativas #2 (~)",
|
||||
"fr_FR": "Références relatives #2 (~)",
|
||||
"zh_CN": "相对引用2(~)",
|
||||
"zh_TW": "相對引用二(~)"
|
||||
"zh_TW": "相對引用二(~)",
|
||||
"ru_RU": 'Относительные ссылки №2'
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -606,9 +607,9 @@ exports.level = {
|
|||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Мы рассмотрели относительные ссылки и branch forcing вкупе, так что теперь пришло время пройти следующий оуровень.",
|
||||
"Мы рассмотрели относительные ссылки и branch forcing вкупе, так что теперь пришло время пройти следующий уровень.",
|
||||
"",
|
||||
"Чтобы пройти этот уровень, передвинь `HEAD`, `master` и `bugFix` так как показано на выизуализации."
|
||||
"Чтобы пройти этот уровень, передвинь `HEAD`, `master` и `bugFix` так как показано на визуализации."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ exports.level = {
|
|||
"Let's see what that looks like:"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Nice! Git simply moved the master branch reference back to `C1`; now our local repository is in a state as if `C2` had never happened"
|
||||
"Nice! Git moved the master 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"
|
||||
|
@ -603,7 +603,7 @@ exports.level = {
|
|||
"markdowns": [
|
||||
"## Отмена изменений в Git",
|
||||
"",
|
||||
"Есть много путей для отмены изменений в Git. Так же как и коммит, отмена изменений в Git возможно и на низком уровне (добавление в коммит отдельных файлов и наборов строк) и на высоком (как изменения реально отменяются). Сейчас сфокусируемся на высокоуровневой части.",
|
||||
"Есть много путей для отмены изменений в Git. Так же как и коммит, отмена изменений в Git возможна и на низком уровне (добавление в коммит отдельных файлов и наборов строк) и на высоком (как изменения реально отменяются). Сейчас сфокусируемся на высокоуровневой части.",
|
||||
"",
|
||||
"Есть два основных способа отмены изменений в Git: первый - это `git reset`, а второй - `git revert`. Попробуем оба на следующем шаге.",
|
||||
""
|
||||
|
@ -633,7 +633,7 @@ exports.level = {
|
|||
"beforeMarkdowns": [
|
||||
"## Git Revert",
|
||||
"",
|
||||
"Reset отлично работае на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не срабоает на удалённых ветках, которые используют другие пользователи.",
|
||||
"Reset отлично работает на локальных ветках, в локальных репозиториях. Но этот метод переписывания истории не сработает на удалённых ветках, которые используют другие пользователи.",
|
||||
"",
|
||||
"Чтобы отменить изменения и поделиться отменёнными изменениями с остальными, надо использовать `git revert`. Посмотрим, как это работает"
|
||||
],
|
||||
|
|
|
@ -211,7 +211,7 @@ exports.level = {
|
|||
}
|
||||
]
|
||||
},
|
||||
"ru_Ru": {
|
||||
"ru_RU": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
|
|
|
@ -9,7 +9,8 @@ exports.level = {
|
|||
"es_AR": "Introducción a clone",
|
||||
"pt_BR": "Introdução à clonagem",
|
||||
"zh_CN": "介绍 Clone",
|
||||
"zh_TW": "介紹 clone"
|
||||
"zh_TW": "介紹 clone",
|
||||
"ru_RU": "Введение в клонирование"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Just git clone!",
|
||||
|
@ -19,7 +20,8 @@ exports.level = {
|
|||
"zh_CN": "只要 git clone!",
|
||||
"es_AR": "Simplemente hacé git clone!",
|
||||
"pt_BR": "Basta fazer um git clone!",
|
||||
"zh_TW": "只要 git clone 就好了"
|
||||
"zh_TW": "只要 git clone 就好了",
|
||||
"ru_RU": "Простой git clone!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -476,6 +478,63 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ru_RU": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Удалённые репозитории в Git",
|
||||
"",
|
||||
"На самом деле Remote удалённые репозитории в Git не так сложны, как кажутся на первый взгляд. Кажется, что в современно мире облачных вычислений под термином удалённых репозиторий подразумевается что-то сложное и загадочное. Однако, удалённые репозитории всего-навсего копии вашего репозитория, хранящиеся на другом компьютере. Обычно вы можете связываться с этим другим компьютеров через Интернет, что позволяет вам передавать коммиты туда и сюда.",
|
||||
"",
|
||||
"Как уже было сказано, удалённые репозитории обладают рядом замечательных свойств:",
|
||||
"",
|
||||
"- В первую очередь, удалённые репозитории это замечательное средство резервного копирования! На сколько Вам известно локальные репозитории способны восстанавливать файлы, использую предыдущие состояния, но вся эта информация хранится локально. Потеряв все свои локальные данные, вы способны восстановить их при наличии копии своего репозитория на другом компьютере.",
|
||||
"",
|
||||
"- Что ещё более важно, удалённые репозитории позволяют сделать процесс разработки более социальным! Теперь, когда копия вашего проекта размещена в другом месте, Ваши друзья запросто могут внести свой вклад в Ваш проект или забрать последние и актуальные изменения.",
|
||||
"",
|
||||
"Набирает популярность использование web сайтов для визуализации активности удалённых репозиторий (например [Github](https://github.com/) или [Phabricator](http://phabricator.org/)), однако удалённые репозитории _всегда_ выступают в качестве базы для таких инструментов. Поэтому так важно понимать как устроены удалённые репозитории!"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"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` на своём существующем репозитории. Настоящее обучение появится в последующих уроках."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -10,7 +10,8 @@ exports.level = {
|
|||
"es_AR": "git fetch",
|
||||
"pt_BR": "Git Fetch",
|
||||
"zh_CN": "Git Fetch",
|
||||
"zh_TW": "git fetch"
|
||||
"zh_TW": "git fetch",
|
||||
"ru_RU": "Git fetch"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "just run git fetch!",
|
||||
|
@ -20,7 +21,8 @@ exports.level = {
|
|||
"es_AR": "Simplemente ¡hacé git fetch!",
|
||||
"pt_BR": "Simplesmente chame git fetch!",
|
||||
"zh_CN": "只要运行 git fetch 命令!",
|
||||
"zh_TW": "只要下 git fetch 指令"
|
||||
"zh_TW": "只要下 git fetch 指令",
|
||||
"ru_RU": "Просто выполните git fetch!"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -604,6 +606,79 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ru_RU": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Git Fetch",
|
||||
"",
|
||||
"Работа с удалёнными git репозиториями сводится к передаче данных _в_ и _из_ других репозиториев. До тех пор, пока мы может отправлять коммиты туда-обратно, мы можем делиться любыми изменениями, которые отслеживает git (следовательно, делиться новыми файлами, свежими идеями, любовными письмами и тд.).",
|
||||
"",
|
||||
"В этом уроке Вы научитесь тому, как извлекать данные _из_ удалённого репозитория -- и для этого у нас есть соответсвтующая команда `git fetch`.",
|
||||
"",
|
||||
"Вы увидете, что как только мы изменим представление нашего удалённого репозитория, наши _удалённые_ ветки обновятся соответствующим образом и отобразят это представление. Это связывает воедино предыдущий урок про удалённые репозитории"
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Прежде чем углубляться в детали команды `git fetch`, давайте взглянем на её визуализацию в действии! Здесь у нас имеется удалённый репозиторий, который содержит в себе два коммита, отсутствующих в нашем локальном репозитории."
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Вот и всё! Коммиты `C2` и `C3` были успешно скачены в наш локальный репозиторий, и наша удалённая ветка `o/master` отобразила эти изменения соответствующим образом."
|
||||
],
|
||||
"command": "git fetch",
|
||||
"beforeCommand": "git clone; git fakeTeamwork 2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"### Что делает fetch",
|
||||
"",
|
||||
"`git fetch` выполняет две и только две основные операции. А именно:",
|
||||
"",
|
||||
"* связывается с указанным удалённым репозиторием и забирает все те данные проекта, которых у вас ещё нет, при этом...",
|
||||
"* у вас должны появиться ссылки на все ветки из этого удалённого репозиториея (например, `o/master`)",
|
||||
"",
|
||||
"Фактически `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` и скачайте все коммиты!"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -10,7 +10,8 @@ exports.level = {
|
|||
"pt_BR": "Ramos remotos",
|
||||
"de_DE": "Branches auf entfernten Servern",
|
||||
"ja" : "リモートのブランチ",
|
||||
"fr_FR": "Les branches distantes"
|
||||
"fr_FR": "Les branches distantes",
|
||||
"ru_RU": "Удалённые ветки"
|
||||
},
|
||||
"hint": {
|
||||
"en_US": "Pay attention to the ordering -- commit on master first!",
|
||||
|
@ -20,7 +21,8 @@ exports.level = {
|
|||
"pt_BR": "Preste atenção na ordem: commite no master primeiro!",
|
||||
"de_DE": "Beachte die Sortierung -- committe zuerst auf dem master!",
|
||||
"ja" : "順番に注意 -- まずmasterに対してcommitしましょう",
|
||||
"fr_FR": "Prêtez attention à l'ordre -- les commits sur master d'abord !"
|
||||
"fr_FR": "Prêtez attention à l'ordre -- les commits sur master d'abord !",
|
||||
"ru_RU": "Уделяйте внимание очерёдности -- сперва commit на master"
|
||||
},
|
||||
"startDialog": {
|
||||
"en_US": {
|
||||
|
@ -510,6 +512,67 @@ exports.level = {
|
|||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ru_RU": {
|
||||
"childViews": [
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"## Удалённые ветки в Git",
|
||||
"",
|
||||
"Теперь, когда Вы уже увидели `git clone` в действии, давайте углубимся в детали и посмотрим что же на самом деле изменилось.",
|
||||
"",
|
||||
"Во-первых, Вы должны были заметить что у нас появилась новая ветка в нашем локальном репозитории с именем `o/master`. Такой тип ветки называется _удалённой_ веткой; поскольку удалённые ветки играют важную и уникальную роль, они обладают рядом специальных свойств.",
|
||||
"",
|
||||
"Удалённые ветки отражают _состояние_ удалённых репозиториев (с того момента как Вы обращались к этим удалённым репозиториям в последний раз). Они позволяют Вам отслеживать и видить разницу между Вашими локальными наработками и тем что было сделано другими участниками -- важный шаг, который необходимо делать, прежде чем делиться своими наработками с другими.",
|
||||
"",
|
||||
"Важным свойством удалённых веток является тот факт, что когда Вы извлекаете их Вы отделяете (detaching) `HEAD`. Git делает это потому что Вы не можете работать непосредственно в этих ветках; сперва Вам необходимо сделать наработки где-либо, а уж затем делиться ими с удалёнными репозиториями (после чего Ваши удалённые ветки будут обновлены)."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"### Что такое `o/` в названии ветки ?",
|
||||
"",
|
||||
"Вы наверное догодались, что первый символ `o/` в названии ветки служит для обозначения именно удалённых веток. Да. Удалённые ветки также имеют (обязательное) правило именования -- они отображаются в формате:",
|
||||
"",
|
||||
"* `<удалённый репозиторий>/<имя ветки>`",
|
||||
"",
|
||||
"Следовательно, если Вы взгляние на имя ветки `o/master`, то здесь `master` - это имя ветки, а `o` - это имя удалённого репозитория.",
|
||||
"",
|
||||
"Большинство разработчиков именуют свои главные удалённые репозитории не как `o`, а как `origin`. Также общепринятым является именование удалённого репозитория как `origin`, когда Вы клонируете репозиторий командой `git clone`.",
|
||||
"",
|
||||
"К сожалению, полное имя `origin` не помещается на элементах дизайна наших уроков, поэтому мы используем краткое `o` :( Просто помните, когда Вы пользуетесь git в реальном проекте, Ваш удалённый репозиторий скорее всего будет называться `origin`!",
|
||||
"",
|
||||
"Давайте посмотрим на всё это в действии."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "GitDemonstrationView",
|
||||
"options": {
|
||||
"beforeMarkdowns": [
|
||||
"Давайте извлечём (check out) удалённую ветку и посмотрим что произойдёт"
|
||||
],
|
||||
"afterMarkdowns": [
|
||||
"Как Вы можете видеть, git отделил (detached) `HEAD` и не обновил `o/master`, когда мы добавили новый коммит. Всё потому, что `o/master` обновится тогда и только тогда, когда обновится сам удалённый репозиторий."
|
||||
],
|
||||
"command": "git checkout o/master; git commit",
|
||||
"beforeCommand": "git clone"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "ModalAlert",
|
||||
"options": {
|
||||
"markdowns": [
|
||||
"Для завершения уровня, выполните коммит единожды на `master`, а затем на `o/master` (предварительно переключившись на эту ветку). Это наглядно продемонстрирует поведение удалённых веток, а также покажет, как изменения влияют на состояние удалённых репозиториев."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue