Last chance! 50% off DataCamp Premium
Sale ends in
Perintah git reset adalah salah satu alat terkuat di Git untuk mengendalikan status repositori Anda. Perintah ini memungkinkan pengembang menyesuaikan commit mana yang ditunjuk oleh sebuah branch, menentukan apa yang tetap distage untuk commit berikutnya, dan bahkan menulis ulang riwayat lokal sebelum melakukan push.
Panduan ini berfokus khusus pada git reset HEAD, variasi serbaguna yang digunakan untuk membatalkan staging file dan mengelola riwayat commit.
Sepanjang panduan ini, kita akan membahas perintah tersebut secara mendalam, berbagai modenya, dan bagaimana perintah ini dibandingkan dengan perintah lain yang sering membingungkan seperti git revert dan git clean.
Dasar-dasar Git Reset HEAD
Sebelum mempelajari cara menerapkan git reset HEAD, mari pahami konsep dasar yang menentukan perilakunya.
Git mengelola data di tiga area konseptual:
Ketiga pohon ini berinteraksi terus-menerus saat bekerja dengan Git untuk mengelola riwayat versi.
Sebagai contoh, ketika Anda menjalankan git add, Anda memindahkan perubahan dari direktori kerja ke area staging. Saat Anda commit, Git mengambil snapshot dari area staging dan mencatatnya di riwayat commit.
Perintah git reset mengubah penunjuk branch saat ini ke commit tertentu, dengan HEAD ikut berpindah. Saat dalam keadaan detached HEAD, perintah ini menggeser HEAD secara langsung. Bergantung pada mode yang digunakan, git reset juga memperbarui indeks dan dapat memodifikasi direktori kerja. Hal ini menjadikannya alat penting untuk mengelola kontrol versi secara presisi.
Pointer HEAD adalah cara Git melacak posisi Anda saat ini dalam riwayat commit. Biasanya, HEAD menunjuk ke commit terbaru dari branch yang Anda checkout.
Namun, pointer ini juga dapat menunjuk langsung ke sebuah commit jika Anda berada dalam keadaan “detached HEAD”. Memahami pointer ini penting, karena git reset bekerja dengan memindahkan HEAD (dan berpotensi referensi branch) ke commit baru.
Sementara pointer branch dan hash commit memberikan referensi statis ke commit, HEAD bersifat dinamis dan berpindah saat Anda menavigasi riwayat atau beralih branch.
Mengenali perbedaan ini membantu menghindari kebingungan saat melakukan reset.
Git menyediakan notasi singkat untuk berpindah relatif terhadap HEAD:
HEAD^ → parent (pertama) langsung dari commit saat iniHEAD~2 → commit kakek (dua langkah ke belakang)Notasi singkat ini memungkinkan navigasi cepat tanpa perlu hash commit lengkap. Sementara branch dan tag juga dapat mereferensikan commit, HEAD memastikan perintah seperti reset atau checkout mengetahui posisi Anda saat ini.
Kiat tentang parent: HEAD~N mengikuti rantai first-parent sebanyak N langkah. ^ memilih parent; pada commit merge Anda dapat menentukan yang mana, misalnya, HEAD^1, HEAD^2.
Menjelajahi Mode git reset HEAD: Soft, Mixed, Hard
git reset memiliki tiga mode, masing-masing menentukan sejauh mana reset memengaruhi repositori Anda. Setiap mode menghasilkan hasil yang berbeda, jadi Anda perlu memahami cara kerja masing-masing untuk menggunakannya dengan tepat.
git reset --soft HEAD^
Pertama, ada mode soft reset. Dengan git reset --soft <target>, Git memindahkan pointer branch ke belakang (atau ke commit target) tetapi menyimpan semua perubahan tetap distage di indeks.
Ini sangat berguna ketika:
Perintah ini membiarkan area staging tetap utuh, sehingga Anda dapat langsung commit ulang dengan pesan yang lebih baik atau seleksi yang lebih rapi.
git reset --mixed HEAD^
Selanjutnya, ada mode mixed reset, yang merupakan mode default. git reset --mixed <target> memindahkan pointer branch dan mereset area staging agar sesuai dengan commit target, sambil mempertahankan perubahan di direktori kerja.
Ini memungkinkan Anda menata ulang commit dengan memecah satu commit besar menjadi beberapa commit kecil yang lebih logis. Setelah reset, Anda dapat men-stage file secara selektif dan melakukan commit ulang dengan lebih teratur.
git reset --hard HEAD^
Terakhir, ada mode hard reset yang memundurkan perubahan pada file yang dilacak. git reset --hard <target> adalah opsi paling kuat dan berbahaya. Perintah ini mereset pointer branch, indeks, dan direktori kerja agar persis cocok dengan commit target. Ini membuang semua perubahan yang belum di-commit pada file yang dilacak di indeks dan direktori kerja Anda. File yang tidak dilacak tidak dihapus (gunakan git clean untuk itu).
Meskipun berguna saat Anda ingin benar-benar memulai ulang, mode ini membawa risiko besar, terutama di lingkungan tim, karena secara permanen menghapus perubahan yang tidak terekam dalam commit.
Mari pahami lebih baik dengan melihat sintaks perintahnya.
Bentuk umum perintah git reset adalah:
git reset [--soft | --mixed | --hard] <target>
Mode menentukan seberapa banyak status repositori Anda terpengaruh, dan target mendefinisikan commit tujuan reset. Jika mode diabaikan, default-nya adalah --mixed.
Commit dapat direferensikan menggunakan notasi yang berbeda:
HEAD^ atau HEAD~3git reset 4a5d9c2)Untuk keamanan, git reflog dapat digunakan untuk mengidentifikasi pergerakan HEAD terbaru dan memulihkan commit yang terbuang secara tidak sengaja.
Anda juga dapat memperbarui area staging hanya untuk file tertentu, sambil membiarkan salinan kerja tidak berubah.
Berikut sintaks untuk operasi tersebut:
git reset HEAD -- <file>
Perintah ini umum digunakan untuk “mengeluarkan” file yang tidak sengaja ditambahkan ke indeks.
Sebagai alternatif, Git modern juga menawarkan git restore --staged <file> sebagai opsi yang lebih deskriptif. Reset khusus file ideal saat Anda ingin memperhalus apa saja yang akan masuk ke commit berikutnya tanpa kehilangan editan Anda.
Untuk informasi lebih lanjut tentang perintah Git, lihat Git Cheat Sheet kami di bawah ini.

Perintah reset ini memiliki banyak kegunaan dalam kontrol versi. Berikut beberapa use case praktis:
Pengembang sering kali commit terlalu dini atau dengan perubahan yang belum lengkap.
git reset --soft HEAD^ memungkinkan Anda membatalkan commit terakhir sambil menjaga semuanya tetap distage, sehingga Anda dapat commit ulang dengan benar tanpa memundurkan semua perubahan dari nol.
Sebagai alternatif, git reset HEAD^ membatalkan commit sambil membiarkan perubahan tidak distage untuk pen-staging ulang yang lebih granular.
Terkadang commit berisi terlalu banyak perubahan yang tidak terkait. Mixed reset memungkinkan Anda memundurkan sebuah commit sambil menjaga perubahan tetap ada di direktori kerja.
Dari sana, Anda dapat membuat beberapa commit yang lebih kecil yang lebih mencerminkan evolusi proyek. Demikian pula, jika Anda melakukan merge terlalu cepat, reset memberi kesempatan untuk merapikan riwayat sebelum membagikannya.
Membatalkan staging file tertentu dengan git reset HEAD -- <file> memastikan hanya file yang relevan yang di-commit bersama. Ini mendukung commit atomik, yang lebih mudah dipahami dan ditinjau.
Misalnya, jika Anda memperbaiki bug dan juga memperbarui dokumentasi, membatalkan staging salah satu set perubahan memastikan setiap commit memiliki tujuan tunggal yang jelas.
Ketika branch lokal Anda sangat berbeda dari remote, hard reset ke branch remote (misalnya, git reset --hard origin/main) memaksa penyelarasan.
Ini bisa berguna untuk membuang perubahan eksperimental lokal, tetapi harus dilakukan dengan hati-hati karena secara permanen membuang modifikasi lokal.
Riwayat remote: git reset bersifat lokal. Untuk mencerminkan riwayat yang ditulis ulang di remote, gunakan git push --force-with-lease dan koordinasikan dengan tim Anda agar tidak menimpa pekerjaan mereka.
Karena git reset dapat membuang perubahan di indeks dan direktori kerja Anda, ada beberapa aspek keselamatan dan risiko yang perlu dipertimbangkan.
Meskipun reset dapat merapikan riwayat, perintah ini juga dapat menghancurkan pekerjaan.
Menggunakan git reset HEAD tanpa flag tambahan akan menggunakan mode mixed secara default. Ini akan membatalkan staging perubahan yang saat ini distage (perubahan tetap ada di direktori kerja Anda). Meskipun perubahan tetap ada di direktori kerja, perubahan tersebut tidak lagi ditandai untuk commit berikutnya.
Perubahan yang belum di-commit menjadi tidak distage; modifikasi file Anda tetap ada di disk. Jika Anda membuat modifikasi pada file yang sebelumnya distage, git reset HEAD akan mengembalikan area staging agar sesuai dengan commit HEAD, sehingga secara efektif membatalkan staging perubahan tersebut.
Sebelum melakukan reset, Anda harus memeriksa status repositori untuk memastikan semua file sudah sesuai.
Untuk melakukannya, ikuti langkah-langkah berikut:
git status untuk memastikan file mana yang distage atau dimodifikasi.git log atau git reflog untuk memahami ke mana HEAD saat ini menunjuk.git diff untuk memastikan apa yang mungkin hilang.Langkah-langkah ini meminimalkan kejutan dan memastikan Anda melakukan reset dengan sengaja.
Selalu buat cadangan sebelum operasi berisiko seperti perubahan besar pada kode.
Berikut beberapa strategi yang dapat Anda gunakan:
git stash push -m "backup".git branch savepoint untuk mempertahankan riwayat saat ini.Langkah-langkah ini membuat reset terasa kurang menakutkan dan memberi Anda kepercayaan diri untuk bereksperimen dengan aman.
Jika perintah Git yang salah digunakan, ada beberapa cara untuk melakukan pemulihan.
git reflog mencatat setiap pergerakan HEAD, menjadikannya penyelamat setelah reset tanpa sengaja. Jika Anda kehilangan jejak sebuah commit, cukup jalankan:
git reflog
git reset --hard <commit-id>
Ini memungkinkan Anda memulihkan pekerjaan yang terbuang selama commit belum dihapus oleh garbage collection.
Selain reflog, Anda dapat mengandalkan stash dan branch cadangan. Stash menangkap pekerjaan yang belum di-commit, sementara branch mempertahankan seluruh riwayat commit. Dalam lingkungan kolaboratif, Anda sering dapat pulih dari kesalahan dengan mengambil state yang benar dari repositori remote.
Perintah git reset HEAD juga dapat digunakan untuk melakukan operasi yang lebih lanjut.
Mengombinasikan git add --patch dengan reset tingkat file memberi Anda kontrol maksimal atas apa yang masuk ke setiap commit. Alur kerja ini memastikan commit bersifat atomik dan fokus, yang meningkatkan keterbacaan dan mengurangi kemungkinan memasukkan perubahan yang tidak terkait.
Jika Anda menemukan salah ketik atau perlu memberikan pesan commit yang lebih jelas, soft reset memungkinkan Anda menulis ulang commit tanpa mengubah kode. Ini adalah cara yang bersih untuk menjaga riwayat tetap bermakna.
Reset juga dapat digunakan secara strategis sebelum melakukan merge untuk merapikan riwayat commit. Pengembang sering menggunakan reset untuk menyatukan atau menata ulang commit sehingga branch menampilkan riwayat yang lebih rapi saat diintegrasikan ke mainline.
Dalam tim, kesepakatan yang jelas sangat penting. Hindari mereset branch bersama, dan komunikasikan dengan orang lain saat force-push diperlukan.
Mengikuti protokol ini mencegah kebingungan dan riwayat yang rusak di repositori bersama.
Perintah Terkait dan Alat Tambahan
Perintah Git umumnya digunakan bersamaan satu sama lain. Berikut beberapa perintah terkait yang bekerja mirip dengan git reset HEAD.
git clean untuk menghapus file yang tidak dilacakTerkadang, file yang tidak dilacak menumpuk di direktori kerja Anda. git clean menghapusnya, tetapi gunakan dengan hati-hati—tindakan ini tidak dapat dibatalkan. Jalankan git clean -n untuk uji coba sebelum benar-benar menghapus file. Dikombinasikan dengan git reset, ini dapat mengembalikan repositori ke keadaan bersih.
git revert untuk riwayat publikSaat bekerja pada repositori bersama, Anda dapat mempertimbangkan menggunakan git revert daripada git reset untuk membatalkan commit. git revert membuat commit baru yang meniadakan perubahan commit sebelumnya, menjaga integritas riwayat. Sebaliknya, git reset menulis ulang riwayat, yang dapat mengganggu rekan satu tim.
Perbandingan cepat:
reset → menulis ulang riwayat.revert → membuat commit baru yang membatalkan commit sebelumnya.restore → menyesuaikan file kerja tanpa mengubah riwayat.Kesimpulan
Menggunakan git reset HEAD membekali pengembang dengan kontrol terperinci atas status repositori mereka. Meskipun kuat, perintah ini harus digunakan dengan hati-hati, terutama dalam lingkungan kolaboratif di mana penulisan ulang riwayat dapat menyebabkan konflik.
Fungsi dasar ini menyediakan banyak kemungkinan dalam bekerja dengan repositori dan memundurkan perubahan yang tidak diinginkan. Jika Anda ingin mempelajari lebih lanjut tentang Git, lihat GitHub Foundations skill track kami atau kursus Foundations of Git.
Gunakan git reset --hard secara hemat, karena perintah ini secara permanen membuang perubahan di area staging dan direktori kerja Anda. Selalu pastikan perubahan yang belum di-commit tidak Anda perlukan sebelum menghapusnya. Lakukan commit atau stash pekerjaan Anda sebelum menjalankan perintah, agar Anda memiliki cadangan jika reset dilakukan terlalu agresif.
Pemulihan bergantung pada apakah commit direferensikan di tempat lain. Reflog Git sering kali dapat membantu: menjalankan git reflog menampilkan riwayat posisi HEAD terbaru, dan Anda dapat menggunakan git checkout atau git reset untuk kembali ke commit yang hilang. Namun, jika Anda tidak melakukan commit sebelum reset, pekerjaan yang belum di-commit biasanya tidak dapat dipulihkan.
--soft memindahkan HEAD ke commit baru tetapi menjaga semua perubahan tetap distage. --mixed (default) memindahkan HEAD dan membersihkan area staging, tetapi membiarkan direktori kerja tidak tersentuh. --hard memindahkan HEAD, membersihkan area staging, dan menimpa direktori kerja, menghapus seluruh perubahan yang belum di-commit.
git reset --hard menghapus perubahan yang belum di-commit. Modifikasi apa pun di direktori kerja atau area staging Anda yang belum di-commit akan hilang saat Anda menjalankan git reset --hard.
Tidak. git reset --hard hanya memengaruhi repositori lokal Anda. Untuk mengubah branch remote, Anda perlu melakukan push perubahan lokal menggunakan force push (git push --force), yang dapat menulis ulang riwayat untuk semua orang yang bekerja pada branch tersebut. Ini hanya boleh dilakukan dengan komunikasi yang jelas kepada tim Anda, karena dapat mengganggu kolaborasi.
Saya Austin, seorang blogger dan penulis teknologi dengan pengalaman bertahun-tahun sebagai data scientist dan analis data di bidang kesehatan. Memulai perjalanan teknologi dengan latar belakang biologi, kini saya membantu orang lain melakukan transisi yang sama melalui blog teknologi saya. Ketertarikan saya pada teknologi mendorong kontribusi tulisan saya untuk puluhan perusahaan SaaS, menginspirasi orang lain dan membagikan pengalaman saya.
Kursus Teratas di DataCamp
{count, plural, one {Program} other {Program}}
{count, plural, one {Kursus} other {Kursus}}
{count, plural, one {Kursus} other {Kursus}}
{count, plural, one {blog} other {blogs}}
David Woods
13 mnt
{count, plural, one {blog} other {blogs}}
Hugo Bowne-Anderson
13 mnt

{count, plural, one {blog} other {blogs}}
Javier Canales Luna
14 mnt
{count, plural, one {blog} other {blogs}}
Dario Radečić
15 mnt