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 pushcommit-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 pushpolos gagal, karena Git belum tahu branchmainini harus dikirim ke mana.- Di
git push -u origin main,originadalah nama remote-nya danmainadalah branch yang dikirim. -u(kependekan dari--set-upstream) mencatat pasangan itu. Sekarangmainpunya upstream: branch di remote yang jadi pasangan tetapnya, yaituorigin/main.* [new branch]artinya branchmainbaru dibuat di GitHub.- Setelah itu cukup
git pushataugit pull, tanpaorigin main.-ucukup sekali per branch. Branch baru, misalnyafitur, juga butuh sekali:git push -u origin fitur.
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
origin/mainadalah remote-tracking branch: catatan di laptopmu tentang posisimaindi GitHub, waktu terakhir kamu fetch, pull, atau push. Kamu gak bisa commit ke sana, dia cuma bergeser lewat tiga perintah itu.b2d4f60..c7e9a12artinyaorigin/mainmaju darib2d4f60kec7e9a12, commit Rina.main-mu masih dib2d4f60. Mau intip isinya dulu?git log main..origin/mainmenampilkan commit yang ada diorigin/maintapi belum ada dimain.
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
- Kamu gak punya commit baru, jadi merge-nya cukup fast-forward:
maindigeser maju kec7e9a12, tanpa commit tambahan. Filefooter.htmldi laptopmu sekarang berisi perbaikan Rina. - Kalau kamu juga punya commit baru, merge-nya bikin merge commit yang menyatukan commit-mu dan commit Rina, sama seperti di pelajaran merging. Kalau kalian mengubah baris yang sama, muncul conflict, dan cara membereskannya juga sama.
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
git push --forcedi branch bersama.--forcemenyuruh GitHub menerima versimu apa adanya, walau itu membuang commit yang gak kamu punya. Di langkah 4,git push --forceakan menghapusperbaiki footermilik Rina dari GitHub. Kalau memang harus menimpa, misalnya di branch pribadimu, pakaigit push --force-with-lease: dia menolak kalaumaindi GitHub sudah bergeser sejak terakhir kamu fetch.- Lupa
-udi branch baru. Push pertama branchfiturtanpa-udibalashas no upstream branch. Jalankangit push -u origin fitursekali. - Mengira fetch mengubah file. Setelah
git fetch, file-filemu belum berubah sama sekali. Perlugit merge origin/main, atau langsunggit pull. - Pull dengan perubahan yang belum di-commit. Kalau file yang masuk bentrok dengan perubahanmu yang belum di-commit, Git menolak:
Your local changes to the following files would be overwritten by merge. Commit dulu, baru pull.
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.