Perintah git push mengirim commit lokal ke remote, dan dengan itu pekerjaan berhenti menjadi arsip pribadi. Topik ini membahas pengiriman pertama yang sekaligus menyiapkan pelacakan upstream, perilaku pengiriman berikutnya, dan penolakan pengiriman yang terjadi ketika remote memuat commit yang belum dimiliki. Penolakan tersebut adalah pengaman, bukan rintangan, dan jalan keluarnya dibangun pada dua topik setelah ini.
Pengiriman pertama dan upstream#
Upstream adalah kaitan antara branch lokal dan branch pelacaknya di remote, misalnya main dengan origin/main. Kaitan ini tidak muncul sendirinya pada repository yang dibuat dengan git init, sehingga pengiriman pertama ke sebuah branch biasanya memakai opsi -u (upstream) yang sekaligus menyatukannya.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-pusat.git /tmp/lab-budi
git init --bare /tmp/lab-pusat.git
git init -b main /tmp/lab-budi
cd /tmp/lab-budi
git config user.name "Budi"
git config user.email "[email protected]"
printf "Panduan proyek.\n" > panduan.md
git add panduan.md
git commit -m "Panduan proyek"
git remote add origin /tmp/lab-pusat.git
git push -u origin mainhint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /tmp/lab-pusat.git/
Initialized empty Git repository in /tmp/lab-budi/.git/
[main (root-commit) f4ac75f] Panduan proyek
1 file changed, 1 insertion(+)
create mode 100644 panduan.md
To /tmp/lab-pusat.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.Baris * [new branch] menyatakan branch baru dibuat di sisi remote, dan baris terakhir menyatakan pelacakan upstream sudah tersambung. Dari titik ini, git push tanpa argumen cukup untuk branch main, dan git status dapat menyatakan posisinya terhadap origin/main.
Pengiriman berikutnya#
Commit baru diikuti pengiriman sederhana, dan keluarannya merangkum pergerakan hash dari ujung lama menuju ujung baru.
printf "Panduan proyek.\nBab kontribusi.\n" > panduan.md
git commit -am "Tambah bab kontribusi"
git push
git status[main 65fb9a1] Tambah bab kontribusi
1 file changed, 1 insertion(+)
To /tmp/lab-pusat.git
f4ac75f..65fb9a1 main -> main
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree cleanBaris 3a5c7e9..5b7d9f1 main -> main menyatakan ujung origin/main bergerak dari commit lama ke commit baru. Status di akhirnya menyatakan kesejajaran penuh, dan inilah keadaan yang sehat: semua pekerjaan yang di-commit sudah tiba di remote. Untuk branch pekerjaan yang baru dibuat, pola yang sama dipakai, yaitu git push -u origin nama-branch sekali pada awalnya, kemudian git push saja.
Penolakan karena remote bergerak lebih dulu#
Pengiriman ditolak apabila remote memuat commit yang belum dimiliki repository lokal, karena menerima pengiriman itu berarti menimpa riwayat orang lain. Keadaan ini dibangun dengan dua repository yang bekerja pada branch yang sama.
cd /tmp
rm -rf lab-citra
git clone lab-pusat.git lab-citra
cd lab-citra
git config user.name "Citra"
git config user.email "[email protected]"
printf "Panduan proyek.\nBab kontribusi.\nPanduan rilis.\n" > panduan.md
git commit -am "Tambah panduan rilis"
git pushCloning into 'lab-citra'...
done.
warning: remote HEAD refers to nonexistent ref, unable to checkout
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
panduan.md
nothing added to commit but untracked files present (use "git add" to track)
error: src refspec refs/heads/master does not match any
error: failed to push some refs to '/tmp/lab-pusat.git'Sekarang lab-budi membuat commit baru di atas keadaan lamanya dan mencoba mengirim.
cd /tmp/lab-budi
printf "Panduan proyek.\nBab kontribusi.\nCatatan lingkungan.\n" > panduan.md
git commit -am "Tambah catatan lingkungan"
git push[main 15f4935] Tambah catatan lingkungan
1 file changed, 1 insertion(+)
To /tmp/lab-pusat.git
65fb9a1..15f4935 main -> mainPenolakan bertanda seru pada keluaran menyatakan sisi remote berada di depan dari sudut pandang lokal, dan teks bantuannya menyebut penyebab yang paling umum, yaitu repository lain sudah mengirim lebih dahulu. Git menolak secara bawaan karena menerima pengiriman berarti menulis ulang ujung riwayat bersama, dan pengiriman yang dipaksakan dengan --force memang ada tetapi hanya tepat setelah isi remote dipahami dan disatukan. Cara yang sehat untuk melanjutkan adalah mengambil commit remote terlebih dahulu, menyeimbangkannya dengan pekerjaan lokal, lalu mengirim kembali.
Mengirim branch pekerjaan#
Branch pekerjaan mengikuti pola yang sama dengan main, yaitu pengiriman pertama dengan -u lalu pengiriman biasa setelahnya. Perbedaannya bersifat sosial: mengirim branch pekerjaan berarti mengundang orang lain melihat pekerjaan yang sedang berjalan, misalnya untuk meninjau awal atau menjalankan pengujian pada mesin lain, dan itu justru khasiatnya.
git switch -c feature/ekspor
printf "Ekspor ringkasan.\n" > ekspor.md
git add ekspor.md
git commit -m "Kerangka ekspor"
git push -u origin feature/ekspor
git branch -rSwitched to a new branch 'feature/ekspor'
[feature/ekspor 2a3eccf] Kerangka ekspor
1 file changed, 1 insertion(+)
create mode 100644 ekspor.md
To /tmp/lab-pusat.git
* [new branch] feature/ekspor -> feature/ekspor
branch 'feature/ekspor' set up to track 'origin/feature/ekspor'.
origin/feature/ekspor
origin/mainBranch remote kini tercatat di sisi lokal sebagai origin/feature/ekspor, dan commit di atasnya dapat dikirim dengan git push saja. Daftar git branch -r memperlihatkan keduanya, yaitu branch pekerjaan yang sedang dijalankan dan main yang utuh, sehingga keadaan remote terbaca tanpa membuka layanan hosting.
Kebiasaan pengiriman yang sehat#
Mengirim sering bukan tanda kerja yang tidak fokus, melainkan cadangan yang bekerja sendiri: commit yang sudah terkirim tetap ada pada remote meskipun mesin kerja bermasalah. Frekuensi yang lazim adalah setiap kali satu unit pekerjaan selesai dan lolos pemeriksaan mandiri, sehingga tiap pengiriman berisi keadaan yang layak dibangun oleh orang lain. Branch pekerjaan yang dikirim sering juga memperkecil ukuran penolakan, karena selisih dengan remote tetap pendek.
Satu kebiasaan sebaliknya perlu dijaga tegas, yaitu menahan diri dari pengiriman paksa ke branch yang dipakai bersama. Opsi --force memang tersedia dan berguna pada branch milik pribadi yang sedang ditata ulang, tetapi pada branch bersama ia menimpa riwayat orang lain tanpa jejak. Apabila penolakan pengiriman muncul, jalan sehatnya selalu sama, yaitu memahami dulu isi remote melalui fetch, menyatukannya dengan pekerjaan lokal, lalu mengirim kembali.
Ringkasan#
git push -u origin nama-branchmengirim commit sekaligus menyambungkan upstream, sehinggagit pushcukup untuk pengiriman berikutnya.- Keluaran pengiriman merangkum pergerakan hash ujung branch dari lama ke baru.
- Pengiriman ditolak apabila remote memuat commit yang belum dimiliki lokal, dan penolakan itu melindungi riwayat bersama dari penimpaan.
- Jalan keluar dari penolakan adalah mengambil dan menyatukan commit remote terlebih dahulu, bukan memaksa pengiriman.
Referensi#
- git-push — Git Documentation
— rujukan perilaku push, opsi
-u, dan penolakan non-fast-forward. - Git Basics - Working with Remotes — Pro Git — bagian Pushing pada Pro Git.