Git Push & Pull — Git

Setelah mengatur remote, kamu perlu mengirim dan mengambil perubahan. git push — mengirim commit lokal ke remote: $ git push origin main Enumerating objects…

git push mengirim commit dari laptopmu ke remote, misalnya GitHub. git pull mengambil commit baru dari remote dan menggabungkannya ke branch-mu. Bayangin kerja kelompok yang punya satu map tugas di loker kelas. Map itu remote-nya, catatan di rumah masing-masing itu repository lokal. Push itu menyetor halaman barumu ke map. Pull itu mengambil halaman baru dari map, lalu menyelipkannya ke catatanmu.

🧪 Tebakan cepat: Rina sudah push satu commit ke GitHub. Kamu belum pull, lalu langsung git push commit-mu sendiri. Apa yang terjadi: commit Rina tertimpa, push-mu ditolak, atau Git menggabungkan keduanya otomatis? Tebak dulu, jawabannya ada di bagian "Push ditolak? Pull dulu".

Push pertama: -u dan upstream

Repo toko-kue di laptopmu punya 2 commit, a1c3e5f halaman awal dan b2d4f60 tambah menu. Remote origin sudah kamu tambahkan dengan git remote add (pelajaran sebelumnya), dan repo di GitHub masih kosong.

$ git push
fatal: The current branch main has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin main

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

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

git fetch: ambil kabar tanpa mengubah branch-mu

Rina, teman satu timmu, push commit c7e9a12 perbaiki footer ke GitHub. Laptopmu belum tahu apa-apa. git fetch mengunduh commit baru dari remote, tapi gak mengubah branch main-mu dan gak menyentuh satu file pun.

$ git fetch
From https://github.com/kamu/toko-kue
   b2d4f60..c7e9a12  main       -> origin/main

git pull = git fetch + git merge

git pull menjalankan dua langkah sekaligus: git fetch, lalu git merge origin/main ke branch-mu. Kalau kamu belum fetch dan belum bikin commit baru:

$ git pull
From https://github.com/kamu/toko-kue
   b2d4f60..c7e9a12  main       -> origin/main
Updating b2d4f60..c7e9a12
Fast-forward

Push ditolak? Pull dulu

Ini kejadian di tebakan tadi, langkah demi langkah. Hash commit-mu nanti beda, di Lab juga beda, karena hash dihitung dari isi commit, waktu, dan pembuatnya.

Langkah Perintah main di laptopmu origin/main main di GitHub
1 git push -u origin main b2d4f60 b2d4f60 b2d4f60
2 Rina push perbaiki footer b2d4f60 b2d4f60 c7e9a12
3 kamu commit tambah tombol pesan d4f8b21 b2d4f60 c7e9a12
4 git push, ditolak d4f8b21 b2d4f60 c7e9a12
5 git pull e5a9d03 (merge) c7e9a12 c7e9a12
6 git push e5a9d03 e5a9d03 e5a9d03

Langkah 4 di terminal:

$ git push
To https://github.com/kamu/toko-kue.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/kamu/toko-kue.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.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Itu jawaban tebakannya: push-mu ditolak, dan commit Rina aman. GitHub cuma menerima push yang melanjutkan main miliknya. Commit-mu dibuat di atas b2d4f60, padahal main di GitHub sudah maju ke c7e9a12. Kalau diterima, commit Rina hilang. Jadi pull dulu (langkah 5), baru push lagi (langkah 6). Kalau kamu sudah fetch tapi belum merge, alasannya tertulis (non-fast-forward), obatnya sama.

Git versi baru kadang menolak git pull di langkah 5 dengan pesan fatal: Need to specify how to reconcile divergent branches. Itu karena dia minta kamu memilih cara menggabungkan. Jalankan sekali git config --global pull.rebase false, supaya pull selalu memakai merge seperti di sini.

⚠️ Jebakan yang sering ketemu

TL;DR: git push mengirim commit ke remote, git pull mengambilnya. Push pertama sebuah branch pakai git push -u origin <branch> (-u sama dengan --set-upstream), setelah itu cukup git push. git fetch cuma mengunduh dan menggeser origin/main, branch dan file-mu gak berubah. git pull sama dengan git fetch lalu git merge. Push ditolak karena remote punya commit yang belum kamu punya? Pull dulu, lalu push lagi. Jangan git push --force di branch bersama, karena itu menimpa commit orang lain. Kalau terpaksa menimpa, pakai --force-with-lease.

Yang akan kamu pelajari