Git

Belum masuk. Progresmu tidak tersimpan.

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

Remote dan Kolaborasi: Push, Pull, dan Workflow Tim

Di bab ini (11 bagian)
  1. Tujuan
  2. Lokal dan remote
  3. Menautkan remote: git remote
  4. Push pertama dan upstream
  5. fetch vs pull
  6. Git bukan GitHub
  7. Alur fork dan pull request
  8. Workflow tim
  9. Kesalahan umum
  10. Coba sendiri
  11. Rangkuman

Tujuan bab ini

  • Menautkan repositori lokal ke remote dengan git remote add, lalu mengirim cabang pertama memakai git push -u.
  • Membedakan git fetch (hanya mengunduh) dan git pull (mengunduh lalu menggabungkan), serta membaca status upstream.
  • Menjelaskan beda Git dengan GitHub, GitLab, dan Bitbucket, plus alur fork dan pull request.
  • Memilih workflow tim (GitHub Flow, Git Flow, trunk-based) sesuai ukuran tim dan cara rilisnya.

Lokal dan remote

Sampai bab sebelumnya, semua yang kamu lakukan terjadi di laptop sendiri: commit, branch, merge, semuanya tersimpan di folder .git. Itu sudah cukup buat kerja sendirian, tapi begitu ada teman satu tim, kalian butuh satu tempat bersama untuk bertukar commit. Tempat itu namanya repositori remote, yaitu salinan repositori yang tinggal di server, biasanya di GitHub, GitLab, atau Bitbucket.

Ingat, Git itu terdistribusi. Remote bukan "pusat" yang wajib ada; ia hanya salinan lain yang kebetulan disepakati sebagai titik temu. Alurnya sederhana:

  • git push mengirim commit lokal ke server.
  • git fetch dan git pull mengambil pembaruan dari server.

Diagram repositori lokal dan remote beserta perintah push, pull, dan fetch

Menautkan remote: git remote

Repositori baru hasil git init belum kenal server mana pun. Cek dulu dengan git remote -v; kalau tidak keluar apa-apa, berarti belum ada remote. Tautkan dengan:

git remote add origin https://github.com/kamu/catatan.git
git remote -v
origin	https://github.com/kamu/catatan.git (fetch)
origin	https://github.com/kamu/catatan.git (push)

origin cuma nama panggilan (alias) untuk URL tadi. Namanya bebas, tapi origin adalah nama baku untuk remote utama, jadi hampir semua tutorial dan tim memakainya. Opsi -v (verbose) menampilkan URL untuk fetch dan push.

Kalau kamu memulai dari repositori yang sudah ada di server, pakai git clone <url>. Clone menyalin seluruh riwayat sekaligus mengatur origin secara otomatis, jadi kamu tidak perlu git remote add lagi.

Push pertama dan upstream

Kirim cabang main ke server untuk pertama kalinya:

git push -u origin main
To https://github.com/kamu/catatan.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Opsi -u (kependekan dari --set-upstream) menetapkan upstream, yaitu cabang remote yang "dipasangkan" dengan cabang lokalmu. Setelah itu kamu cukup mengetik git push atau git pull tanpa menyebut origin main lagi. Tanpa upstream, Git akan menolak git push polos:

fatal: The current branch feature/login has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin feature/login

Cabang remote yang dilacak muncul sebagai origin/main. Ini bukan cabang tempat kamu bekerja, melainkan catatan lokal tentang posisi main di server pada saat terakhir kamu berkomunikasi dengannya. Lihat pasangan upstream tiap cabang dengan git branch -vv:

* main 376941b [origin/main] docs: tambah README

fetch vs pull

Ini bagian yang paling sering tertukar.

  • git fetch origin hanya mengunduh commit baru dari server dan memperbarui origin/main. Cabang main milikmu dan isi folder kerjamu tidak disentuh sama sekali.
  • git pull origin main setara dengan git fetch diikuti git merge origin/main ke cabang yang sedang aktif.

Misalnya teman kamu, Dina, baru saja push satu commit. Setelah git fetch, git status memberi tahu bahwa kamu tertinggal:

On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

File di folder kerjamu masih versi lama. Baru setelah git pull, commit Dina masuk ke main:

Updating 376941b..e316705
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

Kapan pakai fetch? Saat kamu ingin mengintip dulu apa yang berubah (git log main..origin/main) sebelum memutuskan menggabung. Pull lebih praktis untuk sehari-hari, fetch lebih aman saat kamu sedang di tengah pekerjaan.

Kalau kamu dan teman sama-sama sudah commit, cabangnya diverged. Push-mu akan ditolak dengan pesan ! [rejected] main -> main (fetch first), dan solusinya adalah pull dulu, bereskan konflik kalau ada, lalu push lagi. Di Git versi baru, pull pada cabang yang diverged bisa berhenti dengan pesan You have divergent branches; pilih sekali caranya, misalnya git config --global pull.rebase false untuk merge atau true untuk rebase.

Git bukan GitHub

Kesalahpahaman paling umum: menganggap Git dan GitHub itu sama. Git adalah perangkat lunak kontrol versi yang berjalan di komputermu. GitHub, GitLab, dan Bitbucket adalah layanan yang menyimpan repositori Git di internet lalu menambahkan fitur kolaborasi di atasnya.

PlatformCiri khasCocok untuk
GitHubKomunitas open source terbesar; Pull Request, Issues, Actions (CI/CD), ProjectsProyek publik, portofolio, komunitas
GitLabPlatform DevOps menyeluruh, bisa self-hosted; istilahnya Merge RequestPerusahaan yang ingin kontrol penuh atas server
BitbucketTerintegrasi dengan Jira dan Confluence, punya Bitbucket PipelinesTim yang sudah memakai Jira

Alur fork dan pull request

Kamu tidak punya izin push ke repositori orang lain. Cara standar berkontribusi ke proyek open source adalah:

  1. Fork: salin repositori itu ke akunmu lewat antarmuka web.
  2. Clone: unduh hasil fork ke laptop dengan git clone.
  3. Branch: buat cabang khusus, misalnya git switch -c fix/typo-readme.
  4. Commit & push: simpan perubahan, lalu git push -u origin fix/typo-readme ke fork-mu.
  5. Pull request: ajukan permintaan penggabungan ke repositori asal.
  6. Review & merge: pemelihara meninjau, memberi masukan, lalu menggabungkan.

GitHub dan Bitbucket menyebutnya Pull Request (PR), sedangkan GitLab menyebutnya Merge Request (MR). Konsep dan tujuannya sama persis. Di tim sendiri, kamu biasanya tidak perlu fork: cukup buat cabang di repositori bersama, push, lalu buka PR.

Workflow tim

Semua anggota tim perlu sepakat cara memakai cabang. Ada beberapa model populer:

  • Feature branch: dasar dari semua model di bawah. Setiap fitur atau perbaikan dikerjakan di cabang sendiri (feature/login, bugfix/email-kosong), lalu digabung lewat PR.
  • Git Flow: cabang main, develop, feature/*, release/*, dan hotfix/*. Paling lengkap dan formal. Cocok untuk produk dengan versi rilis terjadwal, misalnya aplikasi mobile yang rilis tiap bulan.
  • GitHub Flow: hanya main plus feature/*. Setiap fitur dibuat cabang, di-review lewat PR, lalu langsung dirilis. Cocok untuk aplikasi web dengan deploy berkelanjutan.
  • Trunk-based: semua orang mengintegrasikan ke main minimal sekali sehari, dengan cabang yang umurnya sangat pendek, dijaga pengujian otomatis. Cocok untuk tim matang dengan CI/CD kuat.

Tidak ada model yang paling benar. Tim kecil yang baru belajar biasanya paling nyaman dengan GitHub Flow karena aturannya sedikit.

Kesalahan umum

  • Mengira git fetch sudah memperbarui file. Fetch hanya memperbarui origin/main; jalankan git merge atau git pull agar cabangmu ikut maju.
  • Lupa -u pada push pertama. Akibatnya git push polos ditolak karena belum ada upstream.
  • Push tanpa pull. Kalau teman sudah push duluan, push-mu ditolak. Biasakan pull sebelum push.
  • Langsung push ke main di tim. Lewat PR, perubahan sempat di-review dulu.
  • Menyamakan Git dengan GitHub. Git tetap jalan tanpa internet dan tanpa akun apa pun.

Coba sendiri

Kamu bisa mensimulasikan server tanpa akun GitHub: repositori bare di folder lokal bisa jadi remote.

mkdir lab-remote && cd lab-remote
git init --bare -b main server.git
git init -b main proyek && cd proyek
echo "# Catatan" > README.md
git add . && git commit -m "docs: tambah README"
git remote add origin ../server.git
git push -u origin main
git branch -vv

Output terakhir kira-kira (hash-mu akan berbeda):

* main 376941b [origin/main] docs: tambah README

Sekarang jadi "teman" yang meng-clone dan push:

cd .. && git clone server.git laptop-dina && cd laptop-dina
echo "baris dina" >> README.md
git commit -am "docs: catatan dina" && git push
cd ../proyek
git fetch
git status

git status akan bilang Your branch is behind 'origin/main' by 1 commit. Cek cat README.md, isinya masih satu baris. Jalankan git pull, lalu cat README.md lagi: baris Dina sudah muncul.

Rangkuman

  • git remote add origin <url> menautkan remote; git remote -v menampilkannya; git clone mengatur origin otomatis.
  • git push -u origin main mengirim cabang sekaligus menetapkan upstream, sehingga push dan pull berikutnya cukup tanpa argumen.
  • git fetch hanya mengunduh dan memperbarui origin/main; git pull = fetch + merge ke cabang aktif.
  • Git adalah alatnya; GitHub, GitLab, dan Bitbucket adalah layanan hosting dengan fitur kolaborasi.
  • Kontribusi ke proyek orang: fork, clone, branch, commit dan push, pull request, review dan merge.
  • Pilih workflow sesuai tim: Git Flow untuk rilis terjadwal, GitHub Flow untuk deploy berkelanjutan, trunk-based untuk tim dengan CI/CD kuat.

Selesaikan bab ini

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

Cek pemahaman

  1. 1Kamu menjalankan perintah berikut. Pernyataan mana yang benar tentang repositori lokalmu?

    $ git fetch
    $ git status
    On branch main
    Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
      (use "git pull" to update your local branch)
  2. 2Apa fungsi opsi -u pada perintah git push -u origin main?

  3. 3GitLab menyebut pengajuan penggabungan sebagai Merge Request, sedangkan GitHub menyebutnya Pull Request.

  4. 4Tim web kamu deploy beberapa kali sehari dan hanya ingin satu cabang utama plus cabang fitur yang di-review lewat PR. Model workflow yang paling pas adalah