ЛЕКЦ 05: ХУВИЛБАРЫН УДИРДЛАГА БА GIT (Version Control & Git)
Хичээлийн зорилго: Хувилбарын удирдлагын суурь ойлголт, Git-ийн ажиллагааны зарчим, branch стратеги, багаар хамтран ажиллах workflow, CI/CD-ийн үндэс зэргийг эзэмшүүлэх.
Хамрах хүрээ: VCS тодорхойлолт, Git архитектур, суурь командууд, branching стратеги, merge vs rebase, pull request, conflict шийдвэрлэх, CI/CD-ийн үндэс.
ХЭСЭГ 1: ОНОЛЫН СУУРЬ (Theory & Foundations)
1.1 Хувилбарын удирдлага (Version Control) гэж юу вэ?
Version Control System (VCS) гэдэг нь файлуудын өөрчлөлтийг цаг хугацааны туршид бүртгэж, хадгалж, удирдах систем.
🔑 Тодорхойлолт: VCS нь кодын бүх өөрчлөлтийн түүхийг хадгалж, хэн, хэзээ, юу өөрчилсөн гэдгийг бүртгэдэг.
Зүйрлэл:
💡 Google Docs дээр баримт бичих — бүх өөрчлөлтийн түүхийг харж, хуучин хувилбар руу буцаж болдог шиг, VCS нь кодын "цаг хугацааны машин".
VCS-ийн шийддэг асуудлууд:
| # | Асуудал | VCS-гүй | VCS-тэй |
|---|---|---|---|
| 1 | Файл алдах | Санамсаргүй устгавал сэргээх боломжгүй | Бүх түүх хадгалагдсан, сэргээж болно |
| 2 | Хэн юу өөрчилсөн? | Мэдэхгүй | git log, git blame |
| 3 | Хамтран ажиллах | Файл дарж бичих | Branch, merge, pull request |
| 4 | Хуучин хувилбар | project_v1, project_v2_final_FINAL | Commit бүр нь хувилбар |
| 5 | Туршилт хийх | Эх кодыг эвдэх эрсдэл | Branch дээр туршиж, merge хийх |
VCS-гүй хөгжүүлэгчийн амьдрал:
📁 project_v1/
📁 project_v2/
📁 project_v2_final/
📁 project_v2_final_REAL/
📁 project_v2_final_REAL_THIS_ONE/
📁 project_backup_20240115/
📁 project_DO_NOT_DELETE/
😅 Танил санагдаж байна уу? VCS энэ бүх асуудлыг шийднэ.
1.2 VCS-ийн төрлүүд
1.2.1 Локал VCS (Local VCS)
Файлын өөрчлөлтийг зөвхөн нэг компьютер дээр хадгална.
[Ажлын хавтас] → [Локал мэдээллийн сан]
- Жишээ: RCS (Revision Control System)
- Сул тал: Хамтран ажиллах боломжгүй, компьютер эвдэрвэл бүгд алдагдана
1.2.2 Төвлөрсөн VCS (Centralized VCS — CVCS)
Нэг төв сервер дээр бүх түүх хадгалагдана. Хөгжүүлэгчид серверээс файл татаж ажиллана.
[Хөгжүүлэгч A] ←→ [ТӨВ СЕРВЕР] ←→ [Хөгжүүлэгч B]
- Жишээ: SVN (Subversion), CVS, Perforce
- Давуу тал: Хамтран ажиллах боломжтой, нэг газар удирдах
- Сул тал: Сервер унтарвал хэн ч ажиллаж чадахгүй, сервер эвдэрвэл бүх түүх алдагдана
1.2.3 Тархсан VCS (Distributed VCS — DVCS)
Хөгжүүлэгч бүр бүтэн хуулбар (clone) авна — бүх түүхтэй.
[Хөгжүүлэгч A: Бүтэн хуулбар] ←→ [Алсын сервер] ←→ [Хөгжүүлэгч B: Бүтэн хуулбар]
- Жишээ: Git, Mercurial
- Давуу тал: Офлайн ажиллах боломжтой, сервер эвдэрсэн ч локал хуулбар бүрэн, маш хурдан
- Git нь DVCS-ийн хамгийн түгээмэл, стандарт хэрэгсэл
💡 Зүйрлэл: CVCS = Номын сангаас ном зээлэх (нэг л хуулбар). DVCS = Ном бүрийг хуулж авах (хүн бүрт бүтэн хуулбар).
1.3 Git-ийн түүх ба философи
Түүх:
- 2005 он: Linus Torvalds (Linux-ийн зохиогч) Git-ийг бүтээсэн
- Шалтгаан: Linux цөмийн хөгжүүлэлтэд ашигладаг байсан BitKeeper хэрэгсэлтэй маргалдсан
- Linus-ийн зорилго: Хурдан, энгийн, тархсан, том төслийг удирдах чадвартай
Git-ийн философи:
| Зарчим | Тайлбар |
|---|---|
| Хурд | Бараг бүх үйлдэл локал → маш хурдан |
| Энгийн дизайн | Цөөн суурь ойлголт дээр суурилсан |
| Шугаман бус хөгжүүлэлт | Олон мянган зэрэгцээ branch дэмжинэ |
| Бүрэн тархсан | Хөгжүүлэгч бүр бүтэн түүхтэй |
| Том төсөл | Linux цөм (25+ сая мөр код) удирдах чадвартай |
1.4 Git-ийн архитектур — Гурван бүс (Three Areas)
Git нь 3 үндсэн бүстэй:
┌─────────────┐ git add ┌──────────────┐ git commit ┌──────────────┐
│ WORKING │ ──────────→ │ STAGING │ ────────────→ │ REPOSITORY │
│ DIRECTORY │ │ AREA │ │ (.git) │
│ (Ажлын │ ←────────── │ (Index) │ │ (Түүх) │
│ хавтас) │ файл засах │ (Бэлтгэл) │ │ │
└─────────────┘ └──────────────┘ └──────────────┘
Гурван бүсийн тайлбар:
| Бүс | Англи | Тайлбар |
|---|---|---|
| Ажлын хавтас | Working Directory | Файлуудаа засварладаг газар. Кодоо бичдэг |
| Бэлтгэл бүс | Staging Area (Index) | Дараагийн commit-д оруулах файлуудыг бэлтгэх "тайз" |
| Репозитор | Repository (.git) | Бүх commit-ийн түүх хадгалагддаг |
💡 Зүйрлэл: Гэрийн хоол хийх:
- Working Directory = Гал тогоо (хоол бэлтгэх)
- Staging Area = Тавлага (бэлэн болсон хоолыг тавих)
- Repository = Хоолны зураг авах (түүх хадгалах)
1.5 Git-ийн суурь командууд
1.5.1 Репозитор үүсгэх / клонлох
# Шинэ репозитор үүсгэх
git init
# Одоо байгаа репозиторыг клонлох (хуулах)
git clone https://github.com/user/repo.git
1.5.2 Өөрчлөлт хийх цикл
# 1. Файлуудын төлөвийг шалгах
git status
# 2. Файлыг staging area-д нэмэх
git add filename.java # Нэг файл
git add . # Бүх өөрчлөлт
# 3. Commit хийх (түүхэнд хадгалах)
git commit -m "Оюутны бүртгэлийн модуль нэмсэн"
# 4. Алсын сервер рүү илгээх
git push origin main
1.5.3 Түүх харах
# Commit-ийн түүх харах
git log
git log --oneline # Товч хэлбэрээр
git log --oneline --graph # График хэлбэрээр
# Хэн ямар мөр бичсэнийг харах
git blame filename.java
# Хоёр commit-ийн ялгааг харах
git diff commit1 commit2
1.5.4 Буцаах (Undo)
# Staging area-аас буцаах (unstage)
git restore --staged filename.java
# Ажлын хавтас дахь өөрчлөлтийг цуцлах
git restore filename.java
# Сүүлийн commit-ийн мессежийг засах
git commit --amend -m "Шинэ мессеж"
# Commit-ийг буцаах (шинэ commit үүсгэж)
git revert HEAD
1.6 Branching (Салаалт)
Branch гэж юу вэ?
Branch нь хөгжүүлэлтийн тусдаа шугам. Үндсэн кодонд нөлөөлөхгүйгээр шинэ функц, алдаа засвар зэргийг хийх боломж олгоно.
💡 Зүйрлэл: Номын зэрэгцээ бүлгүүд шиг — нэг бүлгийг бичиж байхдаа нөгөө бүлгийг эвдэхгүй. Дууссаны дараа нэгтгэнэ.
feature/login
┌──●──●──●──┐
╱ ╲ merge
main ──●──●──────────────●──●──
╲ ╱
└──●──●──●──┘
feature/payment
Суурь branch командууд:
# Бүх branch жагсаалт
git branch
# Шинэ branch үүсгэх
git branch feature/login
# Branch руу шилжих
git checkout feature/login
# эсвэл (шинэ арга)
git switch feature/login
# Үүсгэж шилжих (нэг алхам)
git checkout -b feature/payment
# эсвэл
git switch -c feature/payment
# Branch устгах
git branch -d feature/login
1.7 Merge ба Rebase
1.7.1 Merge (Нэгтгэх)
Хоёр branch-ийн түүхийг нэгтгэж, шинэ merge commit үүсгэнэ.
# main branch руу шилжих
git checkout main
# feature branch-ийг нэгтгэх
git merge feature/login
feature/login
┌──●──●──●──┐
╱ ╲ merge commit
main ──●──●──────────────●──
Давуу тал: Түүх бүрэн хадгалагдана, хэзээ merge хийсэн тодорхой Сул тал: Олон merge commit → Түүх нарийн болж болно
1.7.2 Rebase (Суурь шилжүүлэх)
Feature branch-ийн commit-уудыг main-ийн ОРОЙД дахин тавина.
# feature branch дээр байхдаа
git checkout feature/login
git rebase main
ӨМНӨ: ДАРАА:
main: ──●──●──● main: ──●──●──●
╲ ╲
feature: ●──● feature: ●'──●'
Давуу тал: Цэвэр, шугаман түүх Сул тал: Түүхийг дахин бичдэг → Хуваалцсан branch дээр ХЭЗЭЭ Ч ХЭРЭГЛЭХГҮЙ
Merge vs Rebase хэзээ ашиглах:
| Нөхцөл | Merge | Rebase |
|---|---|---|
| Нийтийн branch (main) | ✅ | ❌ |
| Хувийн feature branch | ✅ | ✅ |
| Түүх хадгалах чухал | ✅ | ❌ |
| Цэвэр түүх хэрэгтэй | ❌ | ✅ |
| Алтан дүрэм | Аюулгүй | Нийтийн branch-д хэзээ ч rebase хийхгүй |
1.8 Merge Conflict (Зөрчил)
Conflict хэзээ үүсдэг вэ?
Хоёр branch дээр ижил файлын ижил мөрийг өөр өөрөөр засварласан → Git автоматаар нэгтгэж чадахгүй.
Хөгжүүлэгч A: greeting = "Сайн байна уу";
Хөгжүүлэгч B: greeting = "Сайн уу";
↓
CONFLICT!
Conflict шийдвэрлэх:
// Git-ийн харуулдаг хэлбэр:
<<<<<<< HEAD
greeting = "Сайн байна уу"; // Одоогийн branch
=======
greeting = "Сайн уу"; // Нэгтгэж буй branch
>>>>>>> feature/greeting
// Хөгжүүлэгч шийднэ:
greeting = "Сайн байна уу!"; // Зөв хувилбарыг сонгоно
Шийдвэрлэх алхам:
# 1. Conflict-той файлуудыг олох
git status
# 2. Файлуудыг нээж, conflict-ийг гараар засах
# <<<<<<< , ======= , >>>>>>> тэмдэглэгээг устгах
# 3. Засварласан файлуудыг staging-д нэмэх
git add filename.java
# 4. Merge commit хийх
git commit -m "Merge conflict шийдвэрлэсэн"
💡 Зөвлөгөө: IDE-үүд (IntelliJ, VS Code) conflict шийдвэрлэхэд визуал хэрэгсэл санал болгодог — харьцуулж, сонгоход хялбар.
1.9 Branching стратеги
1.9.1 Git Flow
Хамгийн алдартай, томоохон төслүүдэд тохиромжтой.
main ─────────────────────────────────────── (production)
╲ ╱
develop ──────────────────────────────── (хөгжүүлэлт)
╲ ╲ ╱
feature/A feature/B ────┘
╲
release/1.0 ──── (бэлтгэл)
╲
hotfix/bug ──── (яаралтай засвар)
| Branch | Зорилго |
|---|---|
| main | Production код — үргэлж ажилладаг |
| develop | Хөгжүүлэлтийн үндсэн branch |
| feature/ | Шинэ функц бүрд тусдаа branch |
| release/ | Шинэ хувилбар гаргахын өмнөх бэлтгэл |
| hotfix/ | Production-д гарсан яаралтай алдааны засвар |
1.9.2 GitHub Flow
Энгийн, жижиг багуудад тохиромжтой.
main ──●──●──●──●──●──●──●──●──●──
╲ ╱ ╲ ╱
●──● ●──●──●
feature feature
+ PR + PR
Дүрмүүд:
mainbranch үргэлж deploy хийж болохуйц- Шинэ ажил бүрд
main-аас branch салгах - Тогтмол commit хийж, push хийх
- Pull Request нээх
- Code Review-ийн дараа merge хийх
- Merge хийсний дараа deploy
1.9.3 Trunk-Based Development
Хамгийн энгийн, CI/CD-д тохиромжтой.
main (trunk) ──●──●──●──●──●──●──●──●──●──
╲╱ ╲╱ ╲╱
маш богино feature branch-ууд
Зарчим: Бүх хөгжүүлэгч main руу шууд (эсвэл маш богино branch-аар) commit хийнэ.
1.10 Pull Request (PR) / Merge Request (MR)
Pull Request гэж юу вэ?
Pull Request нь кодыг нэгтгэхийн ӨМНӨ багийн гишүүдээр шалгуулах хүсэлт.
💡 Зүйрлэл: Илтгэлийг хэвлэхийн өмнө багшаар шалгуулах шиг — PR нь кодыг merge хийхийн өмнө шалгуулах.
PR-ийн давуу тал:
| # | Давуу тал | Тайлбар |
|---|---|---|
| 1 | Code Review | Бусад хөгжүүлэгч кодыг шалгана |
| 2 | Чанар | Алдаа, code smell-ийг merge-ийн өмнө олно |
| 3 | Мэдлэг хуваалцах | Баг бүгд кодыг мэддэг |
| 4 | Автомат шалгалт | CI/CD тест автоматаар ажиллана |
| 5 | Баримтжуулалт | Яагаад энэ өөрчлөлт хийсэн бэ гэдэг нь бүртгэгдэнэ |
Сайн PR-ийн шинж:
| Шинж | Тайлбар |
|---|---|
| Жижиг | 200-400 мөр өөрчлөлт (дээд тал нь) |
| Нэг зорилготой | Нэг PR = Нэг функц эсвэл нэг алдаа засвар |
| Тайлбартай | Юу хийсэн, яагаад хийсэн, хэрхэн тестлэсэн |
| Тест бүхий | Шинэ код + тест хамт |
1.11 Commit мессежийн стандарт
Сайн commit мессеж бичих:
<төрөл>(<хамрах хүрээ>): <товч тайлбар>
<дэлгэрэнгүй тайлбар (заавал биш)>
<холбоос, жишээ нь issue дугаар>
Conventional Commits стандарт:
| Төрөл | Тайлбар | Жишээ |
|---|---|---|
| feat | Шинэ функц | feat(auth): нэвтрэлтийн модуль нэмсэн |
| fix | Алдаа засвар | fix(cart): сагсны тооцоолол засав |
| refactor | Код бүтцийн засвар | refactor(user): UserService-ийг хуваасан |
| test | Тест нэмэх/засах | test(order): захиалгын unit тест нэмсэн |
| docs | Баримт бичиг | docs(readme): суулгах заавар нэмсэн |
| style | Формат өөрчлөлт | style: хоосон мөрүүд цэвэрлэсэн |
| chore | Бусад засвар | chore: dependency шинэчлэсэн |
Муу vs Сайн commit мессеж:
# ❌ БУРУУ:
git commit -m "fix"
git commit -m "update"
git commit -m "asdf"
git commit -m "done"
# ✅ ЗӨӨВ:
git commit -m "feat(student): оюутны GPA тооцоолох функц нэмсэн"
git commit -m "fix(login): нууц үг буруу үед алдааны мессеж засав"
git commit -m "refactor(order): calculateTotal() методыг хуваасан"
1.12 .gitignore
.gitignore гэж юу вэ?
Git-д бүртгэхгүй файлуудын жагсаалт. Компайл хийсэн файл, IDE тохиргоо, нууц мэдээлэл зэргийг Git-д нэмэхгүй.
Java төслийн .gitignore жишээ:
# Compiled files
*.class
*.jar
*.war
# Build directories
/target/
/build/
/out/
# IDE files
.idea/
*.iml
.vscode/
.eclipse/
# OS files
.DS_Store
Thumbs.db
# Environment / Secrets
.env
*.properties
!application-example.properties
# Logs
*.log
# Dependencies
/node_modules/
⚠️ Чухал: API key, нууц үг, токен зэрэг нууц мэдээллийг ХЭЗЭЭ Ч Git-д нэмж болохгүй!
.envфайлд хадгалж,.gitignore-д нэмэх.
1.13 CI/CD-ийн үндэс
CI (Continuous Integration) — Тасралтгүй нэгтгэл
Хөгжүүлэгчид код push хийх бүрд автоматаар build, тест ажиллуулах.
Хөгжүүлэгч → git push → CI сервер → Build → Test → Үр дүн мэдэгдэх
↓
✅ Pass → Merge зөвшөөрөх
❌ Fail → Хөгжүүлэгчид мэдэгдэх
CD (Continuous Delivery / Deployment) — Тасралтгүй хүргэлт
CI-ийн дараа автоматаар staging/production орчинд deploy хийх.
Code → Build → Test → Staging → Production
↑ CI ↑ ↑ CD ↑
CI/CD-ийн давуу тал:
| # | Давуу тал | Тайлбар |
|---|---|---|
| 1 | Алдааг эрт олох | Push бүрт тест ажиллана |
| 2 | Хурдан хүргэлт | Автомат deploy → Хүргэлт хурдасна |
| 3 | Итгэлцэл | Тест pass = Код найдвартай |
| 4 | Давталт багасна | Гараар build, test, deploy хийхгүй |
CI/CD хэрэгслүүд:
| Хэрэгсэл | Тайлбар |
|---|---|
| GitHub Actions | GitHub-тай нэгдсэн, үнэгүй |
| GitLab CI/CD | GitLab-тай нэгдсэн |
| Jenkins | Нээлттэй эхийн, уян хатан |
| CircleCI | Cloud-based CI/CD |
| Travis CI | Нээлттэй эхийн төслүүдэд |
GitHub Actions жишээ:
# .github/workflows/ci.yml
name: Java CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean verify
- name: Run tests
run: mvn test
1.14 Git хамтын ажиллагааны зөвлөмжүүд
| # | Зөвлөмж | Тайлбар |
|---|---|---|
| 1 | Тогтмол commit хийх | Жижиг, тогтмол commit > Том, ховор commit |
| 2 | Утга учиртай мессеж бичих | "fix" биш → "fix(auth): token хугацаа дуусах алдааг засав" |
| 3 | Branch ашиглах | main дээр шууд ажиллахгүй |
| 4 | Pull Request ашиглах | Code review-гүйгээр merge хийхгүй |
| 5 | Conflict-ийг түргэн шийдэх | Удаан орхивол conflict ихсэнэ |
| 6 | Push-ийн өмнө pull хийх | git pull --rebase origin main |
| 7 | Нууц мэдээлэл Git-д нэмэхгүй | .env, API key → .gitignore |
| 8 | .gitignore зөв тохируулах | Build файл, IDE тохиргоо нэмэхгүй |
ХЭСЭГ 2: ТҮЛХҮҮР ҮГ БА МЭРГЭЖЛИЙН НЭР ТОМЬЁО (Keywords & Glossary)
| # | Англи нэр томьёо | Монгол утга | Дэлгэрэнгүй тайлбар |
|---|---|---|---|
| 1 | Version Control System (VCS) | Хувилбарын удирдлагын систем | Файлуудын өөрчлөлтийн түүхийг бүртгэж, удирдах систем. |
| 2 | Repository (Repo) | Репозитор / Агуулах | Кодын бүх файл, түүхийг хадгалдаг агуулах. |
| 3 | Commit | Коммит / Бүртгэл | Өөрчлөлтийг түүхэнд хадгалах үйлдэл. Нэг "хадгалах цэг". |
| 4 | Branch | Салаалт / Салбар | Хөгжүүлэлтийн тусдаа шугам. Үндсэн кодонд нөлөөлөхгүй. |
| 5 | Merge | Нэгтгэх | Хоёр branch-ийн өөрчлөлтийг нэг болгох. |
| 6 | Rebase | Суурь шилжүүлэх | Branch-ийн commit-уудыг өөр branch-ийн оройд тавих. |
| 7 | Clone | Клонлох / Хуулах | Алсын репозиторын бүтэн хуулбар авах. |
| 8 | Push | Түлхэх / Илгээх | Локал commit-уудыг алсын сервер рүү илгээх. |
| 9 | Pull | Татах | Алсын серверээс шинэ өөрчлөлтийг татах. |
| 10 | Fetch | Татах (нэгтгэхгүй) | Алсын серверээс мэдээлэл татах, гэхдээ автоматаар merge хийхгүй. |
| 11 | Staging Area (Index) | Бэлтгэл бүс | Дараагийн commit-д оруулах файлуудыг бэлтгэх газар. |
| 12 | Working Directory | Ажлын хавтас | Файлуудаа засварладаг газар. |
| 13 | HEAD | Тэргүүлэгч | Одоогийн branch-ийн хамгийн сүүлийн commit руу заадаг заагч. |
| 14 | Remote | Алсын сервер | Алсад байрлах репозитор (GitHub, GitLab гэх мэт). |
| 15 | Origin | Эх үүсвэр | Клонлосон алсын серверийн анхдагч нэр. |
| 16 | Pull Request (PR) | Татах хүсэлт | Кодыг merge хийхийн өмнө шалгуулах хүсэлт (GitHub). |
| 17 | Merge Request (MR) | Нэгтгэх хүсэлт | PR-тэй ижил, GitLab дахь нэр. |
| 18 | Merge Conflict | Нэгтгэлийн зөрчил | Хоёр branch ижил мөрийг өөрөөр засварласан → автомат нэгтгэх боломжгүй. |
| 19 | Git Flow | Гит урсгал | main, develop, feature, release, hotfix branch бүхий стратеги. |
| 20 | GitHub Flow | ГитХаб урсгал | Энгийн стратеги: main + feature branch + PR. |
| 21 | Trunk-Based Development | Үндсэн мөчирт суурилсан | Бүгд main руу богино branch-аар commit хийх стратеги. |
| 22 | CI (Continuous Integration) | Тасралтгүй нэгтгэл | Push бүрт автоматаар build, тест ажиллуулах. |
| 23 | CD (Continuous Delivery) | Тасралтгүй хүргэлт | CI-ийн дараа автоматаар deploy хийх. |
| 24 | Tag | Шошго | Тодорхой commit-д нэр өгөх. Хувилбар гаргахад (v1.0.0). |
| 25 | Stash | Нөөцлөх / Түр хадгалах | Дуусаагүй өөрчлөлтийг түр хадгалж, цэвэр branch руу шилжих. |
| 26 | Cherry-pick | Сонгон авах | Тодорхой commit-ийг өөр branch руу хуулах. |
| 27 | .gitignore | Гит үл тоомсорлох | Git-д бүртгэхгүй файлуудын жагсаалт. |
| 28 | Blame | Буруутгах / Гэм буруу | Файлын мөр бүрийг хэн бичсэнийг харуулах. |
| 29 | Diff | Ялгаа | Хоёр commit/файлын хоорондох ялгааг харуулах. |
| 30 | Revert | Буцаах | Commit-ийг буцааж, шинэ commit үүсгэх (түүх хадгалагдана). |
| 31 | Reset | Дахин тохируулах | HEAD-ийг өмнөх commit руу шилжүүлэх (түүх өөрчлөгдөж болно). |
| 32 | Amend | Засах | Сүүлийн commit-ийн мессеж/агуулгыг засах. |
| 33 | Fork | Салаалуулах | Бусдын репозиторыг өөрийн бүртгэлд хуулах (GitHub). |
| 34 | Code Review | Кодын шалгалт | Бусад хөгжүүлэгч кодыг шалгаж, санал болгох. |
| 35 | Conventional Commits | Стандарт коммит | feat:, fix:, refactor: гэх мэт commit мессежийн стандарт. |
| 36 | Distributed VCS | Тархсан VCS | Хөгжүүлэгч бүр бүтэн хуулбар авдаг (Git, Mercurial). |
| 37 | Centralized VCS | Төвлөрсөн VCS | Нэг төв серверт бүх түүх хадгалагддаг (SVN). |
| 38 | GitHub Actions | ГитХаб Үйлдлүүд | GitHub-ийн CI/CD автоматжуулалтын хэрэгсэл. |
| 39 | Hotfix | Яаралтай засвар | Production-д гарсан алдааг яаралтай засах branch. |
| 40 | Semantic Versioning | Утга бүхий хувилбарлалт | MAJOR.MINOR.PATCH (v1.2.3) хувилбарын дүрэм. |
ХЭСЭГ 3: ЛАБОРАТОРИ БА ПРАКТИК ЗААВАР (Labs & Step-by-Step Guide)
3.1 Лабораторийн зорилго
Энэ лабораторид та Git-ийн бодит ашиглалтыг дадлагаар эзэмшинэ:
- Git репозитор үүсгэх, commit хийх
- Branch үүсгэж, feature хөгжүүлэх
- Merge conflict шийдвэрлэх
- GitHub дээр хамтран ажиллах (PR)
Шаардлагатай зүйлс: Git суулгасан, терминал/командын мөр, GitHub бүртгэл
3.2 Лаб 1: Git-ийн суурь — Репозитор үүсгэх ба commit хийх
Алхам 1: Git тохиргоо (нэг удаа)
# Нэр болон имэйл тохируулах
git config --global user.name "Баатар"
git config --global user.email "baatar@example.com"
# Тохиргоог шалгах
git config --list
Алхам 2: Репозитор үүсгэх
# Шинэ хавтас үүсгэх
mkdir student-management
cd student-management
# Git репозитор эхлүүлэх
git init
# Төлөв шалгах
git status
Үр дүн: Initialized empty Git repository in .../student-management/.git/
Алхам 3: Эхний файл үүсгэж commit хийх
# Java файл үүсгэх
cat > Student.java << 'EOF'
public class Student {
private String name;
private int age;
private double gpa;
public Student(String name, int age, double gpa) {
this.name = name;
this.age = age;
this.gpa = gpa;
}
public String getName() { return name; }
public int getAge() { return age; }
public double getGpa() { return gpa; }
@Override
public String toString() {
return name + " (Нас: " + age + ", GPA: " + gpa + ")";
}
}
EOF
# Төлөв шалгах — Student.java "untracked" байна
git status
# Staging area-д нэмэх
git add Student.java
# Төлөв шалгах — Student.java "staged" байна
git status
# Commit хийх
git commit -m "feat(student): Student класс үүсгэсэн"
Алхам 4: Өөрчлөлт хийж дахин commit хийх
# Main класс үүсгэх
cat > Main.java << 'EOF'
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Бат", 20, 3.5));
students.add(new Student("Болд", 21, 3.8));
students.add(new Student("Сарнай", 19, 3.9));
System.out.println("=== Оюутнууд ===");
for (Student s : students) {
System.out.println(s);
}
}
}
EOF
# .gitignore файл үүсгэх
cat > .gitignore << 'EOF'
*.class
*.jar
/out/
.idea/
EOF
# Бүгдийг staging-д нэмж commit хийх
git add .
git commit -m "feat(main): Main класс ба .gitignore нэмсэн"
# Түүх харах
git log --oneline
Хүлээгдэх үр дүн:
a1b2c3d feat(main): Main класс ба .gitignore нэмсэн
e4f5g6h feat(student): Student класс үүсгэсэн
3.3 Лаб 2: Branch ашиглах — Feature хөгжүүлэлт
Алхам 1: Feature branch үүсгэх
# Шинэ branch үүсгэж шилжих
git checkout -b feature/grade-calculator
# Одоогийн branch шалгах
git branch
Алхам 2: Feature branch дээр код бичих
cat > GradeCalculator.java << 'EOF'
public class GradeCalculator {
public static String calculateGrade(double gpa) {
if (gpa >= 3.7) return "A";
if (gpa >= 3.3) return "A-";
if (gpa >= 3.0) return "B+";
if (gpa >= 2.7) return "B";
if (gpa >= 2.3) return "B-";
if (gpa >= 2.0) return "C+";
return "F";
}
public static boolean isPassing(double gpa) {
return gpa >= 2.0;
}
}
EOF
git add GradeCalculator.java
git commit -m "feat(grade): GradeCalculator класс нэмсэн"
Алхам 3: Main.java-д GradeCalculator ашиглах
cat > Main.java << 'EOF'
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Бат", 20, 3.5));
students.add(new Student("Болд", 21, 3.8));
students.add(new Student("Сарнай", 19, 3.9));
System.out.println("=== Оюутны тайлан ===");
for (Student s : students) {
String grade = GradeCalculator.calculateGrade(s.getGpa());
boolean passed = GradeCalculator.isPassing(s.getGpa());
System.out.println(s + " | Дүн: " + grade +
" | Тэнцсэн: " + (passed ? "Тийм" : "Үгүй"));
}
}
}
EOF
git add Main.java
git commit -m "feat(main): GradeCalculator-ийг Main-д холбосон"
Алхам 4: main руу merge хийх
# main branch руу шилжих
git checkout main
# Feature branch-ийг merge хийх
git merge feature/grade-calculator
# Түүх харах
git log --oneline --graph
# Feature branch устгах (merge хийсний дараа)
git branch -d feature/grade-calculator
3.4 Лаб 3: Merge Conflict шийдвэрлэх
Алхам 1: Хоёр branch дээр ижил файлыг өөрөөр засах
# Branch A үүсгэх
git checkout -b feature/greeting-mn
# Main.java-ийн мэндчилгээг Монголоор засах
cat > Greeting.java << 'EOF'
public class Greeting {
public static String getGreeting() {
return "Сайн байна уу! Тавтай морил!";
}
}
EOF
git add Greeting.java
git commit -m "feat(greeting): Монгол мэндчилгээ нэмсэн"
# main руу буцаж, Branch B үүсгэх
git checkout main
git checkout -b feature/greeting-en
# Ижил файлыг Англиар бичих
cat > Greeting.java << 'EOF'
public class Greeting {
public static String getGreeting() {
return "Hello! Welcome!";
}
}
EOF
git add Greeting.java
git commit -m "feat(greeting): English greeting нэмсэн"
Алхам 2: Эхний branch-ийг merge хийх (амжилттай)
git checkout main
git merge feature/greeting-mn
# Амжилттай — Greeting.java шинээр нэмэгдэнэ
Алхам 3: Хоёр дахь branch-ийг merge хийх → CONFLICT!
git merge feature/greeting-en
# CONFLICT! Greeting.java файлд зөрчил гарна
Git-ийн мэдэгдэл:
Auto-merging Greeting.java
CONFLICT (content): Merge conflict in Greeting.java
Automatic merge failed; fix conflicts and then commit the result.
Алхам 4: Conflict шийдвэрлэх
# Conflict-той файлыг нээх
cat Greeting.java
Файлын агуулга:
public class Greeting {
public static String getGreeting() {
<<<<<<< HEAD
return "Сайн байна уу! Тавтай морил!";
=======
return "Hello! Welcome!";
>>>>>>> feature/greeting-en
}
}
Шийдвэрлэх — Хоёуланг нь ашиглах:
cat > Greeting.java << 'EOF'
public class Greeting {
public static String getGreeting(String language) {
if ("mn".equals(language)) {
return "Сайн байна уу! Тавтай морил!";
}
return "Hello! Welcome!";
}
}
EOF
# Conflict шийдвэрлэсэн файлыг нэмж commit хийх
git add Greeting.java
git commit -m "fix(greeting): merge conflict шийдвэрлэсэн — хоёр хэл дэмжсэн"
# Branch-уудыг цэвэрлэх
git branch -d feature/greeting-mn
git branch -d feature/greeting-en
# Түүх харах
git log --oneline --graph
3.5 Лаб 4: GitHub дээр ажиллах — Remote ба Pull Request
Алхам 1: GitHub дээр репозитор үүсгэх
- GitHub.com руу нэвтрэх
- New repository товч дарах
- Нэр:
student-management - Create repository дарах
Алхам 2: Локал репозиторыг GitHub-тай холбох
# Remote нэмэх
git remote add origin https://github.com/USERNAME/student-management.git
# Remote шалгах
git remote -v
# Код push хийх
git push -u origin main
Алхам 3: Feature branch үүсгэж push хийх
# Шинэ feature branch
git checkout -b feature/search
# Хайлтын функц нэмэх
cat > StudentSearch.java << 'EOF'
import java.util.List;
import java.util.stream.Collectors;
public class StudentSearch {
public static List<Student> searchByName(List<Student> students, String keyword) {
return students.stream()
.filter(s -> s.getName().toLowerCase().contains(keyword.toLowerCase()))
.collect(Collectors.toList());
}
public static List<Student> filterByGPA(List<Student> students, double minGPA) {
return students.stream()
.filter(s -> s.getGpa() >= minGPA)
.collect(Collectors.toList());
}
}
EOF
git add StudentSearch.java
git commit -m "feat(search): оюутны хайлт, шүүлтүүр нэмсэн"
# Feature branch-ийг GitHub руу push
git push origin feature/search
Алхам 4: GitHub дээр Pull Request үүсгэх
- GitHub дээр репозитор руу очих
- "Compare & pull request" товч дарах
- PR тайлбар бичих:
## Юу хийсэн - Оюутны нэрээр хайх функц нэмсэн - GPA-аар шүүх функц нэмсэн ## Тест - searchByName("Бат") → Бат олдоно - filterByGPA(3.5) → GPA >= 3.5 оюутнууд - Create pull request дарах
- Code Review хийлгэсний дараа Merge дарах
Алхам 5: Merge хийсний дараа локал дээр шинэчлэх
# main руу шилжих
git checkout main
# GitHub-аас pull хийх
git pull origin main
# Feature branch устгах
git branch -d feature/search
git push origin --delete feature/search
Git stash хэрэглээ (нэмэлт):
# Дуусаагүй ажлыг түр хадгалах
git stash
# Бусад ажил хийх...
git checkout main
git pull origin main
# Буцаж ирж, түр хадгалсан ажлыг сэргээх
git checkout feature/my-feature
git stash pop
ХЭСЭГ 4: ШАЛГАЛТЫН АСУУЛТ (Knowledge Check — 100 тест)
Тест 1
Version Control System (VCS) гэж юу вэ?
- A) Програм хангамж зохиох хэрэгсэл
- B) Файлуудын өөрчлөлтийн түүхийг бүртгэж, удирдах систем
- C) Зөвхөн код хадгалах систем
- D) Тест ажиллуулах хэрэгсэл
Зөв хариулт: B
Тайлбар: VCS нь хэн, хэзээ, юу өөрчилсөн гэдгийг бүртгэж, хуучин хувилбар руу буцаах, хамтран ажиллах боломж олгодог.
Тест 2
Git нь ямар төрлийн VCS вэ?
- A) Локал VCS
- B) Төвлөрсөн VCS (CVCS)
- C) Тархсан VCS (DVCS)
- D) Нээлттэй VCS
Зөв хариулт: C
Тайлбар: Git нь Distributed VCS — хөгжүүлэгч бүр бүтэн хуулбар (бүх түүхтэй) авдаг. Офлайн ажиллаж болно.
Тест 3
Git-ийг хэн бүтээсэн вэ?
- A) Bill Gates
- B) Linus Torvalds
- C) James Gosling
- D) Guido van Rossum
Зөв хариулт: B
Тайлбар: Linus Torvalds (Linux-ийн зохиогч) 2005 онд Git-ийг бүтээсэн. Linux цөмийн хөгжүүлэлтийн хэрэгцээнд зориулсан.
Тест 4
Төвлөрсөн VCS (CVCS)-ийн жишээ аль нь вэ?
- A) Git
- B) SVN (Subversion)
- C) Mercurial
- D) Docker
Зөв хариулт: B
Тайлбар: SVN нь Centralized VCS — нэг төв серверт бүх түүх хадгалагдана. Сервер унтарвал хамтран ажиллаж чадахгүй.
Тест 5
Git-ийн гурван бүс (Three Areas) аль нь вэ?
- A) Source, Build, Deploy
- B) Working Directory, Staging Area, Repository
- C) Local, Remote, Cloud
- D) Code, Test, Production
Зөв хариулт: B
Тайлбар: Working Directory (код бичих) → Staging Area (бэлтгэх) → Repository (түүхэнд хадгалах). Гал тогоо → Тавлага → Зураг авах.
Тест 6
git init команд юу хийдэг вэ?
- A) Файл устгах
- B) Шинэ Git репозитор үүсгэх
- C) Алсын сервертэй холбогдох
- D) Commit хийх
Зөв хариулт: B
Тайлбар:
git initнь одоогийн хавтаст.gitдэд хавтас үүсгэж, шинэ Git репозитор эхлүүлнэ.
Тест 7
git clone команд юу хийдэг вэ?
- A) Branch үүсгэх
- B) Алсын репозиторын бүтэн хуулбар авах
- C) Файл устгах
- D) Commit буцаах
Зөв хариулт: B
Тайлбар:
git clone URL— Алсын серверээс бүтэн репозиторыг (бүх түүхтэй) локал компьютерт хуулна.
Тест 8
git add команд юу хийдэг вэ?
- A) Commit хийх
- B) Файлыг Staging Area-д нэмэх
- C) Файл устгах
- D) Branch үүсгэх
Зөв хариулт: B
Тайлбар:
git addнь Working Directory-аас Staging Area руу файл зөөнө. Дараагийн commit-д оруулахаар "бэлтгэнэ".
Тест 9
git commit -m "message" команд юу хийдэг вэ?
- A) Файл staging-д нэмэх
- B) Staging Area дахь өөрчлөлтийг түүхэнд хадгалах
- C) Алсын сервер рүү илгээх
- D) Branch үүсгэх
Зөв хариулт: B
Тайлбар:
git commitнь Staging Area-д бэлтгэсэн өөрчлөлтийг Repository-д (түүхэнд) хадгална.-mнь мессеж.
Тест 10
git push команд юу хийдэг вэ?
- A) Алсын серверээс татах
- B) Локал commit-уудыг алсын сервер рүү илгээх
- C) Branch устгах
- D) Conflict шийдвэрлэх
Зөв хариулт: B
Тайлбар:
git push origin main— Локал дахь commit-уудыг алсын сервер (GitHub/GitLab) руу илгээнэ. Баг бусад хүн харж чадна.
Тест 11
git pull команд юу хийдэг вэ?
- A) Локал commit илгээх
- B) Алсын серверээс шинэ өөрчлөлтийг татаж, автоматаар merge хийх
- C) Branch устгах
- D) Staging area цэвэрлэх
Зөв хариулт: B
Тайлбар:
git pull=git fetch+git merge. Алсын серверээс мэдээлэл татаж, одоогийн branch-тай автоматаар нэгтгэнэ.
Тест 12
git status команд юу харуулдаг вэ?
- A) Commit-ийн түүх
- B) Working directory ба Staging area-ийн одоогийн төлөв
- C) Branch жагсаалт
- D) Remote серверийн мэдээлэл
Зөв хариулт: B
Тайлбар:
git status— Ямар файл өөрчлөгдсөн, ямар файл staging-д бэлтгэгдсэн, ямар файл untracked байна гэдгийг харуулна.
Тест 13
Branch гэж юу вэ?
- A) Файл устгах үйлдэл
- B) Хөгжүүлэлтийн тусдаа шугам — үндсэн кодонд нөлөөлөхгүй
- C) Commit-ийн нэр
- D) Алсын сервер
Зөв хариулт: B
Тайлбар: Branch = Салаалт. Шинэ функц, алдаа засвар зэргийг тусдаа branch-д хийж, дуусмагц main руу нэгтгэнэ.
Тест 14
git checkout -b feature/login команд юу хийдэг вэ?
- A) Branch устгах
- B)
feature/loginнэртэй шинэ branch үүсгэж, тэр branch руу шилжих - C) Файл нээх
- D) Commit хийх
Зөв хариулт: B
Тайлбар:
-bфлаг нь шинэ branch үүсгэнэ.git checkoutнь тэр branch руу шилжинэ. Нэг алхамд 2 үйлдэл.
Тест 15
Merge гэж юу вэ?
- A) Branch устгах
- B) Хоёр branch-ийн өөрчлөлтийг нэг болгох
- C) Файл хуулах
- D) Commit буцаах
Зөв хариулт: B
Тайлбар:
git merge feature/login— feature/login branch-ийн өөрчлөлтийг одоогийн branch-д нэгтгэнэ.
Тест 16
Rebase ба Merge-ийн гол ялгаа юу вэ?
- A) Ялгаагүй
- B) Merge нь merge commit үүсгэдэг, Rebase нь шугаман түүх үүсгэдэг
- C) Rebase нь илүү аюулгүй
- D) Merge нь түүхийг устгадаг
Зөв хариулт: B
Тайлбар: Merge = Merge commit бүхий "салаа" түүх. Rebase = Commit-уудыг дахин тавьж "шугаман" түүх үүсгэнэ. Rebase нь нийтийн branch-д аюултай.
Тест 17
Merge Conflict хэзээ үүсдэг вэ?
- A) Файл устгахад
- B) Хоёр branch дээр ижил файлын ижил мөрийг өөрөөр засварласан үед
- C) git push хийхэд
- D) Branch үүсгэхэд
Зөв хариулт: B
Тайлбар: Git автоматаар нэгтгэж чадахгүй → Хөгжүүлэгч гараар шийдвэрлэх шаардлагатай.
<<<<<<<,=======,>>>>>>>тэмдэглэгээ.
Тест 18
Conflict файлын тэмдэглэгээнд ======= юу ялгадаг вэ?
- A) Файлын эхлэл
- B) Хоёр branch-ийн зөрчилтэй хэсгийг тусгаарлагч
- C) Commit хийлгэдэг
- D) Файл устгадаг
Зөв хариулт: B
Тайлбар:
<<<<<<< HEAD(одоогийн branch)=======(тусгаарлагч)>>>>>>> feature/xxx(нэгтгэж буй branch). Хөгжүүлэгч зөв хувилбарыг сонгоно.
Тест 19
Pull Request (PR) гэж юу вэ?
- A) Код push хийх
- B) Кодыг merge хийхийн өмнө багийн гишүүдээр шалгуулах хүсэлт
- C) Branch устгах
- D) Тест ажиллуулах
Зөв хариулт: B
Тайлбар: PR = Code Review + Шалгалт + Хэлэлцүүлэг. Merge-ийн өмнө бусад хөгжүүлэгч кодыг шалгаж, сайжруулах санал өгнө.
Тест 20
Git Flow стратегид ямар branch-ууд байдаг вэ?
- A) Зөвхөн main
- B) main, develop, feature, release, hotfix
- C) main, test, deploy
- D) src, build, dist
Зөв хариулт: B
Тайлбар: Git Flow = 5 branch: main (production), develop (хөгжүүлэлт), feature/ (шинэ функц), release/ (бэлтгэл), hotfix/ (яаралтай засвар).
Тест 21
GitHub Flow стратегийн гол зарчим юу вэ?
- A) Олон branch ашиглах
- B) main + feature branch + PR → Энгийн, жижиг багуудад
- C) Зөвхөн main ашиглах
- D) Release branch заавал ашиглах
Зөв хариулт: B
Тайлбар: GitHub Flow = Маш энгийн: main-аас branch салгах → Код бичих → PR → Review → Merge → Deploy.
Тест 22
Staging Area (Index) юу хийдэг вэ?
- A) Код компайлдах
- B) Дараагийн commit-д оруулах файлуудыг бэлтгэх
- C) Тест ажиллуулах
- D) Алсын сервертэй холбогдох
Зөв хариулт: B
Тайлбар: Staging Area = "Тайз".
git addхийхэд файл тайзнаа гарна →git commitхийхэд "тоглолт" болно (түүхэнд хадгалагдана).
Тест 23
HEAD гэж юу вэ?
- A) Эхний commit
- B) Одоогийн branch-ийн хамгийн сүүлийн commit руу заадаг заагч
- C) Алсын сервер
- D) Main branch
Зөв хариулт: B
Тайлбар: HEAD = "Та одоо хаана байна". Одоогийн branch-ийн оройн commit руу заана.
git checkoutхийхэд HEAD шилжинэ.
Тест 24
git log --oneline --graph юу харуулдаг вэ?
- A) Файлуудын жагсаалт
- B) Commit-ийн түүхийг товч, график хэлбэрээр
- C) Branch жагсаалт
- D) Remote серверийн мэдээлэл
Зөв хариулт: B
Тайлбар:
--oneline= Нэг мөрд нэг commit.--graph= Branch-уудын салаалтыг визуалаар. Түүхийг хурдан ойлгоход тустай.
Тест 25
git blame filename юу харуулдаг вэ?
- A) Файлын хэмжээ
- B) Файлын мөр бүрийг хэн, хэзээ бичсэнийг
- C) Branch жагсаалт
- D) Conflict жагсаалт
Зөв хариулт: B
Тайлбар:
git blame= Мөр бүрийн зохиогч, commit, огноог харуулна. Алдаа хэн оруулсныг олоход хэрэгтэй.
Тест 26
.gitignore файл юу хийдэг вэ?
- A) Git-ийг устгах
- B) Git-д бүртгэхгүй файлуудын жагсаалтыг тодорхойлох
- C) Commit мессеж бичих
- D) Branch устгах
Зөв хариулт: B
Тайлбар:
.gitignore-д бичсэн файлуудыг Git үл тоомсорлоно. *.class, .idea/, .env зэрэг build, IDE, нууц файлууд.
Тест 27
API key-г Git-д нэмж болох уу?
- A) Болно, асуудалгүй
- B) ХЭЗЭЭ Ч БОЛОХГҮЙ — .gitignore-д нэмж, .env файлд хадгалах
- C) Зөвхөн private repo-д болно
- D) Commit мессежэнд бичих
Зөв хариулт: B
Тайлбар: API key, нууц үг, токен → ХЭЗЭЭ Ч Git-д нэмэхгүй!
.envфайлд хадгалж,.gitignore-д нэмэх. Git түүхэнд нэг удаа орвол устгахад маш хэцүү.
Тест 28
CI (Continuous Integration) гэж юу вэ?
- A) Код гараар тестлэх
- B) Push бүрт автоматаар build, тест ажиллуулах
- C) Зөвхөн deploy хийх
- D) Branch үүсгэх
Зөв хариулт: B
Тайлбар: CI = Хөгжүүлэгч push хийх бүрд CI сервер автоматаар build + тест ажиллуулна → Алдааг ЭРТ олно.
Тест 29
CD (Continuous Delivery) гэж юу вэ?
- A) Зөвхөн тест
- B) CI-ийн дараа автоматаар staging/production руу deploy хийх
- C) Код бичих
- D) Branch merge хийх
Зөв хариулт: B
Тайлбар: CD = CI-ийн дараах алхам. Тест pass → Автоматаар staging/production руу deploy. Хүргэлт хурдасна, гар ажиллагаа багасна.
Тест 30
Conventional Commits стандартаар "шинэ функц" нэмсэн commit яаж бичих вэ?
- A)
update: done - B)
feat(module): тайлбар - C)
new function added - D)
v2
Зөв хариулт: B
Тайлбар:
feat(auth): нэвтрэлтийн модуль нэмсэн. feat = feature (шинэ функц). Стандарт мессеж → Түүх ойлгомжтой, автомат changelog.
Тест 31
git stash команд юу хийдэг вэ?
- A) Файл устгах
- B) Дуусаагүй өөрчлөлтийг түр хадгалж, цэвэр working directory-д буцаах
- C) Branch үүсгэх
- D) Commit хийх
Зөв хариулт: B
Тайлбар:
git stash= Дуусаагүй ажлыг "шүүгээнд" түр хадгалах. Бусад ажил хийж,git stash pop-аар буцааж авна.
Тест 32
git revert HEAD команд юу хийдэг вэ?
- A) Бүх түүх устгах
- B) Сүүлийн commit-ийг буцааж, ШИНЭ commit үүсгэх (түүх хадгалагдана)
- C) Branch устгах
- D) Файл нээх
Зөв хариулт: B
Тайлбар:
git revertнь commit-ийн ЭСРЭГ өөрчлөлт бүхий шинэ commit үүсгэнэ. Түүх хадгалагдана → Аюулгүй буцаах арга.
Тест 33
git reset ба git revert-ийн ялгаа юу вэ?
- A) Ялгаагүй
- B) reset нь түүхийг өөрчилдөг, revert нь шинэ commit үүсгэж буцаадаг
- C) revert нь түүхийг устгадаг
- D) reset нь илүү аюулгүй
Зөв хариулт: B
Тайлбар: reset = HEAD-ийг шилжүүлж, түүх ӨӨРЧЛӨГДӨж болно (аюултай). revert = Шинэ commit үүсгэж буцаана (түүх хадгалагдана, аюулгүй).
Тест 34
git cherry-pick команд юу хийдэг вэ?
- A) Branch устгах
- B) Тодорхой commit-ийг өөр branch руу хуулах
- C) Бүх commit устгах
- D) Merge conflict үүсгэх
Зөв хариулт: B
Тайлбар: Cherry-pick = "Алимыг сонгож түүх". Нэг branch-ийн тодорхой commit-ийг өөр branch руу сонгож авна. Бүх зүйлийг merge хийхгүйгээр.
Тест 35
git diff команд юу харуулдаг вэ?
- A) Branch жагсаалт
- B) Хоёр commit/файлын хоорондох ялгааг
- C) Remote серверийн мэдээлэл
- D) Commit мессеж
Зөв хариулт: B
Тайлбар:
git diff= Юу өөрчлөгдсөнийг харуулна.+нэмэгдсэн мөр,-устгагдсан мөр. Code review-д маш хэрэгтэй.
Тест 36
git fetch ба git pull-ийн ялгаа юу вэ?
- A) Ялгаагүй
- B) fetch нь зөвхөн мэдээлэл татдаг, pull нь татаад автоматаар merge хийдэг
- C) pull нь зөвхөн мэдээлэл татдаг
- D) fetch нь автоматаар merge хийдэг
Зөв хариулт: B
Тайлбар:
git fetch= Мэдээлэл татах, MERGE ХИЙХГҮЙ (аюулгүй шалгах).git pull=fetch+merge(автомат нэгтгэх).
Тест 37
git commit --amend юу хийдэг вэ?
- A) Шинэ commit үүсгэх
- B) Сүүлийн commit-ийн мессеж эсвэл агуулгыг засах
- C) Branch устгах
- D) Файл нээх
Зөв хариулт: B
Тайлбар: Сүүлийн commit-д бичиг дутуу мессеж, мартсан файл нэмэхэд хэрэглэнэ. Push хийсний ДАРАА amend хийж болохгүй (түүх өөрчлөгдөнө).
Тест 38
origin гэж юу вэ?
- A) Эхний commit
- B) Клонлосон алсын серверийн анхдагч нэр
- C) Main branch
- D) HEAD
Зөв хариулт: B
Тайлбар:
git cloneхийхэд алсын сервертoriginгэсэн нэр автоматаар өгөгдөнө.git push origin main= origin сервер рүү main branch-ийг push хийх.
Тест 39
Semantic Versioning (v1.2.3) дахь тоонуудын утга юу вэ?
- A) Огноо
- B) MAJOR.MINOR.PATCH — их өөрчлөлт.жижиг функц.алдаа засвар
- C) Хөгжүүлэгчийн дугаар
- D) Файлын тоо
Зөв хариулт: B
Тайлбар: MAJOR = Нийцэхгүй өөрчлөлт. MINOR = Шинэ функц (нийцтэй). PATCH = Алдаа засвар. v2.0.0 = Major breaking change.
Тест 40
Tag юу хийдэг вэ?
- A) Branch устгах
- B) Тодорхой commit-д нэр (шошго) өгөх — хувилбар гаргахад ашиглана
- C) Файл нэмэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git tag v1.0.0— Одоогийн commit-д "v1.0.0" шошго өгнө. Release гаргахад тухайн цэгийг тэмдэглэх.
Тест 41
Fork ба Clone-ийн ялгаа юу вэ?
- A) Ялгаагүй
- B) Fork нь бусдын repo-г өөрийн GitHub бүртгэлд хуулна, Clone нь локалд хуулна
- C) Clone нь GitHub дээр хуулна
- D) Fork нь локалд хуулна
Зөв хариулт: B
Тайлбар: Fork = GitHub дээр өөрийн бүртгэлд хуулах (нээлттэй эхийн төсөлд хувь нэмэр оруулахад). Clone = Локал компьютерт хуулах.
Тест 42
Rebase-ийг нийтийн branch (main) дээр хийж болох уу?
- A) Болно
- B) ХЭЗЭЭ Ч БОЛОХГҮЙ — Бусад хөгжүүлэгчийн түүхийг эвдэнэ
- C) Зөвхөн менежер хийнэ
- D) Зөвхөн weekend-д хийнэ
Зөв хариулт: B
Тайлбар: "Алтан дүрэм": Нийтийн branch-д ХЭЗЭЭ Ч rebase хийхгүй. Rebase нь түүхийг дахин бичдэг → Бусад хөгжүүлэгчийн branch эвдэрнэ.
Тест 43
Hotfix branch юунд зориулагдсан вэ?
- A) Шинэ функц нэмэх
- B) Production-д гарсан яаралтай алдааг засах
- C) Код refactor хийх
- D) Тест бичих
Зөв хариулт: B
Тайлбар: Hotfix = Production дээр гарсан яаралтай алдаа → main-аас branch салгах → Засах → main + develop руу merge.
Тест 44
Git-ийн давуу тал дотор аль нь АЛГА вэ?
- A) Офлайн ажиллах боломж
- B) Автоматаар код бичдэг
- C) Маш хурдан
- D) Олон мянган branch дэмжих
Зөв хариулт: B
Тайлбар: Git нь автоматаар код бичдэггүй! Давуу талууд: Офлайн ажиллах, хурдан (бүх зүйл локал), олон branch дэмжих, бүтэн түүх.
Тест 45
git branch -d feature/login юу хийдэг вэ?
- A) Branch үүсгэх
- B) Merge хийгдсэн feature/login branch-ийг устгах
- C) Branch нэр солих
- D) Branch руу шилжих
Зөв хариулт: B
Тайлбар:
-dнь branch-ийг устгана. Merge хийгдсэн branch-ийг устгана. Merge хийгдээгүй бол-D(том) ашиглах шаардлагатай.
Тест 46
Сайн Pull Request-ийн шинж аль нь вэ?
- A) 5000 мөр өөрчлөлттэй, олон функцийг хамарсан
- B) Жижиг (200-400 мөр), нэг зорилготой, тайлбартай, тест бүхий
- C) Тайлбаргүй, хурдан merge хийх
- D) Зөвхөн нэг хүн шалгасан
Зөв хариулт: B
Тайлбар: Жижиг PR = Хурдан review, алдаа бага. Нэг PR = Нэг функц/алдаа. Тайлбар + тест = Чанартай.
Тест 47
Дараах commit мессежүүдийн аль нь ХАМГИЙН ЗӨВ вэ?
- A)
fix - B)
update code - C)
fix(cart): сагсанд бүтээгдэхүүн нэмэхэд тооцоолол буруу байсныг засав - D)
asdf
Зөв хариулт: C
Тайлбар: Conventional Commits:
fix(cart): ...— Төрөл (fix), хамрах хүрээ (cart), тодорхой тайлбар. Түүхийг уншихад ойлгомжтой.
Тест 48
GitHub Actions юу хийдэг вэ?
- A) Код бичих
- B) CI/CD автоматжуулалт — push/PR үед автоматаар build, тест, deploy ажиллуулах
- C) Branch устгах
- D) Conflict шийдвэрлэх
Зөв хариулт: B
Тайлбар: GitHub Actions = YAML файлаар CI/CD workflow тодорхойлно. Push/PR бүрт автоматаар build + тест + deploy ажиллана.
Тест 49
Trunk-Based Development стратегийн гол зарчим юу вэ?
- A) Олон урт branch ашиглах
- B) Бүх хөгжүүлэгч main руу шууд эсвэл маш богино branch-аар commit хийх
- C) Release branch заавал ашиглах
- D) Develop branch ашиглах
Зөв хариулт: B
Тайлбар: Trunk-Based = Бүгд main (trunk) руу богино branch-аар. CI/CD-д хамгийн тохиромжтой. Branch-ийн амьдрах хугацаа маш богино.
Тест 50
git restore --staged filename юу хийдэг вэ?
- A) Файл устгах
- B) Staging Area-аас файлыг буцаах (unstage)
- C) Файл нэмэх
- D) Commit хийх
Зөв хариулт: B
Тайлбар:
git add-аар staging-д нэмсэн файлыг буцааж, staging-аас гаргана. Файлын агуулга ӨӨРЧЛӨГДӨхгүй — зөвхөн staging-аас хасна.
Тест 51
git remote -v юу харуулдаг вэ?
- A) Branch жагсаалт
- B) Холбогдсон алсын серверүүдийн нэр ба URL
- C) Commit түүх
- D) Файлуудын жагсаалт
Зөв хариулт: B
Тайлбар:
git remote -v— Бүх remote серверийн нэр (origin гэх мэт) болон URL-ийг fetch/push-ээр ялгаж харуулна.
Тест 52
DVCS (Distributed VCS)-ийн гол давуу тал юу вэ?
- A) Зөвхөн нэг хуулбар
- B) Хөгжүүлэгч бүр бүтэн хуулбар авдаг → Офлайн ажиллах, сервер эвдэрсэн ч нөөц бүрэн
- C) Нэг төв сервер
- D) Зөвхөн онлайн ажилладаг
Зөв хариулт: B
Тайлбар: DVCS-д хүн бүр бүтэн түүхтэй хуулбар → Офлайн commit, branch хийх боломжтой. Сервер унтарсан ч ажиллана.
Тест 53
Code Review-ийн давуу тал аль нь вэ?
- A) Зөвхөн алдаа олох
- B) Алдаа олох, мэдлэг хуваалцах, кодын чанар сайжруулах, багийн нэгдмэл стиль
- C) Зөвхөн формат шалгах
- D) Зөвхөн менежерт хэрэгтэй
Зөв хариулт: B
Тайлбар: Code Review = Алдаа олох + Мэдлэг хуваалцах + Кодын чанар сайжруулах + Нэгдмэл стиль. Баг бүгд суралцана.
Тест 54
Git-д "fast-forward merge" гэж юу вэ?
- A) Хурдан commit
- B) Main branch-д шинэ commit байхгүй үед, feature branch-ийн commit-уудыг шууд main-ийн оройд тавих
- C) Branch устгах
- D) Rebase хийх
Зөв хариулт: B
Тайлбар: Fast-forward = Main-д шинэ commit байхгүй → Feature-ийн commit-уудыг "шулуухан" main-ийн оройд тавих. Merge commit үүсгэхгүй.
Тест 55
git switch команд юу хийдэг вэ?
- A) Файл нээх
- B) Branch хооронд шилжих (git checkout-ийн шинэ хувилбар)
- C) Commit хийх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git switch main=git checkout main. Git 2.23+ хувилбараас нэмэгдсэн, зөвхөн branch шилжихэд зориулсан (checkout-ийн хялбарчилсан).
Тест 56
git push -u origin main дахь -u флаг юу хийдэг вэ?
- A) Файл устгах
- B) Upstream тохируулах — дараа нь зөвхөн
git pushбичихэд хангалттай болно - C) Force push
- D) Branch устгах
Зөв хариулт: B
Тайлбар:
-u(--set-upstream) = Локал branch-ийг remote branch-тай холбоно. Дараа ньgit push(origin main-гүйгээр) бичихэд хангалттай.
Тест 57
git push --force юу хийдэг вэ, яагаад аюултай вэ?
- A) Аюулгүй push
- B) Алсын серверийн түүхийг дарж бичих — бусдын commit устгаж болно
- C) Branch устгах
- D) Зөвхөн шинэ файл push
Зөв хариулт: B
Тайлбар:
--forceнь алсын серверийн түүхийг ДАРЖ бичнэ → Бусад хөгжүүлэгчийн push хийсэн commit-ууд УСТАЖ болно. Маш аюултай!
Тест 58
Monorepo гэж юу вэ?
- A) Олон репозитор
- B) Нэг репозиторт олон төсөл/модуль хадгалах
- C) Жижиг репозитор
- D) Хоосон репозитор
Зөв хариулт: B
Тайлбар: Monorepo = Google, Facebook ашигладаг. Нэг repo-д frontend + backend + shared lib бүгд байна. Давуу тал: Нэгдмэл хувилбарлалт.
Тест 59
Git-д tracked ба untracked файлын ялгаа юу вэ?
- A) Ялгаагүй
- B) Tracked = Git мэддэг файл, Untracked = Git мэдэхгүй шинэ файл
- C) Tracked = Устгасан файл
- D) Untracked = Commit хийсэн файл
Зөв хариулт: B
Тайлбар: Tracked = Өмнө нь
git addхийж, Git-д бүртгэгдсэн. Untracked = Git огт мэдэхгүй шинэ файл.git status-д харагдана.
Тест 60
Squash merge юу хийдэг вэ?
- A) Branch устгах
- B) Feature branch-ийн олон commit-ийг нэг commit болгож merge хийх
- C) Бүх commit устгах
- D) Rebase хийх
Зөв хариулт: B
Тайлбар: Squash merge = Feature branch дотор 10 commit байсан ч main-д 1 цэвэр commit болж нэгтгэгдэнэ. Main-ийн түүх цэвэр.
Тест 61
Git-ийн .git хавтас юу хадгалдаг вэ?
- A) Зөвхөн тохиргоо
- B) Репозиторын бүх түүх, объект, тохиргоо, index
- C) Зөвхөн сүүлийн commit
- D) Зөвхөн branch жагсаалт
Зөв хариулт: B
Тайлбар:
.git= Репозиторын "тархи". Бүх commit, branch, tag, тохиргоо, объектууд хадгалагдана. Устгавал бүх түүх алдагдана!
Тест 62
Git-ийн Interactive Rebase (git rebase -i) юу хийж болох вэ?
- A) Зөвхөн merge
- B) Commit-уудыг дахин эрэмбэлэх, нэгтгэх (squash), засах, устгах
- C) Branch үүсгэх
- D) Зөвхөн push
Зөв хариулт: B
Тайлбар: Interactive rebase = Commit-ийн түүхийг дахин "засварлах". pick, squash, edit, reword, drop зэрэг үйлдлүүд. Push-ийн ӨМНӨ хэрэглэх.
Тест 63
Git submodule юу хийдэг вэ?
- A) Branch үүсгэх
- B) Нэг репозитор дотор бусад репозиторыг хамааралтай нэмэх
- C) Commit устгах
- D) Тест ажиллуулах
Зөв хариулт: B
Тайлбар: Submodule = Нэг repo дотор бусад repo-г оруулах. Тус тусын түүхтэй. Shared library зэрэг дундын кодыг удирдахад ашиглана.
Тест 64
git log --author="Баатар" юу хийдэг вэ?
- A) Бүх commit харуулах
- B) Зөвхөн "Баатар"-ийн commit-уудыг шүүж харуулах
- C) Баатарын файлуудыг устгах
- D) Branch жагсаалт
Зөв хариулт: B
Тайлбар:
--authorшүүлтүүр = Тодорхой хөгжүүлэгчийн хийсэн commit-уудыг шүүж харуулна. Хэн юу хийсэнийг олоход хэрэгтэй.
Тест 65
GitHub дээр "Issues" юу хийдэг вэ?
- A) Код бичих
- B) Алдаа, шинэ функц хүсэлт, даалгавар зэргийг бүртгэж, хянах
- C) Branch устгах
- D) Merge хийх
Зөв хариулт: B
Тайлбар: Issues = Төслийн даалгаврын удирдлага. Bug report, feature request, discussion. PR-тай холбож, ажлын явцыг хянах.
Тест 66
git bisect команд юу хийдэг вэ?
- A) Branch устгах
- B) Binary search ашиглан алдаа оруулсан commit-ийг олох
- C) Файл нэмэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git bisect= Олон commit-ийн дундаас binary search-ээр алдаа ХЭЗЭЭ оруулснийг олно. Маш хурдан — 1000 commit-оос 10 алхамаар олно.
Тест 67
Git hook гэж юу вэ?
- A) Branch устгах
- B) Git-ийн тодорхой үйлдлийн (commit, push) өмнө/дараа автоматаар ажилладаг скрипт
- C) Файл нэмэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар: Git hook = Commit-ийн өмнө тест ажиллуулах (pre-commit), push-ийн өмнө lint шалгах (pre-push).
.git/hooks/хавтаст тохируулна.
Тест 68
git worktree команд юу хийдэг вэ?
- A) Branch устгах
- B) Нэг repo-д олон Working Directory нэгэн зэрэг ашиглах
- C) Файл нэмэх
- D) Commit хийх
Зөв хариулт: B
Тайлбар:
git worktree add ../hotfix hotfix/bug— main дээр ажиллаж байхдаа, өөр хавтаст hotfix branch-ийг нэгэн зэрэг нээх. Branch солихгүйгээр зэрэгцүүлэн ажиллана.
Тест 69
git clean -fd команд юу хийдэг вэ?
- A) Commit хийх
- B) Untracked файл, хавтсуудыг устгах
- C) Branch үүсгэх
- D) Staging area цэвэрлэх
Зөв хариулт: B
Тайлбар:
git clean -fd=-f(force) +-d(directory). Git-д бүртгэгдээгүй файл, хавтсыг бүгдийг устгана. Working directory-г цэвэрлэнэ.
Тест 70
GitHub-д "Protected Branch" гэж юу вэ?
- A) Шифрлэгдсэн branch
- B) Шууд push хийхээс хамгаалсан branch — зөвхөн PR + review-ээр merge
- C) Устгагдсан branch
- D) Нууц branch
Зөв хариулт: B
Тайлбар: Protected Branch = main branch-д шууд push хийхийг хориглоно. Зөвхөн PR → Code Review → CI pass → Merge. Кодын чанарыг хамгаална.
Тест 71
git reflog команд юу харуулдаг вэ?
- A) Branch жагсаалт
- B) HEAD-ийн бүх шилжилтийн түүх — "устгасан" commit-ийг олоход тусална
- C) Remote серверийн мэдээлэл
- D) Файлуудын жагсаалт
Зөв хариулт: B
Тайлбар:
git reflog= HEAD хаашаа шилжсэний түүх.git reset --hardхийсний дараа ч "алдагдсан" commit-ийг олж сэргээх боломжтой.
Тест 72
git reset --soft HEAD~1 юу хийдэг вэ?
- A) Файл устгах
- B) Сүүлийн commit-ийг буцааж, өөрчлөлтийг staging area-д хадгалах
- C) Branch устгах
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
--soft= Commit буцаана, өөрчлөлт staging-д байна (дахин commit хийж болно).--mixed= Working dir-д.--hard= Бүгдийг устгана (аюултай!).
Тест 73
git reset --hard HEAD~1 яагаад аюултай вэ?
- A) Аюулгүй
- B) Сүүлийн commit-ийн БҮХИЙ Л өөрчлөлтийг БҮРМӨСӨН устгана
- C) Branch нэр солино
- D) Remote-д нөлөөлнө
Зөв хариулт: B
Тайлбар:
--hard= Commit + staging + working directory-ийн өөрчлөлтийг БҮГДИЙГ устгана. Сэргээх хэцүү (git reflog-оор боломжтой, гэхдээ эрсдэлтэй).
Тест 74
Git LFS (Large File Storage) юу хийдэг вэ?
- A) Branch устгах
- B) Том файлуудыг (зураг, видео, binary) Git-д оновчтой хадгалах
- C) Commit хийх
- D) Merge хийх
Зөв хариулт: B
Тайлбар: Git LFS = Том файлуудыг (>100MB) тусдаа серверт хадгалж, repo-д зөвхөн заагч (pointer) хадгална. Repo-ийн хэмжээ жижиг байна.
Тест 75
git shortlog команд юу хийдэг вэ?
- A) Branch устгах
- B) Зохиогч тус бүрийн commit тоог нэгтгэж харуулах
- C) Файл нэмэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git shortlog -sn= Хөгжүүлэгч бүрийн commit тоог тоолж, эрэмбэлж харуулна. Хэн хамгийн идэвхтэй байгааг мэдэх.
Тест 76
Дараах аль нь .gitignore-д байх ЁСТОЙ вэ?
- A) Source код (.java)
- B) .env файл, .idea/ хавтас, *.class файл
- C) README.md
- D) Тест файлууд
Зөв хариулт: B
Тайлбар:
.env(нууц),.idea/(IDE тохиргоо),*.class(compiled) → Git-д хэрэггүй, нууцлал/цэвэр байдалд саад. Source, README, тест → Git-д заавал байх ёстой.
Тест 77
git tag -a v1.0.0 -m "Release 1.0" дахь -a юу гэсэн утгатай вэ?
- A) Auto
- B) Annotated tag — нэмэлт мэдээлэлтэй (зохиогч, огноо, мессеж) шошго
- C) Add
- D) Amend
Зөв хариулт: B
Тайлбар:
-a= Annotated tag. Lightweight tag-аас ялгаатай нь: зохиогч, огноо, мессеж хадгалагдана. Release-д annotated tag ашиглах нь зөв.
Тест 78
GitHub-д "Actions" tab дээр CI ажиллаж байх үед ногоон тэмдэг юу гэсэн утгатай вэ?
- A) Алдаатай
- B) Бүх build, тест амжилттай дамжсан
- C) Ажиллаж байна
- D) Цуцлагдсан
Зөв хариулт: B
Тайлбар: ✅ Ногоон = Бүгд pass. ❌ Улаан = Fail. 🟡 Шар = Ажиллаж байна. CI/CD-ийн статусыг PR дээр шууд харж болно.
Тест 79
git stash list юу харуулдаг вэ?
- A) Branch жагсаалт
- B) Түр хадгалсан (stash) өөрчлөлтүүдийн жагсаалт
- C) Commit түүх
- D) Remote жагсаалт
Зөв хариулт: B
Тайлбар:
git stash list= Бүх stash-уудыг жагсаалтаар харуулна.stash@{0},stash@{1}гэх мэт.git stash pop= Сүүлийнхийг сэргээх.
Тест 80
git merge --no-ff feature/login дахь --no-ff юу хийдэг вэ?
- A) Fast-forward хийх
- B) Fast-forward хийхгүй — ЗААВАЛ merge commit үүсгэх
- C) Branch устгах
- D) Файл нэмэх
Зөв хариулт: B
Тайлбар:
--no-ff= No Fast-Forward. Fast-forward хийж болох ч ЗААВАЛ merge commit үүсгэнэ → Хэзээ merge хийснийг түүхэнд тодорхой хадгална.
Тест 81
Git-д "detached HEAD" гэж юу вэ?
- A) HEAD устгагдсан
- B) HEAD нь branch-д биш, тодорхой commit руу шууд заасан төлөв
- C) Branch устгагдсан
- D) Remote холболт тасарсан
Зөв хариулт: B
Тайлбар:
git checkout abc123— Тодорхой commit руу шилжих. HEAD нь branch-д заахгүй → Шинэ commit хийвэл "алдагдаж" болно. Branch үүсгэж хадгалах хэрэгтэй.
Тест 82
git config --global alias.co checkout юу хийдэг вэ?
- A) Файл нэмэх
- B)
git coгэж бичихэдgit checkoutажиллахаар товчлол тохируулах - C) Branch устгах
- D) Commit хийх
Зөв хариулт: B
Тайлбар: Git alias = Урт командыг товчилж нэрлэх.
git co=git checkout,git br=git branch,git ci=git commit. Хурд нэмнэ.
Тест 83
GitHub-д "Dependabot" юу хийдэг вэ?
- A) Код бичих
- B) Хамааралтай сангуудын (dependencies) шинэчлэлтийг автоматаар шалгаж, PR үүсгэх
- C) Branch устгах
- D) Merge хийх
Зөв хариулт: B
Тайлбар: Dependabot = Аюулгүй байдлын сул тал, шинэ хувилбар гарахад автоматаар PR үүсгэж, dependencies-ийг шинэчлэхийг санал болгоно.
Тест 84
Merge strategy-д "ours" ба "theirs" гэж юу вэ?
- A) Хөгжүүлэгчийн нэр
- B) ours = одоогийн branch-ийн өөрчлөлтийг авах, theirs = нэгтгэж буй branch-ийнхийг авах
- C) Remote серверийн нэр
- D) Файлын нэр
Зөв хариулт: B
Тайлбар: Conflict шийдвэрлэхэд:
ours= HEAD (одоогийн branch) → Миний өөрчлөлт.theirs= Merge хийж буй branch → Нөгөө хүний өөрчлөлт.
Тест 85
Хэзээ git pull --rebase ашиглах нь зөв вэ?
- A) Хэзээ ч ашиглахгүй
- B) Өөрийн локал commit-ийн өмнө remote-ийн commit-уудыг тавьж, цэвэр түүх үүсгэхэд
- C) Зөвхөн merge-ийн дараа
- D) Зөвхөн push-ийн өмнө
Зөв хариулт: B
Тайлбар:
git pull --rebase= Remote-ийн шинэ commit-уудыг авч, миний локал commit-уудыг дээр нь тавина → Шугаман түүх. Merge commit үүсгэхгүй.
Тест 86
Нээлттэй эхийн (open source) төсөлд хувь нэмэр оруулах алхам аль нь вэ?
- A) Шууд main руу push
- B) Fork → Clone → Branch → Код бичих → Push → PR үүсгэх
- C) Зөвхөн Issue бичих
- D) Файл имэйлээр илгээх
Зөв хариулт: B
Тайлбар: Open source flow: Fork (хуулах) → Clone (локалд) → Branch (шинэ) → Код бичих → Push → PR (эх төсөл рүү). Maintainer шалгаж merge хийнэ.
Тест 87
git log --since="2024-01-01" --until="2024-06-30" юу хийдэг вэ?
- A) Branch устгах
- B) Тодорхой хугацааны хоорондох commit-уудыг шүүж харуулах
- C) Файл нэмэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
--since,--until= Огнооны хязгаараар commit шүүнэ. Тодорхой хугацаанд юу хийснийг шалгахад тустай.
Тест 88
GitHub-д "branch protection rules" дотор аль тохиргоо ХАМГИЙН ЧУХАЛ вэ?
- A) Branch нэр солих
- B) Require pull request reviews + Require status checks to pass
- C) Зөвхөн push хийх
- D) Branch устгах
Зөв хариулт: B
Тайлбар: PR review шаардах + CI status check pass шаардах = main branch-д зөвхөн шалгагдсан, тест дамжсан код л ордог. Чанарын хамгаалалт.
Тест 89
git archive команд юу хийдэг вэ?
- A) Commit устгах
- B) Репозиторын тодорхой хувилбарыг .zip/.tar файл болгон хадгалах
- C) Branch үүсгэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git archive --format=zip HEAD > project.zip— .git хавтсыг оруулахгүйгээр кодыг архивлана. Хүргэлт, нөөцлөлтөд ашиглана.
Тест 90
git grep "TODO" команд юу хийдэг вэ?
- A) Branch устгах
- B) Репозиторын бүх файлаас "TODO" текстийг хайх
- C) Commit хийх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git grep= Git-ийн бүртгэлтэй файлуудаас текст хайх. Энгийнgrep-ээс хурдан, зөвхөн tracked файлуудаас хайна.
Тест 91
Хамтын ажиллагаанд конфликт БУУРУУЛАХ хамгийн сайн арга юу вэ?
- A) Нэг хүн л ажиллах
- B) Тогтмол pull хийх, жижиг commit, богино branch, тодорхой хуваарь
- C) Конфликт гарахгүй
- D) Force push хийх
Зөв хариулт: B
Тайлбар: Тогтмол
git pull+ жижиг, тогтмол commit + богино branch + багийн гишүүдийн ажлын хуваарь тодорхой = Конфликт бага.
Тест 92
git show abc123 команд юу хийдэг вэ?
- A) Branch устгах
- B) Тодорхой commit-ийн мэдээлэл, өөрчлөлтийг харуулах
- C) Файл нэмэх
- D) Merge хийх
Зөв хариулт: B
Тайлбар:
git show= Commit-ийн мессеж, зохиогч, огноо, бүх өөрчлөлтийг (diff) нэг дор харуулна. Тухайн commit-д юу хийснийг мэдэх.
Тест 93
Gitflow-д release branch яагаад хэрэгтэй вэ?
- A) Код бичихэд
- B) Шинэ хувилбар гаргахын өмнө тест, bug fix, баримт бичиг зэргийг бэлтгэх
- C) Feature хөгжүүлэхэд
- D) Hotfix хийхэд
Зөв хариулт: B
Тайлбар: Release branch = develop-оос салгах → Зөвхөн bug fix, docs → Бэлэн болмогц main + develop руу merge → Tag тавих → Deploy.
Тест 94
git config --global core.autocrlf true юу хийдэг вэ?
- A) Branch устгах
- B) Windows (CRLF) ба Unix (LF) мөр төгсгөлийн ялгааг автоматаар зохицуулах
- C) Файл нэмэх
- D) Commit хийх
Зөв хариулт: B
Тайлбар: Windows = CRLF (\r\n), Mac/Linux = LF (\n).
autocrlf= Commit хийхэд LF болгож, checkout хийхэд OS-д тохируулна. Кросс-платформ баг.
Тест 95
GitHub дээр "Actions secrets" юу хадгалдаг вэ?
- A) Код
- B) API key, токен зэрэг нууц мэдээллийг CI/CD workflow-д аюулгүй дамжуулах
- C) Branch жагсаалт
- D) Commit түүх
Зөв хариулт: B
Тайлбар: Actions secrets = Нууц мэдээллийг шифрлэж хадгална. Workflow YAML файлд
${{ secrets.API_KEY }}гэж ашиглана. Кодонд хэзээ ч шууд бичэхгүй.
Тест 96
git blame -L 10,20 file.java юу хийдэг вэ?
- A) Файл устгах
- B) file.java-ийн 10-20 мөрийг хэн бичсэнийг харуулах
- C) Branch устгах
- D) Commit хийх
Зөв хариулт: B
Тайлбар:
-L 10,20= Зөвхөн 10-20 мөрийн зохиогчийг харуулна. Тодорхой мөрийн алдааг хэн оруулснийг олоход хэрэгтэй.
Тест 97
Git-д "orphan branch" гэж юу вэ?
- A) Устгагдсан branch
- B) Ямар ч commit-тай холбоогүй, бүрэн шинэ түүхтэй branch
- C) Main branch
- D) Remote branch
Зөв хариулт: B
Тайлбар:
git checkout --orphan gh-pages= Бүрэн хоосон түүхтэй шинэ branch. GitHub Pages, баримт бичиг зэрэгт кодын түүхээс тусдаа агуулга хадгалахад ашиглана.
Тест 98
VCS ашиглахгүй бол ямар эрсдэл үүсэх вэ?
- A) Эрсдэл байхгүй
- B) Код алдагдах, хамтран ажиллаж чадахгүй, өөрчлөлт мэдэгдэхгүй, буцаах боломжгүй
- C) Зөвхөн нэг хүн ажиллаж чадна
- D) Код хурдан ажиллана
Зөв хариулт: B
Тайлбар: VCS-гүй = project_final_FINAL хавтсууд, файл дарж бичих, хэн юу хийснийг мэдэхгүй, санамсаргүй устгавал сэргээх боломжгүй.
Тест 99
Git-ийн HEAD~3 гэж юу вэ?
- A) 3 дахь branch
- B) HEAD-ийн 3 commit-ийн өмнөх commit
- C) 3 файл
- D) 3 дахь remote
Зөв хариулт: B
Тайлбар:
HEAD~1= 1 commit өмнө,HEAD~3= 3 commit өмнө.git reset HEAD~3= Сүүлийн 3 commit-ийг буцаах. Тоо = Хэдэн алхам буцах.
Тест 100
Хувилбарын удирдлага (VCS) яагаад програм хангамжийн бүтээлтэд чухал вэ?
- A) Зөвхөн том компаниудад хэрэгтэй
- B) Кодын бүх түүхийг хадгалж, хамтран ажиллах, алдаа олох, хуучин хувилбар руу буцах боломж олгож, мэргэжлийн хөгжүүлэлтийн суурь
- C) Зөвхөн нээлттэй эхийн төсөлд
- D) Зөвхөн хувийн төсөлд
Зөв хариулт: B
Тайлбар: VCS нь БҮХИЙ Л програм хангамжийн төслийн суурь хэрэгсэл. Түүх хадгалах, хамтран ажиллах, алдаа олох, эрсдэл бууруулах, мэргэжлийн стандарт. Нэг хүнтэй ч, 1000 хүнтэй ч Git ашиглах нь ЗААВАЛ.
📚 Ашигласан эх сурвалжууд:
- Scott Chacon, Ben Straub — Pro Git (2nd Edition, 2014) — git-scm.com/book
- Atlassian — Git Tutorials — atlassian.com/git
- GitHub Docs — docs.github.com
- Vincent Driessen — A Successful Git Branching Model (Git Flow)
- Martin Fowler — Patterns for Managing Source Code Branches
- IEEE SWEBOK — Software Construction & Configuration Management
- Conventional Commits — conventionalcommits.org
- Semantic Versioning — semver.org