GIT

# Git Cheat Sheet

Git 5 / 5
18 min read
Table of Contents

Ini adalah Git Cheat Sheet berisi perintah-perintah Git yang sering digunakan, mulai dari operasi dasar sampai recovery, undo commit, menghapus commit tertentu dari history, rebase, stash, dan berbagai perintah yang berguna saat terjadi kesalahan.

Catatan: Perintah seperti reset --hard, rebase, dan force push dapat menghapus atau menulis ulang history. Pastikan memahami efeknya sebelum digunakan pada branch yang sudah digunakan orang lain.

Sebelum melakukan operasi berisiko, backup branch terlebih dahulu:

Terminal window
git branch backup-before-rewrite

1. Setup dan Konfigurasi Git

Mengatur nama dan email

Terminal window
git config --global user.name "Nama"
git config --global user.email "[email protected]"

Cek konfigurasi

Terminal window
git config --list

Cek konfigurasi tertentu

Terminal window
git config user.name
git config user.email

Mengatur konfigurasi hanya untuk repository saat ini

Terminal window
git config user.name "Nama"
git config user.email "[email protected]"

Mengatur editor default

Contoh menggunakan VS Code:

Terminal window
git config --global core.editor "code --wait"

2. Inisialisasi dan Clone Repository

Membuat repository baru

Terminal window
git init

Clone repository

Terminal window
git clone https://github.com/username/repository.git

Clone ke nama directory tertentu

Terminal window
git clone https://github.com/username/repository.git nama-folder

Clone hanya branch tertentu

Terminal window
git clone --branch <branch> --single-branch <repository-url>

3. Status dan Informasi Repository

Cek status

Terminal window
git status

Versi lebih singkat:

Terminal window
git status -s

Melihat remote

Terminal window
git remote -v

Informasi remote tertentu

Terminal window
git remote show origin

Melihat branch aktif

Terminal window
git branch --show-current

Melihat root directory repository

Terminal window
git rev-parse --show-toplevel

4. Menambahkan File ke Staging Area

Menambahkan file tertentu

Terminal window
git add <file>

Menambahkan beberapa file

Terminal window
git add file1 file2 file3

Menambahkan semua perubahan

Terminal window
git add .

atau:

Terminal window
git add -A

Menambahkan hanya file tracked yang berubah atau dihapus

Terminal window
git add -u

Memilih perubahan secara interaktif

Sangat berguna jika satu file memiliki beberapa perubahan tetapi hanya sebagian yang ingin di-commit.

Terminal window
git add -p

5. Menghapus File dari Git

Menghapus file dari Git dan filesystem

Terminal window
git rm <file>

Menghapus directory

Terminal window
git rm -r <directory>

Berhenti tracking file tetapi mempertahankan file lokal

Terminal window
git rm --cached <file>

Contoh umum ketika .env tidak sengaja di-track:

Terminal window
git rm --cached .env

Kemudian masukkan ke .gitignore.

Berhenti tracking directory tetapi mempertahankan directory lokal

Terminal window
git rm --cached -r <directory>

6. Commit

Membuat commit

Terminal window
git commit -m "Pesan commit"

Membuka editor untuk pesan commit

Terminal window
git commit

Commit semua perubahan file yang sudah tracked

Terminal window
git commit -am "Pesan commit"

-a tidak memasukkan file baru/untracked secara otomatis.

Mengubah pesan commit terakhir

Terminal window
git commit --amend

Atau langsung:

Terminal window
git commit --amend -m "Pesan commit baru"

Menambahkan file yang lupa dimasukkan ke commit terakhir

Terminal window
git add <file>
git commit --amend --no-edit

--no-edit mempertahankan pesan commit sebelumnya.

--amend membuat commit baru dengan hash baru. Hindari menggunakannya pada commit yang sudah dipush dan digunakan orang lain kecuali memang ingin rewrite history.


7. Melihat Riwayat Commit

Riwayat lengkap

Terminal window
git log

Riwayat ringkas

Terminal window
git log --oneline

Riwayat dengan graph branch

Terminal window
git log --oneline --graph --decorate --all

Ini adalah salah satu command paling berguna untuk memahami history repository.

Melihat beberapa commit terakhir

Terminal window
git log --oneline -10

Melihat commit tertentu

Terminal window
git show <commit-id>

Melihat perubahan sebuah file sepanjang history

Terminal window
git log -- <file>

Melihat siapa yang terakhir mengubah setiap baris

Terminal window
git blame <file>

8. Git Diff

Melihat perubahan yang belum di-stage

Terminal window
git diff

Melihat perubahan yang sudah di-stage

Terminal window
git diff --staged

atau:

Terminal window
git diff --cached

Melihat seluruh perubahan terhadap commit terakhir

Terminal window
git diff HEAD

Membandingkan dua commit

Terminal window
git diff <commit-a> <commit-b>

Membandingkan dua branch

Terminal window
git diff <branch-a>..<branch-b>

Melihat hanya nama file yang berubah

Terminal window
git diff --name-only

9. Branch

Melihat branch lokal

Terminal window
git branch

Melihat local dan remote branch

Terminal window
git branch -a

Membuat branch

Terminal window
git branch <nama-branch>

Membuat sekaligus berpindah ke branch baru

Direkomendasikan pada Git modern:

Terminal window
git switch -c <nama-branch>

Bentuk lama yang masih umum:

Terminal window
git checkout -b <nama-branch>

Berpindah branch

Terminal window
git switch <nama-branch>

Kembali ke branch sebelumnya

Terminal window
git switch -

Rename branch saat ini

Terminal window
git branch -m <nama-baru>

Menghapus branch yang sudah di-merge

Terminal window
git branch -d <nama-branch>

Force delete branch

Terminal window
git branch -D <nama-branch>

-D dapat menghapus branch walaupun commit di dalamnya belum di-merge.


10. Merge dan Rebase

Merge branch ke branch saat ini

Terminal window
git merge <nama-branch>

Contoh:

Terminal window
git switch main
git merge feature/login

Batalkan merge yang sedang mengalami conflict

Terminal window
git merge --abort

Rebase branch saat ini

Terminal window
git rebase <nama-branch>

Contoh:

Terminal window
git switch feature/login
git rebase main

Lanjutkan rebase setelah conflict selesai

Terminal window
git add <file>
git rebase --continue

Batalkan rebase

Terminal window
git rebase --abort

11. Interactive Rebase

Interactive rebase sangat berguna untuk memperbaiki history sebelum dipush.

Edit beberapa commit terakhir

Contoh 5 commit terakhir:

Terminal window
git rebase -i HEAD~5

Git akan membuka daftar seperti:

pick a1b2c3d add login
pick b2c3d4e fix login
pick c3d4e5f update README

Beberapa operasi penting:

pick = pertahankan commit
reword = ubah pesan commit
edit = ubah isi commit
squash = gabungkan dengan commit sebelumnya dan edit pesan
fixup = gabungkan dengan commit sebelumnya tanpa mempertahankan pesan
drop = hapus commit

Batalkan interactive rebase

Terminal window
git rebase --abort

Lanjutkan setelah melakukan perubahan

Terminal window
git rebase --continue

12. Remote Repository

Menambahkan remote

Terminal window
git remote add origin https://github.com/username/repository.git

Mengubah URL remote

Terminal window
git remote set-url origin <repository-url>

Fetch perubahan dari remote

Terminal window
git fetch origin

Fetch sekaligus membersihkan remote branch yang sudah dihapus

Terminal window
git fetch --prune

Pull

Terminal window
git pull origin <branch>

Pull menggunakan rebase

Terminal window
git pull --rebase origin <branch>

Push

Terminal window
git push origin <branch>

Push sekaligus mengatur upstream

Biasanya digunakan saat push branch baru pertama kali.

Terminal window
git push -u origin <branch>

Setelah itu cukup:

Terminal window
git push

dan:

Terminal window
git pull

Menghapus branch di remote

Terminal window
git push origin --delete <branch>

13. Stash

Stash digunakan untuk menyimpan perubahan sementara tanpa membuat commit.

Simpan perubahan

Terminal window
git stash

Lebih baik menggunakan pesan:

Terminal window
git stash push -m "WIP login page"

Ikut stash file untracked

Terminal window
git stash -u

Melihat daftar stash

Terminal window
git stash list

Melihat isi stash

Terminal window
git stash show -p

Mengambil stash terakhir sekaligus menghapusnya dari daftar

Terminal window
git stash pop

Mengambil stash tanpa menghapusnya

Terminal window
git stash apply

Mengambil stash tertentu

Terminal window
git stash apply stash@{1}

Menghapus stash tertentu

Terminal window
git stash drop stash@{1}

Menghapus seluruh stash

Terminal window
git stash clear

Membuat branch dari stash

Sangat berguna jika perubahan stash ternyata cukup besar dan ingin dilanjutkan sebagai branch sendiri.

Terminal window
git stash branch <nama-branch> stash@{0}

14. Membatalkan Perubahan File yang Belum Di-commit

Membuang perubahan pada satu file

Terminal window
git restore <file>

Membuang semua perubahan tracked di working directory

Terminal window
git restore .

Perubahan yang dibuang dengan cara ini biasanya tidak mudah dikembalikan.

Mengeluarkan file dari staging tetapi mempertahankan perubahan

Terminal window
git restore --staged <file>

Mengeluarkan semua file dari staging

Terminal window
git restore --staged .

Bentuk lama yang juga sering ditemui:

Terminal window
git reset <file>

Mengembalikan file ke versi commit tertentu

Terminal window
git restore --source=<commit-id> <file>

Contoh:

Terminal window
git restore --source=HEAD~1 package.json

15. Membatalkan Commit Terakhir Tanpa Menghapus Perubahan

Ini salah satu kasus yang paling sering dibutuhkan.

Batalkan commit terakhir tetapi perubahan tetap staged

Terminal window
git reset --soft HEAD~1

Sebelum:

A -- B -- C <-- HEAD

Setelah:

A -- B <-- HEAD

Isi perubahan dari C masih berada di staging area.

Cocok jika:

  • Salah membuat commit.
  • Ingin mengubah isi commit.
  • Ingin memecah commit menjadi beberapa commit.
  • Ingin menggabungkan ulang commit.

Batalkan commit terakhir dan keluarkan perubahan dari staging

Terminal window
git reset HEAD~1

atau eksplisit:

Terminal window
git reset --mixed HEAD~1

Perubahan file tetap ada, tetapi tidak lagi staged.

Batalkan beberapa commit tetapi pertahankan semua perubahan

Contoh membatalkan 3 commit:

Terminal window
git reset --soft HEAD~3

16. Menghapus Commit Terakhir dan Perubahannya

Jika benar-benar ingin menghilangkan commit terakhir sekaligus perubahan file:

Terminal window
git reset --hard HEAD~1

Untuk dua commit:

Terminal window
git reset --hard HEAD~2

HATI-HATI: --hard membuang perubahan tracked di working tree dan staging area.

Sebelum menjalankannya, sebaiknya cek:

Terminal window
git status
git log --oneline -5

17. Membatalkan Commit yang Sudah Di-push dengan Aman

Jika commit sudah berada di remote dan digunakan orang lain, hindari reset + force push jika tidak benar-benar diperlukan.

Gunakan:

Terminal window
git revert <commit-id>

git revert tidak menghapus commit lama. Git membuat commit baru yang membalik efek commit tersebut.

Contoh:

A -- B -- C -- D
^
commit bermasalah

Setelah:

Terminal window
git revert C

History menjadi:

A -- B -- C -- D -- E
^
membalik perubahan C

Revert tanpa langsung membuat commit

Terminal window
git revert --no-commit <commit-id>

Kemudian periksa dan commit sendiri:

Terminal window
git status
git diff
git commit -m "Revert perubahan tertentu"

Revert merge commit

Terminal window
git revert -m 1 <merge-commit-id>

Gunakan dengan hati-hati karena -m menentukan parent utama dari merge.


18. Menghapus Commit Tertentu dari History

Misalnya history:

A -- B -- C -- D -- E
^
ingin dihapus

Jika C ingin dihapus tetapi D dan E tetap dipertahankan, gunakan interactive rebase.

Cara 1: Berdasarkan jumlah commit

Terminal window
git rebase -i HEAD~4

Akan muncul:

pick <hash-B> commit B
pick <hash-C> commit C
pick <hash-D> commit D
pick <hash-E> commit E

Ubah commit yang ingin dihapus menjadi:

pick <hash-B> commit B
drop <hash-C> commit C
pick <hash-D> commit D
pick <hash-E> commit E

Simpan dan tutup editor.

Cara 2: Langsung mulai dari parent commit target

Terminal window
git rebase -i <commit-id>^

Kemudian ubah:

pick <commit-id> ...

menjadi:

drop <commit-id> ...

Menghapus root commit

Jika commit yang ingin diedit berada sejak awal repository:

Terminal window
git rebase -i --root

Jika terjadi conflict

Selesaikan conflict kemudian:

Terminal window
git add .
git rebase --continue

Atau batalkan:

Terminal window
git rebase --abort

Cara ini paling mudah digunakan pada history linear. Rebase pada history merge yang kompleks perlu dilakukan lebih hati-hati.


19. Setelah Menghapus atau Mengubah Commit yang Sudah Di-push

Rebase, amend, dan reset dapat mengubah commit hash.

Jika history lama sudah dipush, push biasa kemungkinan ditolak:

Terminal window
git push

Jika memang yakin ingin mengganti history remote:

Terminal window
git push --force-with-lease origin <branch>

Contoh:

Terminal window
git push --force-with-lease origin main

Gunakan --force-with-lease daripada:

Terminal window
git push --force

karena --force-with-lease memiliki perlindungan tambahan agar tidak sembarangan menimpa update remote yang tidak sesuai dengan kondisi yang diharapkan.

Jangan rewrite history branch bersama seperti main tanpa koordinasi dengan anggota tim.


20. Apakah Commit yang Di-drop Benar-benar Hilang Permanen?

Tidak selalu langsung.

Setelah:

Terminal window
git rebase -i

atau:

Terminal window
git reset --hard

commit mungkin sudah tidak terlihat di history branch, tetapi masih dapat tersimpan sementara di Git object database dan reflog.

Artinya, istilah yang lebih tepat adalah:

menghapus commit dari history branch

bukan menjamin semua salinan commit tersebut langsung hilang secara fisik.

Hal ini justru berguna apabila ternyata commit terhapus secara tidak sengaja.


21. Mengembalikan Commit yang Tidak Sengaja Hilang

Salah satu command penyelamat terpenting di Git:

Terminal window
git reflog

Contoh:

f123abc HEAD@{0}: rebase finished
8ab456d HEAD@{1}: reset: moving to HEAD~2
713ac11 HEAD@{2}: commit: important feature

Jika commit yang hilang adalah:

713ac11

buat branch recovery:

Terminal window
git switch -c recovery 713ac11

Ini lebih aman daripada langsung melakukan reset.

Setelah memastikan commit benar, Anda dapat menggabungkan atau cherry-pick kembali perubahan tersebut.


22. Menghapus File Rahasia dari Seluruh Git History

Jika password, API key, private key, .env, atau secret sudah pernah masuk repository, sekadar:

Terminal window
git rm <file>

atau:

Terminal window
git revert <commit>

tidak menghilangkan secret dari commit sebelumnya.

Untuk rewrite seluruh history, salah satu tool yang direkomendasikan adalah git-filter-repo.

Contoh menghapus file tertentu dari history:

Terminal window
git filter-repo --invert-paths --path path/to/secret-file

Untuk kasus sensitive data pada versi git-filter-repo terbaru dapat digunakan:

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path path/to/secret-file

git-filter-repo adalah tool terpisah dan mungkin perlu di-install terlebih dahulu.

Jika secret sudah ter-push, rotate/revoke secret tersebut terlebih dahulu. Menghapus history saja tidak menjamin secret belum pernah disalin, di-cache, atau digunakan orang lain.

Rewrite sensitive data juga membutuhkan koordinasi dengan seluruh collaborator karena clone atau fork lama dapat membawa history tersebut kembali.


23. Cherry-pick

Cherry-pick digunakan untuk mengambil commit tertentu dari branch lain.

Terminal window
git cherry-pick <commit-id>

Contoh:

Terminal window
git switch main
git cherry-pick a1b2c3d

Cherry-pick beberapa commit

Terminal window
git cherry-pick <commit-a> <commit-b>

Cherry-pick perubahan tanpa langsung commit

Terminal window
git cherry-pick --no-commit <commit-id>

Jika terjadi conflict

Selesaikan conflict kemudian:

Terminal window
git add .
git cherry-pick --continue

Batalkan cherry-pick

Terminal window
git cherry-pick --abort

24. Commit Tidak Sengaja Dibuat di Branch yang Salah

Misalnya commit dibuat di main, padahal seharusnya berada di feature/login.

Cari hash:

Terminal window
git log --oneline -5

Misalnya commit:

abc1234 add login page

Pindah ke branch yang benar:

Terminal window
git switch feature/login

Ambil commit tersebut:

Terminal window
git cherry-pick abc1234

Kembali ke branch yang salah:

Terminal window
git switch main

Jika commit belum dipush:

Terminal window
git reset --hard HEAD~1

Jika sudah dipush dan branch digunakan bersama, biasanya lebih aman menggunakan:

Terminal window
git revert abc1234

25. Membersihkan File Untracked

Lihat apa yang akan dihapus terlebih dahulu

Terminal window
git clean -n

Untuk file dan directory:

Terminal window
git clean -nd

Hapus file untracked

Terminal window
git clean -f

Hapus file dan directory untracked

Terminal window
git clean -fd

Jalankan git clean -n terlebih dahulu. File untracked yang dihapus mungkin tidak bisa dipulihkan melalui Git karena belum pernah masuk repository.


26. Reset Local Branch Agar Sama Persis dengan Remote

Misalnya local main sudah kacau dan ingin dibuat sama persis dengan origin/main.

Pertama:

Terminal window
git fetch origin

Kemudian:

Terminal window
git reset --hard origin/main

Jika juga ingin membuang file untracked:

Terminal window
git clean -fd

Semua commit lokal yang tidak ada di origin/main akan tidak lagi direferensikan oleh branch tersebut. Gunakan git reflog jika ternyata perlu recovery.


27. Conflict Resolution

Cek file conflict:

Terminal window
git status

Setelah memperbaiki isi file:

Terminal window
git add <file>

Jika sedang merge:

Terminal window
git merge --continue

Jika sedang rebase:

Terminal window
git rebase --continue

Jika sedang cherry-pick:

Terminal window
git cherry-pick --continue

Batalkan merge:

Terminal window
git merge --abort

Batalkan rebase:

Terminal window
git rebase --abort

Batalkan cherry-pick:

Terminal window
git cherry-pick --abort

28. Tracking Branch dan Upstream

Melihat upstream branch

Terminal window
git branch -vv

Set upstream saat push pertama

Terminal window
git push -u origin <branch>

Mengatur upstream secara manual

Terminal window
git branch --set-upstream-to=origin/<branch>

Setelah upstream tersedia:

Terminal window
git pull
git push

biasanya sudah cukup.


29. Menghapus Remote Branch yang Sudah Tidak Ada

Setelah branch dihapus dari GitHub/GitLab, local Git terkadang masih menampilkannya.

Gunakan:

Terminal window
git fetch --prune

atau:

Terminal window
git remote prune origin

Cek kembali:

Terminal window
git branch -a

30. Tags

Membuat lightweight tag

Terminal window
git tag <tag-name>

Membuat annotated tag

Terminal window
git tag -a <tag-name> -m "Pesan tag"

Contoh:

Terminal window
git tag -a v1.0.0 -m "Release v1.0.0"

Melihat tag

Terminal window
git tag

Push satu tag

Terminal window
git push origin <tag-name>

Push semua tag

Terminal window
git push origin --tags

Menghapus tag lokal

Terminal window
git tag -d <tag-name>

Menghapus tag remote

Terminal window
git push origin --delete <tag-name>

31. Melihat Commit Lama Tanpa Mengubah Branch

Gunakan detached HEAD:

Terminal window
git switch --detach <commit-id>

Contoh:

Terminal window
git switch --detach HEAD~3

Jika ternyata ingin melanjutkan pekerjaan dari sana:

Terminal window
git switch -c <nama-branch>

Jika hanya ingin kembali:

Terminal window
git switch -

32. Git Bisect untuk Mencari Commit Penyebab Bug

Jika aplikasi sebelumnya berjalan tetapi sekarang error dan tidak tahu commit mana penyebabnya, gunakan binary search dengan Git Bisect.

Mulai:

Terminal window
git bisect start

Tandai commit saat ini sebagai buruk:

Terminal window
git bisect bad

Tentukan commit lama yang diketahui masih bekerja:

Terminal window
git bisect good <commit-id>

Git akan checkout commit di tengah-tengah history.

Test aplikasi, kemudian tandai:

Terminal window
git bisect good

atau:

Terminal window
git bisect bad

Ulangi sampai Git menemukan commit pertama yang menyebabkan masalah.

Setelah selesai:

Terminal window
git bisect reset

33. Alias

Alias memperpendek command yang sering digunakan.

Alias status

Terminal window
git config --global alias.st status

Sehingga:

Terminal window
git st

Alias commit

Terminal window
git config --global alias.ci commit

Alias checkout

Terminal window
git config --global alias.co checkout

Alias branch

Terminal window
git config --global alias.br branch

Alias log yang lebih nyaman

Terminal window
git config --global alias.lg "log --oneline --graph --decorate --all"

Kemudian:

Terminal window
git lg

34. Command Recovery yang Sebaiknya Dihafal

Beberapa command berikut sangat berguna ketika terjadi kesalahan:

Terminal window
git status

Melihat keadaan repository.

Terminal window
git log --oneline --graph --decorate --all

Memahami history.

Terminal window
git reflog

Mencari commit/HEAD yang sebelumnya masih ada.

Terminal window
git restore --staged <file>

Mengeluarkan file dari staging tanpa menghapus perubahan.

Terminal window
git reset --soft HEAD~1

Membatalkan commit terakhir tetapi mempertahankan perubahan di staging.

Terminal window
git reset HEAD~1

Membatalkan commit terakhir tetapi mempertahankan perubahan sebagai unstaged.

Terminal window
git revert <commit-id>

Membalik commit tanpa rewrite history.

Terminal window
git rebase --abort

Keluar dari rebase bermasalah.

Terminal window
git merge --abort

Keluar dari merge bermasalah.

Terminal window
git cherry-pick --abort

Keluar dari cherry-pick bermasalah.


35. Quick Reference: “Saya Ingin…”

TujuanCommand
Batalkan commit terakhir, perubahan tetap stagedgit reset --soft HEAD~1
Batalkan commit terakhir, perubahan tetap ada tetapi unstagedgit reset HEAD~1
Hapus commit terakhir beserta perubahannyagit reset --hard HEAD~1
Batalkan commit yang sudah dipush tanpa rewrite historygit revert <commit>
Hapus commit tertentu dari historygit rebase -i <commit>^ lalu drop
Recovery commit yang tidak sengaja hilanggit reflog
Ubah commit terakhirgit commit --amend
Tambahkan file ke commit terakhir tanpa ubah pesangit add <file> && git commit --amend --no-edit
Unstage filegit restore --staged <file>
Buang perubahan filegit restore <file>
Simpan perubahan sementaragit stash
Stash termasuk untracked filegit stash -u
Ambil stash dan hapus dari daftargit stash pop
Ambil commit dari branch laingit cherry-pick <commit>
Hapus local branchgit branch -d <branch>
Paksa hapus local branchgit branch -D <branch>
Hapus remote branchgit push origin --delete <branch>
Bersihkan stale remote branchesgit fetch --prune
Lihat graph seluruh branchgit log --oneline --graph --decorate --all
Reset local branch sama persis seperti remotegit fetch && git reset --hard origin/<branch>
Push setelah rewrite historygit push --force-with-lease
Cek file untracked yang akan dihapusgit clean -n
Hapus file/directory untrackedgit clean -fd
Pindah ke branch sebelumnyagit switch -

36. Perbedaan reset, restore, revert, dan rebase

git restore

Digunakan terutama untuk file dan staging area.

Terminal window
git restore <file>
git restore --staged <file>

git reset

Digunakan untuk memindahkan HEAD dan/atau mengubah staging/working tree.

Terminal window
git reset --soft HEAD~1
git reset HEAD~1
git reset --hard HEAD~1

git revert

Membuat commit baru yang membalik perubahan commit sebelumnya.

Terminal window
git revert <commit>

Biasanya pilihan paling aman untuk commit yang sudah dipublish.

git rebase

Menulis ulang rangkaian commit.

Terminal window
git rebase -i HEAD~5

Berguna untuk:

  • Menghapus commit.
  • Mengubah commit lama.
  • Mengubah pesan commit.
  • Mengurutkan commit.
  • Squash beberapa commit.
  • Membersihkan history sebelum pull request.

Karena rebase mengubah commit hash, hindari melakukan rebase pada shared history tanpa koordinasi.


Git sangat sulit benar-benar “menghilangkan” data secara tidak sengaja karena banyak operasi masih dapat dipulihkan melalui reflog. Namun, command seperti git clean, reset --hard, history rewrite, dan force push tetap harus digunakan dengan hati-hati.

Jika ragu sebelum operasi destruktif, gunakan:

Terminal window
git status
git log --oneline --graph --decorate --all
git branch backup-before-rewrite

Baru setelah itu lakukan operasi yang diperlukan.

37. Mencari Commit Berdasarkan Query

Sebelum menghapus sesuatu dari history, cari dahulu commit yang terpengaruh.

Cari semua commit yang pernah mengubah .env

Terminal window
git log --all --oneline -- .env

Untuk melihat patch/perubahannya:

Terminal window
git log --all -p -- .env

Atau tampilkan nama file:

Terminal window
git log --all --name-status -- .env

Contoh output:

a31bc92 add environment config
912fd21 update database credentials
7d1aa42 fix production env

Kemudian inspect commit tertentu:

Terminal window
git show a31bc92

38. Mencari Commit Berdasarkan Isi Perubahan

Kadang yang dicari bukan nama file, tetapi suatu string di dalam perubahan Git.

Misalnya ingin mencari perubahan yang mengandung:

.env

Gunakan:

Terminal window
git log --all -G'\.env' --oneline

Untuk melihat patch:

Terminal window
git log --all -G'\.env' -p

-G mencari added/deleted lines yang cocok dengan regular expression.

Contoh lain:

Terminal window
git log --all -G'API_KEY' --oneline
Terminal window
git log --all -G'password' --oneline
Terminal window
git log --all -G'DATABASE_URL' --oneline

Cari berdasarkan string dengan -S

Terminal window
git log --all -S'.env' --oneline

Dengan patch:

Terminal window
git log --all -S'.env' -p

Perbedaannya:

-G<regex> = cari baris diff yang cocok regex
-S<string> = cari commit yang mengubah jumlah kemunculan string

Untuk pencarian umum pada perubahan, biasanya -G lebih intuitif.


39. Mencari Commit Berdasarkan Pesan Commit

Jika query berada di commit message:

Terminal window
git log --all --grep='.env' --oneline

Contoh:

Terminal window
git log --all --grep='hotfix' --oneline
Terminal window
git log --all --grep='database' --oneline
Terminal window
git log --all --grep='secret' --oneline

Ini hanya mencari commit message, bukan isi file atau diff.


40. Menghapus Satu Commit yang Ditemukan Berdasarkan Query

Misalnya:

Terminal window
git log --all --oneline -- .env

menghasilkan:

a31bc92 add .env
c912a88 update config
819ab21 initial project

Jika commit:

a31bc92

hanya berisi perubahan yang memang ingin dibuang seluruhnya, gunakan interactive rebase:

Terminal window
git rebase -i a31bc92^

Akan muncul:

pick a31bc92 add .env
pick ...
pick ...

Ubah menjadi:

drop a31bc92 add .env
pick ...
pick ...

Simpan editor.

Commit tersebut akan dihapus dari history branch.

Jika commit berada di root history

Gunakan:

Terminal window
git rebase -i --root

Kemudian ubah commit target menjadi:

drop

Jangan gunakan drop jika commit tersebut juga berisi perubahan penting pada file lain.


41. Menghapus Hanya Perubahan .env dari Satu Commit

Ini biasanya lebih aman daripada menghapus seluruh commit.

Misalnya commit:

a31bc92

mengubah:

.env
src/config.ts
README.md

Kita hanya ingin menghilangkan perubahan .env, tetapi mempertahankan src/config.ts dan README.md.

Mulai interactive rebase:

Terminal window
git rebase -i a31bc92^

Ubah:

pick a31bc92 ...

menjadi:

edit a31bc92 ...

Git akan berhenti pada commit tersebut.

Sekarang kembalikan .env ke kondisi sebelum commit tersebut:

Terminal window
git restore \
--source=HEAD^ \
--staged \
--worktree \
-- .env

Cek hasilnya:

Terminal window
git status
Terminal window
git diff
Terminal window
git diff --cached

Kemudian amend commit:

Terminal window
git commit --amend --no-edit

Lanjutkan rebase:

Terminal window
git rebase --continue

Hasilnya:

sebelum:
a31bc92
├── .env
├── src/config.ts
└── README.md
sesudah rewrite:
a31bc92'
├── src/config.ts
└── README.md

Perubahan .env hilang dari commit tersebut, tetapi perubahan file lain tetap ada.


42. Menghapus .env dari Seluruh Git History

Jika .env tidak seharusnya pernah masuk Git, cara yang lebih tepat adalah menghapus path tersebut dari seluruh history menggunakan git-filter-repo.

Sebelum melakukannya, sebaiknya gunakan fresh clone atau buat backup.

Hapus .env di root repository dari seluruh history

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path .env

Ini menghapus .env dari seluruh rewritten history.

Misalnya sebelumnya:

A --- B --- C --- D
| | |
.env .env .env

Setelah filtering:

A' --- B' --- C' --- D'

Tidak ada versi .env pada rewritten history tersebut.

Perubahan file lain dalam commit tetap dipertahankan.


43. Menghapus Semua .env Termasuk yang Berada di Subdirectory

Repository kadang memiliki:

.env
backend/.env
frontend/.env
apps/api/.env

Gunakan:

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path .env \
--path-glob '*/.env'

--path digunakan untuk path exact, sedangkan --path-glob dapat digunakan untuk wildcard.

Setelah itu verifikasi:

Terminal window
git log --all -- .env

dan:

Terminal window
git log --all -- '*/.env'

44. Menghapus Semua File .env* dari History

Misalnya repository pernah memiliki:

.env
.env.local
.env.production
.env.development
backend/.env
backend/.env.production

Gunakan:

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path-glob '.env*' \
--path-glob '*/.env*'

Hati-hati: query .env* juga dapat cocok dengan file seperti .env.example.

Jika .env.example memang ingin dipertahankan, lebih aman sebutkan file sensitif secara eksplisit:

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path .env \
--path .env.local \
--path .env.production \
--path .env.development

45. Menghapus Berdasarkan Path Tertentu

Konsep yang sama dapat digunakan untuk file lain.

Hapus credentials

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path config/credentials.json

Hapus private key

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path private.pem

Hapus file database

Terminal window
git filter-repo \
--invert-paths \
--path database.sqlite

Hapus directory tertentu

Terminal window
git filter-repo \
--invert-paths \
--path storage/private/

46. Menghapus Isi Berdasarkan Query dari Seluruh History

Kadang file tidak ingin dihapus. Yang ingin dihapus hanya string tertentu.

Misalnya API key pernah masuk:

API_KEY=abc123-secret

Buat file:

replacements.txt

Isi:

abc123-secret

Kemudian:

Terminal window
git filter-repo \
--sensitive-data-removal \
--replace-text replacements.txt

Secara default string yang ditemukan akan diganti menjadi:

***REMOVED***

Tentukan replacement sendiri

Isi replacements.txt:

abc123-secret==>[REDACTED]

Kemudian:

Terminal window
git filter-repo \
--sensitive-data-removal \
--replace-text replacements.txt

47. Menghapus Literal String dari Seluruh History

Misalnya benar-benar ingin menghapus string:

.env

dari isi semua file sepanjang history.

Buat:

replacements.txt

Isi:

literal:.env==>

Kemudian:

Terminal window
git filter-repo --replace-text replacements.txt

Artinya:

.env

akan diganti dengan string kosong.

Ini sangat berbeda dengan menghapus file .env.

Command tersebut juga dapat mengubah:

README.md
.gitignore
docker-compose.yml
source code
documentation

jika file tersebut mengandung teks .env.

Jadi biasanya jangan gunakan ini untuk menghapus file .env.

Gunakan:

Terminal window
git filter-repo --invert-paths --path .env

jika tujuan sebenarnya adalah menghapus file .env dari history.


48. Query Menggunakan Regular Expression

git-filter-repo juga mendukung regex untuk replacement.

Contoh replacements.txt:

regex:API_KEY=[A-Za-z0-9_-]+==>API_KEY=[REMOVED]

Kemudian:

Terminal window
git filter-repo \
--sensitive-data-removal \
--replace-text replacements.txt

Contoh lain:

regex:password=.*==>password=[REMOVED]

Tetapi regex untuk secret harus dibuat dengan hati-hati agar tidak menghapus data legitimate.


49. Jangan Drop Semua Commit yang Menyentuh .env

Misalnya history:

A
|
B add login + .env
|
C add dashboard
|
D update API + .env
|
E

Query:

Terminal window
git log --all --oneline -- .env

menghasilkan:

ddddddd update API + .env
bbbbbbb add login + .env

Secara teori Anda bisa menghapus:

B
D

tetapi itu juga akan menghapus:

login
API changes

jika perubahan tersebut berada dalam commit yang sama.

Jadi:

❌ cari commit .env
❌ drop semua commit tersebut

biasanya bukan solusi terbaik.

Lebih baik:

✅ git filter-repo --invert-paths --path .env

karena Git akan menghapus .env tetapi mempertahankan perubahan lain dalam commit.


50. Workflow Aman Menghapus .env dari History

1. Cari dahulu

Terminal window
git log --all --oneline -- .env

Kemudian:

Terminal window
git log --all -p -- .env

2. Backup

Terminal window
git branch backup-before-env-cleanup

Untuk cleanup besar, fresh clone lebih disarankan.

3. Jika hanya satu commit

Terminal window
git rebase -i <commit-id>^

Gunakan:

edit

lalu:

Terminal window
git restore \
--source=HEAD^ \
--staged \
--worktree \
-- .env
git commit --amend --no-edit
git rebase --continue

4. Jika seluruh history

Terminal window
git filter-repo \
--sensitive-data-removal \
--invert-paths \
--path .env

5. Tambahkan .env ke .gitignore

.env
.env.local
.env.production
.env.development

Kemudian:

Terminal window
git add .gitignore
git commit -m "chore: ignore environment files"

Gunakan .env.example untuk template:

DATABASE_URL=
API_KEY=
APP_SECRET=

6. Verifikasi

Terminal window
git log --all --oneline -- .env

Seharusnya tidak menghasilkan commit terkait .env.

Cari juga berdasarkan patch:

Terminal window
git log --all -G'\.env' --oneline

Perlu diingat bahwa query kedua juga dapat menemukan referensi legitimate seperti .gitignore atau dokumentasi.

7. Jika history sebelumnya sudah berada di remote

History rewrite mengubah commit hash.

Push rewritten history sesuai workflow repository Anda.

Untuk rewrite satu branch:

Terminal window
git push --force-with-lease origin <branch>

Untuk proses sensitive-data cleanup seluruh repository, ikuti prosedur hosting provider karena branch, tag, pull request refs, clone collaborator, cache, dan fork juga dapat terpengaruh.


51. Jika .env Mengandung Secret

Jika .env pernah berisi:

API_KEY=...
DATABASE_PASSWORD=...
JWT_SECRET=...
PRIVATE_KEY=...

anggap secret tersebut sudah terekspos.

Urutan yang benar:

1. Revoke/rotate secret
2. Bersihkan Git history
3. Force-push rewritten history jika diperlukan
4. Bersihkan clone/copy lain
5. Tambahkan .env ke .gitignore
6. Gunakan .env.example tanpa secret

Menghapus .env dari Git history tidak membuat secret lama aman kembali.

Secret harus diganti.


52. Quick Reference — Search dan Delete Berdasarkan Query

TujuanCommand
Cari commit yang mengubah .envgit log --all --oneline -- .env
Lihat patch .env sepanjang historygit log --all -p -- .env
Cari diff berisi .envgit log --all -G'\.env' --oneline
Cari perubahan jumlah string .envgit log --all -S'.env' --oneline
Cari commit message berisi .envgit log --all --grep='.env' --oneline
Inspect commit tertentugit show <commit-id>
Hapus seluruh commit tertentugit rebase -i <commit>^ → drop
Edit commit tertentugit rebase -i <commit>^ → edit
Hapus hanya perubahan .env dari commitgit restore --source=HEAD^ --staged --worktree -- .env lalu amend
Hapus .env dari semua historygit filter-repo --invert-paths --path .env
Hapus nested .envgit filter-repo --invert-paths --path .env --path-glob '*/.env'
Hapus berbagai .env*git filter-repo --invert-paths --path-glob '.env*' --path-glob '*/.env*'
Hapus path arbitrary dari historygit filter-repo --invert-paths --path <path>
Hapus/replace secret berdasarkan textgit filter-repo --replace-text replacements.txt
Cari query regex di diffgit log -G'<regex>' --oneline
Cari query string dengan pickaxegit log -S'<string>' --oneline
Dika Ardianta

Terima kasih telah membaca artikel di website ini. Jangan ragu untuk menjelajahi artikel lainnya!

About Me Follow me on Sosmed


Git Series

# Git Cheat Sheet

Git 5 / 5
18 min read

Ini adalah Git Cheat Sheet berisi perintah-perintah Git yang sering digunakan, mulai dari operasi dasar sampai recovery, undo commit, menghapus commit tertentu dari history, rebase, stash, dan…

Continue

Comments