GitHub

Belum masuk. Progresmu tidak tersimpan.

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

Push, Pull, dan Sinkronisasi dengan GitHub

Di bab ini (10 bagian)
  1. Tujuan
  2. Perjalanan sebuah perubahan sampai ke GitHub
  3. Menyambungkan repo lokal ke GitHub
  4. Siklus harian: add, commit, push
  5. fetch vs pull
  6. Push ditolak? Pull dulu
  7. Daftar perintah penting
  8. Kesalahan umum
  9. Coba sendiri
  10. Rangkuman

Tujuan bab ini

  • Menghubungkan repo lokal ke repo kosong di GitHub dengan git remote add origin dan git push -u.
  • Menjalankan siklus harian add, commit, push tanpa bingung urutannya.
  • Membedakan git fetch dan git pull, lalu tahu kapan memakai masing-masing.
  • Membereskan push yang ditolak dengan pull dulu, baru push lagi.

Perjalanan sebuah perubahan sampai ke GitHub

Di kelas Git kamu sudah kenal tiga area kerja di laptop. Sekarang tambahkan satu tempat lagi, yaitu repo di GitHub:

  1. Working directory: folder tempat kamu mengedit file.
  2. Staging area: perubahan yang sudah kamu pilih untuk commit berikutnya (git add).
  3. Local repository: riwayat commit di folder .git di laptopmu (git commit).
  4. Remote repository: repo di server GitHub yang dibagikan ke tim (git push).

Perjalanan perubahan dari working directory, staging, repo lokal, sampai repo remote di GitHub

Analogi gampangnya: working directory itu meja kerja, staging itu keranjang belanja, commit itu struk pembelian, dan GitHub itu lemari bersama yang bisa dibuka semua anggota tim. Selama belum di-push, commit kamu cuma ada di laptopmu dan rekan tim belum bisa melihatnya. Detail staging, restore, dan reset ada di kelas Git. Di sini kita fokus ke jalur laptop ↔ GitHub.

Menyambungkan repo lokal ke GitHub

Ada dua cara memulai:

  • Repo sudah ada di GitHub (misalnya dibuat lewat tombol New dengan README): cukup git clone <url>. Remote bernama origin otomatis terpasang.
  • Proyek sudah ada di laptop: buat repo baru di GitHub tanpa README, .gitignore, atau lisensi supaya repo itu benar-benar kosong. GitHub lalu menampilkan petunjuk "…or push an existing repository from the command line". Isinya kurang lebih seperti ini:
git remote add origin https://github.com/rina-dev/latihan-sync.git
git branch -M main
git push -u origin main
  • git remote add origin <url> memberi nama pendek origin untuk alamat repo GitHub. Nama origin cuma kebiasaan umum.
  • git branch -M main memastikan nama branch kamu main.
  • git push -u origin main mengirim branch main ke origin, dan opsi -u (--set-upstream) mencatat bahwa main lokal "mengikuti" origin/main.

Setelah -u dipasang sekali, push dan pull berikutnya cukup ditulis git push dan git pull tanpa argumen. Git juga jadi bisa memberi tahu posisimu di git status:

On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Cek alamat remote kapan saja dengan git remote -v. Kalau GitHub meminta login saat push, pakai Personal Access Token atau SSH seperti di bab autentikasi. Password akun GitHub biasa sudah tidak diterima untuk operasi Git.

Siklus harian: add, commit, push

Setiap kali menyelesaikan satu bagian kecil pekerjaan, kamu akan mengetik pola yang sama:

git pull                              # ambil perubahan terbaru dulu
git status                            # apa saja yang berubah?
git add index.html                    # pilih perubahan
git commit -m "Tambah halaman kontak" # simpan snapshot
git push                              # kirim ke GitHub

Setelah push, refresh halaman repo di GitHub dan commit kamu muncul di atas daftar file. Biasakan commit kecil dengan pesan yang jelas. Commit kecil lebih mudah di-review dan lebih jarang bikin konflik.

fetch vs pull

Dua perintah ini sama-sama mengambil data dari GitHub, tapi efeknya beda:

git fetchgit pull
Mengunduh commit baruYaYa
Mengubah file di working directoryTidakYa
Cocok untukmengintip dululangsung ikut terbaru

git fetch hanya memperbarui remote-tracking branch seperti origin/main. File kerjamu tidak disentuh, jadi aman. Setelah fetch, git status bisa memberi tahu kamu tertinggal berapa commit:

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

Mau lihat dulu commit apa saja yang baru? Jalankan git log --oneline main..origin/main.

git pull adalah fetch yang langsung diikuti penggabungan ke branch kamu. Singkatnya: fetch itu "lihat dulu", pull itu "lihat sekaligus ambil".

Satu jebakan: git status tanpa fetch bisa bilang Your branch is up to date with 'origin/main' padahal teman sudah push. Itu karena Git membandingkan dengan origin/main versi terakhir yang ia tahu, bukan dengan GitHub saat ini.

Push ditolak? Pull dulu

Skenario klasik: kamu dan teman sama-sama mulai dari commit yang sama. Teman push duluan. Saat kamu push, GitHub menolak:

 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/rina-dev/latihan-sync.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally.

GitHub cuma menolak menimpa commit teman yang belum kamu punya. Solusinya: ambil dulu, gabungkan, lalu push lagi.

git pull --no-rebase   # ambil commit teman dan buat merge commit
git push

Kenapa ada --no-rebase? Di Git modern (termasuk 2.43), kalau riwayat lokal dan remote sudah bercabang dan kamu belum memilih caranya, git pull berhenti dengan pesan fatal: Need to specify how to reconcile divergent branches. Pilih sekali untuk selamanya dengan git config --global pull.rebase false (merge) atau true (rebase). Bedanya dibahas di kelas Git. Kalau pull ternyata memunculkan konflik, cara menyelesaikannya ada di bab berikutnya.

Satu hal yang jangan pernah jadi refleks: git push --force. Perintah ini menimpa riwayat di GitHub dan bisa menghapus commit teman.

Daftar perintah penting

PerintahFungsi
git clone <url>menyalin repo dari GitHub beserta riwayatnya
git remote -vmelihat alamat remote
git remote add origin <url>menyambungkan repo lokal ke GitHub
git push -u origin <branch>push pertama sekaligus memasang upstream
git pushmengirim commit lokal ke GitHub
git fetchmengunduh info terbaru tanpa mengubah file
git pullfetch lalu menggabungkan ke branch aktif
git statusposisi branch: ahead, behind, atau diverged
git switch -c <nama>membuat lalu pindah ke branch baru
git stashmenyimpan sementara pekerjaan yang belum siap di-commit

Kesalahan umum

  • Membuat repo GitHub dengan README padahal proyek sudah ada di laptop. Push pertama langsung ditolak karena GitHub punya commit yang tidak kamu punya. Pull dulu (dengan --allow-unrelated-histories bila diminta), atau buat repo kosong.
  • error: remote origin already exists. Remote dengan nama itu sudah terpasang. Ganti alamatnya dengan git remote set-url origin <url>.
  • Lupa push. Commit tersimpan di laptop, tapi teman tidak melihat apa-apa. Lihat ahead of 'origin/main' di git status.
  • Percaya up to date tanpa fetch. Jalankan git fetch dulu kalau mau tahu kondisi GitHub yang sebenarnya.
  • Menyelesaikan penolakan push dengan --force. Pull dulu, baru push.

Coba sendiri

Simulasikan "GitHub" dengan repo bare di laptop, plus dua folder sebagai laptopmu dan laptop teman. Hash di laptopmu akan berbeda.

git config --global init.defaultBranch main
mkdir sync-lab && cd sync-lab
git init --bare server.git
git init laptop-rina && cd laptop-rina
echo "# Latihan Sync" > README.md
git add README.md
git commit -m "Tambah README"
git remote add origin ../server.git
git push -u origin main
To ../server.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Sekarang jadilah teman: clone, commit, push.

cd .. && git clone server.git laptop-teman && cd laptop-teman
echo "Catatan teman" > catatan.txt
git add catatan.txt && git commit -m "Tambah catatan"
git push

Kembali ke laptopmu, commit sesuatu, lalu coba push:

cd ../laptop-rina
echo "Halo dari Rina" >> README.md
git commit -am "Tambah sapaan"
git push
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to '../server.git'

Intip dulu, lalu gabungkan dan push:

git fetch
git status
git pull --no-rebase --no-edit
git push
git log --oneline --graph
Your branch and 'origin/main' have diverged,
and have 1 and 1 different commits each, respectively.
...
*   98522eb Merge branch 'main' of ../server
|\
| * 7e67b23 Tambah catatan
* | 177d2bc Tambah sapaan
|/
* cb46fd6 Tambah README

Setelah itu, ulangi dengan repo sungguhan di GitHub.

Rangkuman

  • Perubahan bergerak dari working directory ke staging, ke repo lokal, lalu ke GitHub lewat git push.
  • git remote add origin <url> dan git push -u origin main cukup dijalankan sekali. Setelah itu cukup git push dan git pull.
  • git fetch hanya mengunduh dan memperbarui origin/main, sedangkan git pull sekaligus menggabungkan ke file kerjamu.
  • Push ditolak berarti GitHub punya commit yang belum kamu punya: pull dulu, selesaikan, lalu push lagi, jangan pakai --force.

Selesaikan bab ini

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

Cek pemahaman

  1. 1Repo di-clone dari GitHub, lalu satu commit dibuat tanpa push. Apa baris kedua output `git status`?

    git clone https://github.com/rina-dev/web.git
    cd web
    echo "<p>Kontak</p>" >> index.html
    git commit -am "Tambah kontak"
    git status
  2. 2Perintah mana yang mengunduh commit baru dari GitHub tanpa mengubah file di working directory?

  3. 3Setelah `git push -u origin main` dijalankan sekali, push berikutnya dari branch main cukup ditulis `git push`.

  4. 4Push kamu ditolak dengan pesan `! [rejected] main -> main (fetch first)`. Apa langkah yang paling tepat?