complete translate to Vietnamese

This commit is contained in:
duongtiendat1990 2020-01-25 17:51:46 +07:00
parent 886170f627
commit 2622c3eb7a
39 changed files with 3701 additions and 1397 deletions

View file

@ -14,7 +14,8 @@ exports.level = {
"zh_TW": "多個 parent commit",
"ru_RU": "Здоровая семья, или несколько родителей",
"ko" : "다수의 부모",
'uk': 'Декілька батьків'
'uk': 'Декілька батьків',
'vi': 'Nhiều cha lắm mẹ'
},
"hint": {
"en_US": "Use `git branch bugWork` with a target commit to create the missing reference.",
@ -28,7 +29,8 @@ exports.level = {
"zh_TW": "在一個指定的 commit 上面使用 `git branch bugWork`。",
"ru_RU": "`git branch bugWork` на нужном коммите поможет создать нужную ссылку.",
"ko" : "`git branch bugWork`를 대상 커밋과 함께 사용해서 부족한 참조를 만드세요",
'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання'
'uk': 'Використай "git branch bugWork" на потрібному коміті щоб створити потрібне посилання',
'vi': 'Dùng lệnh `git branch bugWork` để tạo nhánh tại vị trí chỉ định'
},
"startDialog": {
"en_US": {
@ -1075,6 +1077,93 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Tìm về cội nguồn",
"",
"Cũng giống ký hiệu `~`, ta cũng có thể thêm số theo sau ký hiệu `^`.",
"",
"Nhưng mà không giống như (`~`) con số theo sau là số lượng thế hệ commit, con số theo sau `^` chỉ định commit cha từ commit merge. Hãy nhớ rằng commit merge có nhiều cha, cho nên chọn cha nào cũng khá là mơ hồ.",
"",
"Thông thường thì sẽ chọn cha \"đầu tiên\" từ commit merge, nhưng nếu sau dấu `^` có một con số thì cách hành xử sẽ khác đi.",
"",
"Không nói dông dài nữa, làm thử một ví dụ nào",
""
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Ở đây ta có 1 commit merge. Nếu ta dùng lệnh `master^` mà không bổ nghĩa cho nó, ta sẽ đi ngược lên commit cha đầu tiên của merge commit. ",
"",
"(*Trong hình minh họa bên trái thì commit cha đầu tiên được xếp hẳng hàng ngay phía trên của commit merge.*)"
],
"afterMarkdowns": [
"Dễ dàng -- đó là cách mà ta thường làm."
],
"command": "git checkout master^",
"beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nào bây giờ hãy chỉ định commit cha thứ hai thử..."
],
"afterMarkdowns": [
"Thấy chứ? Ta đã leo lên commit cha khác lúc trước."
],
"command": "git checkout master^2",
"beforeCommand": "git checkout HEAD^; git commit; git checkout master; git merge C2"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Dùng bổ ngữ `^` và `~` cho ta khả năng di chuyển trên cây lịch sử:"
],
"afterMarkdowns": [
"Nhanh như chớp!"
],
"command": "git checkout HEAD~; git checkout HEAD^2; git checkout HEAD~2",
"beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Thâm chí còn ghê gớm hơn khi ta kết hợp chúng với nhau! Hãy xem thử:"
],
"afterMarkdowns": [
"Cùng con đường như lúc trước, nhưng chỉ cần 1 dòng lệnh."
],
"command": "git checkout HEAD~^2~2",
"beforeCommand": "git commit; git checkout C0; git commit; git commit; git commit; git checkout master; git merge C5; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Áp dụng thực hành nào",
"",
"Để hoàn thành cấp độ này, hãy tạo ra một nhánh mới ở vị trí chỉ định.",
"",
"Dùng cách chỉ định trực tiếp commit (như là dùng `C6` chẳng hạn) thì dễ quá, nhưng thử thách ở đây là dùng các bổ ngữ đã học ở trên!"
]
}
}
]
}
}
};

View file

@ -81,7 +81,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ko' : 'git의 주요 명령어를 깔끔하게 알려드립니다',
'ru_RU': 'Хорошо подобранное введение в основные команды git',
'uk' : 'Гарно підібране введення в основні команди git',
'vi' : 'Bước làm quen độc đáo tới phần lớn lệnh điều khiển git'
'vi' : 'Từng bước làm quen với phần lớn lệnh điều khiển git'
}
},
rampup: {
@ -98,7 +98,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Едем дальше',
'uk' : 'Їдемо далі',
'ko' : '다음 단계로',
'vi' : 'Vượt chướng ngại vật'
'vi' : 'Tăng tốc'
},
about: {
'en_US': 'The next serving of 100% git awesomes-ness. Hope you\'re hungry',
@ -113,7 +113,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Следующая порция абсолютной git-крутотенюшки. Проголодались?',
'uk' : 'Наступна порція абсолютної git-дивини. Сподіваюсь, ви зголодніли',
'ko' : 'git은 아주 멋져요. 왜 멋진지 알려드립니다',
'vi' : 'Những món tuyệt đỉnh tiếp theo. Hi vọng bạn còn đói.'
'vi' : 'Tận hưởng khẩu phần tuyệt hảo của git. Hi vọng bạn còn đói.'
}
},
remote: {
@ -131,7 +131,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Push & Pull - удалённые репозитории в Git!',
'uk' : 'Push & Pull -- віддалені репозиторії в Git!',
'ko' : 'Push & Pull -- Git 원격 저장소!',
'vi' : 'Push & Pull -- Các git remote!'
'vi' : 'Push & Pull -- Tác động git từ xa!'
},
about: {
'en_US': 'Time to share your 1\'s and 0\'s kids; coding just got social',
@ -146,7 +146,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Настало время поделиться своими единичками и нулями. Время коллективного программирования',
'uk' : 'Настав час поділитися своїми нулями та одиничками; соціальне програмування',
'ko' : '내 코드를 공개할 때가 되었습니다. 코드를 공개해봅시다!',
'vi' : 'Chia sẻ đứa con tinh thần 0 và 1 của bạn; mã tới với cộng đồng'
'vi' : 'Chia sẻ đứa con tinh thần \'0\' và \'1\' của bạn; mã đã đến với cộng đồng'
}
},
remoteAdvanced: {
@ -164,7 +164,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Через origin к звёздам. Продвинутое использование Git Remotes',
'uk' : 'Через origin до зірок. Прогресивне використання Git Remotes',
'ko' : '"origin"그 너머로 -- 고급 Git 원격 저장소',
'vi' : 'Gửi quê hương và các xứ xa -- nâng cao về các git remote'
'vi' : 'Về với cội nguồn và vươn xa hơn -- nâng cao về các git remote'
},
about: {
'en_US': 'And you thought being a benevolent dictator would be fun...',
@ -179,7 +179,7 @@ var sequenceInfo = exports.sequenceInfo = {
'ru_RU': 'Весело было быть всесильным мудрым правителем...',
'uk' : 'А ти думав, що бути всесильним диктатором весело...',
'ko' : '자비로운 독재자가 되는게 재밌을 줄 알았겠지만...',
'vi' : 'Làm một tay độc tài toàn năng bác ái cũng vui lắm...'
'vi' : 'Và bạn nghĩ làm một kẻ độc tài nhân từ thì sẽ vui ...'
}
},
move: {
@ -196,7 +196,7 @@ var sequenceInfo = exports.sequenceInfo = {
'zh_TW': '調整提交順序',
'ru_RU': 'Перемещаем труды туда-сюда',
'uk' : 'Переміщуємо роботу туди-сюди',
'vi' : 'Bốc bốc xếp xếp'
'vi' : 'Điều chỉnh vị trí'
},
about: {
'en_US': '"Git" comfortable with modifying the source tree :P',

View file

@ -13,7 +13,8 @@ exports.level = {
"zh_CN": "Git Branch",
"zh_TW": "建立 git branch",
"ru_RU": "Ветвление в Git",
"uk": "Розгалуження в Git"
"uk": "Розгалуження в Git",
"vi": "Rẽ nhánh với Git"
},
"hint": {
"en_US": "Make a new branch with \"git branch <branch-name>\" and check it out with \"git checkout <branch-name>\"",
@ -27,7 +28,8 @@ exports.level = {
"zh_TW": "用 'git branch [ branch 名稱]' 來建立 branch用 'git checkout [ branch 名稱]' 切換到該 branch",
"ko": "\"git branch [브랜치명]\"으로 새 브랜치를 만들고, \"git checkout [브랜치명]\"로 그 브랜치로 이동하세요",
"ru_RU": "Создай новую ветку при помощи \"git branch [name]\" и перейди на неё при помощи \"git checkout [name]\"",
"uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\""
"uk": "Створи нову гілку за допомогою \"git branch [ім’я]\" й перейди на неї за допомогою \"git checkout [ім’я]\"",
"vi": "Tạo một nhánh mới với lệnh \"git branch <ten-nhanh>\" và chuyển sang đó với lệnh \"git checkout <ten-nhanh>\"",
},
"disabledMap": {
"git revert": true
@ -973,6 +975,88 @@ exports.level = {
}
}
]
}
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Nhánh Git",
"",
"Nhánh trong Git cũng nhẹ đến không ngờ. Chúng chỉ đơn giản là các con trỏ đến commit -- không hơn. Đó là lý do các con chiên Git hay niệm chú:",
"",
"```",
"rẽ nhánh sớm, rẽ nhánh thường xuyên",
"```",
"",
"Bởi vì chẳng tốn bao nhiêu bộ nhớ cho việc rẽ nhánh cả, và nó dễ dàng phân chia công việc hơn là có một cái nhánh to tổ chảng.",
"",
"Khi bạn trộn lẫn commit và nhánh, bạn sẽ thấy chúng kết hợp với nhau thế nào. Còn bây giờ, đơn giản hãy nhớ nhánh cơ bản muốn nói \"Tôi muốn thành quả trong commit này và tất cả cha ông của nó\""
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nào hãy xem nhánh trong Git hoạt động thế nào.",
"",
"Giờ chúng ta tạo một nhánh mới tên là `newImage`"
],
"afterMarkdowns": [
"Đó, rẽ nhánh là thế đó! Nhánh `newImage` giờ đã tham chiếu đến commit `C1`"
],
"command": "git branch newImage",
"beforeCommand": ""
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nào cùng thử thêm nội dung vào nhánh mới này nào. Hãy bấm nút bên dưới"
],
"afterMarkdowns": [
"Ồ không! Nhánh `master` đã di chuyển nhưng nhánh `newImage` thì không! Đó là do ta không \"nằm trên\" nhánh mới, đó là tại sao dấu hoa thị (*) nằm trên nhánh `master`"
],
"command": "git commit",
"beforeCommand": "git branch newImage"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nào cùng bảo Git chuyển ta sang nhánh khác với lệnh",
"",
"```",
"git checkout <name>",
"```",
"",
"Lệnh này sẽ chuyển ta sang nhánh mới trước khi commit"
],
"afterMarkdowns": [
"Đó! Thay đổi của ta đã được lưu sang nhánh mới"
],
"command": "git checkout newImage; git commit",
"beforeCommand": "git branch newImage"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Được rồi! Bạn đã sẵn sàng để tập rẽ nhánh rồi. Khi cửa sổ này đóng lại,",
"tạo một nhánh mới tên là `bugFix` và chuyển sang nhánh đó.",
"",
"Tiện thể, có đường tắt đấy: nếu bạn muốn tạo nhánh mới ",
"VÀ đồng thời chuyển sang luôn, bạn chỉ cần ",
"gõ `git checkout -b [yourbranchname]`."
]
}
}
]
},
}
};

View file

@ -13,7 +13,8 @@ exports.level = {
"zh_CN": "Git Merge",
"zh_TW": "git 中的 merge",
"ru_RU": "Слияния веток в Git",
"uk": "Злиття гілок в Git"
"uk": "Злиття гілок в Git",
"vi": "Gộp nhánh trong Git"
},
"hint": {
"en_US": "Remember to commit in the order specified (bugFix before master)",
@ -27,7 +28,8 @@ exports.level = {
"zh_TW": "記住按指定的順序 commitbugFix 比 master 優先)",
"ko": "말씀드린 순서대로 커밋해주세요 (bugFix에 먼저 커밋하고 master에 커밋)",
"ru_RU": "Не забудь делать коммиты в правильном порядке (сначала bugFix, потом master)",
"uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)"
"uk": "Не забудь робити коміти в правильному порядку (спочатку bugFix, а вже потім master)",
"vi": "Nhớ là commit theo đúng thứ tự(bugFix trước master)"
},
"disabledMap": {
"git revert": true
@ -860,6 +862,75 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Nhánh và gộp nhánh",
"",
"Tuyệt! Ta đã biết làm sao để commit và tạo nhánh. Giờ ta cần học cách để tập hợp thành quả của 2 nhánh khác biệt lại với nhau. Đây sẽ là cách để ta phân tách để phát triển chức năng, rồi sau đó hợp nhất nó trở lại.",
"",
"Cách đầu tiên để hợp nhất thành quả cần xem xét đến là lệnh `git merge`. Merge trong Git là tạo ra một commit đặc biệt mà có 2 người cha độc nhất. Một commit mà có 2 cha căn bản nghĩa là \"Tôi muốn có thành quả của ông này và ông kia nữa, *và* tất cả ông cha của họ.\"",
"",
"Trực quan thì dễ hiểu hơn, sang trang tiếp theo nào"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Ở đây ta có 2 nhánh; mỗi nhánh có 1 commit độc nhất. Có nghĩa là chẳng nhánh nào có đủ \"thành quả\" trong kho chứa của ta cả. Sửa nó bằng merge nào.",
"",
"Ta sẽ `merge` nhánh `bugFix` vào `master`"
],
"afterMarkdowns": [
"Wao! Thấy chứ? Trước tiên, `master` giờ đã trỏ đến commit có 2 cha. Nếu bạn lần theo mũi tên lên trên từ `master`, bạn sẽ gặp tất cả các commit lên đến commit gốc. Có nghĩa là `master` giờ đã chứa tất cả thành quả trong kho.",
"",
"Đồng thời, bạn thấy màu commit thay đổi chứ? Để bạn dễ học hơn, tôi đã phối hợp một số bảng màu. Mỗi nhánh có một màu duy nhất. Mỗi commit mang màu pha trộn của tất cả nhánh chứa nó.",
"",
"Vì vậy, ở đây chúng ta thấy rằng màu nhánh `master` được pha trộn vào tất cả các commit, nhưng màu` bugFix` thì không. Hãy sửa nó nào ..."
],
"command": "git merge bugFix",
"beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy gộp nhánh `master` vào `bugFix` nào:"
],
"afterMarkdowns": [
"Vì `bugFix` là bậc cha ông của `master`, git chẳng phải làm gì cả; nó đơn giản chỉ chuyển `bugFix` vào commit mà `master` đang trỏ tới.",
"",
"Giờ thì tất cả commit đã có cùng màu, nghĩa là mỗi nhánh đã chứa tất cả thành quả trong kho! Ồ hố!"
],
"command": "git checkout bugFix; git merge master",
"beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit; git merge bugFix"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, hãy làm theo các bước bên dưới:",
"",
"* Tạo một nhánh mới tên là `bugFix`",
"* Chuyển sang nhánh `bugFix` với `git checkout bugFix`",
"* Commit một lần",
"* Trở về `master` với `git checkout`",
"* Commit một lần nữa",
"* Gộp nhánh `bugFix` vào `master` với `git merge`",
"",
"*Nhớ rằng, bạn luôn luôn có thể bật lại hội thoại này với lệnh \"objective\"!*"
]
}
}
]
}
}
};

View file

@ -13,7 +13,8 @@ exports.level = {
"zh_CN": "Git Rebase",
"zh_TW": "介紹 rebase",
"ru_RU": "Введение в rebase",
"uk": "Знайомство з rebase"
"uk": "Знайомство з rebase",
"vi": "Giới thiệu về rebase"
},
"hint": {
"en_US": "Make sure you commit from bugFix first",
@ -27,7 +28,8 @@ exports.level = {
"zh_CN": "先在 bugFix 分支上进行提交",
"zh_TW": "你要先在 bugFix branch 進行 commit",
"ru_RU": "Убедись, что сделал коммит в ветке bugFix",
"uk": "Впевнись, що зробив коміт в гілці bugFix"
"uk": "Впевнись, що зробив коміт в гілці bugFix",
"vi": "Hãy chắc chắn rằng bạn commit từ bugFix trước"
},
"disabledMap": {
"git revert": true
@ -834,6 +836,73 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Rebase",
"",
"Cách thứ 2 để kết hợp thành của của 2 nhánh là *rebase.* Rebase về căn bản là chọn một loạt các commit, \"sao chép\" chúng, và ném chúng sang chỗ khác.",
"",
"Nghe có vẻ phức tạp, lợi thế của rebase là có thể tạo ra cây lịch sử thẳng tuột. Ljch sử commit nhìn sẽ gọn gàng hơn nhiều.",
"",
"Xem nó hoạt động thế nào nào..."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Giờ ta lại có 2 nhánh; để ý rằng nhánh bugFix đang được chọn (thấy dấu hoa thị chứ?)",
"",
"Ta muốn chuyển bugFix trực tiếp sang master. Theo cách đó thì các chức năng nhìn có vẻ được phát triển tuần tự, trong khi thực tế chúng được phát triển song song.",
"",
"Dùng lệnh `git rebase` để thử nào"
],
"afterMarkdowns": [
"Tuyệt vời! Giờ thành quả của nhánh bugFix nằm ngay trên master và ta có các commit nằm thẳng tuột.",
"",
"Để ý rằng commit C3 vẫn nằm đâu đó (đã được làm mờ), và commit C3' là bản \"sao chép\" mà ta dán lên nhánh master.",
"",
"Vấn đề duy nhất bây giờ là nhánh master vẫn chưa được cập nhật, làm luôn cho nóng nào..."
],
"command": "git rebase master",
"beforeCommand": "git commit; git checkout -b bugFix C1; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Giờ thì ta đã chuyển sang nhánh `master`. Tiếp tục dán nó vào `bugFix` nào..."
],
"afterMarkdowns": [
"Đó! Bởi vì `master` là cha ông của `bugFix`, git đơn giản chuyển tham chiếu của nhánh `master` tiến lên."
],
"command": "git rebase bugFix",
"beforeCommand": "git commit; git checkout -b bugFix C1; git commit; git rebase master; git checkout master"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, làm theo hướng dẫn sau",
"",
"* Chuyển sang nhánh mới tên là `bugFix`",
"* Commit một lần",
"* Quay về master và commit lần nữa",
"* Quay trở lại bugFix và rebase sang master",
"",
"Chúc may mắn!"
]
}
}
]
}
}
};

File diff suppressed because it is too large Load diff

View file

@ -25,7 +25,8 @@ exports.level = {
"zh_CN": "只取一个提交记录",
"zh_TW": "只取一個 commit",
"ru_RU": "Выберем один коммит.",
"uk": "Вибираємо всього один коміт"
"uk": "Вибираємо всього один коміт",
"vi": "Chỉ lấy 1 commit"
},
"hint": {
"en_US": "Remember, interactive rebase or cherry-pick is your friend here",
@ -39,7 +40,8 @@ exports.level = {
"zh_CN": "你有两个朋友cherry-pick 和 rebase -i",
"zh_TW": "記住,使用互動式的 rebase 或者 cherry-pick 會很有幫助",
"ru_RU": "Не забывай, что интерактивный rebase и cherry-pick это твои друзья!",
"uk": "Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!"
"uk": "Не забувай, що інтерактивний rebase та cherry-pick -- це твої друзі!",
"vi": "Hãy nhớ 2 anh bạn tương tác rebase và cherry-pick!"
},
"startDialog": {
"en_US": {
@ -509,6 +511,45 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Commit xếp chồng tại địa phương",
"",
"Có tình huống thế này thường hay xảy ra trong quá trình phát triển: Tôi dang cố dò lỗi nhưng mà nó lại khá là trúc trắc. Để hỗ trợ cho việc này, thêm vào vài dòng lệnh gỡ lỗi và lệnh in.",
"",
"Mấy lệnh gỡ lỗi và in này nằm yên trong commit của chúng. Cuối cùng thì tôi cũng tìm ra lỗi, gỡ xong, ngon rồi!",
"",
"Bây giờ thì lại phải đưa `bugFix` trở về nhánh `master`. Nếu mà đơn giản dùng fast-forwarded lên `master`, thì `master` lại có tất cả các lệnh gỡ lỗi kia(chẳng muốn chút nào). Phải có cách khác chứ nhỉ..."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Ta cần phải bảo git chỉ sao chép 1 commit thôi. Điều này giống với cấp độ trước về điều chỉnh vị trí -- ta có thể dùng các câu lệnh tương tự:",
"",
"* `git rebase -i`",
"* `git cherry-pick`",
"",
"Để đạt được mục tiêu này."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Bây giờ là cấp độ cao hơn rồi nên bạn hãy tự quyết định nên dùng câu lệnh nào, nhưng để hoàn thành được cấp độ, hãy đàm bảo rằng `master` nhận được commit mà `bugFix` tham chiếu tới."
]
}
}
]
}
}
};

View file

@ -29,7 +29,8 @@ exports.level = {
"zh_CN": "提交的技巧 #1",
"zh_TW": "commit 的戲法",
"ru_RU": "Жонглируем коммитами",
"uk": "Жонглюємо комітами"
"uk": "Жонглюємо комітами",
"vi": "Tung hứng commit"
},
"hint": {
"en_US": "The first command is git rebase -i HEAD~2",
@ -43,7 +44,8 @@ exports.level = {
"zh_CN": "第一个命令是 `git rebase -i HEAD~2`",
"zh_TW": "第一個命令是 'git rebase -i HEAD~2'",
"ru_RU": "Первой командой должна быть git rebase -i HEAD~2",
"uk": "Перша команда має бути git rebase -i HEAD~2"
"uk": "Перша команда має бути git rebase -i HEAD~2",
"vi": "Lệnh đầu tiên là git rebase -i HEAD~2"
},
"startDialog": {
"en_US": {
@ -456,6 +458,40 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tung hứng Commit",
"",
"Có một tình huống xảy ra khá thường xuyên. Bạn có vài thay đổi trên (`newImage`) và một vài thay đổi khác trên (`caption`) và chúng lại liên quan đến nhau, nên chúng nằm chồng lên nhau trong kho của bạn (một lại nối một).",
"",
"Tréo ngoe là bạn lại phải điều chỉnh một chút ở commit trước. Giả sử như tay thiết kết muốn ta đổi chiều của `newImage` một chút, mặc dù commit ấy đã xưa lắm rồi!!"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để khắc phục khó khăn này ta có thể làm như sau:",
"",
"* Ta sẽ dùng `git rebase -i` sắp xếp lại commit để cái ta cần sửa sẽ nằm trên cùng",
"* Ta sẽ dùng `commit --amend` tạo ra một điều chỉnh nhỏ",
"* Sau đó ta sẽ lại sắp xếp lại commit như trước bằng cách dùng `git rebase -i`",
"* Cuối cùng, ta sẽ chuyển `master` tới phần đã cập nhật để hoàn thành cấp độ (dùng cách nào tùy bạn)",
"",
"Có nhiều cách để hoàn thành mục tiêu (Tôi thấy bạn hấp háy sang cherry-pick rồi đấy), rồi ta sẽ thấy chúng nhiều hơn, nhưng giờ hãy cứ tập trung vào kỹ thuật này đã.",
"Sau cùng thì, để ý các dấu nháy đơn(') chứ?-- vì ta đã chuyển commit 2 lần, nên chúng có thêm một dấu nháy đơn. Và một dấu nữa cho commit mà ta đã sửa đổi, thế là ta có trạng thái cuối cùng của cây lịch sử ",
"",
"Nói cách khác, khi tôi so sánh kết quả, tôi chỉ so sánh cấu trúc của cây lịch sử. Sự khác biệt về số lượng `'` không được bao gồm trong so sánh. Miễn là cấu trúc nhánh `master` của bạn giống với cấu trúc đích, tôi sẽ vẫn để bạn qua bài."
]
}
}
]
}
}
};

View file

@ -28,7 +28,8 @@ exports.level = {
"zh_CN": "提交的技巧 #2",
"zh_TW": "commit 的戲法 #2",
"ru_RU": "Жонглируем коммитами №2",
"uk": "Жонглюємо комітами #2"
"uk": "Жонглюємо комітами #2",
"vi": "Tung hứng commit #2"
},
"hint": {
"en_US": "Don't forget to forward master to the updated changes!",
@ -42,7 +43,8 @@ exports.level = {
"zh_CN": "别忘记了将 master 快进到最新的更新上!",
"zh_TW": "別忘記了將 master 推到最新的 commit 上面!",
"ru_RU": "Не забудь переместить master на последние изменения.",
"uk": "Не забудь перемістити master на останні зміни!"
"uk": "Не забудь перемістити master на останні зміни!",
"vi": "Đừng quên đẩy nhánh master lên cập nhật mới nhất!"
},
"startDialog": {
"en_US": {
@ -554,6 +556,49 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tung hứng Commit #2",
"",
"*Nếu bạn vẫn chưa hoàn thành Tung hứng Commit #1 (cấp độ trước), hãy làm nó trước khi tiếp tục*",
"",
"Như bạn đã thấy ở cấp độ trước, ta dùng `rebase -i` để sắp xếp lại các commit. Một khi commit mà ta muốn sửa đã ở trên cùng, ta có thể dễ dàng --chỉnh sửa(amend) nó và sau đó sắp xếp lại trật tự lúc trước.",
"",
"Nhưng mà vẫn tồn tại vấn đề khi mà ta sắp xếp quá nhiều, điều này có thể dẫn đến xung đột khi rebase. Thử dùng cách khác với `git cherry-pick` nào"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy nhớ rằng cherry-pick sẽ thả commit ở bất cứ đâu xuống dưới HEAD (miễn là nó không phải cha ông hay tổ tiên gì của HEAD).",
"",
"Hãy xem thử minh họa nhỏ sau:"
],
"afterMarkdowns": [
"Hay! Tiếp tục nào"
],
"command": "git cherry-pick C2",
"beforeCommand": "git checkout -b bugFix; git commit; git checkout master; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Vậy thì ở cấp độ này, hãy làm hoàn thành mục tiêu tương tự là chỉnh sửa `C2` một lần nhưng hãy tránh dùng `rebase -i`. Tự tìm cách đi nhé! :D",
"",
"Nhớ rằng, số lượng dấu nháy dơn (') trên commit không quan trọng, quan trọng là mối tương liên các tham chiếu. Nói cách khác, kể cả bất cứ commit nào của bạn có thêm một đấu(') tôi vẫn công nhận đáp án của bạn"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"zh_TW": "git tag",
"ru_RU": "git tag",
"ko" : "Git 태그",
"uk" : "Git Tags"
"uk" : "Git Tags",
"vi" : "Tag trong Git"
},
"hint": {
"en_US": "you can either check out the commit directly or simply checkout the tag!",
@ -28,7 +29,8 @@ exports.level = {
"zh_CN": "你可以直接 checkout 到 commit 上,或是简单地 checkout 到 tag 上",
"ru_RU": "Можно сделать checkout напрямую на коммит или же на тег",
"ko" : "커밋을 직접 또는 태그를 이용해서 체크아웃할수 있습니다!",
"uk" : "ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!"
"uk" : "ти можеш або зробити checkout коміта напряму чи просто зачекаутити таг!",
"vi" : "Bạn có thể chuyển trực tiếp sang commit hoặc đơn giản là chuyển sang tag!"
},
"startDialog": {
"en_US": {
@ -654,6 +656,58 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tag trong Git",
"",
"Qua các bài học trước, bạn đã biết được rằng rất dễ dàng để di chuyển qua lại giữa các nhánh và chúng thường tham chiếu đến các commit khác nhau trong quá trình ta làm việc trên chúng. Nhánh thường dễ biết đổi, thường chỉ là tạm thời và chúng luôn như vậy.",
"",
"Nếu như vậy thì bạn có thể sẽ thắc mắc liệu có cách nào để đánh dấu *vĩnh viễn* một thời điểm nào đó trong lịch sử làm việc không? Khi mà dự án càng ngày càng mở rộng và merge thì diễn ra liên tục, vậy thì có cách nào để đánh dấu những commit đó một cách cố định hơn nhánh không?",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Tất nhiên là có chứ! Git có các tag(thẻ) để hỗ trợ vấn đề này -- chúng (bằng cách nào đó) đánh dấu vĩnh viễn một commit cụ thể nào đó như một \"cột mốc\" mà sau đó bạn có thể tham chiếu đến như với nhánh.",
"",
"Quan trọng hơn là, khi ta commit thì chúng không hề bị di chuyển. Bạn không thể \"check out\" một tag rồi làm việc trên đó -- tag giống như là mỏ neo để chỉ định một điểm cụ thể nào dó trên cây lịch sử.",
"",
"Cùng xem tag thực tế là như thế nào nào."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy thử tạo một thẻ ở commit `C1` chỉ định rằng đây là phiên bản thứ nhất của ta"
],
"afterMarkdowns": [
"Đó! Đơn giản như đan rổ. Ta tạo ra thẻ `v1` và tham chiếu đến commit `C1`. Nếu bạn không chỉ định commit, git sẽ gắn thẻ vào commit mà `HEAD` đang trỏ tới"
],
"command": "git tag v1 C1",
"beforeCommand": "git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Trong cấp độ này hãy tạo ra một thẻ tại vị trí chỉ định và chuyển sang `v1`. Để ý rằng bạn sẽ chuyến sang trạng thái tách biệt `HEAD` -- bởi vì bạn không thể tham chiếu đến thẻ `v1`.",
"",
"Sang cấp độ tới ta sẽ xem xét một vài cách hay ho để dùng thẻ."
]
}
}
]
}
}
};

View file

@ -18,7 +18,8 @@ exports.level = {
"zh_TW": "介紹 cherry-pick",
"ru_RU": "Введение в Cherry-pick",
"ko" : "Cherry-pick 소개",
"uk": "Знайомство з cherry-pick"
"uk": "Знайомство з cherry-pick",
"vi" : "Giới thiệu về cherry-pick"
},
"hint": {
"fr_FR": "git cherry-pick suivi par les noms de commits",
@ -32,7 +33,8 @@ exports.level = {
"zh_TW": "git cherry-pick 後面要接著 commit 的名稱",
"ru_RU": "git cherry-pick основывается на именах коммитов!",
"ko" : "커밋의 이름들로 git cherry-pick 하세요!",
"uk": "git cherry-pick базується на іменах комітів!"
"uk": "git cherry-pick базується на іменах комітів!",
"vi" : "git cherry-pick sau đó là tên commit!"
},
"startDialog": {
"en_US": {
@ -717,6 +719,63 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Mang đi kéo về",
"",
"Cho đến giờ thì ta đã nắm được cơ bản về git -- commit, rẽ nhánh, và dịch chuyển qua lại trên cây mã nguồn. Chừng ấy khái niệm là đã đủ để tác động đến 90% sức mạnh của kho chứa git và các chức nawmg cần thiết cho nhà phát triển phần mềm.",
"",
"Tuy nhiên 10% còn lại thì lại khá hữu ích trong các quy trình làm việc phức tạp (hoặc khi bạn vướng phải tình huống khó khăn). The next concept we're going to cover is \"chỉnh lý các bản ghi\" -- đó là cách để nhà phát triển nói rằng\"Tôi muốn lấy bản ghi ở đây và cả bản ghi ở đó\" một cách chính xác, linh hoạt và sống động.",
"",
"Nghe thì có vẻ phức tạp, nhưng thực ra khái niệm này khá đơn giản."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Cherry-pick",
"",
"Lệnh đầu tiên của loạt bài này là `git cherry-pick`, dạng lệnh là::",
"",
"* `git cherry-pick <Commit1> <Commit2> <...>`",
"",
"Đó là cách rất trực tiếp để copy một loạt commit xuống dưới vị trí hiện tại của bạn (`HEAD`). Cá nhân tôi thì rất thích `cherry-pick` bởi tính tiện dụng và dễ hiểu của nó.",
"",
"Hãy xem qua một ví dụ!",
""
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Ở đây ta có một kho chứa mà ta muốn sao chép thành quả công việc từ nhánh `side` sang nhánh `master`. Có thể dùng rebase để làm việc này (kỹ thuật mà ta đã học), nhưng hãy xem thử cherry-pick làm điều này ra sao."
],
"afterMarkdowns": [
"Thế thôi! Chúng ta chỉ cần các commit `C2` và` C4`, vì vậy Git sẽ lấy chúng và đặt chúng dưới nhánh hiện tại. Thật đơn giản!"
],
"command": "git cherry-pick C2 C4",
"beforeCommand": "git checkout -b side; git commit; git commit; git commit; git checkout master; git commit;"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, hãy copy thành quả công việc từ 3 nhánh khác vào master. Bạn có thể nhìn vào mô tả mục tiêu để biết chúng ta cần những commit nào.",
""
]
}
}
]
}
}
};

File diff suppressed because it is too large Load diff

View file

@ -18,7 +18,8 @@ exports.level = {
"ru_RU": "Можно использовать либо ветки, либо относительные ссылки (HEAD~), чтобы указать цель для Rebase",
"ja" : "リベースする対象の指定には、ブランチ名や相対リファレンス(HEAD~)が使えます",
"ko" : "리베이스할 타겟으로 브랜치나 상대 참조(HEAD~)를 사용할 수 있습니다",
"uk" : "ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase"
"uk" : "ти можеш використовувати гілки чи відносні посилання (HEAD~) щоб вказувати ціль для rebase",
"vi": "bạn có thể sử dụng tham chiếu tương đối (HEAD~) hoặc nhánh để chỉ định mục tiêu rebase",
},
"name": {
"en_US": "Interactive Rebase Intro",
@ -32,7 +33,8 @@ exports.level = {
"zh_TW": "介紹互動式的 rebase",
"ru_RU": "Введение в интерактивный Rebase",
"ko" : "인터랙티브 리베이스 소개",
"uk" : "Знайомство з інтерактивним rebase"
"uk" : "Знайомство з інтерактивним rebase",
"vi" : "Giới thiệu về tương tác rebase"
},
"startDialog": {
"en_US": {
@ -685,7 +687,7 @@ exports.level = {
}
]
},
"ko": {
"ko": {
"childViews": [
{
"type": "ModalAlert",
@ -814,6 +816,71 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Rebase Tương tác",
"",
"Khi bạn biết rõ mình muốn những commit nào (và mã băm tương ứng của chúng) thì Git cherry-pick là công cụ tuyệt vời -- nó đơn giản đến bất ngờ.",
"",
"Nhưng mà lỡ như bạn không biết mình cần commit nào thì sao? May mà git cũng có công cụ cho việc này! Ta có thể dùng rebase tương tác cho việc này -- đó là cách tốt nhất để cân nhắc lựa chọn các commit mà bạn muốn rebase.",
"",
"Hãy đi sâu vào chi tiết nào..."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Rebase tương tác nghĩa là dùng lệnh `rebase` với tùy chọn `-i`.",
"",
"Nếu lệnh của bạn có bao hàm tùy chọn này, git sẽ mở một giao diện người dùng để cho bạn biết những commit nào sẽ được sao chép xuống dưới mục tiêu rebase. Nó cũng đồng thời thể hiện mã băm và thông điệp của commit, điều này là tuyệt vời bởi nhờ đó ta có thể phân biệt được chúng.",
"",
"Với git \"thật\", cửa sổ UI (giao diện người dùng) sẽ được mở thông qua một tệp nhờ công cụ chỉnh sửa văn bản như là `vim`. Vì mục đích học tập, tôi đã xây dựng một cửa sổ hội thoại nhỏ mà nó hành xử cũng tương tự như vậy."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Khi hội thoại tương tác rebase bật lên, bạn có thể làm được 3 điều:",
"",
"* Bạn có thể sắp xếp lại commit một cách đơn giản thông qua UI (bạn có thể làm điều này bằng cách kéo thả trên công cụ của chúng tôi).",
"* Bạn có thẻ bỏ qua một vài commit. Điều này được thể hiện qua nút `pick` -- tắt nút `pick` nghĩa là bạn bỏ qua commit đó.",
"* Cuối cùng, bạn có thể nén các commit. Đáng tiếc là trình độ của chúng tôi chưa hỗ trợ được chức năng này do vài vấn đề logic, cho nên tôi sẽ bỏ qua phần này. Nói dơn giản thì -- nó cho phép bạn kết hợp các commit.",
"",
"Tuyệt! Cùng xem qua một ví dụ nào."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Khi bạn bấm nút, một cửa sổ tương tác rebase sẽ xuất hiện. Sắp xếp lại một vài commit (hoặc thậm chí bỏ qua một vài cái) và xem thử kết quả!"
],
"afterMarkdowns": [
"BÙÙM! Git sao chép chính xác các commit mà bạn chọn thông qua UI"
],
"command": "git rebase -i HEAD~4 --aboveAll",
"beforeCommand": "git commit; git commit; git commit; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, do an interactive rebase and achieve the order shown in the goal visualization. Remember you can always `undo` or `reset` to fix mistakes :D"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"de_DE": "Relative Referenzen (^)",
"ru_RU": "Относительные ссылки (^)",
"ko" : "상대 참조 (^) (Relative Refs)",
"uk": "Відносні посилання"
"uk": "Відносні посилання",
"vi": "Tham chiếu tương đối (^)"
},
"hint": {
"en_US": "Remember the Caret (^) operator!",
@ -28,7 +29,8 @@ exports.level = {
"zh_TW": "不要忘記插入(^)符號!",
"ru_RU": "Не забудь оператор `^`",
"ko" : "(^)연산자를 기억하세요!",
"uk": "Не забудь оператор `^`"
"uk": "Не забудь оператор `^`",
"vi": "Đừng quên dấu mũ (^)!"
},
"startDialog": {
"en_US": {
@ -930,6 +932,81 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tham chiếu tương đối",
"",
"Dịch chuyển trong Git bằng cách chỉ định mã băm(hash) của commit cỏ vẻ hơi buồn tẻ. Trong đời thực thì sẽ không có mô tả git trực quan ngay bên cạnh terminal của bạn đâu, nên nếu bạn muốn nhìn mã băm của commit thì phải dùng `git log` thôi.",
"",
"Hơn nữa, mã băm thực tế thường dài hơn rất nhiều. Ví dụ, mã băm của commit được giới thiệu trong phần trước là `fed2da64c0efc5293610bdd892f82a58e8cbc5d8`. Đọc mà xoắn hết cả lưỡi...",
"",
"Được cái là Git cũng khá thông minh về mã băm. Nó chỉ yêu cầu bạn chỉ định mã băm đủ để xác định commit. Cho nên tôi có thể đơn giản chỉ cần gõ `fed2` thay vì cái chuỗi dài ngoằng phía trên."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Như tôi đã nói, xác định commit bằng mã băm của nó chẳng hề thuận tiện tẹo nào, đó là tại sao Git có những `tham chiếu tương đối`. Chúng rất tuyệt vời!",
"",
"Với tham chiếu tương đối, bạn có thể bắt đầu từ những nơi có thể ghi nhớ được (như là nhánh `bugFix` hoặc `HEAD`) và làm việc trên đó.",
"",
"Những commits tương đối rất mạnh mẽ, nhưng chúng tôi sẽ chỉ giới thiệu 2 loại đơn giản sau:",
"",
"* Dịch chuyển 1 commit lên trên trong 1 lần với `^`",
"* Dịch chuyển nhiều commit lên trên trong 1 lần với `~<số>`"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Xem thử cái dấu mũ (^) trước nào. Mỗi lần bạn nối nó với một cái tên tham chiếu, bạn đang ra lệnh cho Git tìm kiếm cha của một commit cụ thể.",
"",
"Cho nên `master^` nghĩa là \"cha đầu tiên của `master`\".",
"",
"`master^^` là ông nội (tổ tiên thế hệ 2) của `master`",
"",
"Thử nhảy sang commit trước master nào"
],
"afterMarkdowns": [
"BÙUM! Đã xong. Đơn giản hơn gõ mã băm nhiều"
],
"command": "git checkout master^",
"beforeCommand": "git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Bạn cũng có thể dùng `HEAD` như là tham chiếu tương đối. Thử dùng nó để leo commit vài lần nào"
],
"afterMarkdowns": [
"Game là dễ! Du hành ngược thời gian với `HEAD^`"
],
"command": "git checkout C3; git checkout HEAD^; git checkout HEAD^; git checkout HEAD^",
"beforeCommand": "git commit; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, nhảy sang cha của `bugFix`. Tức là tháo `HEAD`.",
"",
"Nếu muốn thì bạn có thể dùng mã băm, nhưng thế thì còn gì vui nữa dùng tham chiếu tương đối đi!"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"ja" : "このレベルをクリアするには少なくとも一つの直接リファレンスhashを使用する必要があります",
"ru_RU": "Понадобится использовать как минимум одну прямую ссылку (хеш), чтобы пройти этот уровень",
"ko" : "이번 레벨을 완료하려면 최소 한번은 직접 참조(해시)를 사용해야 합니다.",
"uk": "Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень"
"uk": "Тобі потрібно використати як мінімум одне пряме посилання (хеш) щоб пройти цей рівень",
"vi": "Bạn sẽ cần dùng ít nhất một tham chiếu trực tiếp (mã băm) để hoàn thành cấp độ này"
},
"name": {
"en_US": "Relative Refs #2 (~)",
@ -28,7 +29,9 @@ exports.level = {
"zh_TW": "相對引用二(~",
"ru_RU": 'Относительные ссылки №2',
"ko" : "상대 참조 #2 (~)",
"uk": "Відносні посилання №2"
"uk": "Відносні посилання №2",
"vi": "Tham chiếu tương đối #2 (~)",
},
"startDialog": {
"en_US": {
@ -841,6 +844,75 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Toán tử \"~\"",
"",
"Giả sử bạn muốn leo lên nhiều cấp trong git. Dùng `^` vài lần thì tù lắm, nên Git đã có dấu ngã (~) cho việc đó.",
"",
"",
"Theo sau toán tử ngã (~) là số lượng cha ông mà bạn muốn leo lên(không bắt buộc). Xem thử làm thật thì thế nào nào"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy chỉ định số lượng commit với `~`."
],
"afterMarkdowns": [
"BÙUM! Quá chuẩn luôn -- tham chiếu tương đối tuyệt vời."
],
"command": "git checkout HEAD~4",
"beforeCommand": "git commit; git commit; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Branch forcing",
"",
"Giờ thì bạn là cao thủ về tham chiếu tương đối rồi, *làm* thật thôi chứ nhỉ.",
"",
"Tôi thì hay thường dùng tham chiếu tương đối để dịch chuyển nhánh. Bạn có thể trực tiếp gán lại nhánh cho commit với cú pháp `-f`. Kiểu như thế này:",
"",
"`git branch -f master HEAD~3`",
"",
"dịch chuyển (ép buộc) nhánh master lên 3 commit phía trên HEAD."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Xem thử cái lệnh trên hoạt động sao nào."
],
"afterMarkdowns": [
"Đóóóó! Tham chiếu tương đối cho chúng ta một cách chuẩn xác để trỏ tới `C1` và ép nhánh bằng (`-f`) thì dịch chuyển nhanh chóng nhánh tới đó."
],
"command": "git branch -f master HEAD~3",
"beforeCommand": "git commit; git commit; git commit; git checkout -b bugFix"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Giờ thì bạn đã thấy cách kết hợp tham chiếu tương đối và ép nhánh, dùng chúng để vượt level tiếp thôi.",
"",
"Để hoàn thành cấp độ này, chuyển `HEAD`, `master`, và `bugFix` đến mục tiêu được xác định của chúng."
]
}
}
]
}
}
};

View file

@ -15,7 +15,9 @@ exports.level = {
"zh_CN": "撤销变更",
"zh_TW": "在 git 中取消修改 ",
"ru_RU": "Отмена изменений в Git",
"uk": "Відміна змін в Git"
"uk": "Відміна змін в Git",
"vi": "Hoàn tác thay đổi trong Git",
},
"hint": {
"en_US": "Notice that revert and reset take different arguments.",
@ -29,7 +31,8 @@ exports.level = {
"ko": "revert와 reset이 받는 인자가 다름을 기억하세요",
"ja" : "revertとresetとで引数が異なることに注意。",
"ru_RU": "Обрати внимание, что revert и reset принимают разные параметры.",
"uk": "Зверни увагу на те що revert та reset приймають різні параметри"
"uk": "Зверни увагу на те що revert та reset приймають різні параметри",
"vi": "Lưu ý rằng hoàn tác(revert) và đặt lại(reset) có những đối số khác nhau.",
},
"startDialog": {
"en_US": {
@ -789,6 +792,69 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Hoàn tác trong Git",
"",
"Có rất nhiều cách để hoàn tác thay đổi trong Git. Và cũng tương tự như commit, hủy thay đổi trong Git có cả thành phần bậc thấp (tạm thời lưu trữ một số tệp hoặc đoạn độc lập) và thành phần bậc cao (cách mà các thay đổi thực sự bị hủy). Ứng dụng của chúng tôi tập trung vào cái sau.",
"",
"Có 2 cách nguyên thủy để hủy thay đổi trong Git -- một là dùng `git reset` và cách khác là dùng `git revert`. Chúng ta sẽ xem xét từng cái trong hội thoại sau",
""
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"## Git Reset",
"",
"`git reset` hoàn tác bằng cách chuyển tham chiếu của nhánh ngược lên commit cũ hơn. Bạn có thể hiểu nó như kiểu \"viết lại lịch sử;\" `git reset` sẽ dịch chuyển nhánh lên trên như thể commit chưa bao giờ được tạo ra vậy.",
"",
"Cùng xem thử nó trông thế nào nào:"
],
"afterMarkdowns": [
"Hay! Git chuyển tham chiếu của master trở lại `C1`; bây giờ kho cá nhân của ta trông như thể commit `C2` chưa bao giờ xảy ra vậy."
],
"command": "git reset HEAD~1",
"beforeCommand": "git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"## Git Revert",
"",
"Trong khi git reset hoạt động rất tốt tại nhánh cục bộ trên máy cá nhân, cách thức \"viết lại lịch sử\" chẳng hề có tác dụng lên nhánh ở phương xa mà người khác sử dụng.",
"",
"Để có thể hoàn tác và *chia sẻ* hoàn tác đó với người khác, thì ta cần sử dụng `git revert`. Xem thử cách thức nó hoạt động nào"
],
"afterMarkdowns": [
"Lạ nhỉ, một commit mới được thả vào bên dưới commit mà ta muốn hoàn tác. Đó là bởi vì commit mới `C2'` này có chứa *thay đổi* -- đó là những thay đổi về hoàn tác commit `C2`.",
"",
"Dùng revert thì bạn có thể đẩy thay đổi mình lên và chia sẻ với người khác."
],
"command": "git revert HEAD",
"beforeCommand": "git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, hoàn tác commit gần nhất trên cả `local` (`cục bộ`) và `pushed` (`được đẩy`). Bạn sẽ hoàn tác tổng cộng 2 commit(một trên mỗi nhánh).",
"",
"Nhớ rằng `pushed` là nhánh ở phương xa và `local` là nhánh địa phương -- như thế thì bạn sẽ chọn được phương án phù hợp."
]
}
}
]
}
}
};

View file

@ -19,7 +19,8 @@ exports.level = {
"zh_CN": "多次 Rebase",
"zh_TW": "N次Rebase",
"ru_RU": "Rebase over 9000 раз",
"uk" : "Rebase over 9000 разів"
"uk" : "Rebase over 9000 разів",
"vi" : "Rebase hơn 9000 lần"
},
"hint": {
"en_US": "Remember, the most efficient way might be to only update master at the end...",
@ -33,7 +34,8 @@ exports.level = {
"zh_CN": "记住,最后更新 master 分支可能是最高效的方法……",
"zh_TW": "要記住喔! 把 master branch 留到最後更新可能是最有效率的方法。",
"ru_RU": "Не забудь, что лучше всего сдвинуть мастер в самом конце...",
"uk" : "Не забувай, що краще всього буде перемістити master в самому кінці... "
"uk" : "Не забувай, що краще всього буде перемістити master в самому кінці... ",
"vi" : "Hãy nhớ rằng, cách tốt nhất có lẽ là nên cuối cùng mới cập nhật nhánh `master`... "
},
"startDialog": {
"en_US": {
@ -251,6 +253,24 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Rebase nhiều nhánh",
"",
"Giời ạ, sao mà nhiều nhánh thế khôn biết! Chuyển hết chúng vào `master` thôi.",
"",
"Nhưng mà cha quản lý lại muốn oái oăm hơn cơ -- hắn muốn tất cả commit xếp thẳng hàng. Nghĩa là cây lịch sử của ta sẽ có `C7'` ở cuối, phía trên là`C6'`, và cứ thế theo đúng thứ tự.",
"",
"Nếu mà nhỡ may bạn làm nhầm thì có thể dùng lệnh `reset` để bắt đầu lại. Hãy nhớ đối chiếu với đáp án của chúng tôi xem bạn có thể hoàn thành với ít câu lệnh hơn không!"
]
}
}
]
}
}
};

View file

@ -18,7 +18,8 @@ exports.level = {
"zh_CN": "纠缠不清的分支",
"zh_TW": "branch 漿糊",
"ru_RU": "Спутанные ветки",
"uk" : "Макарони з гілок"
"uk" : "Макарони з гілок",
"vi" : "Nhánh rối như canh hẹ"
},
"hint": {
"en_US": "Make sure to do everything in the proper order! Branch one first, then two, then three",
@ -32,7 +33,8 @@ exports.level = {
"zh_CN": "确保你是按照正确的顺序来操作!先操作分支 `one`, 然后 `two`, 最后才是 `three`",
"zh_TW": "確認你是按照正確的順序來操作!先操作 branch `one`, 然後 `two`, 最後才是 `three`",
"ru_RU": "Убедись, что у нас всё по порядку! Сначала ветка `one`, потом `two` и только потом `three`",
"uk": "Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`"
"uk": "Переконайся, що все йде за порядком! Спершу гілка `one`, потім `two`, і тільки потім `three`",
"vi": "Hãy chắc chắn rằng bạn làm đúng thứ tự! Nhánh `one` trước, rồi `two`, rồi mới đến `three`"
},
"startDialog": {
"en_US": {
@ -274,6 +276,26 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Nhánh rối như canh hẹ",
"",
"Chààà, anh bạn! Thử thách lần này hơi khoai đây.",
"",
"Hiện tại thì nhánh `master` đang có nhiều commit hơn các nhánh `one`, `two` và `three`. Vì một lý do nào đó, ta cần cập nhật những commit trên nhánh `master` lên các nhánh còn lại kèm với một vài điều chỉnh .",
"",
"Nhánh `one` thì cần sắp xếp lại và xóa commit `C5`, trong khi đó nhánh `two` thì đơn giản sắp xếp, còn `three` thì chỉ cần một commit!",
"",
"Cố gắng động não tìm ra cách đi nhé -- khi bạn làm xong thì nhớ so sánh với đáp án của chúng tôi bằng lệnh `show solution`. "
]
}
}
]
}
}
};

View file

@ -13,7 +13,8 @@ exports.level = {
"zh_TW": "介紹 clone",
"ru_RU": "Введение в клонирование",
"ko" : "Clone 소개",
"uk" : "Знайомство з clone"
"uk" : "Знайомство з clone",
"vi" : "Giới thiệu về clone"
},
"hint": {
"en_US": "Just git clone!",
@ -27,7 +28,8 @@ exports.level = {
"zh_TW": "只要 git clone 就好了",
"ru_RU": "Простой git clone!",
"ko" : "그냥 git clone 하세요!",
"uk" : "Просто git clone!"
"uk" : "Просто git clone!",
"vi" : "Đơn giản là `git clone`!"
},
"startDialog": {
"en_US": {
@ -712,6 +714,63 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Remotes(Kho lưu trữ từ xa)",
"",
"Thực ra thì kho remote cũng không khó hiểu lắm đâu. Giờ đây đâu đâu cũng thấy điện toán đám mây nên ai ai cũng tưởng git remote nó là cái gì đó ma thuật lắm, nhưng chúng thực ra chỉ là những bản sao chép ko chứa của bạn lên máy tính khác. Bạn có thể giao tiếp với chúng qua internet, tù đó mà chuyển giao commit qua lại.",
"",
"Vì lẽ đó mà kho remote có những đặc tính tuyệt vời:",
"",
"- Trước hết, có tác dụng như là bản sao dự phòng! Bạn đã biết rằng kho địa phương có thể khôi phục trở lại trạng thái trước đó, nhưng tất cả thông tin đó chỉ được lưu trữ cục bộ. Bằng cách sao chép toàn bộ kho chứa của bạn lên máy tính ở xa, bạn hoàn toàn có thể mất hết dữ liệu tại máy tính mà vẫn tiếp tục làm việc như chưa có gì xảy ra.",
"",
"- Quạn trọng hơn nữa, kho remote khiến lập trình có tính cộng đồng hơn! Bây giờ bản sao dự án của bạn đã được lưu trũ ở nơi khác, bạn bè của bạn có thể đóng góp (hoặc kéo về cập nhật mới nhất) dự án của bạn rất dễ dàng.",
"",
"Trực quan hóa các kho lưu trữ từ xa bằng cách sử dụng các trang web đang trở nên phổ biến hơn (như [Github] (https://github.com/) hoặc [Photypeator] (http://phovenator.org/)), nhưng các kho lưu trữ từ xa * * Luôn luôn ** là trụ cột của các công cụ này, vì vậy điều quan trọng là phải hiểu khái niệm này!"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Câu lệnh của chúng tôi để tạo kho lưu trữ từ xa",
"",
"Cho đến bây giờ, Learn Git Branching đã tập trung dạy về làm việc trên kho chứa _địa phương_ (rẽ nhánh `branch`, hợp nhánh `merge`, dịch chuyển nhánh `rebase`, vân vân ...). Nhưng bây giờ ta lại muốn học về làm việc trên kho lưu trữ từ xa, ta cần một câu lệnh để cài đặt môi trường cho những bài học này. Đó là `git clone`",
"",
"Về mặt kỹ thuật, thì `git clone` thực tế là câu lệnh dùng để tạo một bản sao chép _địa phương_ của khó chứa từ xa (ví dụ từ github chẳng hạn). Nhưng trong Learn Git Branching ta sẽ dùng câu lệnh này hơi khác biệt một chút -- `git clone` sẽ tạo ra một bản sao chép lên kho lưu trữu từ xa dựa trên kho chứa cục bộ của bạn. Điều này hoàn toàn ngược lại với câu lệnh thực tế, nhưng nó giúp ta nhân bản và làm việc với kho lưu trữ từ xa, nên ta sẽ dùng nó trong quá trình học.",
""
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nào cùng khởi động bằng cách nhìn xem kho lưu trữ từ xa trông như thế nào (trong mô tả của chúng tôi).",
""
],
"afterMarkdowns": [
"Nó đây rồi! Giờ ta đã có kho lưu trữ dự án chúng ta từ xa. Nhìn nó cũng khá tương tự chỉ là được minh họa khác biệt một chút -- đến các cấp độ sau ta sẽ tìm hiểu thêm về cách thức trao đổi nội dung giữa các kho chứa này."
],
"command": "git clone",
"beforeCommand": ""
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này chỉ cần đơn giản gõ lệnh `git clone` để sao chép kho chứa hiện tại. Ta sẽ học sâu hơn ở các bài học sau."
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"zh_TW": "模擬團隊合作",
"ru_RU": "Коллективная работа",
"uk" : "Симуляція колективної роботи",
"ko" : "가짜 팀워크"
"ko" : "가짜 팀워크",
"vi" : "Giả lập làm việc nhóm"
},
"hint": {
"en_US": "remember you can specify the number of commits to fake",
@ -28,7 +29,8 @@ exports.level = {
"zh_TW": "你要記得指定要送多少個 commit 出去",
"ru_RU": "помните, Вы можете указать количество фейковых коммитов",
"uk" : "пам’ятай що ти можеш вказати кількість фейкових комітів",
"ko" : "가장할 커밋의 갯수를 조절할 수 있습니다."
"ko" : "가장할 커밋의 갯수를 조절할 수 있습니다.",
"vi" : "Nhớ rằng bạn có thể chỉ định số lượng commit để giả lập."
},
"startDialog": {
"en_US": {
@ -680,6 +682,60 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Mô phỏng hợp tác",
"",
"Bây giờ khó đây -- để chuẩn bị cho những bài học tới, chúng tôi cần chỉ bạn cách kéo về những cập nhật có trên kho chứa từ xa.",
"",
"Có nghĩa là ta cần \"giả vờ\" kho chứa từ xa được cập nhật bởi đồng nghiệp / bạn / cộng tác viên của bạn, có khi là một nhánh xác định hoặc là một số commit.",
"",
"Để làm điều này, chúng tôi sẽ giới thiệu cho bạn một lệnh tự tạo `git fakeTeamwork`! Cái tên nói lên tất cả, cùng xem thử bản giới thiệu..."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hành xử mặc định của `fakeTeamwork` đơn giản là tạo ra một commit ở trên nhánh master từ xa"
],
"afterMarkdowns": [
"Đó -- kho chứa từ xa đã được cập nhật thêm một commit, và ta chưa tải commit đó xuống vì ta chưa hề chạy lệnh `git fetch`."
],
"command": "git fakeTeamwork",
"beforeCommand": "git clone"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Bạn cũng có thể chỉ định số lượng commit bằng cách thêm con số đằng sau câu lệnh"
],
"afterMarkdowns": [
"Chỉ với một câu lệnh ta có thể giả lập tạo ra 3 commit trên nhánh `foo` từ xa của ta"
],
"command": "git fakeTeamwork foo 3",
"beforeCommand": "git branch foo; git clone"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Các cấp độ tới sẽ khá là khó, nên ở cấp độ này chúng tôi sẽ yêu cầu bạn thêm một chút.",
"",
"Sao chép một kho chứa từ xa (sử dụng `git clone`), sau đó mô phỏng một số thay đổi trong kho chứa từ xa mà bạn vừa tạo, sau đó thực hiện một số commit trên nhánh cục bộ của riêng bạn, sau đó kéo các thay đổi từ kho chứa từ xa. Nhiều bài học trong một bài."
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"zh_TW": "git fetch",
"ru_RU": "Git fetch",
"uk" : "Git fetch",
"ko" : "Git Fetch"
"ko" : "Git Fetch",
"vi" : "Git Fetch"
},
"hint": {
"en_US": "just run git fetch!",
@ -28,7 +29,8 @@ exports.level = {
"zh_TW": "只要下 git fetch 指令",
"ru_RU": "Просто выполните git fetch!",
"uk" : "Просто виконай git fetch!",
"ko" : "그냥 git fetch를 하세요!"
"ko" : "그냥 git fetch를 하세요!",
"vi" : "Gõ git fetch là được!"
},
"startDialog": {
"en_US": {
@ -906,6 +908,79 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Fetch",
"",
"Lam việc với git remote về căn bản là chuyển giao dữ liệu _qua_ và _lại_ giữa các kho chứa. Miễn là ta có thể chia sẻ qua lại các commit, ta có thể chia sẻ bất kỳ cập nhật gì được theo dõi bở git (và từ đó chia sẻ thành quả, tập tin mới, ý tưởng mới, thư tình, các kiểu con đà điểu.).",
"",
"Ở bài học này ta sẽ học cách lấy dữ liệu về _từ_ một kho chứa từ xa -- lệnh đó là `git fetch`.",
"",
"Bạn sẽ nhận thấy rằng khi ta cập nhật đại điện kho chứa từ xa, Nhánh _từ xa_ của ta cũng được cập nhật để phản ánh đại diện đó. Điều này liên quan đến bài học trước về nhánh từ xa"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Trước khi đi vào chi tiết về `git fetch`, hãy xem cách nó hoạt động! Ở đây ta có một kho chứa từ xa trong đó chứa 2 commit mà kho chứa địa phương của ta không có."
],
"afterMarkdowns": [
"Đó! Commit `C2` và `C3` đã được tải xuống kho chứa cục bộ của ta, và nhánh từ xa `o/master` của ta đã được cập nhật để phản ánh điều này."
],
"command": "git fetch",
"beforeCommand": "git clone; git fakeTeamwork 2"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Fetch làm gì",
"",
"`git fetch` thực hiện 2 bước chính, và chỉ 2 bước chính. Nó:",
"",
"* tải xuống commit có trên kho chứa từ xa mà kho chứa cục bộ của ta không có, và...",
"* cập nhật nơi mà nhánh từ xa của ta trỏ tới (ví dụ nhánh `o/master`)",
"",
"Về căn bản thì `git fetch` đưa đại diện _địa phương_ của kho chứa từ xa của ta về trạng thái đồng bộ với trạng thái _thực tế_ của kho chứa từ xa (ngay lúc này).",
"",
"Nếu bạn còn nhớ thì trong bài học trước, chúng tôi có đề cập rằng nhánh từ xa phản ánh trạng thái của kho chứa từ xa _kể từ_ kể từ lần cuối bạn tương tác với các nhánh từ xa đó. `git fetch` chính là cách để tương tác với cách nhánh từ xa! Hi vọng chúng tôi đã làm sáng tỏ sự liên kết giữa nhánh từ xa và `git fetch`.",
"",
"`git fetch` thường tương tác với kho chứa từ xa bằng Internet (thông qua các giao thức như `http://` hoặc `git://`).",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### fetch không làm gì",
"",
"Tuy nhiên, `git fetch` không hề thay đổi trạng thái kho chứa _địa phương_ của bạn. Nó sẽ không cập nhật nhánh `master` hay thay đổi bất kỳ điều gì trong hệ thống tập tin hiện tại của bạn.",
"",
"Điều này rất quan trọng, vì nhiều nhà phát triển nghĩ rằng `git fetch` sẽ làm kho chứa địa phương của họ phản ánh trạng thái của kho chúa từ xa. Nó có thể tải xuống tất cả dữ liệu cần thiết, nhưng nó thực tế _không_ thay đổi bất cứ thứ gì trên tập tin địa phương của bạn. Ta sẽ học lệnh để làm điều đó sau :D",
"",
"Nói tóm lại, bạn có thể coi `git fetch` thuần túy như một bước tải xuống."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, đơn giản hãy gõ `git fetch` để tải xuống tất cả commit!"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"ja" : "Fetchの引数",
"ru_RU": "Аргументы для fetch",
"ko" : "Fetch의 인자들",
"uk" : "Аргументи для fetch"
"uk" : "Аргументи для fetch",
"vi" : "Tham số fetch"
},
"hint": {
"en_US": "Pay attention how the commit ids may have swapped! You can read slides again with \"help level\"",
@ -28,7 +29,8 @@ exports.level = {
"ja" : "コミットIDの入れ替わりに注意スライドを復習するには`help level`を実行",
"ru_RU": "Обратите внимание на то, как номера коммитов могут меняться! Вы можете прочесть слайды вновь, воспользовавшись командой \"help level\"",
"ko" : "커밋 ID가 바뀔수도있으니 주의하세요! \"help level\"을 입력하면 슬라이드들을 다시 읽어볼수 있습니다.",
"uk" : "Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою \"help level\""
"uk" : "Зверни увагу на те, що номери комітів можуть змінюватися! Слайди уроку можна переглянути ще раз командою \"help level\"",
"vi" : "Lưu ý id của các commit bị tráo đổi, bạn có thể dùng \"help level\" để đọc lại hội thoại"
},
"startDialog": {
"en_US": {
@ -1383,6 +1385,129 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tham số Git fetch",
"",
"Chúng ta vừa tìm hiểu về tham số của git push, sự tuyệt vời của tham số `<vị trí>`, và thậm chí cả refspecs (`<nguồn>:<đích>`). Liệu ta có thể áp dụng điều này vào `git fetch` không nhỉ?",
"",
"Đoán chuẩn rồi đấy! Tham số cho lệnh `git fetch` thực ra *rất, rất* giống với `git push`. Chúng có chung khái niệm nhưng được áp dụng cho hướng ngược lại(vì bây giờ ta tải xuống commit chứ không phải tải lên).",
"",
"Hãy lần lượt đi qua từng khái niệm một..."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Tham số `<vị trí>`",
"",
"Nếu bạn chỉ định vị trí cho `git fetch` như câu lệnh dưới:",
"",
"`git fetch origin foo`",
"",
"Git sẽ lênh nhánh `foo` trên kho chứa từ xa, lấy toàn bộ các commit chưa có trên kho chứa cục bộ và thả chúng xuống nhánh `o/foo` ở kho chứa cục bộ.",
"",
"Hãy xem một ví dụ (vẫn là câu lệnh trên nhưng mà trực quan hơn)."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Thông qua chỉ định vị trí..."
],
"afterMarkdowns": [
"Ta chỉ tải xuống commit ở trên nhánh `foo` và đặt chúng ở nhánh `o/foo`"
],
"command": "git fetch origin foo",
"beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Có thể bạn sẽ thắc mắc -- tại sao git lại thả các commit xuống nhánh `o/foo` thay vì nhánh `foo` ở kho chứa cục bộ? Tôi tưởng tham số `<vị trí>` tồn tại ở cả kho chứa cục bộ và kho chứa từ xa mà?",
"",
"Chà trong trường hợp này git ứng xử có một chút ngoại lệ đặc biệt, vì có thể bạn đang làm việc trên nhánh `foo` ở kho chứa cục bộ mà bạn không muốn nó bị làm rối!! Điều này liên kết đến bài học trước về `git fetch` -- nó không cập nhật nhánh cục bộ không liên kết nhánh từ xa của bạn(nhánh không có tiền tố `origin/`), nó chỉ tải xuống các commit( mà bạn có thể xem xét hoặc hợp nhất sau).",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"\"Nếu vậy, thì điều gì sẽ xảy ra nếu tôi chỉ định cả nguồn và đích với `<nguồn>:<đích>`?\"",
"",
"Nếu bạn nhất quyết muốn tải commit *trực tiếp* xuống nhánh cục bộ,thì bạn có thể chỉ định điều này bằng cách dùng refspec hai chấm. Bạn không thể nạp commit vào nhánh mà bạn đang đứng, nhưng git sẽ cho phép bạn làm điều này:",
"",
"Đây là cách duy nhất -- `<nguồn>` là vị trí trên kho *từ xa* và `<đích>` là vị trí *cục bộ* để đặt các commit. Điều này hoàn toàn ngược lại với `git push`, và đó là tất nhiên thôi vì ta đang chuyển giao dữ liệu theo hướng ngược lại!",
"",
"Thực tế là, các nhà phát triển rất hiếm khi làm điều này. Tôi giới thiệu về nó chủ yếu là vì muốn giải thích rõ hơn việc `fetch` và `push` là khá tương đồng, chỉ là theo hướng ngược lại."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Lấy một ví dụ điên rồ..."
],
"afterMarkdowns": [
"Wao! Thấy chứ, git diễn giải `foo~1` thành một vị trí trên kho chứa từ xa sau đó tải xuống các commit lên nhánh `bar` ở kho chứa cục bộ. Để ý rằng nhánh `foo` và `o/foo` không hề được cập nhật vì ta đã chỉ định đích đến."
],
"command": "git fetch origin foo~1:bar",
"beforeCommand": "git branch foo; git clone; git branch bar; git fakeTeamwork foo 2"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nếu như đích đến chưa hề tồn tại trước khi tôi chạy lệnh thì sao? Cùng xem lại ví dụ vừa rồi nhưng lần này nhánh `bar` chưa hề tồn tại."
],
"afterMarkdowns": [
"Thấy chứ, nó Y HỆT với git push. Git tạo ra đích đến ở kho chứa cục bộ trước khi nạp, cũng giống như git sẽ tạo ra đích đến trên kho chứa từ xa trước khi đẩy (trong trường hợp nó không tồn tại)."
],
"command": "git fetch origin foo~1:bar",
"beforeCommand": "git branch foo; git clone; git fakeTeamwork foo 2"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Không có tham số?",
"",
"Nếu lệnh `git fetch` không nhận được bất kỳ tham số nào, nó sẽ tải xuống tất cả các commit có trên kho chứa từ xa lên tất cả các nhánh từ xa ở kho chứa cục bộ..."
],
"afterMarkdowns": [
"Khá là đơn giản, nhưng mà cũng nên xem qua thử."
],
"command": "git fetch",
"beforeCommand": "git branch foo; git clone; git fakeTeamwork foo; git fakeTeamwork master"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Được rồi, lý thuyết như vậy là đủ rồi! Để hoàn thành cấp độ này, hãy chỉ nạp những commit được chỉ định trong mô tả mục tiêu. Thoải mái ứng biến với những câu lệnh nhé!",
"",
"Bạn sẽ phải chỉ định nguồn và dích cho lệnh fetch. Chú ý đến mô tả mục tiêu vì các ID có thể bị xáo trộn!"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"ja" : "履歴の分岐",
"ru_RU": "Расхождение в истории",
"uk" : "Розбіжності в історії",
"ko" : "엇갈린 히스토리"
"ko" : "엇갈린 히스토리",
"vi" : "Dị biệt lịch sử"
},
"hint": {
"en_US": "check out the ordering from the goal visualization",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "regardez l'ordre dans la fenêtre de visualisation d'objectif",
"ru_RU": "проверьте сортировку в визуализации цели",
"uk" : "перевірте порядок в візуалізації цілі",
"ko" : "순서는 goal을 참고하세요"
"ko" : "순서는 goal을 참고하세요",
"vi" : "kiểm tra kỹ thứ tự trên mô hình mục tiêu"
},
"startDialog": {
"en_US": {
@ -1747,6 +1749,149 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Diverged Work",
"",
"Cho đến giờ ta đã biết cách `kéo`(`pull`) commit từ nơi khác về và cách `đẩy`(`push`) lên những thay đổi của ta. Chúng nhìn có vẻ khá đơn giản, vậy tại sao người ta lại thấy lúng túng về chúng?",
"",
"Khó khăn đến từ sự *dị biệt* của cây lịch sử trên kho chứa từ xa. Trước khi đi vào thảo luận chi tiết vấn đề này, hãy xem qua một ví dụ...",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Tưởng tượng bạn sao chép một kho chứa vào thứ Hai và bắt đầu phát triển một tính năng mới. Đến thứ Sáu thì bạn đã sẵn sàng để xuất bản thành quả của mình -- nhưng không! Đồng nghiệp của bạn đã viết thêm hàng loạt mã trong một tuần vừa rồi và điều này làm cho chức năng của bạn trở nên lỗi thời. Và họ cũng đã xuất bản những commit này lên kho chứa từ xa chung, vậy giờ thành quả của *bạn* lại dựa trên phiên bản *cũ* của dự án mà nó không còn thích đáng nữa.",
"",
"Trong trường hợp này, lệnh `git push` trở lên khá nhập nhằng. Nếu bạn dùng `git push`, liệu git nên thay đổi kho chứa từ xa trơ rveef trạng thái ngày thứ Hai? Hay nó nên cố gắng thêm mã của bạn vào trong khi không xóa mã mới? Hay là nó sẽ bỏ qua hoàn toàn mã của bạn vì nó đã lỗi thời?",
"",
"Vì có quá nhiều tình huống mơ hồ (dị biệt lịch sử), git sẽ không cho phép bạn `đẩy`(`push`) thay đổi của mình. Nó sẽ ép bạn phải sát nhập trạng thái mới nhất của kho chứa từ xa vào thành phẩm của mình trước khi chia sẻ chúng."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nói quá nhiều rồi! Đi vào hành động thôi"
],
"afterMarkdowns": [
"Thấy chứ? Không có gì xảy ra cả vì lệnh bị thất bại. `git push` thất bại vì commit mới nhất của bạn: `C3` dựa trên commit `C1` ở nhánh từ xa. Nhánh đó đã được cập nhật lên commit `C2`, nên git từ chối lệnh đẩy của bạn"
],
"command": "git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Vậy thì giải quyết tình huống này sao giờ? Đơn giản thôi, tất cả những gì bạn cần làm là khiến cho thành quả của mình dựa trên phiên bản mới nhất của nhánh từ xa.",
"",
"Có vài cách để làm điều này, nhưng cách trực tiếp nhất là bố trí lại (dùng rebase) để di chuyển thành quả của bạn. Cùng xem cách nó hoạt động nào."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nào bây giờ trước push ta dùng rebase thì..."
],
"afterMarkdowns": [
"Bùùm! Ta đã cập nhật nhánh từ xa trong kho chứ cục bộ với `git fetch`, dịch chuyển thành quả của mình để phản ánh thay đổi mới của kho chứa từ xa, sau đó đẩy chúng lên với `git push`"
],
"command": "git fetch; git rebase o/master; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Có cách nào khác để cập nhật thành quả của mình khi kho chứa từ xa được cập nhật không? Tất nhiên rồi! Hãy xem xét điều tương tự với `merge`.",
"",
"Mặc dù `git merge` không dịch chuyển commit của bạn (thay vì đó nó tạo ra một commit hơp nhất), đó là cách để nói với git rằng bạn đã kết hợp tất cả thay đổi từ nhánh từ xa. Đó là bởi vì bây giờ nhánh từ xa đã trở thành một *tổ tiên* của nhánh cục bộ của bạn, nghĩa là commit của bạn có thể tham chiếu điến tất cả commit có ở nhánh tù xa.",
"",
"Hãy xem qua bản biểu diễn sau..."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Giờ nếu ta dùng merge thay vày rebase thì..."
],
"afterMarkdowns": [
"Bùùm! Ta đã cập nhật đại diện nhánh từ xa tại kho chứa địa phương với `git fetch`, *hợp nhất* (*merge*) thành quả mới vào thành quả của ta (để phản ánh thay đổi ở nhánh từ xa), sau đó đẩy chúng lên với `git push`"
],
"command": "git fetch; git merge o/master; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Tuyệt vời! Có cách nào để làm việc này mà không phải gõ nhiều lệnh thế không nhỉ?",
"",
"Tất nhiên rồi -- bạn đã biết rằng `git pull` là lệnh tắt của fetch và merge. Tương tự như vậy, `git pull --rebase` là lệnh tắt của fetch và rebase!",
"",
"Hãy xem thử cách lệnh tắt này hoạt động ra sao."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Trước tiên với `--rebase`..."
],
"afterMarkdowns": [
"Giống hệt như trước! Chỉ là lệnh ngắn hơn."
],
"command": "git pull --rebase; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Và giờ với lệnh `pull` thông thường"
],
"afterMarkdowns": [
"Lại một lần nữa, chính xác y hệt như trước!"
],
"command": "git pull; git push",
"beforeCommand": "git clone; git fakeTeamwork; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Quy trình tìm nạp (fetch), bố trí lại/hợp nhất (rebase/merge), và đẩy (push) là khá phổ biết. Ta sẽ xem xét các phiên bản phức tạp hơn của những quy trình này ở các bài học sau, còn bây giờ thì hãy tập trung vào bài này đã.",
"",
"Để giải quyết cấp độ này, hãy làm các bước sau:",
"",
"* Nhân bản kho chứa của bạn",
"* Giả lập làm việc nhóm (1 commit)",
"* Tạo ra 1 commit địa phương",
"* Xuất bản thành quả của bạn dùng *rebase*"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Fusionner avec les branches distantes",
"ru_RU": "Слияние с удалённым репозиторием",
"ko" : "원격 작업과 merge하기",
"uk" : "Мердж з віддаленим репозиторієм"
"uk" : "Мердж з віддаленим репозиторієм",
"vi" : "Hợp nhất nhánh từ xa"
},
"hint": {
"en_US": "Pay attention to the goal tree!",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "Respectez l'arbre représentant l'objectif !",
"ru_RU": "Внимательно посмотрите на цель уровня!",
"ko" : "goal을 잘 살펴보세요!",
"uk" : "Уважно подивись як має виглядати результат!"
"uk" : "Уважно подивись як має виглядати результат!",
"vi" : "Hãy để ý đến cây mục tiêu!"
},
"compareOnlyMaster": true,
"startDialog": {
@ -571,6 +573,51 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tại sao không hợp nhất?",
"",
"Để có thể đẩy cập nhật của bạn lên kho nhánh từ xa, tất cả những gì bạn cần làm là *kết nạp* thay đổi mới nhất từ nhánh từ xa. Nghĩa là bạn có thể dùng tái bố trí *hoặc* hợp nhất với nhánh từ xa (ví dụ `o/master`).",
"",
"Vậy ta có thể sử dụng một trong 2 cách, thì tại sao đến giờ ta chỉ tập trung vào tái bố trí trong các bài học? Tại sao khi làm việc với nhánh từ xa lại ta lại không thích `hợp nhất` (`merge`)?",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Trong cộng đồng phát triền phần mềm có rất nhiều tranh luận về ưu, nhươc, khuyết của việc sử dụng tái bố trí(`rebase`) hay hợp nhất(`merge`). Dưới đây là một vài ưu / nhược cơ bản của tái bố trí:",
"",
"Ưu điểm:",
"",
"* Tái bố trí làm cây commit của bạn trông gọn gàng hơn nhiều vì mọi thứ được xếp theo đường thẳng",
"",
"Nhược điểm:",
"",
"* Tái bố trí sửa đổi lịch sử (biểu hiện) của cây commit.",
"",
"Ví dụ, commit `C1` có thể bố trí lên *sau* `C3`. Thế là `C1'` biểu hiện như là nó xuất hiện sau `C3` trong khi thực tế nó được hoàn thành trước đó.",
"",
"Có những nhà phát triển muốn tôn trọng tính lịch sự nên họ ưa thích hợp nhất hơn. Những người khác (như tôi chẳng hạn) thì thiên về tái bố trí hơn vì muốn có cây commit gọn gàng. Rốt cục cũng là thiên hướng thôi :D"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Ở cấp độ này, hãy thử giải bài tập trước nhưng mà với *hợp nhất*. Có lẽ bài này hơi thừa nhưng mà nó mịnh họa quan điểm trên rõ ràng hơn."
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Git pull",
"ru_RU": "Git pull",
"uk" : "Git pull",
"ko" : "Git pull"
"ko" : "Git pull",
"vi" : "Git pull"
},
"hint": {
"en_US": "Just run git pull!",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "Utilisez facilement git pull !",
"ru_RU": "Запустите комманду git pull !",
"uk" : "Просто виконай git pull !",
"ko" : "그냥 git pull을 하세요!"
"ko" : "그냥 git pull을 하세요!",
"vi" : "Đơn giản là gõ git pull!",
},
"startDialog": {
"en_US": {
@ -738,6 +740,65 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Pull",
"",
"Ta đã biết cách dùng `git fetch` để nạp các commit từ kho chứa từ xa, giờ hãy cập nhật các commit này vào các nhánh địa phương!",
"",
"Thực ra thì có nhiều cách đề làm điều này -- một khi bạn đã có các commit này ở ko chứa địa phương, bạn có thể hợp nhất chúng như với các commit ở các nhánh khác. Nghĩa là bạn có thể sử dụng các câu lệnh sau:",
"",
"* `git cherry-pick o/master`",
"* `git rebase o/master`",
"* `git merge o/master`",
"* etc., etc.",
"",
"Thực tế thì, quá trình *nạp* commit từ kho chứa từ xa và *hợp nhất* chúng phổ biết đến nỗi git cung cấp một câu lệnh để làm cả 2 điều này một lúc! Đó là `git pull`."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Trước tiên hãy xem quá trình `nạp` và `hợp nhất` được thực hiện một cách tuần tự"
],
"afterMarkdowns": [
"Bùùm -- ta tải xuống commit `C3` với lệnh `git fetch` rồi sau đó hợp nhất nó với lệnh `git merge o/master`. Giờ thì nhánh `master` đã phản ánh trạng thái mới từ kho chứa từ xa (trong trường hợp này là `origin`)"
],
"command": "git fetch; git merge o/master",
"beforeCommand": "git clone; git commit; git fakeTeamwork"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nếu thay vì dó ta dùng `git pull` thì điều gì xảy ra?"
],
"afterMarkdowns": [
"Cũng như nhau! Điều đó có nghĩa là `git pull` về cơ bản là cách làm tắt cho việc thực hiện tuần tự `git fetch` sau đó là hợp nhất các nhánh từ xa được nạp."
],
"command": "git pull",
"beforeCommand": "git clone; git commit; git fakeTeamwork"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Ta sẽ tìm hiều chi tiết về `git pull` sau (bao gồm các tùy chọn và tham số), còn bây giờ thì cứ dùng thử nó ở cấp độ này đã.",
"",
"Nhớ rằng -- bạn có thể giải quyết cấp độ này với `fetch` và sau đó `merge`, nhưng mà như thế thì lại tốn têm một câu lệnh :P"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Arguments de pull",
"ru_RU": "Аргументы для pull",
"ko" : "pull 인자들",
"uk" : "Аргументи pull"
"uk" : "Аргументи pull",
"vi" : "Tham số pull"
},
"hint": {
"en_US": "Remember that you can create new local branches with fetch/pull arguments",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "Vous pouvez aussi créer une nouvelle branche locale avec les arguments de fetch/pull",
"ru_RU": "Напоминаю, что новые ветки можно создавать и с помощью команд fetch/pull",
"ko" : "fetch/pull 과 인자들로 새 로컬 브랜치를 생성할수 있다는것을 기억하세요.",
"uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами"
"uk" : "Пам'ятай, що ти можеш створювати нові гілки, використовуючи fetch/pull з аргументами",
"vi" : "Nhớ rằng,bạn có thể tạo nhánh cục bộ mới với tham số của fetch/pull"
},
"startDialog": {
"en_US": {
@ -844,6 +846,80 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tham số git pull",
"",
"Giờ thì bạn đã biết gần như là *tất cả* về tham số của `git fetch` và `git push`, thế thì hầu như chẳng còn gì mới cho git pull cả :)",
"",
"Đó và vì nói cho cùng thì git pull *về thực tế* cũng chỉ là lệnh tắt cho tìm nạp và sau đó là hợp nhất những gì vừa mới được nạp. Bạn có thể coi nó như là chạy lệnh git fetch với *cùng* tham số được chỉ định và sau đó hợp nhất các commit vào *nơi* được chỉ định.",
"",
"Điều này được áp dụng kể cả khi bạn sử dụng những tham số phức tạp đến độ điên rồ. Hãy xem qua một vài ví dụ:"
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Dưới đây là một vài câu lệnh tương đồng nhau trong git:",
"",
"`git pull origin foo` tương đương với:",
"",
"`git fetch origin foo; git merge o/foo`",
"",
"Và...",
"",
"`git pull origin bar~1:bugFix` tương đương với:",
"",
"`git fetch origin bar~1:bugFix; git merge bugFix`",
"",
"Thấy chứ? git pull thực ra chỉ là lệnh tắt cho fetch + merge, và tất cả những gì git pull quan tâm là nơi mà các commit sẽ tới (tham số `đích` mà nó diễn giải được trong quá trình nạp).",
"",
"Hãy xem qua một bản giới thiệu:"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nếu ta chỉ định vị trí để nạp, mọi thứ diễn ra như với git fetch nhưng giờ đây có thêm một bước đó là ta hợp nhất những gì mà ta đã nạp"
],
"afterMarkdowns": [
"Thấy chứ! Bằng cách chỉ định nhánh `master` ta tải các commit xuống nhánh `o/master` như thường lệ. Sau đó hợp nhất nhánh `o/master` vào nhánh cục bộ mà ta đang đứng, nhánh mà *không phải* nhánh cục bộ `master`. Nhờ vậy mà ta có thể chạy cùng một lệnh git pull(với cùng tham số) nhiều lần ở những vị trí khác nhau để áp dụng cùng cập nhật lên các nhánh khác nhau."
],
"command": "git pull origin master",
"beforeCommand": "git clone; go -b bar; git commit; git fakeTeamwork"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Điều này có hoạt động với đích và nguồn không? Đoán đúng rồi đấy! Cùng xem thử nào:"
],
"afterMarkdowns": [
"Wao, quá NHIỀU trong một câu lệnh. Ta tạo ra một nhánh cục bộ là `foo`, tải commit xuống từ nhánh từ xa master xuống nhánh `foo` đó, và sau đó hợp nhất commit vào nhánh `bar` mà ta đang đứng. Đủ thứ luôn!!!"
],
"command": "git pull origin master:foo",
"beforeCommand": "git clone; git fakeTeamwork; go -b bar; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Được rồi, để kết thúc khóa học, hãy đạt đến mục tiêu được mô tả. Bạn sẽ cần tải xuống vài commit, tạo ra vài nhánh mới, và hợp nhất những nhánh đó sang những nhánh khác, nhưng mà đừng dùng nhiều lệnh quá nhé :P"
]
}
}
]
}
}
};

View file

@ -17,7 +17,8 @@ exports.level = {
"fr_FR": "Git push",
"ru_RU": "Git push",
"uk" : "Git push",
"ko" : "Git push"
"ko" : "Git push",
"vi" : "Git push"
},
"hint": {
"en_US": "Remember you have to clone before you can push!",
@ -30,7 +31,8 @@ exports.level = {
"fr_FR": "Rappelez-vous que vous devez cloner avant de pouvoir faire un push !",
"ru_RU": "Помните, что прежде чем push-ить вам нужно склонировать репозиторий!",
"uk" : "Пам’ятай, що перед тим як щось push-нути потрібно склонувати репозиторій!",
"ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!"
"ko" : "push를 하기전에 clone을 먼저해야 된다는것을 기억하세요!",
"vi" : "Nhớ rằng bạn phải clone trước khi push!"
},
"startDialog": {
"en_US": {
@ -543,6 +545,49 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Git Push",
"",
"Được rồi, ta đã biết cách nạp thay đổi từ kho chứa từ xa và kết hợp chúng vào các nhánh cục bộ. Khá là tuyệt rồi... nhưng nếu tôi muốn chia sẻ tác phẩm tuyệt vời _của tôi_ với mọi người khác thì sao?",
"",
"Chà, cách tải lên thì phải ngược với tải xuống rồi. Vậy thì đối nghịch của `git pull`(kéo) là gì? `git push`(đẩy)!",
"",
"`git push` có trách nhiệm tải lên thay đổi _của bạn_ vào nhánh từ xa được chỉ định và cập nhật nhánh đó để kết hợp với commit đẩy lên của bạn. Một khi lệnh `git push` hoàn thành, tất cả bạn bè của bạn có thể tải xuống thay đổi của nhánh từ xa đó đó.",
"",
"Bạn có thể xem `git push` là câu lệnh để \"xuất bản\" thành quả công việc của bạn. Lệnh này có nhiều tính năng tinh tế mà ta sẽ tìm hiểu nhanh thôi, nhưng giờ hãy cứ bắt đầu với từng bước nhỏ đã...",
"",
"*lưu ý --`git push` mà không có tham số hành xử tùy biến phụ thuộc vào cài đặt của git là `push.default`. Giá trị mặc định cho cài đặt này phụ thuộc vào phiên bản git mà bạn đang sử dụng, còn ở bài học của chúng ta thì ta sẽ sử dụng giá trị `upstream` (ngược dòng). Bây giờ thì đó chưa phải là vấn đề gì lớn, nhưng chúng tôi khuyến nghị bạn kiểm tra cài đặt của mình trước khi đẩy lên dự án của bạn.*"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Ở đây ta có một vài thay đổi mà kho chứa từ xa không có. Hãy tải chúng lên!"
],
"afterMarkdowns": [
"Đó -- kho chứa từ xa đã nhận được commit `C2`, nhánh `master` ở kho chứa từ xa đã được cập nhật lên `C2`, và phản chiếu nhánh từ xa *của ta* (`o/master`) cũng được cập nhật luôn. Mọi thứ đã đồng bộ!"
],
"command": "git push",
"beforeCommand": "git clone; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, đơn giản là hãy chia sẻ 2 commit mới với kho chứa từ xa. Chuẩn bị tinh thần nhé, vì các bài học sẽ khó dần lên nhiều đấy!"
]
}
}
]
}
}
};

View file

@ -17,7 +17,8 @@ exports.level = {
"fr_FR": "Arguments de git push",
"ru_RU": "Аргументы git push",
"ko" : "git push의 인자들",
"uk" : "Аргументи git push"
"uk" : "Аргументи git push",
"vi" : "Tham số git push"
},
"hint": {
"en_US": "You can always look at the last slide of the dialog with \"objective\"",
@ -31,7 +32,8 @@ exports.level = {
"fr_FR": "Vous pouvez toujours regarder le dernier slide des dialogues en tapant \"objective\".",
"ru_RU": "Вы всегда можете ознакомиться с последним слайдом, воспользовавшись \"objective\".",
"ko" : "대화창의 마지막 슬라이드를 \"objective\"로 다시 볼 수 있습니다.",
"uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\""
"uk" : "Завжди можна подивитися останній слайд діалогу за допомогою \"objective\"",
"vi" : "Bạn có thể sử dụng \"objective\" để đọc trang cuối của cửa sổ hộp thoại"
},
"startDialog": {
"en_US": {
@ -840,6 +842,81 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Tham số đẩy",
"",
"Tuyệt! Bạn đã biết đến theo dõi từ xa, giờ thì ta có thể tìm hiểu sâu hơn về cách hoạt động của đẩy( `git push`), tìm nạp(`git fetch`) và kéo(`git pull`). Ta sẽ giải quyết từng câu lệnh một nhưng về căn bản chúng khá là giống nhau.",
"",
"Trước hết hãy xem qua `git push`. Trong bài học về theo dõi từ xa bạn đã biết rằng git sử dụng thuộc tính(nhánh từ xa mà nó \"theo dõi\") của nhánh hiện tại để xác định kho và nhánh từ xa để đẩy. Git làm việc này mà không cần tham số chỉ định, nhưng lệnh git push có thể thêm tham số dưới dạng sau:",
"",
"`git push <tên kho từ xa> <vị trí>`",
"",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Tham số `<vị trí>` là gì vậy? Chúng ta sẽ đi sâu vào chi tiết sau sau, hãy xem ví dụ trước. Đưa ra câu lệnh:",
"",
"`git push origin master`",
"",
"được dịch lại là:",
"",
"*Chuyển sang nhánh \"master\" trong kho lưu trữ cục bộ, nhận tất cả các commit và tìm nhánh \"master\" trong kho chứa từ xa tên là \"origin\". Thêm tất cả các commit không có trong nhánh đó và báo cho tôi biết khi nào hoàn tất.*",
"",
"Bằng cách chỉ định `master` trong tham số \"vị trí\",ta báo với git nơi mà commit *xuất phát* và nơi chúng *sẽ đến*. Về căn bản nó là \"địa điểm\" để đồng bộ hóa 2 kho chứa.",
"",
"Lưu ý rằng ta ta đã thông báo cho gi tất cả thông tin cần thiết( thông qua chỉ định 2 tham số), nó sẽ không quan tâm nhánh mà ta đang đứng!"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy xem xét một ví dụ về việc xác định tham số. Lưu ý vị trí nhánh mà ta đang đứng."
],
"afterMarkdowns": [
"Được rồi! Bằng cách chỉ định các tham số, nhánh `master` trong kho lưu trữ từ xa đã được cập nhật."
],
"command": "git checkout C0; git push origin master",
"beforeCommand": "git clone; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Giả sử ta không chỉ định các tham số thì sao? Điều gì sẽ xảy ra?"
],
"afterMarkdowns": [
"Lệnh thất bại (như bạn có thể thấy, không có gì xảy ra)! Bởi vì `HEAD` không trỏ đến nhánh nào có theo dõi từ xa."
],
"command": "git checkout C0; git push",
"beforeCommand": "git clone; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Được rồi, trong cấp độ này hãy cập nhánh `foo` và `master` trên kho lưu trữ từ xa. Cái khó là ở cấp độ này lệnh `git checkout` đã bị vô hiệu hóa!",
"",
"*Chú ý: Các nhánh từ xa được đánh dấu bằng tiền tố `o/` bời vì UI của chúng tôi không chứa được hết `origin/`. Đừng lo ",
"về vấn đề này... đơn giản cứ dùng `origin` như bình thường thôi.*"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Arguments de git push -- toujours plus !",
"ru_RU": "Аргументы для push -- расширенная версия!",
"ko" : "git push 인자 -- 확장판!",
"uk" : "Розширені аргументи git push!"
"uk" : "Розширені аргументи git push!",
"vi" : "Tham số git push -- bản mở rộng!"
},
"hint": {
"en_US": "Remember you can admit defeat and type in \"show solution\" :P",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "N'oubliez pas que vous pouvez toujours déclarer forfait avec \"show solution\" :P",
"ru_RU": "Помните, Вы всегда можете признать своё поражение, набрав команду \"show solution\" (показать решение) :P",
"ko" : "혹시 아세요? 패배를 인정하고 \"show solution\"을 입력할 수 있다는 걸요 :P",
"uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P"
"uk" : "Пам'ятай, ти завжди можеш визнати поразку і підглянути рішення командою \"show solution\" :P",
"vi" : "Nhớ rằng, bạn có thể thừa nhận thất bại và gõ \"show solution\" :P"
},
"startDialog": {
"en_US": {
@ -800,6 +802,76 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Chi tiết về tham số `<vị trí>`",
"",
"Nhớ lại học trước, khi chỉ định tham số `<vị trí>` là `master` cho lệnh `git push`, ta cũng đã chỉ định nguồn và đích cho các commit.",
"",
"Có thể bạn sẽ thắng mắc -- Nếu như ta muốn nguồn và đích khác đi thì sao? Nếu như ta muốn đẩy commit từ nhánh cục bộ `foo` lên nhánh từ xa `bar` thì sao?",
"",
"Chà đáng tiếc là điều này là bất khả thi tron git... đùa thôi! Tất nhiên là làm được chứ :)... git có nhiều và rất nhiều lựa chọn linh động(có lẽ là quá nhiều)",
"",
"Hãy xem cách nó hoạt động ..."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để chỉ định `<vị trí>` cho cả nguồn và đích, chỉ cần sử dụng dấu hai chấm `:` để kết nối cả hai:",
"",
"`git push origin <nguồn>:<đích>`",
"",
"Giá trị thực của tham số này là một refspec, \"refspec\" là một từ tự tạo, nghĩa là một vị trí được Git nhận ra (chẳng hạn như nhánh `foo` hoặc` HEAD ~ 1`).",
"",
"Một khi bạn đã chỉ định các nguồn và đích độc lập, bạn có thể thao tác với kho chứa từ xa một cách khá thú vị và chính xác, hãy xem bản demo!"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nhớ rằng, `nguồn` là bất kỳ vị trí nào mà git hiểu:"
],
"afterMarkdowns": [
"Wao! Lệnh này khá phức tạp, nhưng mà hợp lý -- git diễn giải `foo^` thành một vị trí, tải lên tất cả các commit từ đó trở về trước mà chưa có trên nhánh đích rồi cập nhật nó."
],
"command": "git push origin foo^:master",
"beforeCommand": "git clone; go -b foo; git commit; git commit"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nếu như đích đến mà bạn muốn không tồn tại thì sao? Chẳng sao cả! Đơn giản hãy gõ tên nhánh và git sẽ tạo nhánh đó trên kho chứa từ xa cho bạn."
],
"afterMarkdowns": [
"Tuyệt vời, thấy git thú vị không :D"
],
"command": "git push origin master:newBranch",
"beforeCommand": "git clone; git commit"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Ở cấp độ này, hãy hoàn thành mục tiêu được mô tả, và hãy nhớ cấu trúc:",
"",
"`<nguồn>:<đích>`"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Rappelez-vous que vous pouvez toujours utiliser les commandes undo et reset.",
"ru_RU": "Помни - ты всегда можешь отменить команды с помощью undo или reset",
"ko" : "명령어를 undo와 reset으로 되돌릴 수 있다는 것을 잊지마세요",
"uk" : "Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset"
"uk" : "Пам'ятай, ти в будь-який момент можеш використовувати команди undo або reset",
"vi" : "Nhớ rằng bạn luôn luôn có thể hoàn tác hoặc soạn lại câu lệnh "
},
"name": {
"en_US": "Push Master!",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "Maître du push !",
"ru_RU": "Push Мастер!",
"ko" : "Push Master!",
"uk" : "Push Maйстер!"
"uk" : "Push Maйстер!",
"vi" : "Push Master!"
},
"compareOnlyMasterHashAgnostic": true,
"startDialog": {
@ -667,6 +669,59 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Sáp nhập các nhánh tính năng",
"",
"Giờ thì bạn đã quen thuộc với tìm nạp, kéo và đẩy, bây giờ chúng tôi sẽ kiểm tra kỹ năng của bạn với một quy trình làm việc mới.",
"",
"Trong các dự án lớn, các nhà phát triển thường làm việc trên các nhánh tính năng (được phân nhánh từ `master`) và chỉ thực hiện tích hợp sau khi công việc hoàn thành. Điều này tương tự như mô tả trong bài học trước (đẩy nhánh bên sang kho lưu trữ từ xa), nhưng chúng ta sẽ đi sâu hơn một chút trong phần này.",
"",
"Một vài nhà phát triển chỉ thực hiện đẩy và kéo khi ở trên nhánh `master` -- như vậy thì nhánh `master` luôn luôn được cập nhật với nhánh từ xa (`o/master`).",
"",
"Vậy nên với quy trình làm việc này chúng tôi đã kết hợp 2 việc:",
"",
"* tích hợp nhánh chức năng lên nhánh `master`, và",
"* đẩy và kéo từ nhánh từ xa"
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy xem qua cách cập nhật nhánh `master` và đẩy lên nhánh từ xa hoạt động như thế nào."
],
"afterMarkdowns": [
"Ta thực thi 2 câu lệnh làm việc sau:",
"",
"* tái bố trí (`rebase`) thành quả của ta lên commit của nhánh từ xa, và",
"* xuất bản thành quả của ta lên nhánh từ xa"
],
"command": "git pull --rebase; git push",
"beforeCommand": "git clone; git commit; git fakeTeamwork"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Cấp độ này khá là phức tạp đấy -- để hoàn thành thì hãy xem qua hướng dẫn cơ bản sau:",
"",
"* Có 3 nhánh chức năng là -- `side1` `side2` vả `side3`",
"* Chúng tôi muốn bạn đẩy từng nhánh chức năng, theo thứ tự, lên nhánh từ xa",
"* Nhánh từ xa cũng đã được cập nhật, nên ta cũng cần sát nhập thay đổi đó nữa",
"",
":O khoai đây! Cố lên nhé, hoàn thành cấp độ này là lên trình nhiều lắm đấy."
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Les branches distantes",
"ru_RU": "Удалённые ветки",
"ko" : "원격 브랜치(remote branch)",
"uk" : "Віддалені гілки"
"uk" : "Віддалені гілки",
"vi" : "Nhánh từ xa"
},
"hint": {
"en_US": "Pay attention to the ordering -- commit on master first!",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "Prêtez attention à l'ordre -- les commits sur master d'abord !",
"ru_RU": "Уделяйте внимание очерёдности -- сперва commit на master",
"ko" : "순서에 주의하세요 -- master에서 먼저 커밋하세요!",
"uk" : "Звертайте увагу на послідовність -- спочатку коміт в мастер!"
"uk" : "Звертайте увагу на послідовність -- спочатку коміт в мастер!",
"vi" : "Chú ý đến thứ tự -- commit trên nhánh master trước!"
},
"startDialog": {
"en_US": {
@ -762,6 +764,67 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Nhánh Git từ xa",
"",
"Giờ bạn đã thấy cách thức hoạt động của `git clone`, cùng xem xét kỹ hơn những gì đã xảy ra.",
"",
"Điều đầu tiên mà có thể bạn để ý là một nhánh mới xuất hiện trong kho chứa địa phương của ta là `o/master`. Loại nhánh này được gọi là nhánh _từ xa_ (_remote_) ; nhánh từ xa có những thuộc tính đặc biệt vì chúng phục vụ những mục đích duy nhất.",
"",
"Nhánh từ xa phản ánh _trạng thái_ (_state_) của kho chứa từ xa (kể từ lần cuối cùng bạn tương tác với kho chứa từ xa). Chúng giúp bạn hiểu về sự khác biệt giữa công tác trên kho chứa cục bộ với kho chứa từ xa -- một bước quan trọng trước khi chia sẻ công việc của bạn với người khác.",
"",
"Nhánh từ xa có một thuộc tính đặc biệt đó là khi bạn chuyển sang chúng bạn sẽ vào trạng thái tách rời `HEAD`. Git chủ tâm làm việc này vì bạn không thể công tác trực tiếp trên chúng; bạn phải công tác ở nơi khác và chia sẻ thành quả lên kho chứa từ xa (sau đó nhánh từ xa sẽ được cập nhật)."
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"###`o/` là gì vậy?",
"",
"Có thể bạn sẽ thắc mắc về ký tự `o/` ở đầu tên nhánh từ xa có ý nghĩa gì. Chà, tên nhánh từ xa cũng có (thiết yếu) quy tắc đặt tên -- chúng được hiển thị dưới dạng:",
"",
"* `<tên kho từ xa>/<tên nhánh>`",
"",
"Do đó, ở trong `o/master` thì `master` là tên nhánh còn `o` là tên kho chứa từ xa.",
"",
"Thực tế thì hầu hết các nhà phát triển đặt tên kho chứa từ xa là `origin` chứ không phải `o`. Nó trở thành thông lệ đến nỗi Git đặt tên `origin` cho kho chứa từ xa khi bạn dùng `git clone` để sao chép một kho chứa.",
"",
"Đáng tiêc là `origin` không khớp trong giao diện của chúng tôi, nên chúng tôi đành phải viết tắt là `o` :( Nhưng hãy nhớ rằng khi dùng git thật sự thì chắc hẳn tên của kho chứa từ xa sẽ là `origin`!",
"",
"Lý thuyết hơi nhiều rồi, đi vào thực hành thôi."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy thử chuyển sang nhánh từ xa xem điểu gì xảy ra"
],
"afterMarkdowns": [
"Như bạn thấy, git đưa ta vào trạng thái `HEAD` và không cập nhật nhánh `o/master` khi ta thêm một commit. Đó là bởi vì `o/master` chỉ cập nhật khi kho chứa từ xa được cập nhật."
],
"command": "git checkout o/master; git commit",
"beforeCommand": "git clone"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Để hoàn thành cấp độ này, commit một lần trên `master` và một lần nữa sau khi chuyển sang `o/master`. Điều nãy sẽ giúp ta hiểu cách nhánh từ xa hành xử, chúng chỉ cập nhật để phản ánh trạng thái của kho chứa từ xa."
]
}
}
]
}
}
};

View file

@ -18,7 +18,8 @@ exports.level = {
"fr_FR": "Source de rien du tout",
"ru_RU": "Пустой источник",
"ko" : "Source가 없다",
"uk" : "Нема джерела"
"uk" : "Нема джерела",
"vi" : "Không có nguồn"
},
"hint": {
"en_US": "The branch command is disabled for this level so you'll have to use fetch!",
@ -33,6 +34,7 @@ exports.level = {
"ru_RU": "Команда branch недоступна на этом упражнении, пользуйтесь командой fetch!",
"ko" : "branch 명령이 비활성화 되어있습니다. fetch를 사용해야 되요!",
"uk" : "Команда branch недоступна на цьому уроці, користуйся командою fetch!",
"vi" : "Lệnh branch đã bị vô hiệu hóa ở cấp độ này nên bạn sẽ phải dùng fetch!"
},
"startDialog": {
"en_US": {
@ -617,6 +619,59 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Sự kỳ quặc của `<nguồn>`",
"",
"Git lợi dụng tham số `<nguồn>` theo 2 cách khá dị.Hai cách lợi dụng này bắt nguồn từ thục tế là bạn có thể \"không chỉ định\" `nguồn` cho cả git push và git fetch. Bạn có thể làm điều này bằng cách để trống tham số như sau:",
"",
"* `git push origin :side`",
"* `git fetch origin :bugFix`",
"",
"Hãy xem thử 2 câu lệnh này làm việc gì..."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nếu ta đẩy \"không gì cả\" lên một nhánh từ xa thì nó sẽ làm gì? Nó xóa nhánh đó!"
],
"afterMarkdowns": [
"Đó, ta đã xóa thành công nhánh `foo` trên kho chứa từ xa bằng cách đẩy \"không gì cả\" lên nó. Khá là hợp lý..."
],
"command": "git push origin :foo",
"beforeCommand": "git clone; git push origin master:foo"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Cuối cùng, nạp \"không gì cả\" vào một kho chứa cục bộ thực tế sẽ tạo ra một nhánh mới"
],
"afterMarkdowns": [
"Khá là quái và dị. Nhưng mà dó là những gì git làm!"
],
"command": "git fetch origin :bar",
"beforeCommand": "git clone"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Ở cấp độ đơn giản này -- bạn chỉ cần xóa một nhánh từ xa và tạo ra một nhánh mới với `git fetch` để hoàn thành!"
]
}
}
]
}
}
};

View file

@ -14,7 +14,8 @@ exports.level = {
"fr_FR": "Suivi de branche distante",
"ru_RU": "Слежка за удалённым репозиторием",
"ko" : "원격 저장소 추적하기",
"uk" : "Слідкуємо за віддаленим репозиторієм"
"uk" : "Слідкуємо за віддаленим репозиторієм",
"vi" : "Theo dõi từ xa"
},
"hint": {
"en_US": "Remember there are two ways to set remote tracking!",
@ -28,7 +29,8 @@ exports.level = {
"fr_FR": "Rappelez-vous qu'il existe deux façons de configurer le suivi de branche distante !",
"ru_RU": "Помни, есть два способа установить слежку за удалённым репозиторием!",
"ko" : "원격 추적하기를 설정하는데에는 두가지 방법이 있습니다!",
"uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!"
"uk" : "Пам'ятай, є два способи слідкувати за віддаленим репозиорієм!",
"vi" : "Hãy nhớ rằng, có 2 cách để thiết lập theo dõi từ xa!"
},
"startDialog": {
"en_US": {
@ -1447,6 +1449,124 @@ exports.level = {
}
}
]
},
"vi": {
"childViews": [
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Theo dõi nhánh từ xa",
"",
"Trong những bài học vừa qua có một điểu có vẻ như là \"ma thuật\" đó là git lại biết được nhánh `master` có liên kết đến nhánh `o/master`. Đúng là chúng có tên tương tự và nhánh `master` ở kho chứa từ xa có kết nối đến nhánh `master` ở kho chứa địa phương có vẻ như là hợp lý, nhưng kết nối này được thể hiện rõ ràng trong 2 trường hợp:",
"",
"* Trong quá trình thực hiện thao tác kéo, các commit được tải xuống nhánh `o/master` và sau đó *hợp nhất* vào nhánh `master`. Mục tiêu hợp nhất dược ngầm định bởi kết nối này.",
"* Trong quá trình thực hiện thao tác đẩy, thảnh quả trên nhánh `master` được đẩy lên nhánh `master` từ xa (sau dó được biểu thị bằng nhánh `o/master` ở kho chứa địa phương). *Đích đến* của lệnh đẩy được xác định bằng kết nối giữa nhánh `master` và nhánh `o/master`.",
""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"## Theo dõi từ xa",
"",
"Nói tóm lại, kết nối giữa nhánh `master` và nhánh `o/master` đơn giản được giải thích bằng thuộc tính \"theo dõi từ xa\" (\"remote tracking\") của các nhánh. Nhánh `master` được thiết lập để theo dõi nhánh `o/master` -- Điều này có nghĩa là nhánh `master` được chỉ định đích của lệnh đẩy và mục tiêu hợp nhất sau khi kéo.",
"",
"Có thể bạn sẽ thắc mắc rằng tại sao thuộc tính này được thiết lập lên nhánh `master` trong khi bạn chẳng hề chạy một câu lệnh nào chỉ định điều này. Chà, khi bạn dùng git để nhân bản kho chứa, thì thuộc tính này đã được tự động thiết lập cho bạn rồi. ",
"",
"Trong quá trình thực hiện nhân bản, git tạo ra nhánh từ xa trên kho chứa địa phương cho tất cả các nhánh trên kho chứa từ xa (các nhánh như `o/master`). Sau đó nó sẽ tạo một nhánh địa phương theo dõi nhánh hoạt dộng hiện tại của kho chứa từ xa, đa phần các trường hợp là nhánh `master`.",
"",
"Một khi quá trình nhân bản hoàn thành, bạn sẽ chỉ có một nhánh địa phương (để bạn không thấy quá tải) nhưng bạn có thể thấy tất cả các nhánh trên kho chứa từ xa (phòng trường hợp bạn thấy tò mò). Đây là phương án tối ưu!",
"",
"Điều này giải thích việc sau khi nhân bản bạn có thể thấy dòng lệnh sau xuất hiện:",
"",
" local branch \"master\" set to track remote branch \"o/master\""
]
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Tôi có thể tự chỉ định chứ?",
"",
"Tất nhiên là được chứ! Bạn có thế khiến bất kỳ nhánh nào theo dõi nhánh `o/master`, và nếu bạn làm vậy, nhánh đó sẽ được được chỉ định đích của lệnh đẩy và mục tiêu hợp nhất giống như nhánh `master`. Điều này có nghĩa là bạn có thể chạy lệnh `git push` trên nhánh có tên là `totallyNotMaster` và thành quả của bạn sẽ được đẩy lên nhánh `master` ở kho chứa từ xa!",
"",
"Có 2 cách để thiết lập thuộc tính này. Cách đầu tiên là chuyển sang một nhánh mới từ một nhánh từ xa bằng cách thực hiện",
"",
"`git checkout -b totallyNotMaster o/master`",
"",
"Tạo ra một nhánh mới `totallyNotMaster` và thiết lập cho nó theo dõi nhánh `o/master`."
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Nói vậy là đủ rồi, hãy xem thử một mô tả nào! Ta sẽ chuyển sang một nhánh tên là `foo` và thiết lập cho nó theo dõi nhánh `master` trên kho chứa từ xa."
],
"afterMarkdowns": [
"Như bạn đã thấy, chúng tôi đã sử dụng mục tiêu ngầm `o / master` để cập nhật nhánh` foo. Để ý rằng nhánh `master` không được cập nhật!!"
],
"command": "git checkout -b foo o/master; git pull",
"beforeCommand": "git clone; git fakeTeamwork"
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Điểu này cũng được áp dụng cho lệnh git push"
],
"afterMarkdowns": [
"Bùùm. Ta đã đẩy thành quả lên nhánh `master` ở kho chứa tù xa mặc dù nhánh của ta có tên hoàn toàn khác biệt"
],
"command": "git checkout -b foo o/master; git commit; git push",
"beforeCommand": "git clone"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"### Cách thứ #2",
"",
"Cách khác để thiết lập theo dõi trên một nhánh đó là đơn giản sử dụng lệnh `git branch -u`. Thực hiện",
"",
"`git branch -u o/master foo`",
"",
"sẽ thiết lập nhánh `foo` theo dõi nhánh `o/master`. Nếu nhánh `foo` đang được `HEAD` trỏ tới bạn có thể bỏ tham số này:",
"",
"`git branch -u o/master`",
""
]
}
},
{
"type": "GitDemonstrationView",
"options": {
"beforeMarkdowns": [
"Hãy xem thử cách khác để thiết lập theo dõi..."
],
"afterMarkdowns": [
"Y hệt như trước, nhưng lệnh này biểu hiện rõ ràng hơn. Tuyệt!"
],
"command": "git branch -u o/master foo; git commit; git push",
"beforeCommand": "git clone; git checkout -b foo"
}
},
{
"type": "ModalAlert",
"options": {
"markdowns": [
"Được rồi! Ở cấp độ này hãy để thành quả lên nhánh `master` trên kho lưu trữ từ xa mà không chuyển sang nhánh `master` tại kho địa phương. Hãy tự tìm ra cách nhé, giờ là khóa học nâng cao rồi :P"
]
}
}
]
}
}
};