ЛАБ 05

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

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