Permasalahan
Mengulang kembali apapun yang sudah dilakukan
Bayangkan kamu telah melakukan beberapa commit, tetapi kemudian kamu melakukan git reset --hard HEAD~2
dan kehilangan dua commit terakhir. Kamu dapat memulihkannya dengan cara berikut:
- Cek log reflog
git reflog
- Outputnya mungkin menunjukkan:
c4f2a27 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
a3d5b8e HEAD@{1}: commit: Menambahkan file README
- Kamu ingin mengembalikan commit a3d5b8e:
git reset --hard a3d5b8e
Untuk memulihkan, kamu dapat menggunakan
git reset HEAD@{index}
atau
git reset --hard HEAD@{index}
Apa perbedaannya?
git reset --hard HEAD@{1}
Jika kamu ingin benar-benar mengembalikan repository ke keadaan persis seperti commit HEAD@{1} dan membuang semua perubahan yang belum dikomit atau distage:
git reset --hard HEAD@{1}
git reset HEAD@{1}
Jika kamu ingin mengembalikan staging area ke commit HEAD@{1} tetapi tetap menjaga perubahan yang ada di working directory (misalnya untuk memeriksa atau menyimpan sementara perubahan yang ada):
git reset HEAD@{1}
Kesimpulan
git reset --hard
: Mengembalikan repository sepenuhnya ke commit yang ditentukan, termasuk staging area dan working directory.
git reset
: Mengembalikan commit yang ditentukan hanya untuk staging area, tidak mengubah working directory.
Memperbaiki commit terakhir
git add . # Atau menambahkan file individu
git commit --amend --no-edit
--amend
artinya merubah.--no-edit
artinya tanpa edit
Merubah tanpa edit? Tapi barusan kita mengedit isi commit sebelumnnya?
ammend ini adalah untuk commit message, bukan isinya. Masih belum paham?
Memperbaiki pesan commit terakhir
git commit --amend
Disini tanpa menggunakan --no-edit
, jadi hanya mengganti pesan commitnya saja. Sudah jelas kan?
Tanpa sengaja membuat commit di branch master, harusnya di branch baru
Pernah ga sih lupa checkout ke branch tetapi langsung ngoding di branch master(atau branch lainnya)? 🤣
Tenang, caranya gampang banget.
git reset HEAD~ –hard
- Pada branch master, buat dulu branch baru
git branch nama-branch-baru
- Reset master ke commit sebelumnya
git reset HEAD~ --hard
- Checkout ke branch yang benar
git branch nama-branch-baru
git rebase -i HEAD~n
Cara yang tadi berlaku jika hanya ada 1 commit yang di reset. Tapi kalo terlanjur banyak commit di master, gimana dong?
Langkah yang berbeda hanya pada step ke 2
- Drop commit yang ingin dihapus
git rebase -i HEAD~n # n adalah perkiraan berapa commit yang ingin di hapus
- Pada editor, cari commit mana yang ingin di hapus. Ubah
pick
kedrop
. Lalu simpan.
git cherry-pick commit-hash
Ada cara yang lebih simple dan lebih sering saya gunakan, cherry-pick
git cherry-pick commit-hash
Setelah melakukan cherry pick, dapat checkout kembali ke branch yang salah dan melalukan git reset HEAD~ --hard
atau git rebase -i HEAD~n
Catatan
Jika commit pada master sudah terlanjur di push, bagaimana?
Harus di force push 😢. Maka dari itu, branch master/main harus di guard agar tidak bisa commit langsung ya, hanya dapat di merge dari branch lain.
Untuk cara force push akan ada penjelasannya tersendiri.
Membatalkan commit yang lampau
git revert [saved hash]
Perbedaan revert dengan rebase -> drop
atau reset --hard
, revert membentuk commit baru. Jadi nanti kamu bisa revert commit yang me-revert commit 🤣
Jika ditengah proses rebase ingin membatalkan, gunakan git rebase --abort
Menyimpan state
git stash save "stash name"
Mirip ketika bermain game dan menyimpan save, pada saat ngoding kita dapat menyimpan state saat ini dan men-load kemudian
- stash stateJika tanpa nama custom
git stash save "nama custom" # nama stash opsional
sh git stash save
- List stash
git stash list
- Load stateJika tanpa
git stash apply stash@{n} # n: posisi stash yang didapatkan pada stash list
stash@{n}
Maka akan load stash trakhir. Perintah ini sama dengangit stash apply
git stash apply stash@{0}
Mengembalikan keadaan file pada keadaan sebelumnya
git checkout [hash] -- path/to/file
Membantu jika ingin mengembalikan kondisi file sesuai pada commit tertentu
Push Paksa (Force Push)
Penjelasan kali ini akan lebih panjang, karena merupakan tindakan yang berbahaya!
Force push (git push --force
) adalah tindakan untuk memaksa mengirimkan perubahan dari repository lokal ke repository remote, menggantikan riwayat commit yang ada di remote. Ini berguna ketika kamu perlu memperbarui riwayat commit di remote setelah melakukan perubahan seperti rebase
atau amend
.
Mengapa Force Push Berbahaya?
Force push bisa berbahaya karena:
- Menghapus riwayat commit di remote yang mungkin penting.
- Membuat commit rekan tim kamu hilang jika mereka juga bekerja pada branch yang sama.
- Menyebabkan konflik jika orang lain telah menggabungkan (merge) commit yang kamu ganti.
--force
Misalkan kamu telah mengubah riwayat commit di branch main
dengan melakukan rebase atau mengedit commit, dan kamu ingin memaksa mengupdate remote repository.
- Buat beberapa perubahan dan lakukan commit:
git commit --amend -m "Memperbaiki pesan commit"
- Push perubahan dengan force:
git push --force origin main
Dengan menggunakan --force
, kamu menggantikan riwayat commit yang ada di remote dengan riwayat commit baru dari repository lokal kamu.
--force-with-lease
--force-with-lease
adalah opsi yang lebih aman daripada --force
karena melakukan pemeriksaan tambahan sebelum melakukan push. Opsi ini memastikan bahwa kamu hanya akan memaksa push jika tidak ada orang lain yang telah melakukan push ke remote sejak kamu terakhir kali menarik (pull) perubahan.
Keuntungan Menggunakan --force-with-lease
- Mencegah kamu secara tidak sengaja menimpa commit orang lain.
- Memberikan peringatan jika terdapat perubahan di remote yang belum kamu tarik (pull).
Contoh Penggunaan --force-with-lease
Misalkan kamu melakukan perubahan di branch main
dan ingin memastikan tidak ada yang telah melakukan push ke remote sejak terakhir kali kamu menarik perubahan.
- Buat beberapa perubahan dan lakukan commit:
git commit --amend -m "Memperbaiki pesan commit"
- Push perubahan dengan
--force-with-lease
:git push --force-with-lease origin main
Jika tidak ada orang lain yang melakukan push ke branch main
di remote, perubahan kamu akan diterima. Namun, jika ada perubahan di remote yang belum kamu tarik, Git akan memberikan peringatan dan menghentikan push tersebut, mencegah potensi konflik.
Kesimpulan
Dengan menggunakan --force-with-lease
, kamu mendapatkan perlindungan tambahan dibandingkan --force
, sehingga lebih aman untuk digunakan dalam lingkungan kolaboratif. Selalu berhati-hati saat menggunakan force push untuk menghindari kehilangan riwayat commit yang penting.
Sumber Referensi
Peralatan
- Editor neovim
- Terminal direkam dengan asciinema
- Pemutar menggunakan asciinema-player
- Git interface tig