15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai
22.10.2024

Git Reset vs. Git Checkout vs. Git Revert: Panduan Teknis Lengkap

Memahami perbedaan antara git reset, git checkout, dan git revert sangat penting bagi setiap developer yang bekerja dengan version control. Singkatnya: git reset menulis ulang riwayat dengan memindahkan pointer HEAD; git checkout berpindah antar branch, commit, atau file tanpa mengubah riwayat; dan git revert membatalkan commit dengan membuat commit invers baru, sehingga riwayat tetap utuh. Memilih perintah yang salah — terutama pada branch yang digunakan bersama — dapat merusak riwayat commit tim Anda atau menyebabkan kehilangan data yang tidak dapat dipulihkan.

Panduan ini melampaui sintaks tingkat permukaan untuk menjelaskan mekanisme internal Git, kondisi tepat working tree dan index Anda setelah setiap operasi, serta skenario nyata di mana setiap perintah merupakan pilihan yang tepat (atau pilihan yang sangat salah).

Cara Git Mengelola State: Tiga Tree

Sebelum membandingkan perintah-perintah tersebut, Anda memerlukan model mental yang kuat tentang cara Git melacak state. Git beroperasi di tiga lapisan berbeda:

  • Working directory — file yang Anda lihat dan edit di disk.
  • Staging area (index) — snapshot dari apa yang akan masuk ke commit berikutnya.
  • Commit history (HEAD) — rantai objek commit yang tidak dapat diubah yang tersimpan di .git/.

Setiap perintah undo di Git menargetkan satu atau lebih lapisan ini. Kebingungan antara reset, checkout, dan revert hampir selalu berasal dari ketidaktahuan lapisan mana yang disentuh oleh perintah tertentu.

git reset: Menulis Ulang Riwayat Lokal

git reset memindahkan pointer HEAD branch saat ini ke commit yang ditentukan. Bergantung pada flag mode yang Anda berikan, perintah ini juga dapat memperbarui index dan working directory. Ini adalah operasi penulisan ulang riwayat dan harus diperlakukan sebagai destruktif saat digunakan dengan --hard.

Penjelasan Mode Reset

git reset --soft <commit>   # Move HEAD only; index and working tree unchanged
git reset --mixed <commit>  # Move HEAD + reset index; working tree unchanged (default)
git reset --hard <commit>   # Move HEAD + reset index + reset working tree
ModeHEAD BerpindahIndex DiresetWorking Tree DiresetPerubahan Dipertahankan
--softYaTidakTidakStaged dan unstaged
--mixedYaYaTidakHanya unstaged
--hardYaYaYaTidak ada — hilang secara permanen

Kasus Penggunaan Praktis

Menggabungkan commit sebelum push. Jika Anda memiliki tiga commit work-in-progress yang berantakan yang belum di-push, git reset --soft HEAD~3 menggabungkannya kembali ke index sehingga Anda dapat melakukan commit ulang sebagai satu commit yang bersih.

Membatalkan staging file yang tidak sengaja ditambahkan. Menjalankan git reset HEAD <file> (atau git reset tanpa referensi commit) menghapus file dari index tanpa menyentuh working directory — efeknya identik dengan git restore --staged <file> di Git 2.23+.

Memulihkan dari merge lokal yang gagal. git reset --hard ORIG_HEAD memulihkan state yang ada tepat sebelum merge, karena Git menulis HEAD pra-merge ke ORIG_HEAD secara otomatis.

Jebakan Kritis: Push Setelah Reset

Jika Anda mereset branch yang sudah di-push ke remote lalu melakukan force-push, setiap kolaborator yang branch lokalnya melacak remote tersebut akan memiliki riwayat yang berbeda. Ini adalah salah satu penyebab paling umum hilangnya commit di lingkungan tim. Jangan pernah menjalankan git reset diikuti oleh git push --force pada branch yang digunakan bersama tanpa koordinasi tim yang eksplisit.

# Dangerous on shared branches — use only on private/local branches
git reset --hard HEAD~2
git push --force origin feature/my-branch

git checkout: Navigasi Tanpa Modifikasi Riwayat

git checkout adalah perintah serbaguna yang mengalihkan working tree agar sesuai dengan branch, commit tertentu, atau satu file. Perintah ini tidak memodifikasi riwayat commit. Di Git 2.23 dan yang lebih baru, tanggung jawabnya dibagi menjadi git switch (untuk branch) dan git restore (untuk file), tetapi git checkout tetap berfungsi penuh dan masih dominan di lingkungan produksi.

Referensi Sintaks

git checkout <branch_name>          # Switch to an existing branch
git checkout -b <new_branch>        # Create and switch to a new branch
git checkout <commit_hash>          # Enter detached HEAD state at a specific commit
git checkout -- <file_name>         # Discard working directory changes to a file
git checkout <commit_hash> -- <file> # Restore a single file from a specific commit

State Detached HEAD: Apa Artinya Sebenarnya

Saat Anda menjalankan git checkout <commit_hash>, Git memindahkan HEAD untuk menunjuk langsung ke objek commit daripada ke ref branch. Ini disebut state detached HEAD. Commit apa pun yang Anda buat dalam state ini tidak dapat dijangkau dari branch mana pun — commit tersebut menjadi yatim piatu dan pada akhirnya akan dikumpulkan oleh garbage collector Git kecuali Anda membuat branch untuk menangkapnya.

git checkout 4f7a2c1          # HEAD now points directly to commit 4f7a2c1
git checkout -b hotfix/patch  # Rescue those commits by creating a branch

Skenario nyata yang umum: seorang developer melakukan checkout pada commit lama untuk menguji regresi, secara tidak sengaja membuat perbaikan, melakukan commit, lalu beralih kembali ke main — kehilangan perbaikan tersebut sepenuhnya karena tidak pernah terhubung ke branch.

Memulihkan Satu File dari Riwayat

Salah satu bentuk git checkout yang paling jarang digunakan adalah pemulihan file yang ditargetkan:

git checkout HEAD~3 -- src/config/database.php

Ini mengambil database.php seperti yang ada tiga commit yang lalu langsung ke index dan working directory Anda, tanpa menyentuh file lain atau memindahkan HEAD. Ini adalah padanan bedah dari peralihan branch penuh.

git revert: Undo yang Aman untuk Riwayat Bersama

git revert membuat commit baru yang menerapkan diff invers dari commit yang ditentukan. Commit asli tetap ada dalam riwayat tanpa tersentuh. Ini adalah satu-satunya mekanisme undo yang aman untuk commit yang sudah di-push ke branch remote bersama, karena tidak menulis ulang riwayat — melainkan memperpanjangnya.

Referensi Sintaks

git revert HEAD                  # Revert the most recent commit
git revert <commit_hash>         # Revert a specific commit by hash
git revert HEAD~3..HEAD          # Revert a range of commits (creates multiple revert commits)
git revert -n <commit_hash>      # Stage the revert without committing (--no-commit)

Flag –no-commit: Mengelompokkan Revert

Saat melakukan revert pada beberapa commit, membuat satu commit revert per commit asli dapat mengotori log. Flag -n (atau --no-commit) melakukan staging semua pembalikan tanpa melakukan commit, sehingga Anda dapat menggabungkannya menjadi satu commit revert:

git revert -n HEAD~4..HEAD
git commit -m "Revert: roll back broken authentication refactor"

Revert Merge Commit Memerlukan Perhatian Ekstra

Melakukan revert pada merge commit memerlukan penentuan parent mainline dengan flag -m, karena Git perlu mengetahui sisi mana dari merge yang harus diperlakukan sebagai riwayat "yang benar":

git revert -m 1 <merge_commit_hash>

Di sini, -m 1 menetapkan parent pertama (biasanya branch yang Anda merge ke dalamnya) sebagai mainline. Menghilangkan flag ini pada merge commit akan menyebabkan Git menampilkan error. Ini adalah hambatan umum saat melakukan revert pada merge rilis yang buruk dalam pipeline CI/CD.

Perbandingan Berdampingan: Reset vs. Checkout vs. Revert

Kriteria`git reset``git checkout``git revert`
Memodifikasi riwayat commitYaTidakTidak (menambahkan ke dalamnya)
Mempengaruhi working directoryDengan --hard atau --mixedYaYa (melalui commit baru)
Mempengaruhi staging area (index)Ya (kecuali --soft)Hanya dengan bentuk fileTidak
Aman pada branch bersama/remoteTidakYa (hanya baca)Ya
Membuat commit baruTidakTidakYa
Dapat dipulihkanSebagian (melalui ORIG_HEAD)YaYa
Menangani merge commitTidakYa (navigasi)Ya (dengan -m)
Padanan modern Git 2.23+Samagit switch / git restoreSama

Kapan Menggunakan Setiap Perintah: Matriks Keputusan

Gunakan git reset ketika:

  • Anda bekerja pada branch lokal yang belum di-push dan ingin membersihkan, menggabungkan, atau membuang commit.
  • Anda perlu membatalkan staging file sebelum commit.
  • Anda ingin membatalkan merge lokal yang belum dibagikan.
  • Anda adalah satu-satunya developer pada feature branch dan perlu menulis ulang riwayatnya sebelum membuka pull request.

Gunakan git checkout ketika:

  • Anda perlu beralih antar branch selama pengembangan aktif.
  • Anda ingin memeriksa state repositori pada commit historis tanpa mengubah apa pun.
  • Anda perlu memulihkan satu file ke statenya pada commit tertentu.
  • Anda membuat branch baru dari titik tertentu dalam riwayat.

Gunakan git revert ketika:

  • Sebuah commit sudah di-push ke branch remote atau bersama.
  • Anda bekerja dalam tim dan perlu mempertahankan riwayat yang transparan dan dapat diaudit.
  • Anda perlu membatalkan commit tertentu yang bukan yang terbaru (revert non-linear).
  • Proyek Anda memerlukan kepatuhan atau jejak audit di mana penghapusan riwayat dilarang.

Skenario Lanjutan: Memulihkan dari git reset –hard

Jika Anda secara tidak sengaja menjalankan git reset --hard dan kehilangan commit, commit tersebut tidak langsung hilang. Reflog Git mencatat setiap posisi yang pernah ditunjuk oleh HEAD, bahkan setelah hard reset:

git reflog
# Output example:
# a1b2c3d HEAD@{0}: reset: moving to HEAD~3
# 7e8f9a0 HEAD@{1}: commit: Add payment gateway integration
# ...

git reset --hard HEAD@{1}   # Restore to the commit before the accidental reset

Entri reflog kedaluwarsa setelah 90 hari secara default (gc.reflogExpire), sehingga jendela pemulihan ini tidak tak terbatas. Pada server produksi atau lingkungan VPS Hosting yang menjalankan layanan Git self-hosted seperti Gitea atau GitLab, Anda harus memastikan direktori .git Anda disertakan dalam rutinitas backup reguler justru karena kedaluwarsa ini.

Menghosting Infrastruktur Git Anda

Menjalankan server Git self-hosted — baik GitLab CE, Gitea, maupun Gogs — memerlukan I/O penyimpanan yang andal dan uptime yang konsisten. Satu pack file yang rusak atau push yang terputus selama siklus git gc dapat merusak integritas repositori. Untuk tim yang mengelola beberapa repositori, Dedicated Server menyediakan sumber daya yang terisolasi, akses root penuh untuk menyetel pengaturan core.packedGitWindowSize dan pack.threads Git, serta throughput NVMe yang dibutuhkan untuk monorepo besar.

Untuk tim kecil atau developer individu yang membutuhkan lingkungan Linux yang bersih untuk menjalankan Git hook, skrip CI, dan pipeline deployment, VPS dengan cPanel menawarkan control plane yang dikelola bersama akses SSH penuh — menghilangkan overhead administrasi server manual sambil tetap mempertahankan fleksibilitas untuk mengonfigurasi Git server-side hook dan kontrol akses.

Jika alur kerja Anda melibatkan deployment otomatis yang dipicu oleh git push, mengamankan server Anda dengan Sertifikat SSL yang valid adalah hal yang tidak bisa ditawar — baik untuk mengenkripsi payload webhook maupun untuk mengautentikasi remote Git berbasis HTTPS tanpa menonaktifkan verifikasi sertifikat.

Poin Teknis Utama

  • git reset --hard adalah satu-satunya perintah di antara ketiganya yang dapat menyebabkan kehilangan data permanen yang tidak dapat dipulihkan jika reflog telah kedaluwarsa.
  • git revert adalah satu-satunya perintah yang aman digunakan setelah git push tanpa memerlukan force-push.
  • State HEAD yang terlepas dari git checkout <hash> tidak menghapus commit — tetapi commit baru apa pun yang dibuat dalam state tersebut akan menjadi yatim piatu kecuali Anda segera menjalankan git checkout -b <new_branch>.
  • Flag -n pada git revert sangat penting untuk menjaga log tetap bersih saat melakukan rollback pada beberapa commit sekaligus.
  • Git 2.23+ membagi git checkout menjadi git switch dan git restore untuk kejelasan — memahami perintah asli membuat kedua alternatif modern tersebut langsung intuitif.
  • Selalu verifikasi branch Anda saat ini dengan git status dan git log --oneline -5 sebelum menjalankan operasi undo apa pun.
  • Pada infrastruktur bersama, terapkan aturan perlindungan branch (GitHub, GitLab, Gitea semuanya mendukung ini) untuk memblokir git push --force pada branch main dan release di tingkat server.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara git reset --soft dan git reset --mixed?

Keduanya memindahkan HEAD ke commit yang ditentukan, tetapi --soft membiarkan perubahan Anda tetap di-stage dalam index, sementara --mixed (default) juga menghapus index, membiarkan perubahan hanya di working directory. Keduanya tidak menyentuh file di disk.

Bisakah saya memulihkan commit setelah git reset --hard?

Ya, dalam jendela kedaluwarsa reflog (90 hari secara default). Jalankan git reflog untuk menemukan hash commit dari state yang hilang, lalu jalankan git reset --hard <hash> atau git checkout -b recovery <hash> untuk memulihkannya.

Mengapa git revert pada merge commit memerlukan flag -m?

Merge commit memiliki dua parent. Git tidak dapat menentukan diff parent mana yang harus diinvers tanpa Anda menentukan mainline. -m 1 memberi tahu Git untuk memperlakukan parent pertama sebagai trunk, melakukan revert pada perubahan yang diperkenalkan oleh branch yang di-merge.

Apakah git checkout -- <file> sama dengan git restore <file>?

Secara fungsional ya — keduanya membuang perubahan working directory yang tidak di-stage pada file dengan memulihkannya dari index. git restore diperkenalkan di Git 2.23 sebagai pengganti yang lebih tidak ambigu, tetapi git checkout -- <file> menghasilkan hasil yang identik pada semua versi Git.

Kapan saya benar-benar tidak boleh menggunakan git reset pada branch?

Jangan pernah menggunakan git reset (terutama dengan --hard atau --mixed) pada branch mana pun yang sudah di-clone atau di-pull oleh developer lain. Melakukan hal ini akan membuat riwayat lokal mereka berbeda dari remote, mengharuskan setiap kolaborator untuk melakukan forced reset atau re-clone — dan berisiko membuang commit secara diam-diam yang hanya ada di mesin mereka.

15%

Hemat 15% di Semua Layanan Hosting

Uji kemampuanmu dan dapatkan Diskon pada paket hosting apa saja

Gunakan kode:

Skills
Memulai