❖ 1. សេចក្តីផ្តើមអំពី Git
1.1 Git និង Version Control System គឺជាអ្វី?
Git ជា Version Control System (VCS)៖ ឧបករណ៍ដែលកត់ត្រាប្រវត្តិការផ្លាស់ប្តូរនៃកូដ អនុញ្ញាតឲ្យអ្នកអភិវឌ្ឍន៍ត្រឡប់ទៅកាន់កំណែចាស់ បើកមើលនរណាបានផ្លាស់ប្តូរអ្វី និងធ្វើការជាក្រុមដោយមិនបំផ្លាញការងាររបស់គ្នាទៅវិញទៅមក។ វាត្រូវបានបង្កើតឡើងដោយ Linus Torvalds (ស្ថាបនិក Linux) ក្នុងឆ្នាំ 2005។
1.2 ភាពខុសគ្នារវាង Git និង GitHub
| Git | GitHub | |
|---|---|---|
| ជាអ្វី | កម្មវិធី (Software) ដំណើរការនៅលើគ្រឿងខ្លួនឯង | សេវាកម្មលើអនឡាញ (Website/Service) |
| មុខងារ | តាមដានប្រវត្តិកូដ (Version Control) | រក្សាទុក Repository លើ Cloud + សហការជាក្រុម |
| ទាមទារអ៊ីនធឺណិត | ទេ (ដំណើរការក្នុងគ្រឿងបានទាំងស្រុង) | ត្រូវការ ដើម្បីភ្ជាប់ទៅ Server |
1.3 ការដំឡើង Git
| ប្រព័ន្ធ | របៀបដំឡើង |
|---|---|
| Windows | ទាញយកពី git-scm.com ហើយដំណើរការ Installer |
| macOS | brew 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
.git គឺជា "ខួរក្បាល" របស់ Repository។ កុំលុបវាចោលដោយចៃដន្យ បើមិនដូច្នេះទេនឹងបាត់ប្រវត្តិការងារទាំងអស់។2.3 ស្ថានភាព 3 ដំណាក់កាលរបស់ File (Working Directory, Staging Area, Repository)
| ដំណាក់កាល | ន័យ |
|---|---|
| Working Directory | Folder ជាក់ស្តែងលើកុំព្យូទ័រ ដែលអ្នកកែប្រែ 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 add → git commit → (ធ្វើឡើងវិញ)។ នេះជាវដ្ដការងារមូលដ្ឋានបំផុតដែលអ្នកនឹងប្រើរាល់ថ្ងៃ។❖ 4. ការធ្វើការជាមួយ Branches
4.1 Branch គឺជាអ្វី? ហេតុអ្វីត្រូវប្រើ
Branch ជា "ខ្សែបន្ថែម" នៃប្រវត្តិការងារ ដែលអនុញ្ញាតឲ្យអភិវឌ្ឍ Feature ថ្មី ដោះស្រាយ Bug ឬសាកល្បងគំនិតថ្មី ដោយមិនប៉ះពាល់ដល់កូដដើម (ជាទូទៅឈ្មោះ main ឬ master)។ នៅពេលរួចរាល់ អាចបញ្ចូល (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
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 ជាជំហានៗ
- បើក File ដែលមាន Conflict ក្នុង Editor
- សម្រេចថាតើត្រូវរក្សាកូដមួយណា (ឬផ្សំទាំងពីរ)
- លុបសញ្ញា
<<<<<<<,=======,>>>>>>>ចេញទាំងអស់ - រក្សាទុក File រួច
git addដាក់ File នោះ 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។
| ជំហាន | សកម្មភាព |
|---|---|
| 1 | Fork ឬបង្កើត 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 សម្រាប់ការសហការ៖
- Issuesដែលកត់ត្រា Bug ឬ Feature Request ដែលត្រូវធ្វើ
- Commentsដែលផ្តល់មតិលើកូដជាក់លាក់ក្នុង Pull Request
- Assignees / Reviewers កំណត់នរណាទទួលខុសត្រូវលើកិច្ចការនីមួយៗ
❖ 9. Best Practices & .gitignore
9.1 របៀបសរសេរ Commit Message ល្អ
| មិនល្អ ✗ | ល្អ ✓ |
|---|---|
fix | fix: កែកំហុសទម្រង់នៅទំព័រ Login |
update stuff | feat: បន្ថែមប៊ូតុង Dark Mode |
asdasd | docs: ធ្វើបច្ចុប្បន្នភាព 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 |
លំហាត់អនុវត្ត
- បង្កើត Repository ថ្មីមួយដោយប្រើ
git initហើយបង្កើត File មួយ រួច Commit ដំបូង។ - បង្កើត Branch ថ្មីមួយឈ្មោះ
feature-testហើយកែប្រែ File នោះ រួច Commit ម្តងទៀត។ - ត្រឡប់ទៅ
mainរួច mergefeature-testចូល។ - បង្កើត GitHub Repository ថ្មី ហើយ push Project របស់អ្នកទៅ។
- សាកល្បងបង្កើត Conflict ដោយចេតនា (កែបន្ទាត់ដូចគ្នាក្នុង ២ Branch) រួចអនុវត្តជំហានដោះស្រាយ Conflict។
- សរសេរ
.gitignoreសម្រាប់ Project របស់អ្នក ដោយដកយក Folder/File ណាដែលមិនចាំបាច់ Commit។