git push: cara mengirim perubahan ke repositori remote
git push mengirim commit dari branch lokal aktif ke repositori remote dan menggeser penunjuk branch di sana. Untuk pertama kali, branch dipublikasikan dengan git push -u origin nama-branch; setelah itu cukup git push. Jika di server ada commit orang lain, tarik dulu dengan git pull, jangan langsung force push.
Apa yang dilakukan git push
Perintah git push mengambil commit dari branch lokal Anda yang belum ada di server, mengirimkannya ke repositori remote (biasanya bernama origin), lalu menggeser penunjuk branch di sana ke commit terakhir Anda. Berkas di folder kerja dan perubahan yang belum di-commit tidak ikut terkirim: yang dikirim hanya riwayat, yaitu commit.
Perlu dipahami bahwa push bukan «sinkronisasi». Ia hanya berjalan satu arah: dari repositori lokal ke remote. Untuk menerima perubahan orang lain, gunakan git fetch atau git pull. Jika kedua arah ini tertukar, hampir semua masalah yang biasanya dibawa pemula ke mentor akan muncul.
Aturan lain dari Git: secara default, push hanya diizinkan sebagai pemajuan (fast-forward). Server akan menerima commit Anda jika commit itu melanjutkan riwayat yang sudah ada di server. Jika seseorang sudah lebih dulu mengirim commit miliknya, push Anda ditolak. Itu perlindungan, bukan kesalahan.
Sintaks perintah
git push [<remote>] [<branch-lokal>[:<branch-remote>]]
Jika git push dijalankan tanpa argumen, Git mengambil branch aktif dan mengirimkannya ke branch yang ditetapkan sebagai upstream. Bentuk eksplisit berguna ketika upstream belum diatur atau Anda ingin mengirim branch dengan nama lain:
git push origin main # kirim main lokal ke origin/main
git push origin feature/login # kirim branch feature/login
git push origin fix:hotfix-123 # kirim fix lokal sebagai hotfix-123 di server
git push origin HEAD # kirim branch aktif dengan nama yang sama
Cara mengirim untuk pertama kali
Jalur umum dari proyek baru sampai kode ada di GitHub atau GitLab adalah sebagai berikut. Pertama, buat repositori kosong di server, lalu hubungkan dengan repositori lokal dan kirim branch.
git init
git add .
git commit -m "Commit pertama"
git branch -M main
git remote add origin git@github.com:user/project.git
git push -u origin main
Flag -u (bentuk panjangnya --set-upstream) menghubungkan branch lokal main dengan origin/main. Setelah itu, di branch ini cukup menulis git push dan git pull, dan git status akan menampilkan berapa commit Anda di depan atau di belakang server.
Untuk memeriksa ke mana remote mengarah, gunakan git remote -v. Jika alamatnya salah, perbaiki dengan git remote set-url origin <alamat-baru>, bukan dengan menghapus dan membuat ulang repositori.
Cara mengirim branch baru
Anda membuat branch untuk tugas, membuat beberapa commit, lalu menjalankan git push. Git menjawab:
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
Ini bukan error, melainkan petunjuk: branch tersebut belum punya pasangan di server. Jalankan perintah yang disarankan, atau bentuk singkatnya git push -u origin feature/login. Agar Git melakukannya otomatis untuk setiap branch baru, aktifkan pengaturan berikut (tersedia sejak Git 2.37):
git config --global push.autoSetupRemote true
Mengapa git push ditolak: rejected, non-fast-forward
Situasi paling umum dalam kerja tim:
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'github.com:user/project.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally.
Rekan Anda mengirim commit lebih dulu. Riwayat Anda dan riwayat di server sudah bercabang, dan jika push diterima, commit rekan Anda akan hilang. Solusi yang benar adalah menarik perubahan itu dan meletakkan commit Anda di atasnya:
git pull --rebase # ambil commit orang lain dan letakkan commit Anda di atasnya
# jika ada konflik: perbaiki berkas, git add, git rebase --continue
git push
Sebagai alternatif, git pull biasa juga bisa dipakai, tetapi akan menghasilkan commit merge. Keduanya benar; kebanyakan tim lebih suka rebase untuk commit lokal agar riwayatnya tetap lurus. Yang penting: jangan «menyelesaikan» penolakan dengan --force.
git push --force dan --force-with-lease
Force push diperlukan ketika Anda sengaja menulis ulang riwayat branch sendiri: misalnya dengan git commit --amend, git rebase, atau menggabungkan commit sebelum review. Push biasa tidak akan menerima branch seperti itu, karena commit lama di server tidak lagi menjadi leluhur commit baru.
git push --force-with-lease
--force-with-lease menimpa branch di server hanya jika posisinya masih sama seperti yang terakhir dilihat Git lokal (lewat referensi origin/<branch>). Jika rekan sudah mengirim sesuatu, perintah ini akan menolak, sehingga pekerjaannya tidak terhapus. --force (-f) biasa tidak melakukan pemeriksaan ini dan menimpa semuanya tanpa peringatan.
Ada satu hal yang perlu diperhatikan: jika sebelumnya Anda menjalankan git fetch, referensi origin/<branch> ikut diperbarui, dan perlindungan ini tidak lagi berguna, karena Git menganggap Anda sudah melihat commit orang lain. Karena itu, jangan jalankan fetch tepat sebelum force push tanpa memeriksa apa yang datang.
| Perintah | Yang dilakukan | Kapan dipakai |
|---|---|---|
git push | Hanya pemajuan (fast-forward) | Selalu, sebagai default |
git push --force-with-lease | Penulisan ulang dengan pemeriksaan | Branch sendiri setelah rebase atau amend |
git push --force | Penulisan ulang tanpa pemeriksaan | Hampir tidak pernah; jangan pernah ke branch bersama |
Ke branch bersama (main, develop) tidak boleh ada force push: bagi siapa pun yang sudah mengunduh riwayat lama, riwayatnya akan berbeda dari server. Biasanya branch seperti ini juga dilindungi di pengaturan repositori, dan server akan membalas protected branch hook declined.
Cara mengirim tag
git push biasa tidak mengirim tag. Tag harus disebutkan secara eksplisit:
git tag -a v1.2.0 -m "Rilis 1.2.0"
git push origin v1.2.0 # satu tag
git push --tags # semua tag lokal
git push --follow-tags # commit dan tag beranotasi yang menunjuk ke commit tersebut
--follow-tags lebih baik daripada --tags: ia tidak mengirim tag ringan lokal yang kebetulan ada, hanya tag beranotasi yang dapat dijangkau dari commit yang dikirim.
Cara menghapus branch di server
Penghapusan juga dilakukan lewat push:
git push origin --delete feature/login
# sintaks lama, hasilnya sama:
git push origin :feature/login
Branch lokal tetap ada dan bisa dihapus dengan git branch -d feature/login. Rekan Anda masih akan melihat referensi origin/feature/login sampai mereka menjalankan git fetch --prune.
Flag git push yang berguna
| Flag | Fungsi |
|---|---|
-u, --set-upstream | Mengingat branch remote sebagai upstream |
-n, --dry-run | Menampilkan apa yang akan dikirim tanpa benar-benar mengirim |
--all | Mengirim semua branch lokal |
--tags / --follow-tags | Mengirim tag |
-d, --delete | Menghapus branch atau tag di server |
--force-with-lease | Penulisan ulang riwayat yang aman |
-v, --verbose | Keluaran rinci |
--no-verify | Melewati hook pre-push (gunakan dengan sadar) |
Kesalahan umum saat git push dan cara mengatasinya
Permission denied (publickey)
Server tidak menerima kunci SSH Anda. Periksa bahwa kuncinya ada (ls ~/.ssh), bahwa kunci publiknya sudah ditambahkan ke akun, dan bahwa koneksinya berfungsi: ssh -T git@github.com. Jika remote memakai HTTPS, Git akan meminta login dan token, bukan kunci; cek dengan git remote -v.
Authentication failed lewat HTTPS
GitHub dan banyak layanan lain sudah lama tidak menerima kata sandi akun untuk akses HTTPS. Yang dibutuhkan adalah personal access token atau beralih ke SSH. Untuk menyimpan token, gunakan credential helper: git config --global credential.helper store (menyimpan dalam bentuk teks biasa) atau pengelola kredensial dari sistem operasi Anda.
src refspec main does not match any
Branch dengan nama itu tidak ada. Biasanya repositori masih kosong tanpa satu commit pun, atau branch-nya bernama master. Periksa dengan git branch, buat commit, atau ganti nama branch: git branch -M main.
Everything up-to-date padahal ada perubahan
Anda lupa melakukan commit. git push mengirim commit, bukan berkas. Jalankan git status, lalu git add dan git commit. Kemungkinan lain: Anda berada di branch yang berbeda dari yang Anda kira.
Berkas terlalu besar
Layanan hosting membatasi ukuran berkas (di GitHub 100 MB). Jika berkas seperti itu sudah masuk riwayat, menghapusnya dengan commit baru tidak cukup: riwayat harus ditulis ulang, atau berkas dikeluarkan dari commit yang belum dikirim (git reset --soft, lalu commit ulang). Untuk berkas biner besar gunakan Git LFS.
Alur kerja dengan git push
git switch -c feature/x— buat branch untuk tugas.- Commit dalam langkah-langkah kecil yang logis.
git fetchlalugit rebase origin/main— perbarui dengan branch utama yang terbaru.git push -u origin feature/x— publikasikan branch.- Buka pull request; setelah review, tambahkan commit lalu jalankan
git pushbiasa. - Jika terpaksa menulis ulang riwayat, gunakan
git push --force-with-lease.
Sebelum mengirim, lihat apa yang akan dikirim: git log origin/main..HEAD --oneline menampilkan commit yang belum ada di server.
Pengaturan yang cukup dilakukan sekali
Beberapa pengaturan global menghindarkan sebagian besar kejutan saat mengirim. push.default menentukan apa yang dikirim git push tanpa argumen. Nilai default di versi Git modern adalah simple: hanya branch aktif yang dikirim, dan hanya ke branch upstream dengan nama yang sama. Biasanya tidak perlu diubah, tetapi periksa apakah konfigurasi lama masih memakai matching, yang mengirim semua branch yang namanya cocok sekaligus.
git config --global push.default simple
git config --global push.autoSetupRemote true
git config --global push.followTags true
git config --global pull.rebase true
push.followTags menjadikan --follow-tags perilaku default, sedangkan pull.rebase menghindari commit merge yang tidak perlu ketika push ditolak dan Anda harus menarik perubahan orang lain terlebih dahulu.
Hook pre-push
Berkas .git/hooks/pre-push dijalankan sebelum pengiriman. Jika skrip ini berakhir dengan kode non-nol, push dibatalkan. Hook sering dipakai untuk menjalankan tes atau linter agar kode yang rusak tidak sampai ke server. Melewati hook dengan --no-verify hanya layak dilakukan jika Anda benar-benar memahami mengapa hook tersebut gagal.
Ringkasan
git push mempublikasikan commit Anda ke repositori remote, dan hanya berjalan satu arah. Kirim branch pertama kali dengan -u, jika ditolak tarik dulu perubahan orang lain lewat pull, dan kirim riwayat branch Anda yang sudah ditulis ulang hanya dengan --force-with-lease. Bekerja dengan repositori remote, push, pull, dan kunci SSH dibahas dengan praktik dalam kursus Git.
Pertanyaan umum
Apakah git push mengirim perubahan yang belum di-commit?
Tidak. Push hanya mengirim commit; perubahan di folder kerja dan di index tetap lokal sampai Anda commit.
Bagaimana cara membatalkan git push?
Di branch sendiri, Anda bisa membatalkan commit secara lokal dengan git reset lalu mengirim ulang dengan git push --force-with-lease. Di branch bersama, lebih aman membuat commit kebalikan dengan git revert lalu push biasa.
Bisakah hanya satu commit yang dikirim?
Bisa, dengan menyebut hash-nya: git push origin abc1234:main akan mengirim seluruh riwayat sampai commit itu, tetapi tidak commit yang lebih baru. Commit tanpa induk-induknya tidak bisa dikirim sendirian.
Apa bedanya git push dengan git push origin main?
Tanpa argumen, Git memakai upstream yang sudah diatur untuk branch aktif. Bentuk eksplisit menyebutkan remote dan branch secara langsung, dan tetap berfungsi walaupun upstream belum diatur.
Bagaimana cara mengirim ke dua repositori sekaligus?
Tambahkan remote kedua dan kirim ke masing-masing dengan nama, atau tambahkan dua alamat push untuk origin dengan git remote set-url --add --push origin alamat (jalankan untuk kedua alamat, termasuk alamat asli, jika tidak push hanya akan masuk ke alamat kedua).
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
Ke kursus