Rujukan Pantas

Git & GitHub — Cheatsheet

Rujukan pantas satu halaman untuk semua command Git, workflow, template, dan penyelesaian masalah.

⌨️

Semua Command Git Penting

Rujukan pantas — command, penerangan, dan contoh.

🔧
Setup & Konfigurasi
Command untuk persediaan awal Git
git --versionSemak versi Git
git config --global user.name "Nama"Set nama untuk commit
git config --global user.email "em@il"Set email untuk commit
git config --global init.defaultBranch mainDefault branch name = main
git config --listSemak semua konfigurasi
📂
Mulakan & Clone Repositori
Buat repo baru atau salin sedia ada
git initCipta repo git baru dalam folder semasa
git clone <url>Salin repo dari GitHub ke tempatan
git clone <url> .Clone ke dalam folder semasa
💾
Staging & Commit
Workflow harian — add, commit, amend
git statusSemak keadaan semasa repo
git add <fail>Stage fail tertentu
git add .Stage semua perubahan
git commit -m "mesej"Commit dengan mesej
git commit -am "mesej"Add + commit sekali (fail tracked sahaja)
git commit --amend -m "mesej baru"Ubah mesej commit terakhir
🌿
Branch & Merge
Urus branch dan gabungkan kod
git branchSenarai semua branch tempatan
git branch <nama>Cipta branch baru
git branch -d <nama>Padam branch
git checkout <branch>Tukar ke branch lain
git checkout -b <nama>Buat dan terus tukar ke branch baru
git merge <branch>Merge branch ke branch semasa
git log --oneline --graphVisual sejarah commit dengan branch
☁️
Remote & Sync (GitHub)
Sambung, push, pull, fetch
git remote add origin <url>Sambung ke remote GitHub
git remote -vSenarai remote yang disambung
git push -u origin <branch>Push dan set upstream (kali pertama)
git pushPush ke remote (kali kedua dan seterusnya)
git pullAmbil perubahan dari remote
git fetchAmbil info remote tanpa merge
git pull --rebasePull dan rebase (sejarah linear)
↩️
Undo, History & Diff
Batal perubahan, lihat sejarah, banding
git log --onelineSejarah commit ringkas
git diffLihat perubahan belum stage
git diff --stagedLihat perubahan yang sudah stage
git restore <fail>Kembalikan fail ke versi commit terakhir
git restore --staged <fail>Keluarkan fail dari staging
git reset --soft HEAD~1Batal commit terakhir, simpan perubahan
git stashSimpan sementara perubahan belum siap
git stash popKeluarkan stash terakhir
git reflogSejarah semua pergerakan HEAD (rescue tool)
📊

Git Workflow Diagram

Visual workflow — dari init hingga deploy.

🔄
Workflow Asas Git (Lokal)
Kitaran edit → stage → commit
┌─────────────────────────────────────────────────────┐ │ WORKING DIRECTORY │ │ (Folder projek — fail yang sedang diedit) │ └──────────────────┬──────────────────────────────────┘ │ git add <fail> ▼ ┌─────────────────────────────────────────────────────┐ │ STAGING AREA (INDEX) │ │ (Meja persediaan — pilih perubahan nak disimpan) │ └──────────────────┬──────────────────────────────────┘ │ git commit -m "mesej" ▼ ┌─────────────────────────────────────────────────────┐ │ LOCAL REPOSITORY (.git) │ │ (Sejarah commit — semua snapshot disimpan) │ └──────────────────┬──────────────────────────────────┘ │ git push ▼ ┌─────────────────────────────────────────────────────┐ │ GITHUB (REMOTE) │ │ (Awan — backup, kolaborasi, CI/CD) │ └─────────────────────────────────────────────────────┘
🌿
Branch & Merge Workflow
Feature branch → merge → padam
main: A──────B───────────────E──────F \ / feature-login: C──────D────── A — Init repo B — Commit pertama C — Cawang feature-login dari B D — Siap feature, commit E — Merge feature-login ke main F — Terus develop di main
🤝
Kolaborasi dengan Fork & PR
Workflow open source standard
REPO ASAL (Owner) │ ├── Fork (buat salinan ke akaun sendiri) │ ▼ FORK ANDA (GitHub) │ ├── Clone ke komputer tempatan │ ▼ TEMPATAN (Lokal) │ ├── Buat branch baru (git checkout -b feature-x) ├── Edit & commit │ ▼ Push branch ke fork (git push -u origin feature-x) │ ▼ FORK ANDA (GitHub) │ ├── Buka Pull Request → repo asal │ ▼ REPO ASAL — PR DIBUKA │ ├── Discuss, review, approve ├── Merge PR │ ▼ PR SELESAI 🎉
Sync Fork: git remote add upstream <repo-asal>git pull upstream main
🚫

Template .gitignore

Fail dan folder yang patut dikecualikan dari Git.

📄
.gitignore Lengkap (Pelbagai Projek)
Template sedia guna untuk pelbagai jenis projek
# === Node.js / JavaScript === node_modules/ npm-debug.log* yarn-debug.log* yarn-error.log* .env .env.local dist/ build/ .next/ .cache/ # === Python === __pycache__/ *.py[cod] *.so .Python env/ venv/ .venv/ *.egg-info/ dist/ build/ # === Java === *.class *.jar *.war target/ .idea/ *.iml *.gradle/ build/ # === macOS === .DS_Store *.swp *.swo *~ # === Windows === Thumbs.db ehthumbs.db Desktop.ini # === Editor === .vscode/ .idea/ *.sublime-project *.sublime-workspace # === Logs & Temp === *.log *.tmp *.temp logs/ tmp/ # === OS === .DS_Store Thumbs.db # === Git === .git/ # === Dependency directories === vendor/ bower_components/ jspm_packages/
Tip: Guna toptal.com/gitignore untuk jana .gitignore ikut stack teknologi anda. Copy-paste je.
🐛

Common Errors & Fix

Error biasa dan penyelesaian cepat.

⚠️
Error & Penyelesaian
14 error biasa — dari "Please tell me who you are" hingga merge conflict
Error Sebab Penyelesaian
Please tell me who you are Git config nama/email belum set git config --global user.name "Nama"
git config --global user.email "em@il"
fatal: not a git repository Tak dalam folder repo git git init atau cd ke folder repo
fatal: No configured push destination Remote belum diset git remote add origin <url>
fatal: The current branch has no upstream branch Branch tak guna -u masa push pertama git push -u origin nama-branch
! [rejected] — fetch first Remote ada commit baru git pull --rebasegit push
Merge conflict in <fail> Dua branch ubah line sama Buka fail → resolve <<< === >>> → git addgit commit
You are in 'detached HEAD' state Checkout ke commit tertentu (bukan branch) git checkout nama-branch
fatal: refusing to merge unrelated histories Cuba merge dua repo yang tak berkaitan git pull origin main --allow-unrelated-histories
Cannot rebase: Your index contains uncommitted changes Ada perubahan belum commit/stash git stash → rebase → git stash pop
error: pathspec 'x' did not match any files Fail yang disebut tak wujud Semak ejaan atau git status untuk lihat fail sebenar
fatal: remote origin already exists Remote dah ada, nak ganti git remote set-url origin <url-baru>
warning: LF will be replaced by CRLF Perbezaan line endings Windows/Unix git config --global core.autocrlf true (Windows)
Authentication failed Password/token salah atau expired Guna Personal Access Token (Settings → Developer → PAT)
fatal: remote error: Repository not found URL salah atau repo private Semak URL, pastikan ada akses ke repo
🆘
Rescue — Bila Betul-betul Tersangkut
Langkah terakhir untuk selamatkan repo
# Situasi: Repo dah rosak, Git tak boleh buat apa-apa # 1. Guna reflog — cari di mana HEAD pernah berada git reflog # Output macam: # abc1234 HEAD@{0}: commit: baiki bug login # def5678 HEAD@{1}: commit: tambah navbar # ghi9012 HEAD@{2}: merge feature-x # 2. Reset ke titik yang stabil git reset --hard abc1234 # 3. Kalau betul-betul nak delete dan start balik # Backup kod dulu! cp -r projek-saya projek-saya-backup # 4. Padam folder .git, init semula rm -rf .git git init git add . git commit -m "fresh start" # 5. Sambung balik ke GitHub git remote add origin <url> git push -u --force origin main
Ingat: git reset --hard akan padam perubahan yang belum commit. Backup dulu kalau ragu-ragu. Jangan panik — Git almost everything is recoverable melalui reflog.
🐛

10 Kesilapan Biasa Git & GitHub

Kesilapan yang selalu dilakukan oleh pelajar dan developer baru — dan cara elakkan atau perbaikinya.

⚠️
1. Git Init dalam Folder Salah — Repo dalam Repo
"Eh, kenapa Git saya tak jalan?" — Sebab ada .git dalam folder parent

Masalah: Pelajar buka terminal di Desktop, taip git init, sedangkan folder Desktop mengandungi banyak projek lain. Lepas tu, dalam folder projek, git status tunjuk fail-fail dari folder lain.

Sebab: Git cari folder .git secara rekursif ke atas. Kalau ada .git di Desktop, semua subfolder akan guna repo yang sama.

Penyelesaian: git init hanya dalam folder projek yang spesifik. Semak guna git rev-parse --git-dir untuk tahu di mana root repo. Kalau tersalah, padam folder .git yang salah: rm -rf .git (di folder yang betul).
🔑
2. Commit API Keys / Secrets ke Public Repo
"Oops, API key saya dah exposed — sekarang orang boleh guna akaun saya"

Masalah: Pelajar simpan API_KEY=abc123 terus dalam kod dan commit ke public repo. Dalam masa beberapa minit, bot GitHub akan scan dan guna key tersebut.

Sebab: GitHub Sentry (dan pihak ketiga) sentiasa scan public repo untuk credential yang terdedah.

Penyelesaian: Guna .env untuk secrets — jangan commit! Tambah .env dalam .gitignore. Kalau dah terlanjur expose: revoke key segera di dashboard provider. Guna git filter-branch atau BFG Repo-Cleaner untuk padam dari sejarah.
✏️
3. Commit Message "update" — Tak Informatif
"update", "fixed", "commit baru", "aaa" — ini tidak membantu langsung

Masalah: Bulan depan, pelajar sendiri pun tak ingat apa yang dia buat dalam commit "update" itu. Dalam pasukan, review PR jadi mustahil.

Sebab: Malas atau tak biasa tulis mesej bermakna.

Penyelesaian: Guna formula: [jenis]: [apa yang berubah]. Contoh: feat: add login form, fix: correct navbar height on mobile, docs: update README with install guide. Biasakan guna conventional commit format.
🚀
4. Push Terus ke Main Tanpa Branch
"Saya edit terus dalam main — kalau rosak, habislah"

Masalah: Pelajar push terus ke main untuk projek berkumpulan. Bila ada yang tak sengaja push kod rosak, semua orang terduduk.

Sebab: Tak biasa dengan workflow branch, rasa "buang masa" nak buat branch dulu.

Penyelesaian: Branch murah — git checkout -b feature-anda ambil masa 1 saat. Guna branch protection rules di GitHub (Settings → Branches) untuk restrict direct push ke main. Wajibkan PR untuk sebarang perubahan ke main.
⚔️
5. Merge Conflict Tak Resolve — Project Broken
"Saya tahu ada conflict, tapi saya diamkan je — now project rosak"

Masalah: Merge conflict muncul, pelajar panik atau ignore. Lepas merge paksa (--force), kod jadi broken dan separuh.

Sebab: Takut dengan conflict markers dan tak tahu cara resolve.

Penyelesaian: Conflict adalah normal! Buka fail, cari <<<<<<< ======= >>>>>>>. Baca dua versi, pilih atau gabung. Guna VS Code — ia ada UI untuk "Accept Current", "Accept Incoming", "Accept Both". Lepas resolve, git add dan git commit. Practice makes perfect!
📖 Rujuk Modul Pelajar → Branch & Merge → Merge Conflict
📥
6. Clone Repo dan Mula Edit Tanpa git pull Dulu
"Saya edit terus — lepas tu nak push, 'rejected' pulak"

Masalah: Pelajar clone repo, tak git pull, terus edit. Rakan sepasukan dah push perubahan baru. Bila nak push sendiri, Git reject — "fetch first".

Sebab: Anggapkan clone dapat versi terkini — tapi antara masa clone dan edit, orang lain dah update.

Penyelesaian: Sebelum mula kerja: git checkout main && git pull. Sebelum push: git pull --rebase untuk ambil perubahan terkini. Ini jadi tabiat harian — pull dulu sebelum mula coding.
🚫
7. .gitignore Tak Ada — node_modules Semua Masuk Repo
"Repo saya 500MB sebab node_modules... alhamdulillah"

Masalah: Pelajar buat git add . tanpa .gitignore. Semua node_modules/ (ribuan fail, ratusan MB) masuk ke staging dan kemudian ke GitHub.

Sebab: Lupa atau tak tahu tentang .gitignore.

Penyelesaian: .gitignore mesti dibuat sebelum git add . pertama. Kalau dah terlanjur:
1. git rm --cached -r node_modules/ (keluarkan dari Git tapi simpan tempatan)
2. Tambah node_modules/ dalam .gitignore
3. Commit: git commit -m "chore: add gitignore and remove node_modules"
📖 Rujuk Cheatsheet → .gitignore Template
💥
8. Force Push Tanpa Fikir — Overwrite Kerja Orang Lain
"git push --force — hah, hilang commit member aku"

Masalah: Push rejected — pelajar frustrated, guna git push --force tanpa sedar ia akan ganti sejarah remote dengan sejarah tempatan. Commit rakan sepasukan hilang.

Sebab: --force = "saya tahu lebih baik, jangan tanya". Dalam kolaborasi, ini sangat bahaya.

Penyelesaian: Guna git push --force-with-lease sebagai alternatif — ia akan check kalau remote ada commit yang tempatan tak tahu, dan tolak force push. Untuk selamat:
1. git pull --rebase dulu
2. Resolve conflict (kalau ada)
3. git push
🌐
9. Edit di GitHub Web dan di Local Serentak — Conflict
"Saya edit README dekat GitHub web, pastu edit dekat local — haru biru"

Masalah: Pelajar edit README.md terus di GitHub web (untuk "cepat"). Lepas tu edit README yang sama di komputer tempatan. Bila push, dia tak boleh — "merge conflict".

Sebab: Dua versi berbeza untuk fail yang sama — satu di GitHub, satu tempatan. Git tak tahu mana satu betul.

Penyelesaian: Elak edit di GitHub web untuk fail yang sedang aktif dibangunkan. GitHub web hanya sesuai untuk: edit kecil (typo README), buat issue, review PR, atau merge. Untuk coding sebenar, sentiasa guna editor tempatan. Kalau dah terlanjur: git pull dulu, resolve conflict, baru push.
🤖
10. Tak Guna GitHub MCP — Boleh Automate dari Claude Code
"Saya buka GitHub, scroll, klik sana sini... leceh"

Masalah: Pelajar buat semua tugasan GitHub secara manual — buka browser, login, navigate, klik. Ambil masa berbanding guna automation.

Sebab: Tak tahu tentang GitHub MCP (Model Context Protocol) dalam Claude Code.

Penyelesaian: Guna GitHub MCP dalam Claude Code! Satu prompt dan tugasan selesai:
"List semua open PR" — tak payah buka GitHub
"Buat issue baru" — auto create
"Review PR #5" — Claude baca kod dan bagi feedback
"Merge PR #5" — satu klik dari terminal
Setup: authenticate sekali, lepas tu guna terus. Ini akan jimat berjam-jam seminggu.
📖 Rujuk Cheatsheet → GitHub MCP & Modul Pelajar → GitHub MCP
🤖

GitHub MCP — Rujukan Pantas

Command dan prompt untuk GitHub MCP dalam Claude Code.

🔌
Setup & Authentication
Cara sambung GitHub MCP
mcp__github__authenticateMulakan OAuth — login ke GitHub
gh auth loginAlternatif — guna GitHub CLI
Tip: Lepas authenticate sekali, sesi seterusnya akan guna token yang sama.
💬
Prompt Berguna untuk Claude Code
Copy-paste prompt untuk tugasan biasa

📋 Pull Request

"Senaraikan semua open pull request dalam repo ini." "Review PR #[nombor] dan berikan: 1. Ringkasan perubahan 2. Isu keselamatan 3. Cadangan penambahbaikan 4. Keputusan: Approve / Request Changes" "Tunjukkan files changed dalam PR #[nombor]." "Merge PR #[nombor] dengan strategi squash."

📋 Issues

"List semua open issues." "Buat issue baru: Title: '[tajuk]' Description: '[description]' Labels: [bug/enhancement/docs] Assign: [username]" "Tutup issue #[nombor] dengan comment: '[reason]'" "Assign issue #[nombor] kepada [username]."

📋 Code Review

"Review kod dalam PR #[nombor] dan beri mark: - Kualiti kod: A/B/C - Coverage test: A/B/C - Security: A/B/C - Documentation: A/B/C" "Dalam PR #[nombor], check kalau ada: - Hardcoded secrets - XSS vulnerabilities - SQL injection risks - Logic errors"

📋 Repository Management

"Semak status CI/CD untuk PR #[nombor]." "List semua branch dalam repo ini." "Buat branch baru '[nama]' dari main." "Cari semua commit oleh [username] dalam 7 hari lepas."

📋 Automasi & Advanced

"Guna Sequential Thinking untuk analisis PR #[nombor] langkah demi langkah." "Buat comment pada PR #[nombor] line [nombor]: '[feedback anda]'" "Buat draft PR dari branch [nama] ke main dengan title '[tajuk]' dan description '[desc]'." "Untuk setiap open issue, cadangkan label yang sesuai berdasarkan content issue tersebut."
Power Tip: Gabung GitHub MCP dengan skill code-review:code-review untuk review PR yang lebih mendalam dan berstruktur.