Error src refspec main does not match any adalah salah satu error Git yang paling sering ditemui, terutama oleh pengguna yang baru pertama kali mendaftarkan repositori ke remote. Meskipun pesannya terliensi singkat, error ini sebenarnya menyimpan banyak informasi tentang apa yang salah dalam alur push kamu. Artikel ini akan membongkar pesan error tersebut, menjelaskan setiap kemungkinan penyebabnya, dan memberikan solusi step-by-step yang bisa langsung kamu ikuti — bukan sekadar workaround, tapi perbaikan permanen yang mencegah error ini muncul lagi di masa depan.


Membaca Pesan Errornya

Ketika kamu menjalankan perintah push untuk pertama kalinya ke repositori remote, terkadang Git merespons dengan pesan berikut:

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/username/repo.git'

Baris pertama, src refspec main does not match any, adalah inti dari masalahnya. Git mencoba mencari referensi bernama main di repositori lokal kamu, tetapi tidak menemukan satupun branch, tag, atau commit yang cocok dengan nama tersebut. Baris kedua hanyalah konsekuensi: karena sumber (src) tidak ditemukan, operasi push gagal total.

Kenapa error ini muncul? Secara sederhana, Git bekerja dengan konsep refspec, yaitu pemetaan antara referensi lokal dan referensi remote. Format umumnya adalah <src>:<dst>, di mana src adalah branch lokal dan dst adalah branch remote. Ketika kamu menjalankan git push origin main, Git mengasumsikan refspec main:main. Jika branch main tidak ada di lokal — baik karena belum pernah dibuat, belum ada commit sama sekali, atau memang namanya berbeda — maka Git mengeluarkan error ini. Jadi, error ini bukan masalah dengan remote, melainkan masalah dengan referensi lokal yang tidak ditemukan.


Penyebab yang Paling Sering

Ada beberapa root cause yang bisa memicu error ini. Berikut adalah daftar dari yang paling sering terjadi hingga yang lebih jarang, beserta cara memastikan mana yang sedang kamu alami.

1. Belum ada commit sama sekali di repositori. Ini adalah penyebab paling umum, terutama bagi pemula. Kamu sudah menjalankan git init, mungkin sudah menambahkan remote dengan git remote add origin, lalu langsung push. Namun, branch main baru tercipta secara otomatis setelah commit pertama berhasil dibuat. Tanpa commit, tidak ada branch yang ada secara formal di Git — HEAD memang ada, tapi tidak menunjuk ke apapun. Cara memastikan: jalankan git log. Jika output-nya fatal: your current branch does not have any commits yet, ini penyebabnya.

2. Nama branch default bukan main, melainkan master. Repositori Git yang dibuat dengan versi Git lama (sebelum versi 2.28) akan menggunakan master sebagai nama branch default. Ketika kamu push dengan git push origin main, Git mencari branch main yang tidak ada. Cara memastikan: jalankan git branch. Jika output-nya menunjukkan master (atau nama lain selain main), ini penyebabnya.

3. File yang di-add berada di .gitignore sehingga tidak ada perubahan yang ter-commit. Kamu mungkin sudah menjalankan git add . dan git commit -m "initial", tapi commit gagal secara diam-diam karena semua file yang di-stage diabaikan oleh .gitignore. Tanpa commit yang berhasil, branch tetap belum terbentuk. Cara memastikan: setelah commit, jalankan git log. Jika tetap tidak ada commit, kemungkinan besar inilah penyebabnya.

4. Kamu berada di direktori yang salah atau repositori belum di-init. Jika kamu menjalankan push di luar repositori Git, atau di subdirektori yang belum menjadi bagian dari repositori, maka Git tidak punya konteks branch apapun. Cara memastikan: jalankan git status. Jika output-nya fatal: not a git repository, ini penyebabnya.

5. Branch yang di-push sengaja di-delete atau belum di-checkout. Misalnya kamu membuat branch baru di remote atau di lokal lain, tapi belum pernah checkout ke branch tersebut di repositori ini. Cara memastikan: git branch -a untuk melihat semua branch lokal dan remote. Jika main tidak muncul di daftar, branch tersebut memang belum ada.


Langkah Perbaikan

Berikut adalah solusi langkah demi langkah yang mencakup perbaikan langsung sekaligus identifikasi root cause.

Langkah 1: Verifikasi status repositori

Jalankan perintah berikut untuk melihat kondisi repositori saat ini:

git status

Output yang diharapkan jika repositori valid:

On branch main
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        index.js
        README.md

Jika output menunjukkan not a git repository, berarti kamu harus menjalankan git init terlebih dahulu. Jika branch yang tercantum bukan main (misalnya master), catat nama branch tersebut karena ini adalah root cause nomor 2.

Langkah 2: Tambahkan file dan buat commit pertama

Ini adalah langkah krusial yang paling sering terlewat. Tanpa commit, branch tidak secara formal ada di Git:

git add .
git commit -m "Initial commit"

Output yang diharapkan:

[main (root-commit) a1b2c3d] Initial commit
 2 files changed, 15 insertions(+)
 create mode 100644 index.js
 create mode 100644 README.md

Perhatikan baris pertama: [main (root-commit) ...]. Ini mengonfirmasi bahwa branch main kini sudah ada dan memiliki setidaknya satu commit. Jika baris ini muncul dengan nama branch selain main, berarti branch default kamu bukan main.

Langkah 3: Verifikasi branch yang aktif

git branch

Output yang diharapkan:

* main

Tanda bintang * menunjukkan branch yang sedang aktif. Jika yang muncul adalah * master, maka kamu punya dua opsi: (a) push dengan nama yang benar, atau (b) rename branch ke main.

Opsi A — Push dengan nama yang benar (solusi langsung):

git push -u origin master

Opsi B — Rename branch ke main (fix permanen):

git branch -M main

Flag -M adalah shorthand dari --move --force, yang artinya rename branch saat ini menjadi main meskipun nama tersebut sudah ada. Setelah rename, push seperti biasa:

git push -u origin main

Output yang diharapkan:

Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 227 bytes | 227.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/username/repo.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

Langkah 4: Verifikasi bahwa solusi berhasil

Jalankan perintah berikut untuk memastikan push berhasil dan branch lokal ter-track dengan remote:

git branch -vv

Output yang diharapkan:

* main a1b2c3d [origin/main] Initial commit

Notasi [origin/main] mengonfirmasi bahwa branch lokal main terhubung dengan remote branch origin/main. Error src refspec main does not match any seharusnya tidak muncul lagi pada push berikutnya.


Supaya Tidak Terulang

Solusi step-by-step di atas memang menyelesaikan masalah saat ini, tapi agar error ini tidak muncul lagi di repositori baru di masa depan, kamu perlu mengubah konfigurasi global Git.

Konfigurasi nama branch default global

Sejak Git 2.28 (dirilis Juli 2020), Git mendukung konfigurasi nama branch default melalui init.defaultBranch. Setel secara global agar setiap git init di masa depan otomatis menggunakan main:

git config --global init.defaultBranch main

Untuk memverifikasi:

git config --global init.defaultBranch

Output: main

Konfigurasi ini disimpan di file ~/.gitconfig (di Linux/macOS) atau C:\Users\<nama>\.gitconfig (di Windows). Kamu juga bisa mengedit file tersebut secara manual:

[user]
    name = Nama Kamu
    email = email@example.com
[init]
    defaultBranch = main

Best practice untuk mencegah error kembali

Pertama, selalu buat commit sebelum push. Ini terdengar trivial, tapi banyak pengguna — terutama yang menggunakan CI/CD pipeline — melakukan git init dan langsung push dalam satu script tanpa commit di antaranya. Kedua, selalu gunakan -u (upstream) saat push pertama kali. Flag ini tidak hanya push, tapi juga mengatur hubungan tracking antara branch lokal dan remote, sehingga git push tanpa argumen sudah cukup untuk push berikutnya. Ketiga, konfirmasi nama branch sebelum push dengan git branch — ini hanya butuh dua detik dan menyelamatkan dari error yang memakan waktu lebih lama untuk di-debug.

Perbedaan antar sistem operasi

Konfigurasi di atas berjalan dengan cara yang sama di Linux, macOS, dan Windows. Namun, ada nuansa kecil yang perlu diperhatikan. Di Windows, Git Bash dan Git GUI kadang menggunakan konfigurasi yang terpisah dari Git yang di-install via Chocolatey atau Scoop. Pastikan kamu menjalankan git config --global dari terminal yang sama dengan yang kamu gunakan untuk push. Di macOS, jika kamu menggunakan Xcode's Git (versi lama yang ter-install bersama Command Line Tools), versinya mungkin lebih lama dari 2.28 dan tidak mendukung init.defaultBranch. Periksa versi Git dengan git --version dan install versi terbaru via Homebrew jika perlu:

brew install git

Di Linux, distribusi tertentu (seperti Debian stable) bisa membawa versi Git yang lebih lama dari 2.28. Gunakan package manager atau build dari source untuk mendapatkan versi terbaru.


Kalau Masih Belum Berhasil

Jika semua solusi di atas sudah kamu coba tapi error tetap muncul, ada beberapa skenario edge case yang perlu diperiksa.

Scenario 1: Commit kosong karena semua file di-ignore

Jalankan git add . lalu git status. Jika output menunjukkan nothing to commit, working tree clean padahal kamu yakin ada file di direktori, berarti semua file tertangkap oleh .gitignore. Periksa file .gitignore dan pastikan file yang ingin kamu commit tidak cocok dengan pola ignore mana pun. Kamu juga bisa memaksa penambahan file yang di-ignore:

git add -f namafile.txt
git commit -m "Add ignored file"

Scenario 2: HEAD ter-detach (detached HEAD state)

Jika kamu sebelumnya checkout ke commit tertentu (misalnya git checkout a1b2c3d), kamu berada dalam detached HEAD state. Dalam kondisi ini, branch main tidak aktif, dan push akan gagal. Perbaiki dengan checkout kembali ke branch:

git checkout main

Jika branch main belum ada (karena commit dibuat dalam detached HEAD), buat branch baru dari commit tersebut:

git checkout -b main

Scenario 3: Remote salah atau sudah terhapus

Jalankan git remote -v untuk memverifikasi bahwa remote origin mengarah ke URL yang benar. Jika URL sudah tidak valid (misalnya repositori di GitHub sudah di-delete), hapus remote lama dan tambahkan yang baru: