GitHub

Belum masuk. Progresmu tidak tersimpan.

Masuk
  • Bab 8 dari 8
  • 30 menit
  • 4 soal kuis

Praktik Terbaik, Kesalahan Umum, dan Studi Kasus Tim

Di bab ini (9 bagian)
  1. Tujuan
  2. Pesan commit yang baik
  3. Kesalahan umum pemula dan solusinya
  4. Studi kasus: tim tiga orang
  5. Ringkasan seluruh kelas
  6. Sumber belajar
  7. Kesalahan umum
  8. Coba sendiri
  9. Rangkuman

Tujuan bab ini

  • Menulis pesan commit yang jelas dengan format Conventional Commits.
  • Mengenali kesalahan umum pemula di GitHub, terutama push ditolak, secret ter-commit, dan conflict, beserta solusinya.
  • Menerapkan GitHub Flow pada proyek tim tiga orang, dari membuat repo sampai rilis.
  • Tahu ke mana belajar berikutnya setelah kelas ini.

Pesan commit yang baik

Pesan commit adalah dokumentasi paling murah dan paling awet. Enam bulan lagi, kamu (atau temanmu) akan membuka riwayat untuk mencari kapan sebuah bug muncul. Pesan seperti update, fix bug, atau asdasd sama sekali tidak membantu.

Banyak tim memakai format Conventional Commits:

<tipe>(<cakupan>): <deskripsi singkat>

Cakupan opsional. Tipe yang paling sering dipakai:

TipeKapan dipakai
featMenambah fitur baru
fixMemperbaiki bug
docsMengubah dokumentasi saja
styleFormat kode tanpa mengubah logika
refactorMenata ulang kode tanpa mengubah perilaku
testMenambah atau memperbaiki test
chorePekerjaan rutin, misalnya update dependensi

Contoh yang baik:

git commit -m "feat(form): tambah validasi email pada pendaftaran"
git commit -m "fix: perbaiki tombol simpan yang gagal di Safari"
git commit -m "docs: tambah cara instal di README"

Pakai kalimat perintah yang pendek ("tambah", bukan "menambahkan" atau "ditambahkan"), satu commit untuk satu tujuan, dan simpan detail panjang di badan commit atau deskripsi PR. Bonusnya, pesan yang rapi bisa diolah alat otomatis menjadi changelog, dan judul PR dengan format yang sama membuat hasil squash and merge tetap enak dibaca.

Kesalahan umum pemula dan solusinya

Push ditolak

Kamu baru mau push, tapi Git menolak:

To https://github.com/tim/buku.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/tim/buku.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.

Artinya ada commit di GitHub yang belum kamu punya, biasanya push dari teman. Solusinya: git pull, bereskan conflict kalau ada, lalu git push lagi. Jangan langsung git push --force, karena itu menimpa commit temanmu di server.

Di Git 2.27 ke atas, kalau riwayat lokal dan remote sama-sama punya commit baru, git pull polos bisa berhenti dengan pesan fatal: Need to specify how to reconcile divergent branches. Pilih sekali saja caranya, misalnya merge:

git config --global pull.rebase false

(Pilihan rebase dibahas di kelas Git.)

Terlanjur commit secret

File .env berisi token ikut ter-push. Menghapus file di commit berikutnya tidak cukup, karena riwayat Git tetap menyimpannya dan siapa pun bisa membuka commit lama. Urutan penanganannya:

  1. Cabut (revoke) dan ganti kredensialnya di layanan asalnya. Ini langkah terpenting.
  2. Hentikan pelacakan file dan cegah terulang:
echo ".env" >> .gitignore
git rm --cached .env
git add .gitignore
git commit -m "chore: berhenti melacak .env"

git rm --cached hanya mengeluarkan file dari repo, file di laptopmu tetap ada. Untuk benar-benar membersihkan riwayat dibutuhkan alat seperti git filter-repo, tapi kredensial lama tetap harus dianggap bocor. Secret scanning GitHub biasanya juga mengirim peringatan untuk kasus ini.

Conflict

Dua orang mengubah baris yang sama, lalu git pull berakhir dengan:

CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

Buka file itu, cari penanda <<<<<<<, =======, dan >>>>>>>, sisakan versi final, hapus semua penanda, lalu git add dan git commit. Conflict bukan tanda kamu gagal; itu cara Git bertanya, "versi mana yang benar?". Untuk conflict di PR, GitHub juga menyediakan tombol Resolve conflicts di halaman PR bila conflict-nya sederhana.

Kesalahan lain yang sering muncul: push langsung ke main (aktifkan branch protection), commit raksasa berisi sepuluh perubahan (pecah jadi commit kecil), lupa pull sebelum mulai kerja, branch yang hidup berminggu-minggu, dan repo tanpa README.

Studi kasus: tim tiga orang

Studi kasus tim tiga orang dari minggu pertama sampai rilis

Ani, Budi, dan Citra membuat aplikasi web pendataan buku untuk tugas akhir dengan tenggat empat minggu. Ani pegang antarmuka, Budi basis data dan API, Citra test dan dokumentasi. Kesepakatan tim: main dilindungi, setiap perubahan lewat PR, minimal satu approval, dan squash and merge sebagai strategi baku.

Minggu 1: menyiapkan rumah. Ani membuat organization tim-buku, repo pendataan-buku dengan README, .gitignore Node, dan lisensi MIT. Budi dan Citra diundang ke team dengan peran Write. Di Settings › Branches, Ani membuat aturan untuk main: wajib PR, wajib satu approval, wajib status check CI lulus.

Minggu 2: memecah pekerjaan. Setiap tugas jadi issue berlabel dan ber-assignee, lalu dimasukkan ke papan Projects. Masing-masing bekerja di branch sendiri:

git switch -c feature/daftar-buku
git commit -m "feat(ui): tampilkan daftar buku"
git push -u origin feature/daftar-buku

Minggu 3: PR dan review. Ani membuka PR berjudul feat(ui): tampilkan daftar buku dengan deskripsi Closes #4. Workflow CI menjalankan npm test. Citra mereview, meminta perubahan kecil, Ani push perbaikan ke branch yang sama, lalu Citra approve dan PR di-merge. Issue #4 tertutup otomatis dan kartunya pindah ke Done.

Minggu 4: rilis. Setelah fitur terakhir masuk, Citra melengkapi README, Budi membuat tag v1.0.0 dan Release dengan release notes otomatis, lalu situsnya diterbitkan lewat GitHub Pages. Dosen cukup menerima satu tautan.

Pola ini berlaku untuk tugas kelompok apa pun: branch kecil, PR, review, CI hijau, merge, rilis.

Ringkasan seluruh kelas

  1. Git adalah alat version control; GitHub adalah platform tempat repo disimpan dan dikolaborasikan.
  2. Amankan akun dengan 2FA, autentikasi dengan PAT atau SSH.
  3. Repo yang baik punya README, .gitignore, dan LICENSE.
  4. Siklus harian: pull, ubah, add, commit, push.
  5. Satu branch untuk satu tujuan, gabungkan lewat pull request yang direview.
  6. Issues, label, dan Projects menjaga pekerjaan tim tetap terlacak.
  7. Actions menjalankan test otomatis; Pages dan Releases menerbitkan hasilnya.
  8. Jangan pernah commit kredensial.

Sumber belajar

  • docs.github.com: dokumentasi resmi semua fitur GitHub.
  • GitHub Skills (skills.github.com): kursus interaktif yang dikerjakan langsung di repo, mulai dari sini.
  • Pro Git (git-scm.com/book): buku gratis tentang Git.
  • GitHub Education (education.github.com): Student Developer Pack untuk pelajar.
  • Learn Git Branching (learngitbranching.js.org): latihan visual branch dan merge.

Kesalahan umum

  • Pesan commit tanpa makna seperti update atau fix.
  • Memakai git push --force ke main untuk "mengatasi" push ditolak.
  • Hanya menghapus .env tanpa mengganti token yang bocor.
  • Membiarkan penanda conflict <<<<<<< ikut ter-commit.

Coba sendiri

Simulasikan push ditolak dan conflict di laptop, memakai repo bare sebagai pengganti GitHub:

mkdir lab-tim && cd lab-tim
git init --bare -b main server.git
git clone server.git ani && cd ani
echo "# Buku" > README.md
git add . && git commit -m "docs: tambah README" && git push -u origin main
cd .. && git clone server.git budi && cd budi
echo "x" >> README.md && git commit -am "docs: cara instal" && git push
cd ../ani
echo "y" >> README.md && git commit -am "feat: halaman daftar"
git push

Push terakhir ditolak dengan ! [rejected] main -> main (fetch first). Sekarang tarik dengan merge:

git pull --no-rebase
git status
Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   README.md

Buka README.md, sisakan baris x dan y, hapus penanda, lalu:

git add README.md
git commit -m "fix: selesaikan konflik README"
git push
git log --oneline

Kamu akan melihat empat commit, dengan commit penyelesaian conflict di paling atas.

Rangkuman

  • Pakai Conventional Commits: feat, fix, docs, refactor, test, chore, dengan kalimat perintah yang singkat.
  • Push ditolak berarti remote punya commit baru: git pull, bereskan conflict, lalu push lagi, bukan --force.
  • Secret yang ter-push harus dicabut dan diganti; .gitignore dan git rm --cached mencegahnya terulang.
  • Conflict diselesaikan dengan memilih versi final, menghapus penanda, lalu add dan commit.
  • GitHub Flow untuk tim: issue, branch, PR, review, CI, merge, tag, Release, Pages.
  • Lanjutkan belajar lewat docs.github.com dan GitHub Skills.

Selesaikan bab ini

  1. 1. Baca materi
  2. 2. Kuis (4 soal)

Cek pemahaman

  1. 1Kamu menjalankan git push dan mendapat output berikut. Langkah yang tepat berikutnya adalah

    $ git push
    To https://github.com/tim/buku.git
     ! [rejected]        main -> main (fetch first)
    error: failed to push some refs to 'https://github.com/tim/buku.git'
    hint: Updates were rejected because the remote contains work that you do not
    hint: have locally.
  2. 2Pesan commit mana yang sesuai format Conventional Commits untuk perbaikan bug?

  3. 3Jika token API terlanjur ter-push ke GitHub, langkah terpenting adalah mencabut token itu dan membuat token baru.

  4. 4Setelah git pull, git status menampilkan bagian berikut. Apa arti keadaan ini?

    $ git status
    On branch main
    You have unmerged paths.
      (fix conflicts and run "git commit")
    
    Unmerged paths:
      (use "git add <file>..." to mark resolution)
    	both modified:   README.md