Perintah Git: contekan dengan contoh untuk pekerjaan harian
Perintah Git yang paling dasar adalah git init dan git clone untuk membuat repositori, git status, git add, dan git commit untuk menyimpan perubahan, git branch, git switch, dan git merge untuk bekerja dengan branch, git push, git fetch, dan git pull untuk sinkronisasi dengan server, serta git restore, git reset, dan git revert untuk membatalkan perubahan.
Berikut contekan Git yang praktis: perintah dikelompokkan menurut tugas, setiap perintah disertai contoh dan penjelasan singkat. Contekan ini sebaiknya dibuka di samping terminal, karena hampir semua hal yang dilakukan developer dengan Git dalam sehari tercakup dalam 20 sampai 30 perintah di tabel-tabel ini.
Agar perintah-perintah ini mudah dipahami, ingat tiga area: direktori kerja (berkas di disk), index atau staging area (yang akan masuk ke commit berikutnya), dan repositori (riwayat commit di folder .git). Sebagian besar perintah Git memindahkan perubahan di antara ketiga area ini, atau antara repositori lokal dan remote.
Konfigurasi Git
Perintah berikut dijalankan sekali setelah instalasi. Flag --global menyimpan pengaturan di ~/.gitconfig dan berlaku untuk semua repositori pengguna; tanpa flag itu, pengaturan hanya berlaku untuk repositori saat ini.
| Perintah | Fungsi |
|---|---|
git config --global user.name "Ivan Petrov" | Nama penulis commit |
git config --global user.email "ivan@example.com" | E-mail penulis commit |
git config --global init.defaultBranch main | Nama branch default untuk repositori baru |
git config --global core.editor "code --wait" | Editor untuk pesan commit (di sini VS Code) |
git config --global pull.rebase false | Perilaku default git pull adalah merge |
git config --global core.autocrlf input | Mengubah CRLF menjadi LF saat commit (macOS/Linux; di Windows biasanya true) |
git config --list --show-origin | Menampilkan semua pengaturan beserta berkas asalnya |
git config --global alias.st status | Alias: git st sebagai pengganti git status |
git --version | Versi Git yang terpasang |
git help commit | Panduan lengkap untuk satu perintah (atau git commit -h untuk ringkasan) |
Membuat dan mengkloning repositori
| Perintah | Fungsi |
|---|---|
git init | Membuat repositori kosong (folder .git) di direktori saat ini |
git init my-project | Membuat direktori my-project dan repositori di dalamnya |
git clone https://github.com/user/repo.git | Menyalin repositori remote beserta seluruh riwayatnya |
git clone git@github.com:user/repo.git app | Mengkloning lewat SSH ke folder app |
git clone --depth 1 URL | Klon dangkal: hanya commit terakhir, cepat dan hemat tempat |
git clone -b develop URL | Mengkloning dan langsung berpindah ke branch develop |
Siklus dasar: status, add, commit
Ini inti pekerjaan harian: melihat apa yang berubah, memilih yang diperlukan ke index, dan mencatatnya dalam commit.
| Perintah | Fungsi |
|---|---|
git status | Keadaan: berkas yang berubah, sudah di-stage, dan tidak dilacak |
git status -s | Format singkat: M — berubah, A — ditambahkan, ?? — tidak dilacak |
git add file.txt | Menambahkan berkas ke index |
git add . | Menambahkan semua perubahan di direktori saat ini dan di bawahnya, termasuk penghapusan |
git add -A | Menambahkan semua perubahan di seluruh repositori |
git add -p | Memilih potongan (hunk) perubahan secara interaktif |
git commit -m "Tambahkan form login" | Membuat commit dari index dengan pesan |
git commit -am "Perbaiki salah ketik" | Menambahkan semua berkas yang dilacak yang berubah lalu commit; berkas baru tidak ikut |
git commit --amend | Menulis ulang commit terakhir: menambahkan yang terlupa dari index atau memperbaiki pesan |
git commit --amend --no-edit | Menambahkan ke commit terakhir tanpa mengubah pesannya |
git rm file.txt | Menghapus berkas dari disk dan dari index |
git rm --cached secret.env | Berhenti melacak berkas, tetapi berkas tetap di disk |
git mv old.js new.js | Mengganti nama atau memindahkan berkas |
Alur tipikal:
git status
git add src/login.js src/login.css
git diff --staged # periksa apa yang akan masuk ke commit
git commit -m "Tambahkan form login"
Jangan gunakan --amend pada commit yang sudah dikirim ke branch bersama: perintah itu membuat commit baru dengan hash berbeda, dan rekan Anda harus menangani riwayat yang berbeda.
Melihat riwayat dan perubahan
| Perintah | Fungsi |
|---|---|
git log | Riwayat commit di branch aktif |
git log --oneline | Setiap commit dalam satu baris: hash pendek dan judul |
git log --oneline --graph --all | Graf semua branch di terminal |
git log -p file.txt | Riwayat berkas beserta diff setiap commit |
git log --author="Ivan" --since="2 weeks ago" | Filter berdasarkan penulis dan tanggal |
git log -S "getUser" | Commit yang menambah atau menghapus baris getUser |
git log main..feature | Commit yang ada di feature tetapi tidak di main |
git diff | Perubahan di direktori kerja yang belum masuk index |
git diff --staged | Perubahan di index terhadap commit terakhir (sinonim --cached) |
git diff main feature | Selisih antara ujung dua branch |
git diff HEAD~3 -- src/ | Perubahan di folder src selama tiga commit terakhir |
git show a1b2c3d | Metadata dan diff satu commit |
git show HEAD:README.md | Isi berkas pada commit terakhir |
git blame app.js | Siapa dan di commit mana setiap baris terakhir diubah |
git shortlog -sn | Jumlah commit per penulis |
Referensi ke commit berguna di mana saja: HEAD adalah commit saat ini, HEAD~1 induknya, HEAD~3 tiga langkah ke belakang melalui induk pertama, dan HEAD^2 induk kedua dari commit merge.
Branch: membuat, berpindah, menghapus
Sejak versi 2.23, Git memiliki git switch untuk branch dan git restore untuk berkas, yang memisahkan tugas git checkout yang terlalu banyak fungsi. Bentuk lama tetap berfungsi.
| Perintah | Fungsi |
|---|---|
git branch | Daftar branch lokal; yang aktif ditandai * |
git branch -a | Branch lokal dan remote (remote-tracking) |
git branch -vv | Branch dengan commit terakhir dan selisih ketertinggalan/kemajuan terhadap upstream |
git branch feature/login | Membuat branch tanpa berpindah |
git switch feature/login | Berpindah ke branch |
git switch -c feature/login | Membuat branch dan berpindah (setara git checkout -b) |
git switch - | Kembali ke branch sebelumnya |
git branch -m new-name | Mengganti nama branch aktif |
git branch -d feature/login | Menghapus branch jika sudah digabung |
git branch -D feature/login | Menghapus branch secara paksa, meskipun belum digabung |
git branch --merged | Branch yang sudah digabung ke branch aktif — kandidat untuk dihapus |
Penggabungan dan rebase
| Perintah | Fungsi |
|---|---|
git merge feature | Menggabungkan feature ke branch aktif (fast-forward jika memungkinkan) |
git merge --no-ff feature | Selalu membuat commit merge |
git merge --squash feature | Mengumpulkan semua perubahan branch ke index sekaligus, lalu git commit |
git merge --abort | Membatalkan penggabungan yang konflik dan kembali ke keadaan semula |
git rebase main | Memindahkan commit branch aktif ke atas main |
git rebase -i HEAD~4 | Interaktif: menggabungkan (squash), mengganti nama, mengatur ulang, atau menghapus 4 commit terakhir |
git rebase --continue | Melanjutkan setelah konflik diselesaikan |
git rebase --abort | Membatalkan rebase sepenuhnya |
git cherry-pick a1b2c3d | Menerapkan satu commit ke branch aktif sebagai commit baru |
Penyelesaian konflik saat penggabungan hampir selalu berbentuk sama:
git merge feature
# CONFLICT (content): Merge conflict in app.js
git status # berkas ada di bagian "both modified"
# edit app.js, hapus penanda <<<<<<< ======= >>>>>>>
git add app.js
git commit # Git menyiapkan pesan commit merge
Aturan utama rebase: jangan me-rebase commit yang sudah ada di branch bersama dan menjadi dasar kerja orang lain.
Kerja dengan repositori remote
| Perintah | Fungsi |
|---|---|
git remote -v | Daftar remote beserta alamatnya |
git remote add origin git@github.com:user/repo.git | Menghubungkan repositori remote dengan nama origin |
git remote set-url origin NEW_URL | Mengganti alamat remote (misalnya dari HTTPS ke SSH) |
git remote remove upstream | Memutus remote |
git fetch | Mengunduh commit dan branch baru tanpa menyentuh berkas Anda |
git fetch --prune | Sama, plus menghapus referensi ke branch yang sudah dihapus di server |
git pull | git fetch + penggabungan upstream ke branch aktif |
git pull --rebase | git fetch + rebase commit Anda di atas hasil yang diunduh |
git push | Mengirim commit branch aktif ke upstream-nya |
git push -u origin feature/login | Pengiriman pertama branch sekaligus mengatur upstream |
git push --force-with-lease | Menimpa branch remote hanya jika tidak ada commit baru dari orang lain di sana |
git push origin --delete feature/login | Menghapus branch di server |
git push --tags | Mengirim semua tag lokal |
Daripada git push --force, biasakan memakai --force-with-lease: jika rekan sudah mengirim sesuatu ke branch yang sama, perintah ini menolak menimpa pekerjaannya.
Membatalkan perubahan
Bagian yang paling menegangkan dalam Git. Pertanyaan kuncinya sebelum memilih perintah: perubahan itu baru ada di berkas, sudah di index, di commit lokal, atau di commit yang sudah dipublikasikan?
| Situasi | Perintah |
|---|---|
| Membatalkan perubahan di berkas (kembali seperti commit terakhir) | git restore app.js |
| Mengeluarkan berkas dari index dan menyimpan perubahannya | git restore --staged app.js |
| Mengambil berkas dari commit tertentu | git restore --source=a1b2c3d app.js |
| Membatalkan commit terakhir, perubahan tetap di index | git reset --soft HEAD~1 |
| Membatalkan commit terakhir, perubahan tetap di berkas | git reset HEAD~1 (mode --mixed default) |
| Menghapus commit terakhir beserta seluruh perubahannya | git reset --hard HEAD~1 |
| Membatalkan commit yang sudah dipublikasikan dengan commit kebalikan | git revert a1b2c3d |
| Membatalkan commit merge | git revert -m 1 <hash-merge> |
| Melihat berkas tidak dilacak yang akan dihapus | git clean -n |
| Menghapus berkas dan folder yang tidak dilacak | git clean -fd |
| Mencari commit yang «hilang» setelah reset atau rebase | git reflog, lalu git reset --hard HEAD@{2} |
git reset --hard dan git clean -f menghapus perubahan yang belum di-commit secara permanen: reflog hanya menyimpan commit, bukan perubahan di direktori kerja. Sebelum menjalankannya, buat git stash, atau setidaknya jalankan git status.
Stash: menyimpan pekerjaan yang belum selesai
| Perintah | Fungsi |
|---|---|
git stash | Menyimpan perubahan berkas yang dilacak dan mengosongkan direktori kerja |
git stash push -u -m "wip: form" | Menyimpan termasuk berkas tidak dilacak, dengan label |
git stash list | Daftar simpanan: stash@{0}, stash@{1}, … |
git stash show -p stash@{0} | Melihat diff simpanan |
git stash pop | Mengembalikan simpanan terakhir dan menghapusnya dari daftar |
git stash apply stash@{1} | Mengembalikan simpanan dan tetap menyimpannya di daftar |
git stash drop stash@{1} | Menghapus satu simpanan |
git stash branch fix-form | Membuat branch dari commit tempat stash dibuat, lalu menerapkannya |
Tag dan rilis
| Perintah | Fungsi |
|---|---|
git tag | Daftar tag |
git tag -a v1.2.0 -m "Rilis 1.2.0" | Tag beranotasi dengan penulis, tanggal, dan pesan |
git tag v1.2.0 a1b2c3d | Tag ringan pada commit tertentu |
git push origin v1.2.0 | Mengirim satu tag |
git tag -d v1.2.0 | Menghapus tag secara lokal |
git push origin --delete v1.2.0 | Menghapus tag di server |
git describe --tags | Tag terdekat dan jumlah commit sesudahnya, misalnya v1.2.0-3-ga1b2c3d |
Perintah Git tingkat lanjut
| Perintah | Fungsi |
|---|---|
git bisect start, git bisect bad, git bisect good v1.1.0 | Pencarian biner untuk commit yang membawa error; akhirnya git bisect reset |
git worktree add ../hotfix main | Folder kerja kedua dengan branch lain dari repositori yang sama |
git submodule update --init --recursive | Mengunduh submodul setelah kloning |
git grep "TODO" | Pencarian cepat di berkas yang dilacak |
git format-patch -1 HEAD / git apply fix.patch | Menyimpan commit sebagai patch dan menerapkan patch ke direktori kerja |
git gc | Mengemas objek dan membersihkan repositori (biasanya Git melakukannya sendiri) |
Kesalahan umum dan cara memperbaikinya
Commit dibuat di main, bukan di branch baru
Jika commit belum dikirim, buat branch di posisi commit itu, lalu mundurkan main:
git branch feature/login # branch menunjuk ke commit Anda
git reset --hard HEAD~1 # main kembali satu langkah
git switch feature/login
Berkas yang terlupa tidak masuk ke commit terakhir
git add forgotten.js
git commit --amend --no-edit
Push ditolak: rejected, non-fast-forward
Di server ada commit yang belum Anda miliki. Ambil dulu, baru kirim:
git pull --rebase
git push
Berkas berisi kata sandi ter-commit tanpa sengaja
Hentikan pelacakannya dan tambahkan ke .gitignore: git rm --cached .env, lalu commit. Jika commit sudah dikirim, anggap rahasia itu bocor dan buat yang baru; dari riwayat, rahasia itu tidak hilang begitu saja.
Ringkasan
Untuk pekerjaan harian, sekumpulan kecil perintah sudah cukup: status, add, commit, switch, merge, pull, push, dan log --oneline. Perintah pembatalan — restore, reset, revert — dipilih sesuai apakah commit sudah dipublikasikan, dan reflog diingat sebagai jaring pengaman terakhir. Semua perintah dalam contekan ini dibahas dengan praktik dalam kursus Git, tempat Anda mencobanya langsung di repositori sendiri.
Pertanyaan umum
Berapa banyak perintah Git yang perlu dikuasai pemula?
Untuk memulai cukup 10 sampai 12: init, clone, status, add, commit, log, diff, branch, switch, merge, pull, dan push. Sisanya dipelajari saat kebutuhan muncul.
Apa bedanya git switch dengan git checkout?
git switch hanya berpindah dan membuat branch, sedangkan git checkout juga memulihkan berkas. Pemisahan menjadi switch dan restore dibuat agar tidak keliru menimpa perubahan karena salah mengira nama branch sebagai berkas.
Bagaimana cara melihat bantuan untuk perintah Git tertentu?
Jalankan git help nama-perintah untuk panduan lengkap, atau git nama-perintah -h untuk daftar flag ringkas. Dokumentasi yang sama juga ada di git-scm.com.
Bisakah perintah Git yang panjang dipersingkat?
Bisa, dengan alias: git config --global alias.lg "log --oneline --graph --all" memungkinkan Anda mengetik git lg.
Apakah perintah ini sama di Windows?
Ya, perintahnya identik di semua sistem. Di Windows, jalankan di Git Bash, PowerShell, atau terminal editor kode.
Topik ini dibahas mendalam dengan praktik di kursus “Git dari Nol hingga Pengembang Percaya Diri”.
- Repositori Pertama: init, add, commit dan Keajaiban Indeks
- Membaca Riwayat: log, diff, show dan Navigasi ke Masa Lalu
- Cabang: Realitas Paralel untuk Kode Anda
- Membatalkan Kesalahan: restore, reset, revert — dengan Benar dan Berbahaya
- GitHub dan Repositori Jarak Jauh: Kode Anda di Awan
- Alat Lanjutan: rebase, stash, cherry-pick, dan tag