Gunakan git merge --abort untuk membatalkan merge yang masih berjalan, misalnya ketika Git berhenti karena konflik. Periksa keadaan sebelum dan sesudahnya:

git status
git merge --abort
git status

Jangan menjalankan abort jika Anda masih ingin mempertahankan edit penyelesaian konflik tanpa mencadangkannya. Abort mencoba merekonstruksi keadaan sebelum merge; hasilnya tidak selalu “working tree bersih” jika sejak awal ada perubahan lokal.

Pilih tindakan berdasarkan keadaan

Keadaan Tindakan yang sesuai
Merge masih berlangsung, MERGE_HEAD ada Pertimbangkan git merge --abort.
Merge selesai dan commit sudah dibuat Abort tidak berlaku; periksa sejarah dan pertimbangkan revert atau pemulihan lokal terencana.
Fast-forward sudah memindahkan branch Tidak ada merge yang tertunda atau merge commit baru; abort tidak berlaku.
Rebase atau cherry-pick sedang konflik Gunakan prosedur operasi tersebut: git rebase --abort atau git cherry-pick --abort, bukan merge abort.

Tidak semua git merge membuat merge commit. Fast-forward hanya memindahkan pointer branch. Untuk meninjau merge sebelum commit, --no-commit saja tidak menghentikan fast-forward; gunakan git merge --no-ff --no-commit nama-branch jika memang menginginkan merge tertunda dan memahami perubahan bentuk riwayatnya.

Periksa status dan lindungi kerja lokal

git status --short
git diff
git diff --cached
git rev-parse -q --verify MERGE_HEAD
git ls-files -u

MERGE_HEAD menandai merge yang sedang berlangsung; git ls-files -u menunjukkan entri index yang belum tergabung. git rev-parse tetap cocok untuk repo dengan worktree terpisah, tidak mengasumsikan .git adalah direktori biasa. Status nonzero pada pemeriksaan MERGE_HEAD dapat berarti tidak ada merge aktif; pastikan Anda juga berada dalam repo yang benar.

Koreksi penting: abort tidak selalu membuang seluruh perubahan yang belum di-commit. Perubahan lokal yang tidak bertabrakan dapat dipertahankan. Namun, Git memperingatkan bahwa dalam beberapa keadaan perubahan sebelum merge tidak bisa direkonstruksi, terutama bila file tersebut diedit lagi selama konflik. Jadi, tidak benar pula menjanjikan semua kerja lokal pasti selamat.

Sebelum memulai merge, buat commit yang sesuai atau stash dengan pesan yang mudah dikenali:

git stash push -u -m "cadangan sebelum merge"
git stash list

-u menyertakan file untracked, tetapi bukan file ignored. File penting yang diabaikan Git perlu cadangan tersendiri. Pastikan stash benar-benar terbentuk; jika tidak ada perubahan, jangan menganggap entri teratas adalah cadangan baru. Jangan mencoba menyimpan stash biasa saat index sudah memiliki konflik sebagai solusi universal; salin file penting ke lokasi aman terlebih dahulu bila merge telanjur dimulai.

Setelah merge/abort selesai, pilih entri yang benar dari git stash list, lalu terapkan dengan git stash apply 'stash@{0}' hanya jika memang itulah cadangan yang dimaksud. apply mempertahankan entri cadangan untuk diperiksa; jangan menghapusnya sebelum hasil diverifikasi. Penerapan stash juga dapat menimbulkan konflik.

Latihan konflik dalam repo sementara

Contoh ditujukan untuk Git modern yang menyediakan git switch dan merge --autostash. Jalankan di Bash secara berurutan. Identitas commit hanya disetel di repo fixture, tidak mengganti konfigurasi global. Tidak ada remote, push, atau data produksi.

lab=$(mktemp -d)
cd "$lab" || exit 1
git init -b main
git config user.name "Sandbox CLI"
git config user.email "sandbox@example.invalid"
git config commit.gpgsign false
printf 'dasar\n' > konflik.txt
printf 'catatan awal\n' > catatan.txt
git add konflik.txt catatan.txt
git commit -m "dasar"
git switch -c fitur
printf 'versi fitur\n' > konflik.txt
git commit -am "ubah di fitur"
git switch main
printf 'versi main\n' > konflik.txt
git commit -am "ubah di main"

Konflik dari working tree bersih

git merge fitur

Perintah ini sengaja gagal dengan konflik, bukan tanda fixture rusak. Pesan umumnya memuat CONFLICT (content) dan Automatic merge failed. Jangan menjalankan seluruh latihan dengan set -e tanpa menangani kegagalan yang diharapkan.

git status --short
git ls-files -u
git merge --abort
git status --short

Sebelum abort, konflik.txt berstatus UU dan index memuat entri unmerged. Sesudah abort, git status --short kosong, konflik.txt kembali berisi versi main, dan MERGE_HEAD tidak ada. Ini benar untuk fixture yang awalnya bersih, bukan jaminan untuk semua repo.

Perubahan lokal yang tidak terkait dapat tetap ada

Setelah latihan sebelumnya selesai:

printf 'catatan lokal\n' > catatan.txt
git merge fitur

Merge kembali konflik pada konflik.txt. catatan.txt adalah file tracked yang tidak disentuh branch fitur.

git merge --abort
git status --short
git diff -- catatan.txt

Pada fixture, perubahan catatan lokal tetap ada dan status memuat M catatan.txt. Ini menunjukkan mengapa klaim “abort pasti menghapus semua perubahan unstaged” salah. Jangan menggeneralisasi hasil ini ke file yang bertabrakan atau edit baru yang dibuat setelah konflik.

Autostash: abort tidak persis sama dengan reset

Dengan perubahan catatan.txt dari langkah sebelumnya, coba:

git merge --autostash fitur
git rev-parse -q --verify MERGE_AUTOSTASH

Merge menghasilkan konflik; MERGE_AUTOSTASH menunjuk cadangan sementara perubahan tracked sebelum operasi. Sesudah:

git merge --abort
git status --short

Git membatalkan merge dan menerapkan autostash kembali ke working tree. Pada fixture tanpa konflik saat penerapan ulang, perubahan catatan lokal pulih dan tidak tersisa entri baru di git stash list.

Menurut manual Git:

  • Jika MERGE_HEAD ada dan tidak ada MERGE_AUTOSTASH, git merge --abort setara dengan git reset --merge dalam konteks itu.
  • Jika MERGE_AUTOSTASH ada, abort menerapkannya kembali ke working tree; git reset --merge justru menyimpan autostash ke stash list, tidak langsung menerapkannya.
  • git merge --quit melupakan status merge tanpa memulihkan index/working tree. Autostash yang ada disimpan ke stash list. Ini bukan sinonim abort.

git reset --merge bukan perintah yang “selalu berhasil” dan bukan cara menjaga staging tanpa perubahan: ia memperbarui index dan dapat menolak bila perubahan lokal bertabrakan. Jangan memakainya sebagai fallback buta setelah abort gagal.

Autostash juga bukan jaminan keselamatan. Penerapan ulang bisa konflik, dan file untracked/ignored tidak menjadi cadangan lengkap lewat mekanisme ini. Jika Git melaporkan konflik saat menerapkan autostash, periksa git status, git stash list, dan file penting; jangan langsung mengulang reset. Pengujian lokal artikel ini mencakup perbedaan abort/reset serta konflik penerapan ulang autostash pada merge yang berhasil.

Jika tidak ada merge untuk dibatalkan

Pesan berikut berarti tidak ada MERGE_HEAD yang bisa dibatalkan:

fatal: There is no merge to abort (MERGE_HEAD missing).

Periksa terlebih dahulu:

git status
git log --oneline --graph -8
git reflog -8

Merge commit sudah selesai atau dibagikan

Untuk riwayat yang sudah dibagikan, revert biasanya lebih aman daripada menulis ulang riwayat. Ilustrasi, bukan perintah yang bisa disalin tanpa memilih commit:

git revert -m 1 COMMIT_MERGE

Ganti COMMIT_MERGE dengan commit merge yang sudah diverifikasi. -m 1 memilih parent pertama sebagai mainline; pastikan parent tersebut benar-benar garis sejarah yang ingin dipertahankan. Revert membuat commit pembalik, dapat konflik, dan memengaruhi hasil merge ulang di masa depan. Periksa parent serta hasil tes dan koordinasikan dengan tim. Jangan otomatis memakai HEAD atau -m 1 pada setiap kasus.

Pemulihan lokal sebelum riwayat dibagikan

Untuk merge yang hanya lokal, pemulihan ke commit sebelum merge memerlukan identifikasi commit dari reflog dan cadangan pekerjaan terlebih dahulu. ORIG_HEAD dapat membantu, tetapi dapat ditimpa operasi lain. HEAD~1 berarti parent pertama, bukan selalu posisi sebelum merge, terutama setelah fast-forward atau commit tambahan.

git reset --hard dapat membuang perubahan tracked dan dapat menghapus file/direktori untracked yang menghalangi penulisan target. Karena itu artikel ini tidak menawarkan reset hard sebagai jalan pintas. Simpan file penting, verifikasi commit tujuan, dan pilih pemulihan sesuai keadaan repo. Branch cadangan saja tidak menyimpan perubahan yang belum di-commit.

Bila abort gagal

Berhenti dan simpan salinan file yang masih diperlukan. Periksa error, status index, jenis operasi aktif, dan stash yang ada. Jangan menghapus file metadata .git secara manual, jangan langsung melakukan reset --hard, dan jangan memakai git merge -X ours sebagai pengganti pembatalan: opsi strategi itu memengaruhi penyelesaian konflik dan bisa membuang perubahan pihak lain pada konflik tertentu.

Verifikasi lokal dan rujukan

Uji dijalankan di repo sementara dengan Git 2.53.0.windows.2 dan Bash 5.2.37. Skenario mencakup abort konflik bersih, pelestarian edit lokal tak terkait, autostash abort versus reset, quit, konflik penerapan ulang autostash, merge tertunda tanpa konflik, merge commit selesai, serta fast-forward. Tidak ada push atau reset pada repo artikel. Hasil fixture membuktikan kasus yang diuji, bukan jaminan semua perubahan lokal dapat dipulihkan.

Rujukan primer: git-merge: --abort, --autostash, --quit dan peringatan perubahan lokal, git-reset: mode --merge dan --hard, serta git-revert: mainline dan konsekuensi revert merge.