🐙 Git dan GitHub CLI
Perintah dasar dan lanjutan Git untuk kontrol versi, branching, repositori remote, stash, tag, dan GitHub CLI.
🔹 Perintah Dasar
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git add | Tambahkan file ke staging area | |
| git add file.txt | Stage file tertentu untuk commit berikutnya | |
| git add . | Stage semua perubahan di direktori saat ini dan di bawahnya | |
| git add -p | Pilih secara interaktif bagian file mana yang akan di-stage (berguna untuk commit parsial) | |
| git clone | Kloning repositori ke direktori baru | |
| git clone -b branch_name URL | Kloning hanya branch tertentu (bukan default) | |
| git clone --depth 1 URL | Kloning hanya commit terbaru, membuat salinan dangkal untuk menghemat waktu dan ruang | |
| git commit | Rekam perubahan ke repositori | |
| git commit -m "Initial commit" | Commit dengan pesan tanpa membuka editor | |
| git commit -a -m "Fix bugs" | Stage dan commit semua file yang dimodifikasi dengan pesan | |
| git commit --amend | Perbarui commit terakhir (ubah pesan atau tambahkan perubahan) | |
| git commit --fixup abc1234 | Buat commit fixup untuk digabung otomatis saat rebase interaktif | |
| git config | Dapatkan dan atur opsi repositori atau global | |
| git config --global user.name "Name" | Atur username Git global | |
| git config --global user.email "email@example.com" | Atur email Git global | |
| git config --list | Daftar semua pengaturan Git (nama, email, editor, dll.) | |
| git diff | Tampilkan perubahan antar commit, commit dan working tree, dll. | |
| git diff HEAD | Tampilkan perubahan sejak commit terakhir (unstaged changes) | |
| git diff --staged | Tampilkan apa yang akan termasuk di commit berikutnya | |
| git diff --word-diff HEAD~1 | Tampilkan perubahan dengan perbedaan per kata | |
| git grep | Cari di dalam file repositori | |
| git grep "functionName" | Cari semua penyebutan  | |
| git grep -n "TODO" | Cari baris yang mengandung  | |
| git grep -i "login" | Cari kata  | |
| git init | Buat repositori Git kosong atau inisialisasi ulang yang sudah ada | |
| git init my-project | Inisialisasi repo baru di direktori my-project | |
| git init --bare | Inisialisasi repositori bare | |
| git log | Tampilkan log commit | |
| git log --oneline | Tampilkan riwayat commit dalam format ringkas satu baris | |
| git log --graph --all | Tampilkan semua branch dalam grafik visual commit | |
| git log -p --stat | Tampilkan patch dan statistik perubahan file untuk commit | |
| git reset | Batalkan stage file, tetapi simpan perubahan di working directory | |
| git reset HEAD file.txt | Hapus file dari staging (perubahan tetap ada) | |
| git reset --hard HEAD~1 | Kembali satu commit dan hapus semua perubahan (tidak bisa dibalik!) | |
| git reset --soft HEAD~1 | Batalkan commit terakhir tetapi simpan perubahan siap di-commit lagi | |
| git reset --mixed HEAD~1 | Batalkan commit tetapi simpan perubahan tidak di-stage di working directory | |
| git show | Tampilkan berbagai jenis objek | |
| git show <commit_hash> | Tampilkan perubahan dan pesan dari commit tertentu | |
| git show HEAD~1 | Tampilkan commit sebelumnya sebelum commit saat ini | |
| git show --stat | Tampilkan ringkasan perubahan file untuk commit terbaru | |
| git status | Tampilkan status working tree | |
| git status -s | Tampilkan status dalam format singkat | |
| git status -b | Tampilkan branch saat ini dan status file | 
🌿 Branching dan Merging
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git branch | Buat, daftar, atau hapus branch | |
| git branch new-feature | Buat branch baru bernama  | |
| git branch -d old-feature | Hapus branch lokal bernama  | |
| git checkout | Beralih branch atau pulihkan file dari commit lain | |
| git checkout main | Beralih ke branch  | |
| git checkout -b new-branch | Buat dan beralih ke branch baru bernama  | |
| git switch | Beralih branch (alternatif sederhana untuk checkout) | |
| git switch main | Beralih ke branch  | |
| git switch -c feature-x | Buat dan beralih ke branch baru bernama  | |
| git switch new-feature | Beralih ke branch yang sudah ada bernama  | |
| git merge | Gabungkan perubahan dari branch lain ke branch saat ini | |
| git merge new-feature | Gabungkan branch  | |
| git merge --no-ff new-feature | Selalu buat commit merge (bahkan jika fast-forward memungkinkan) | |
| git merge --abort | Batalkan merge dan kembalikan perubahan jika terjadi konflik | |
| git rebase | Pindahkan atau terapkan ulang commit ke base commit baru | |
| git rebase main | Terapkan ulang commit branch Anda di atas branch  | |
| git rebase -i HEAD~3 | Edit interaktif 3 commit terakhir | |
| git rebase --abort | Hentikan dan batalkan rebase yang sedang berlangsung | |
| git rebase -i --autosquash HEAD~5 | Gabungkan otomatis commit yang ditandai sebagai fixup atau squash selama rebase interaktif | |
| git cherry-pick | Terapkan commit tertentu dari branch lain | |
| git cherry-pick <hash> | Terapkan commit tertentu (berdasarkan hash) ke branch saat ini | |
| git cherry-pick --continue | Lanjutkan cherry-pick setelah menyelesaikan konflik | |
| git cherry-pick A^..B | Terapkan rentang commit dari  | 
📡 Repositori Remote
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git remote | Kelola tautan ke repositori remote (seperti GitHub) | |
| git remote -v | Tampilkan nama remote dan URL-nya | |
| git remote add origin URL | Tambahkan repositori remote bernama  | |
| git pull | Unduh dan gabungkan otomatis perubahan dari branch remote | |
| git pull origin main | Fetch dan gabungkan perubahan dari branch  | |
| git pull --rebase origin main | Fetch dan rebase branch Anda di atas branch remote alih-alih merge | |
| git push | Unggah perubahan lokal Anda ke repositori remote | |
| git push origin main | Push branch lokal  | |
| git fetch | Unduh perubahan dari remote tanpa menggabungkan | |
| git fetch origin | Fetch semua pembaruan dari remote  | |
| git fetch origin main | Fetch hanya branch  | |
| git fetch --all | Fetch pembaruan dari semua remote | |
| git fetch --prune | Bersihkan branch yang dihapus — hapus referensi lokal ke branch yang dihapus di remote | |
| git fetch --dry-run | Tampilkan apa yang akan di-fetch, tanpa benar-benar mengunduh apapun | |
| git fetch origin +main | Paksa perbarui branch tracking lokal ( | 
📦 Stash dan Pembersihan
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git stash | Simpan sementara perubahan yang belum di-commit (pekerjaan sedang berlangsung) | |
| git stash | Simpan file yang dimodifikasi dan di-stage, lalu kembalikan working directory ke commit terakhir | |
| git stash apply | Terapkan kembali stash terbaru (stash tetap tersimpan) | |
| git stash pop | Terapkan dan hapus stash terbaru | |
| git stash list | Tampilkan daftar semua perubahan yang di-stash | |
| git stash branch feature-fix | Buat branch baru dan terapkan stash terbaru ke branch tersebut | |
| git clean | Hapus permanen file yang tidak dilacak (tidak ada di Git) | |
| git clean -f | Hapus file yang tidak dilacak di direktori saat ini | |
| git clean -fd | Hapus file dan folder yang tidak dilacak | |
| git clean -n | Pratinjau apa yang akan dihapus (dry run aman) | 
🏷️ Tag
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git tag | Buat, daftar, atau hapus tag untuk menandai titik tertentu dalam riwayat (seperti rilis) | |
| git tag -a v1.0 -m "Version 1.0" | Buat tag annotated bernama  | |
| git tag -d v1.0 | Hapus tag lokal bernama  | |
| git push | Unggah commit, branch, dan tag dari lokal ke repositori remote | |
| git push origin --tags | Push semua tag lokal ke remote (berguna setelah menandai banyak versi) | |
| git push origin v1.0 | Push tag tertentu (misalnya  | |
| git push origin :refs/tags/v1.0 | Hapus tag remote  | 
🛠️ Resolusi Konflik
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git mergetool | Buka alat visual untuk membantu menyelesaikan konflik merge | |
| git mergetool --tool=meld | Gunakan alat merge tertentu (seperti Meld) untuk memperbaiki konflik | |
| git rerere | Biarkan Git mengingat bagaimana Anda menyelesaikan konflik merge sebelumnya | |
| git config --global rerere.enabled true | Aktifkan penggunaan ulang otomatis resolusi konflik sebelumnya | |
| git rerere status | Tampilkan file yang memiliki resolusi konflik tersimpan | |
| git rerere diff | Tampilkan perubahan yang disimpan Git untuk penggunaan ulang di masa depan | 
⚙️ Perintah Lanjutan
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git bisect | Gunakan binary search untuk menemukan commit yang memperkenalkan bug | |
| git bisect start | Mulai binary search antara commit baik dan buruk untuk menemukan bug | |
| git bisect bad | Tandai commit saat ini sebagai “buruk” (mengandung bug) | |
| git bisect good <commit> | Tandai commit “baik” yang diketahui di mana bug tidak ada | |
| git blame | Tampilkan siapa yang terakhir mengubah setiap baris file, dengan revisi dan penulis | |
| git blame file.txt | Tampilkan penulis dan info commit untuk setiap baris dalam file | |
| git blame -L 10,20 file.txt | Tampilkan info blame hanya untuk baris 10 hingga 20 | |
| git blame --show-email file.txt | Tampilkan alamat email penulis bersama perubahan baris | |
| git reflog | Lihat dan kelola reference log (reflog) pergerakan branch dan HEAD | |
| git reflog show main@{1.week.ago} | Lihat ke mana branch  | |
| git reflog expire --expire=30.days --dry-run | Pratinjau reflog yang lebih lama dari 30 hari yang bisa dibersihkan (tidak ada perubahan yang dibuat) | |
| git reflog delete HEAD@{2} | Hapus entry reflog tertentu (gunakan hati-hati, dapat memengaruhi pemulihan) | |
| git submodule | Tambah, inisialisasi, perbarui, atau inspeksi submodule (repositori di dalam repositori) | |
| git submodule add URL path | Tambahkan repositori eksternal sebagai submodule di path tertentu | |
| git submodule update --init | Inisialisasi dan unduh semua submodule yang tercantum dalam repositori | |
| git submodule foreach git pull | Jalankan  | |
| git submodule sync --recursive | Sinkronkan URL submodule setelah perubahan di file  | |
| git submodule update --remote --merge | Perbarui submodule ke commit terbaru dari branch remote mereka | |
| git archive | Buat arsip (zip, tar, dll.) dari file commit atau branch tertentu | |
| git archive --format=zip HEAD > archive.zip | Buat arsip ZIP dari file proyek saat ini di HEAD | |
| git archive -o release.tar.gz HEAD | Buat arsip  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Buat arsip  | |
| git gc | Bersihkan file yang tidak perlu dan optimalkan repositori untuk performa | |
| git gc --aggressive | Lakukan pembersihan dan optimisasi menyeluruh (bisa lambat tapi efektif) | |
| git gc --prune=now | Hapus semua objek yang tidak dapat dijangkau segera (berbahaya jika tidak yakin) | |
| git shortlog | Ringkasan cepat penulis dan commit mereka | |
| git shortlog -e | Tampilkan daftar penulis dengan alamat email mereka (misalnya, untuk menganalisis siapa yang berkontribusi dan seberapa banyak) | |
| git shortlog -s -n | Tampilkan berapa banyak commit yang dibuat setiap penulis, diurutkan berdasarkan jumlah commit | |
| git shortlog -sne | Sama seperti di atas, tetapi juga menyertakan nama dan email — berguna untuk pelacakan aktivitas detail | |
| git revert | Buat commit baru yang membatalkan perubahan dari commit sebelumnya tanpa menulis ulang riwayat | |
| git revert HEAD | Batalkan commit terakhir dengan membuat commit baru yang membalikkan perubahannya | |
| git revert <commit_hash> | Batalkan commit tertentu berdasarkan hash, dengan aman menambahkan commit baru yang membalikkan | 
🐙 GitHub CLI
ghmemungkinkan Anda mengelola GitHub langsung dari terminal.
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| gh auth login | Autentikasi dengan host GitHub untuk memungkinkan perintah CLI berinteraksi dengan akun Anda | |
| gh auth login --with-token < mytoken.txt | Autentikasi menggunakan personal access token yang disimpan dalam file ( | |
| gh auth login --hostname enterprise.internal | Autentikasi ke server GitHub Enterprise (bukan github.com) | |
| gh repo clone | Kloning repositori GitHub ke mesin lokal Anda | |
| gh repo clone user/repo | Kloning repositori milik  | |
| gh repo clone cli/cli -- --depth=1 | Kloning repositori tetapi hanya unduh commit terbaru untuk kloning lebih cepat dan kecil | |
| gh repo clone cli/cli workspace/cli | Kloning repositori ke folder khusus  | |
| gh issue list | Daftar issue dalam repositori GitHub, dapat difilter berdasarkan berbagai kriteria | |
| gh issue list --assignee "@me" | Daftar issue yang ditugaskan kepada Anda | |
| gh issue list --state all | Daftar semua issue terlepas dari status (open atau closed) | |
| gh issue list --search "error no:assignee sort:created-asc" | Daftar issue yang cocok dengan “error”, tanpa assignment, diurutkan berdasarkan tanggal pembuatan naik | |
| gh pr create | Buat pull request di GitHub melalui CLI | |
| gh pr create --title "..." | Buat pull request dengan judul tertentu | |
| gh pr create --project "Roadmap" | Hubungkan pull request ke proyek GitHub bernama “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | Buat PR dari branch  | |
| gh repo create | Buat repositori GitHub baru dari CLI | |
| gh repo create my-project | Buat repositori baru bernama  | |
| gh repo create my-project --public --clone | Buat repositori publik dan kloning secara lokal | |
| gh repo create my-project --private --source=. --remote=upstream | Buat repositori remote privat dari folder saat ini dan tambahkan remote bernama  | 
💡 Alias Git (Jalan Pintas Berguna)
Atur alias yang nyaman untuk mempercepat perintah Git umum:
git config --global alias.br branch                                       # jalan pintas untuk: git branch
git config --global alias.ci commit                                       # jalan pintas untuk: git commit
git config --global alias.co checkout                                     # jalan pintas untuk: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # grafik riwayat yang rapi
git config --global alias.last "log -1 HEAD"                              # tampilkan commit terakhir
git config --global alias.st status                                       # jalan pintas untuk: git status🚀 Perintah Git Lanjutan untuk Profesional
| Perintah | Contoh | Deskripsi | 
|---|---|---|
| git filter-repo | Alat yang kuat dan cepat untuk menulis ulang riwayat Git guna menghapus atau memodifikasi file, kepenulisan, atau path; menggantikan git filter-branch dengan kecepatan dan keamanan yang lebih baik | |
| git filter-repo --path secret.txt --invert-paths | Tulis ulang riwayat repositori secara efisien untuk menghapus file atau direktori sensitif tanpa masalah performa  | |
| git filter-repo --replace-text replacements.txt | Ganti string atau pola secara massal di seluruh riwayat (misalnya, sanitasi kredensial) | |
| git filter-repo --subdirectory-filter src | Ekstrak riwayat subdirektori ke repositori baru, dengan metadata commit tetap terjaga | |
| git worktree | Kelola banyak working directory yang terhubung ke satu repositori, memungkinkan pekerjaan paralel di berbagai branch tanpa kloning | |
| git worktree add ../feature feature-branch | Buat working tree tambahan yang terhubung ke repositori sama, memungkinkan checkout branch paralel tanpa kloning | |
| git worktree list | Daftar semua worktree aktif, path, dan branch terkait | |
| git worktree remove ../feature | Hapus worktree yang tidak lagi diperlukan dengan aman | |
| git replace | Buat referensi sementara untuk menggantikan objek yang ada, memungkinkan manipulasi riwayat lokal non-destruktif untuk pengujian | |
| git replace <old_commit> <new_commit> | Tukar sementara satu commit dengan commit lain di repo lokal, berguna untuk pengujian atau patching riwayat tanpa menulis ulang | |
| git replace --list | Tampilkan semua referensi pengganti aktif | |
| git replace -d <replace_ref> | Hapus referensi pengganti tertentu untuk mengembalikan perilaku | |
| git stash | Simpan sementara perubahan yang belum di-commit ke stack, memungkinkan berpindah konteks tanpa commit pekerjaan yang belum selesai | |
| git stash push -p | Pilih interaktif bagian perubahan untuk disimpan, memberi kontrol lebih detail | |
| git stash push -m "WIP selective stash" | Buat stash dengan pesan khusus agar mudah diidentifikasi | |
| git stash apply stash@{2} | Terapkan stash tertentu dari daftar tanpa menghapusnya | |
| git rebase | Terapkan ulang commit di atas base lain, menjaga riwayat proyek tetap bersih dan linear dengan opsi pengeditan interaktif | |
| git rebase --interactive --autosquash | Mulai rebase interaktif yang otomatis mengurutkan ulang dan squash commit bertanda fixup atau squash | |
| git rebase -i --autosquash HEAD~10 | Otomatis urutkan ulang dan squash commit fixup/squash, membersihkan riwayat sebelum push | |
| git commit --fixup <commit> | Buat commit fixup yang akan digabung otomatis saat rebase interaktif | |
| git commit --squash <commit> | Buat commit squash untuk digabung dengan commit tertentu saat rebase | |
| git bisect | Alat binary search untuk mengidentifikasi commit yang memperkenalkan bug dengan menguji commit berturut-turut | |
| git bisect run | Otomatisasi proses bisect dengan menjalankan skrip uji pada setiap commit untuk menemukan commit yang bermasalah | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Otomatisasi bisection dengan skrip uji di setiap commit, mempercepat identifikasi bug | |
| git bisect visualize | Buka alat grafis untuk memvisualisasikan proses bisect | |
| git bisect reset | Keluar dari mode bisect dan kembali ke HEAD asli | |
| git commit | Rekam perubahan ke repositori dengan opsi detail seperti amend, sign, fixup, dan kustomisasi pesan untuk menjaga riwayat berkualitas tinggi | |
| git commit --gpg-sign | Buat commit yang ditandatangani dengan kunci GPG Anda untuk verifikasi kriptografis keaslian dan kepenulisan | |
| git commit -S -m "Signed commit" | Tandatangani commit dengan kunci GPG Anda untuk memastikan integritas dan verifikasi kepenulisan | |
| git config --global user.signingkey <key_id> | Konfigurasikan kunci GPG yang digunakan untuk menandatangani commit secara global | |
| git log --show-signature | Verifikasi dan tampilkan info tanda tangan GPG untuk commit | |
| git reflog | Catat pembaruan HEAD dan branch, penting untuk memulihkan commit yang hilang dan memahami pergerakan riwayat lokal | |
| git reset --hard HEAD@{3} | Reset branch saat ini ke status sebelumnya dari reflog untuk memulihkan perubahan | |
| git reflog expire --expire=now --all | Segera hapus semua entry reflog, membersihkan riwayat reflog (gunakan dengan hati-hati) | 
🧰 Tips Workflow Pro dan Otomatisasi
| Topik | Perintah / Contoh | Penjelasan & Tips Pro | 
|---|---|---|
| Pembersihan Repo Agresif | git gc --aggressive --prune=now | Melakukan garbage collection mendalam dan memangkas objek yang tidak dapat dijangkau segera untuk optimisasi repositori. Gunakan saat maintenance | 
| Worktree Branch Paralel | git worktree add ../feature-branch feature | Simpan banyak working tree untuk pengembangan fitur secara bersamaan, menghindari overhead kloning | 
| Riwayat Bersih dan Linear | git rebase -i --autosquash | Sebelum push, lakukan rebase interaktif dengan autosquash agar riwayat tetap bersih dan mudah dibaca | 
| Commit Aman | git commit -S | Tandatangani commit dengan GPG untuk meningkatkan kepercayaan dalam repositori bersama, wajib di banyak lingkungan enterprise | 
| Bisect Otomatis | git bisect run ./test-script.sh | Otomatisasi pencarian bug dengan menjalankan skrip uji pada setiap kandidat commit selama bisect | 
| Cache Resolusi Konflik | git config --global rerere.enabled true | Aktifkan penggunaan ulang resolusi konflik untuk mempercepat penyelesaian konflik merge berulang saat rebase atau merge | 
| Alias dan Hook Bersama | Simpan alias Git umum dan commit hook dalam repo bersama atau pipeline CI untuk menegakkan standar tim dan meningkatkan produktivitas | 
Sumber Daya Tambahan
🧠 Tip
Jangan coba hafalkan semuanya. Gunakan --help, jelajahi, dan berlatih secara rutin:
git help <command>
git status🌐 Tautan Berguna
📘 Dokumentasi Git Resmi — manual detail untuk semua perintah Git:
https://git-scm.com/docs
📙 Learn Git Branching — tutorial visual interaktif untuk menguasai konsep branching:
https://learngitbranching.js.org
📕 Buku Pro Git (gratis, oleh Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (referensi ringkas resmi):
https://education.github.com/git-cheat-sheet-education.pdf