❖ 1. សេចក្តីផ្តើមអំពី Git

1.1 Git និង Version Control System គឺជាអ្វី? រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Git ជា Version Control System (VCS)៖ ឧបករណ៍ដែលកត់ត្រាប្រវត្តិការផ្លាស់ប្តូរនៃកូដ អនុញ្ញាតឲ្យអ្នកអភិវឌ្ឍន៍ត្រឡប់ទៅកាន់កំណែចាស់ បើកមើលនរណាបានផ្លាស់ប្តូរអ្វី និងធ្វើការជាក្រុមដោយមិនបំផ្លាញការងាររបស់គ្នាទៅវិញទៅមក។ វាត្រូវបានបង្កើតឡើងដោយ Linus Torvalds (ស្ថាបនិក Linux) ក្នុងឆ្នាំ 2005។

1.2 ភាពខុសគ្នារវាង Git និង GitHub រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

GitGitHub
ជាអ្វីកម្មវិធី (Software) ដំណើរការនៅលើគ្រឿងខ្លួនឯងសេវាកម្មលើអនឡាញ (Website/Service)
មុខងារតាមដានប្រវត្តិកូដ (Version Control)រក្សាទុក Repository លើ Cloud + សហការជាក្រុម
ទាមទារអ៊ីនធឺណិតទេ (ដំណើរការក្នុងគ្រឿងបានទាំងស្រុង)ត្រូវការ ដើម្បីភ្ជាប់ទៅ Server
ចំណាំ៖ Git ដូចជា "ម៉ាស៊ីនថតវីដេអូ" សម្រាប់កូដ៖ ចាប់រូបភាព (snapshot) នៃ Project នៅពេលនីមួយៗ ចំណែក GitHub ដូចជា "YouTube" ជាកន្លែងផ្ទុក និងចែករំលែកវីដេអូទាំងនោះ។

1.3 ការដំឡើង Git រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ប្រព័ន្ធរបៀបដំឡើង
Windowsទាញយកពី git-scm.com ហើយដំណើរការ Installer
macOSbrew install git (ត្រូវការ Homebrew)
Linux (Ubuntu/Debian)sudo apt install git
# ពិនិត្យមើលថាតើ Git បានដំឡើងជោគជ័យដែរឬទេ
git --version

❖ 2. ការកំណត់រចនាសម្ព័ន្ធដំបូង

2.1 កំណត់ឈ្មោះ និងអ៊ីមែល (git config) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

មុននឹងចាប់ផ្ដើមប្រើ Git ត្រូវប្រាប់វាថាអ្នកជានរណាដែលព័ត៌មាននេះនឹងភ្ជាប់ជាមួយរាល់ Commit ដែលអ្នកបង្កើត។

git config --global user.name "Sok Dara"
git config --global user.email "sokdara@email.com"

# ពិនិត្យមើលការកំណត់បច្ចុប្បន្ន
git config --list

2.2 ចាប់ផ្តើម Repository ថ្មី (git init) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

git init ប្តូរ Folder ធម្មតាមួយឲ្យក្លាយជា Git Repository ដោយបង្កើត folder លាក់ឈ្មោះ .git ដែលផ្ទុករាល់ប្រវត្តិសាស្ត្រ។

mkdir my-project
cd my-project
git init
គន្លឹះ៖ Folder .git គឺជា "ខួរក្បាល" របស់ Repository។ កុំលុបវាចោលដោយចៃដន្យ បើមិនដូច្នេះទេនឹងបាត់ប្រវត្តិការងារទាំងអស់។

2.3 ស្ថានភាព 3 ដំណាក់កាលរបស់ File (Working Directory, Staging Area, Repository) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ដំណាក់កាលន័យ
Working DirectoryFolder ជាក់ស្តែងលើកុំព្យូទ័រ ដែលអ្នកកែប្រែ File
Staging Areaតំបន់ "ត្រៀម" File ដែលរើសរួច ត្រៀមនឹង Commit (ដោយប្រើ git add)
Repository (.git)កន្លែងផ្ទុកជាអចិន្ត្រៃយ៍ បន្ទាប់ពី Commit រួច

❖ 3. ជំហានមូលដ្ឋាន (Basic Workflow)

3.1 git addដែលដាក់ File ចូល Staging Area រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ពាក្យបញ្ជាន័យ
git add file.txtដាក់ File តែមួយចូល Staging
git add .ដាក់ File ដែលផ្លាស់ប្តូរទាំងអស់ក្នុង Folder បច្ចុប្បន្នចូល Staging

3.2 git commitដែលរក្សាទុកការផ្លាស់ប្តូរ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Commit ជា "snapshot" ថេរនៃ Project នៅចំណុចពេលនោះ ដែលត្រូវភ្ជាប់ជាមួយសារពន្យល់ខ្លីៗ (Commit Message)។

git add .
git commit -m "បន្ថែមទំព័រ Login"

3.3 git status & git logដែលពិនិត្យស្ថានភាព និងប្រវត្តិ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# មើលថា File មួយណាបានផ្លាស់ប្តូរ/ត្រូវ Stage
git status

# មើលប្រវត្តិ Commit ទាំងអស់
git log

# មើលជាទម្រង់សង្ខេប មួយបន្ទាត់ក្នុងមួយ Commit
git log --oneline

3.4 git diffដែលមើលភាពខុសគ្នា រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# មើលអ្វីដែលបានផ្លាស់ប្តូរ តែមិនទាន់ Stage
git diff

# មើលអ្វីដែលបាន Stage រួច តែមិនទាន់ Commit
git diff --staged
លំដាប់ការងារធម្មតា៖ កែកូដ → git addgit commit → (ធ្វើឡើងវិញ)។ នេះជាវដ្ដការងារមូលដ្ឋានបំផុតដែលអ្នកនឹងប្រើរាល់ថ្ងៃ។

❖ 4. ការធ្វើការជាមួយ Branches

4.1 Branch គឺជាអ្វី? ហេតុអ្វីត្រូវប្រើ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Branch ជា "ខ្សែបន្ថែម" នៃប្រវត្តិការងារ ដែលអនុញ្ញាតឲ្យអភិវឌ្ឍ Feature ថ្មី ដោះស្រាយ Bug ឬសាកល្បងគំនិតថ្មី ដោយមិនប៉ះពាល់ដល់កូដដើម (ជាទូទៅឈ្មោះ mainmaster)។ នៅពេលរួចរាល់ អាចបញ្ចូល (merge) ការងារនោះមកវិញ។

4.2 បង្កើត និងប្តូរទៅ Branch រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# មើលបញ្ជី Branch ទាំងអស់
git branch

# បង្កើត Branch ថ្មី
git branch feature-login

# ប្តូរទៅ Branch នោះ
git checkout feature-login

# ឬបង្កើត + ប្តូរក្នុងពាក្យបញ្ជាតែមួយ
git checkout -b feature-login

# របៀបទំនើប (Git ជំនាន់ថ្មី) ប្រើ switch ជំនួស checkout
git switch -c feature-login

4.3 ការបញ្ចូល Branch ចូលគ្នា (merge) រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# ត្រឡប់ទៅ main សិន
git checkout main

# បញ្ចូល feature-login ចូលទៅ main
git merge feature-login

4.4 ការលុប Branch រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# លុប Branch ដែល merge រួចហើយ
git branch -d feature-login

# បង្ខំលុប (ទោះបីមិនទាន់ merge)
git branch -D feature-login
ចំណាំ៖ ជាទម្លាប់ល្អ គួរបង្កើត Branch ថ្មីមួយសម្រាប់ Feature ឬ Bug Fix នីមួយៗ (ឧ. feature-signup, fix-navbar) ជំនួសឲ្យការសរសេរកូដទាំងអស់ដោយផ្ទាល់លើ main

❖ 5. ការភ្ជាប់ជាមួយ Remote Repository

5.1 Clone Repository ពី GitHub រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

git clone ទាញយក Repository ទាំងមូល (រួមទាំងប្រវត្តិសាស្ត្រ) ពី GitHub មកកាន់គ្រឿងខ្លួនឯង។

git clone https://github.com/username/project-name.git

5.2 git remoteដែលភ្ជាប់ទៅ Repository ពីចម្ងាយ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

បើ Repository បង្កើតដោយ git init នៅលើគ្រឿងខ្លួនឯង ត្រូវភ្ជាប់ទៅ GitHub ដោយផ្ទាល់ ដោយប្រើ git remote

# ភ្ជាប់ទៅ Repository ពីចម្ងាយ ដាក់ឈ្មោះថា origin (ស្តង់ដារ)
git remote add origin https://github.com/username/project-name.git

# មើលបញ្ជី remote ដែលមានស្រាប់
git remote -v

5.3 git pushដែលបញ្ជូនការផ្លាស់ប្តូរទៅ Remote រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# បញ្ជូន Commit ទៅ GitHub លើកដំបូង (កំណត់ upstream branch)
git push -u origin main

# ពេលក្រោយអាចប្រើខ្លីៗ
git push

5.4 git pull & git fetchដែលទាញយកការផ្លាស់ប្តូរចុងក្រោយ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ពាក្យបញ្ជាន័យ
git fetchទាញយកការផ្លាស់ប្តូរពី Remote មក តែមិនបញ្ចូលចូល Branch បច្ចុប្បន្ន (មើលមុននឹងសម្រេចចិត្ត)
git pullស្មើនឹង git fetch + git merge៖ ទាញយក ហើយបញ្ចូលភ្លាមតែម្ដង
គន្លឹះ៖ ត្រូវ git pull ជានិច្ចមុននឹងចាប់ផ្ដើមធ្វើការនៅដើមថ្ងៃ ដើម្បីធានាថាកូដរបស់អ្នកទាន់សម័យបំផុត ជៀសវាង Conflict ច្រើនពេលក្រោយ។

❖ 6. ការដោះស្រាយ Merge Conflicts

6.1 Merge Conflict កើតឡើងនៅពេលណា? រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Conflict កើតឡើងនៅពេល Git មិនអាចសម្រេចថាតើត្រូវយកកូដមួយណា ព្រោះមនុស្សពីរនាក់បានកែបន្ទាត់ដូចគ្នាខុសគ្នា ក្នុង Branch ផ្សេងគ្នា ហើយកំពុងព្យាយាម merge ចូលគ្នា។

6.2 របៀបអានសញ្ញា Conflict Markers រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ពេល Conflict កើតឡើង Git នឹងសរសេរសញ្ញាទាំងនេះដាក់ក្នុង File ដោយផ្ទាល់៖

<<<<<<< HEAD
កូដពី Branch បច្ចុប្បន្នរបស់អ្នក
=======
កូដពី Branch ដែលកំពុង merge ចូលមក
>>>>>>> feature-branch
សញ្ញាន័យ
<<<<<<< HEADចាប់ផ្ដើមកូដរបស់ Branch បច្ចុប្បន្ន
=======ចំណុចបំបែករវាងកូដទាំងពីរ
>>>>>>> branch-nameបញ្ចប់កូដរបស់ Branch ដែលកំពុងបញ្ចូលចូលមក

6.3 ដំណោះស្រាយ Conflict ជាជំហានៗ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

  1. បើក File ដែលមាន Conflict ក្នុង Editor
  2. សម្រេចថាតើត្រូវរក្សាកូដមួយណា (ឬផ្សំទាំងពីរ)
  3. លុបសញ្ញា <<<<<<<, =======, >>>>>>> ចេញទាំងអស់
  4. រក្សាទុក File រួច git add ដាក់ File នោះ
  5. git commit ដើម្បីបញ្ចប់ការ merge
git add resolved-file.txt
git commit -m "ដោះស្រាយ merge conflict"

❖ 7. ការត្រឡប់ក្រោយ (Undoing Changes)

7.1 git restoreដែលត្រឡប់ File ដែលមិនទាន់ Commit រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

# ត្រឡប់ File ក្នុង Working Directory ទៅដូចលើក Commit ចុងក្រោយ
git restore file.txt

# ដក File ចេញពី Staging Area វិញ (មិនលុបការផ្លាស់ប្តូរ)
git restore --staged file.txt

7.2 git resetដែលត្រឡប់ Commit រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ពាក្យបញ្ជាន័យ
git reset --soft HEAD~1ដក Commit ចុងក្រោយចេញ តែរក្សាការផ្លាស់ប្តូរទុកក្នុង Staging
git reset --mixed HEAD~1ដក Commit ចេញ ហើយដកចេញពី Staging ដែរ (លំនាំដើម)
git reset --hard HEAD~1លុប Commit និងការផ្លាស់ប្តូរទាំងអស់ចោលទាំងស្រុង
ប្រយ័ត្ន! git reset --hard លុបទិន្នន័យចោលជាអចិន្ត្រៃយ៍ មិនអាចត្រឡប់មកវិញបានទេ។ ត្រូវប្រាកដថាចង់ធ្វើមុននឹងប្រើ។

7.3 git revertដែលបង្កើត Commit ថ្មីដើម្បីលុបចោលការផ្លាស់ប្តូរ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

ខុសពី reset, revert មិនលុបប្រវត្តិចោលទេ គឺបង្កើត Commit ថ្មីមួយដែលធ្វើផ្ទុយពី Commit ចាស់ ដែលសុវត្ថិភាពជាងសម្រាប់ប្រើលើ Branch ដែលអ្នកដទៃកំពុងប្រើដែរ។

git revert <commit-hash>

7.4 git stashដែលរក្សាទុកការផ្លាស់ប្តូរជាបណ្តោះអាសន្ន រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

git stash ដាក់ការផ្លាស់ប្តូរដែលមិនទាន់ Commit ទៅកន្លែងផ្ទុកបណ្តោះអាសន្ន ដើម្បីអាចប្តូរទៅ Branch ផ្សេងភ្លាមៗ ដោយមិនចាំបាច់ Commit អ្វីទាំងអស់មុន។

# រក្សាទុកការផ្លាស់ប្តូរបច្ចុប្បន្ន
git stash

# មើលបញ្ជី stash ទាំងអស់
git stash list

# ទាញយកមកវិញ (និងលុបចេញពី stash)
git stash pop

❖ 8. ការធ្វើការជាក្រុមតាមរយៈ GitHub

8.1 Fork Repository រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Fork ជាការចម្លង Repository របស់អ្នកដទៃមកដាក់ក្នុងគណនី GitHub ផ្ទាល់ខ្លួន ដើម្បីធ្វើការផ្លាស់ប្តូរដោយសេរី ដោយមិនប៉ះពាល់ដល់ Repository ដើម ដែលប្រើញឹកញាប់សម្រាប់ចូលរួម Open Source Project។

8.2 Pull Request (PR) គឺជាអ្វី? រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Pull Request ជាការស្នើសុំទៅម្ចាស់ Repository ដើម ឲ្យពិនិត្យ និងទទួលយកការផ្លាស់ប្តូររបស់អ្នក (ពី Branch ឬ Fork របស់អ្នក) បញ្ចូលទៅក្នុងកូដដើម។ ជាមធ្យោបាយស្តង់ដារបំផុតសម្រាប់ការសហការលើ GitHub។

ជំហានសកម្មភាព
1Fork ឬបង្កើត Branch ថ្មីសម្រាប់ការងាររបស់អ្នក
2កែកូដ, Commit, Push ទៅ GitHub
3ចុច "New Pull Request" នៅលើ GitHub
4ពន្យល់ពីអ្វីដែលបានផ្លាស់ប្តូរ ក្នុងសេចក្ដីពិពណ៌នា PR
5រង់ចាំ Code Review និងការអនុម័តពីម្ចាស់ Project

8.3 Code Review និង Collaboration រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Code Review ជាដំណើរការដែលសមាជិកក្រុមផ្សេងទៀតពិនិត្យមើលកូដមុននឹងទទួលយក merge ចូល ដែលជួយចាប់កំហុសដំបូង និងរក្សាគុណភាពកូដ។ លក្ខណៈពិសេសមួយចំនួននៃ GitHub សម្រាប់ការសហការ៖

❖ 9. Best Practices & .gitignore

9.1 របៀបសរសេរ Commit Message ល្អ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

មិនល្អ ✗ល្អ ✓
fixfix: កែកំហុសទម្រង់នៅទំព័រ Login
update stufffeat: បន្ថែមប៊ូតុង Dark Mode
asdasddocs: ធ្វើបច្ចុប្បន្នភាព README
គន្លឹះ៖ ប្រើប្រូបទ type: ពិពណ៌នាខ្លីៗ (ឧ. feat, fix, docs, style, refactor) ធ្វើឲ្យប្រវត្តិការងារងាយស្វែងរក និងអានយល់ក្រោយមកទៀត ដែលគេហៅថា Conventional Commits។

9.2 ការប្រើ .gitignore រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

File .gitignore ប្រាប់ Git ថាកុំតាមដាន File ឬ Folder ជាក់លាក់ (ឧ. password, dependencies, build output) ដើម្បីការពារកុំឲ្យទិន្នន័យរសើប ឬ File ធំៗដែលមិនចាំបាច់ ត្រូវបាន Commit ចូល Repository ដោយចៃដន្យ។

# .gitignore ឧទាហរណ៍
node_modules/
.env
*.log
__pycache__/
.DS_Store

9.3 Git Workflow ដែលគេប្រើប្រាស់ទូទៅ រៀបរៀងដោយ: លោក អ៊ុតថា សៀវអុី

Workflowការពិពណ៌នា
GitHub Flowសាមញ្ញបំផុត៖ Branch ថ្មីសម្រាប់ Feature នីមួយៗ, Pull Request, merge ចូល main ដោយផ្ទាល់
Git Flowស្មុគស្មាញជាង មាន Branch ជាប្រចាំ ដូចជា develop, release, hotfix ស័ក្តិសមសម្រាប់ Project ធំៗ ដែលមានកាលវិភាគចេញផ្សាយច្បាស់លាស់
Trunk-Based Developmentអ្នកអភិវឌ្ឍន៍ commit ចូល main ញឹកញាប់ (Branch ខ្លីៗ) សម្រាប់ក្រុមធ្វើ Continuous Integration

លំហាត់អនុវត្ត

  1. បង្កើត Repository ថ្មីមួយដោយប្រើ git init ហើយបង្កើត File មួយ រួច Commit ដំបូង។
  2. បង្កើត Branch ថ្មីមួយឈ្មោះ feature-test ហើយកែប្រែ File នោះ រួច Commit ម្តងទៀត។
  3. ត្រឡប់ទៅ main រួច merge feature-test ចូល។
  4. បង្កើត GitHub Repository ថ្មី ហើយ push Project របស់អ្នកទៅ។
  5. សាកល្បងបង្កើត Conflict ដោយចេតនា (កែបន្ទាត់ដូចគ្នាក្នុង ២ Branch) រួចអនុវត្តជំហានដោះស្រាយ Conflict។
  6. សរសេរ .gitignore សម្រាប់ Project របស់អ្នក ដោយដកយក Folder/File ណាដែលមិនចាំបាច់ Commit។