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:

  1. Cek log reflog
git reflog
  1. Outputnya mungkin menunjukkan:
c4f2a27 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
a3d5b8e HEAD@{1}: commit: Menambahkan file README
  1. 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

  1. Pada branch master, buat dulu branch baru
    git branch nama-branch-baru
    
  2. Reset master ke commit sebelumnya
    git reset HEAD~ --hard
    
  3. 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

  1. Drop commit yang ingin dihapus
    git rebase -i HEAD~n # n adalah perkiraan berapa commit yang ingin di hapus
    
  2. Pada editor, cari commit mana yang ingin di hapus. Ubah pick ke drop. 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

  1. stash state
    git stash save "nama custom" # nama stash opsional
    
    Jika tanpa nama custom sh git stash save
  2. List stash
    git stash list
    
  3. Load state
    git stash apply stash@{n} # n: posisi stash yang didapatkan pada stash list
    
    Jika tanpa stash@{n}
    git stash apply
    
    Maka akan load stash trakhir. Perintah ini sama dengan 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.

  1. Buat beberapa perubahan dan lakukan commit:
    git commit --amend -m "Memperbaiki pesan commit"
    
  2. 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.

  1. Buat beberapa perubahan dan lakukan commit:
    git commit --amend -m "Memperbaiki pesan commit"
    
  2. 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