ЛЕКЦ 05

Хувилбарын Удирдлага (Git)

ЛЕКЦ 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_FINALCommit бүр нь хувилбар
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 хэзээ ашиглах:

НөхцөлMergeRebase
Нийтийн 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Зорилго
mainProduction код — үргэлж ажилладаг
developХөгжүүлэлтийн үндсэн branch
feature/Шинэ функц бүрд тусдаа branch
release/Шинэ хувилбар гаргахын өмнөх бэлтгэл
hotfix/Production-д гарсан яаралтай алдааны засвар

1.9.2 GitHub Flow

Энгийн, жижиг багуудад тохиромжтой.

main ──●──●──●──●──●──●──●──●──●──
        ╲     ╱   ╲        ╱
         ●──●      ●──●──●
      feature    feature
      + PR       + PR

Дүрмүүд:

  1. main branch үргэлж deploy хийж болохуйц
  2. Шинэ ажил бүрд main-аас branch салгах
  3. Тогтмол commit хийж, push хийх
  4. Pull Request нээх
  5. Code Review-ийн дараа merge хийх
  6. 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-ийн давуу тал:

#Давуу талТайлбар
1Code 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 ActionsGitHub-тай нэгдсэн, үнэгүй
GitLab CI/CDGitLab-тай нэгдсэн
JenkinsНээлттэй эхийн, уян хатан
CircleCICloud-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 хугацаа дуусах алдааг засав"
3Branch ашиглахmain дээр шууд ажиллахгүй
4Pull Request ашиглахCode review-гүйгээр merge хийхгүй
5Conflict-ийг түргэн шийдэхУдаан орхивол conflict ихсэнэ
6Push-ийн өмнө pull хийхgit pull --rebase origin main
7Нууц мэдээлэл Git-д нэмэхгүй.env, API key → .gitignore
8.gitignore зөв тохируулахBuild файл, IDE тохиргоо нэмэхгүй


ХЭСЭГ 2: ТҮЛХҮҮР ҮГ БА МЭРГЭЖЛИЙН НЭР ТОМЬЁО (Keywords & Glossary)

#Англи нэр томьёоМонгол утгаДэлгэрэнгүй тайлбар
1Version Control System (VCS)Хувилбарын удирдлагын системФайлуудын өөрчлөлтийн түүхийг бүртгэж, удирдах систем.
2Repository (Repo)Репозитор / АгуулахКодын бүх файл, түүхийг хадгалдаг агуулах.
3CommitКоммит / БүртгэлӨөрчлөлтийг түүхэнд хадгалах үйлдэл. Нэг "хадгалах цэг".
4BranchСалаалт / СалбарХөгжүүлэлтийн тусдаа шугам. Үндсэн кодонд нөлөөлөхгүй.
5MergeНэгтгэхХоёр branch-ийн өөрчлөлтийг нэг болгох.
6RebaseСуурь шилжүүлэхBranch-ийн commit-уудыг өөр branch-ийн оройд тавих.
7CloneКлонлох / ХуулахАлсын репозиторын бүтэн хуулбар авах.
8PushТүлхэх / ИлгээхЛокал commit-уудыг алсын сервер рүү илгээх.
9PullТатахАлсын серверээс шинэ өөрчлөлтийг татах.
10FetchТатах (нэгтгэхгүй)Алсын серверээс мэдээлэл татах, гэхдээ автоматаар merge хийхгүй.
11Staging Area (Index)Бэлтгэл бүсДараагийн commit-д оруулах файлуудыг бэлтгэх газар.
12Working DirectoryАжлын хавтасФайлуудаа засварладаг газар.
13HEADТэргүүлэгчОдоогийн branch-ийн хамгийн сүүлийн commit руу заадаг заагч.
14RemoteАлсын серверАлсад байрлах репозитор (GitHub, GitLab гэх мэт).
15OriginЭх үүсвэрКлонлосон алсын серверийн анхдагч нэр.
16Pull Request (PR)Татах хүсэлтКодыг merge хийхийн өмнө шалгуулах хүсэлт (GitHub).
17Merge Request (MR)Нэгтгэх хүсэлтPR-тэй ижил, GitLab дахь нэр.
18Merge ConflictНэгтгэлийн зөрчилХоёр branch ижил мөрийг өөрөөр засварласан → автомат нэгтгэх боломжгүй.
19Git FlowГит урсгалmain, develop, feature, release, hotfix branch бүхий стратеги.
20GitHub FlowГитХаб урсгалЭнгийн стратеги: main + feature branch + PR.
21Trunk-Based DevelopmentҮндсэн мөчирт суурилсанБүгд main руу богино branch-аар commit хийх стратеги.
22CI (Continuous Integration)Тасралтгүй нэгтгэлPush бүрт автоматаар build, тест ажиллуулах.
23CD (Continuous Delivery)Тасралтгүй хүргэлтCI-ийн дараа автоматаар deploy хийх.
24TagШошгоТодорхой commit-д нэр өгөх. Хувилбар гаргахад (v1.0.0).
25StashНөөцлөх / Түр хадгалахДуусаагүй өөрчлөлтийг түр хадгалж, цэвэр branch руу шилжих.
26Cherry-pickСонгон авахТодорхой commit-ийг өөр branch руу хуулах.
27.gitignoreГит үл тоомсорлохGit-д бүртгэхгүй файлуудын жагсаалт.
28BlameБуруутгах / Гэм бурууФайлын мөр бүрийг хэн бичсэнийг харуулах.
29DiffЯлгааХоёр commit/файлын хоорондох ялгааг харуулах.
30RevertБуцаахCommit-ийг буцааж, шинэ commit үүсгэх (түүх хадгалагдана).
31ResetДахин тохируулахHEAD-ийг өмнөх commit руу шилжүүлэх (түүх өөрчлөгдөж болно).
32AmendЗасахСүүлийн commit-ийн мессеж/агуулгыг засах.
33ForkСалаалуулахБусдын репозиторыг өөрийн бүртгэлд хуулах (GitHub).
34Code ReviewКодын шалгалтБусад хөгжүүлэгч кодыг шалгаж, санал болгох.
35Conventional CommitsСтандарт коммитfeat:, fix:, refactor: гэх мэт commit мессежийн стандарт.
36Distributed VCSТархсан VCSХөгжүүлэгч бүр бүтэн хуулбар авдаг (Git, Mercurial).
37Centralized VCSТөвлөрсөн VCSНэг төв серверт бүх түүх хадгалагддаг (SVN).
38GitHub ActionsГитХаб ҮйлдлүүдGitHub-ийн CI/CD автоматжуулалтын хэрэгсэл.
39HotfixЯаралтай засварProduction-д гарсан алдааг яаралтай засах branch.
40Semantic VersioningУтга бүхий хувилбарлалтMAJOR.MINOR.PATCH (v1.2.3) хувилбарын дүрэм.


ХЭСЭГ 3: ЛАБОРАТОРИ БА ПРАКТИК ЗААВАР (Labs & Step-by-Step Guide)

3.1 Лабораторийн зорилго

Энэ лабораторид та Git-ийн бодит ашиглалтыг дадлагаар эзэмшинэ:

  1. Git репозитор үүсгэх, commit хийх
  2. Branch үүсгэж, feature хөгжүүлэх
  3. Merge conflict шийдвэрлэх
  4. 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 дээр репозитор үүсгэх

  1. GitHub.com руу нэвтрэх
  2. New repository товч дарах
  3. Нэр: student-management
  4. 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 үүсгэх

  1. GitHub дээр репозитор руу очих
  2. "Compare & pull request" товч дарах
  3. PR тайлбар бичих:
    ## Юу хийсэн
    - Оюутны нэрээр хайх функц нэмсэн
    - GPA-аар шүүх функц нэмсэн
    
    ## Тест
    - searchByName("Бат") → Бат олдоно
    - filterByGPA(3.5) → GPA >= 3.5 оюутнууд
    
  4. Create pull request дарах
  5. 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