Tai, Git!?!

Git susah: bikin ngaco di situ gampang, dan susah bener cari tau cara benerin kesalahan lo. Pokoknya lo gak bisa keluar dari masalah lo kalau lo gak tau masalah lo untuk benerin masalah lo itu

Jadi ini beberapa masalah yang pernah gue hadapin, dan cara gue keluar dari masalah-masalah itu dengan bahasa yang simpel.

Tai, gue udah ngelakuin sesuatu yang salah, plis kasih tau gue kalo git punya mesin waktu ajaib!?!

git reflog
# lo bakalan liat daftar yang telah lo
# lakuin di git, di semua branch!
# masing-masing punya index HEAD@{index}
# cari satu dimana itu sebelum lo ngerusak segalanya
git reset HEAD@{index}
# mesin waktu ajaib

Lo bisa pake ini untuk barang-barang yang lo hapus secara gak sengaja, atau hilangin barang-barang yang lo cobain tapi malah ngerusak repo, atau balikin bad merge, atau cuman buat kembali ke waktu semuanya lancar jaya. Gue pake reflog SERING BANGET. Makasih banyak buat lo lo lo lo lo semua yang udah ngasih tau gue!

Tai, gue udah commit tapi ada yang pengen gue tambahin lagi!

# bikin change lo
git add . # atau tambahin filenya satu-satu
git commit --amend --no-edit
# sekarang commit-an lo ada change lo itu
# WARNING: jangan pernah amend commit-an publik

Ini biasanya gue lakuin kalo pas gue commit terus jalanin tests/linters... dan tai gw lupa tambahin spasi setelah tanda sama dengan. Lo juga bisa bikin change sebagai commit-an baru dan lakuin rebase -i biar langsung jalanin dua-duanya, tapi cara ini jauh lebih cepet.

Warning: Lo jangan pernah amend commit-an yang udah di-push ke public/shared branch! Cuma amend commit-an yang ada di local copy lo atau lo bakalan nyaho.

Tai, gue perlu ganti commit message di commit-an terakhir gw!

git commit --amend
# ikutin deh instruksinye untuk ganti commit message lo

Dasar requirement format commit message goblok.

Tai, gw gak sengaja commit sesuatu di master yang harusnya di branch baru!

# bikin branch baru dari master yang sekarang
git branch nama-branch-baru
# hapus commitan terakhir lo dari master branch
git reset HEAD~ --hard
git checkout nama-branch-baru
# sekarang commit-an lo ada di branch yang baru :)

Catatan: Ini gak guna kalau lo udah push commit-an lo ke public/shared branch, dan kalau lo udah pernah commit yang lain-lain, lo mungkin perlu git reset HEAD@{jumlah-commitan-lo} daripada HEAD~. Sedih yang tak berujung. Makasih lagi ke lo lo lo semua yang udah ngasih tau cara yang lebih kece yang tadinya gue gak tau. Makasih semua!

Tai, gw gak sengaja commit ke branch yang salah!

# undo commit-an terakhir, tapi biarin changesnya
git reset HEAD~ --soft
git stash
# pindah ke branch yang bener
git checkout nama-branch-yang-bener
git stash pop
git add . # atau tambahin satu-satu filenya
git commit -m "message lo di sini";
# sekarang changes lo ada di branch yang bener

Banyak yang ngasih tau gue pake cherry-pick kalo lo ngadepin masalah kayak gini, jadi terserah lo deh mau pake yang mana!

git checkout nama-branch-yang-bener
# ambil commit-an terakhir ke master
git cherry-pick master
# hapus dari master
git checkout master
git reset HEAD~ --hard

Tai, gw coba jalanin diff tapi kagak terjadi apa-apa?!

Kalau lo tau apa yang lo ganti di file tapi diff nya kosong, mungkin lo add files ke staging dan lo perlu pake flag yang spesial.

git diff --staged

Huft ¯\_(ツ)_/¯ (iye, gue tau ini fitur, bukannya bug, tapi ini bikin bingung kalau lo pertama kali ngadepin kayak ginian!)

Tai, gw perlu undo commit-an dari 5 commit-an sebelumnya!

# cari commit-an lo yang perlu lo undo
git log
# pake arrow keys untuk scroll ke atas dan bawah di history
# kalau udah ketemu, inget hash-nya
git revert [hash yang tadi lo inget]
# git bakalan bikin commit-an baru yang bakalan nge-undo commit-an tadi
# ikutin instruksinya untuk edit commit message 
# atau save aja dan commit

Ternyate lo gak perlu cari atu dan copy-paste isi file lama ke file yang baru untuk undo changes lo! Kalau lo commit bug, lo bisa undo semua commit-an lo dengan revert

Lo juga bisa revert satu file doang daripada semua commit-an lo! Tapi karena ini git, itu command-nya lain lah, tai...

Tai, gue perlu undo changes gue di file!

# cari hash untuk commit-an sebelum file lo ganti
git log
# pake arrow keys untuk scroll ke atas dan bawah di history
# kalau lo udah ketemu commit-an nya, inget hash-nya
git checkout [hash yang lo inget tadi] -- path/ke/file
# versi lama dari file tadi bakalan ada di index lo
git commit -m "Wow, lo gak perlu copy-paste buat undo"

Pas gue baru nemuin cara ini, ini KEREN. KEREN. K-E-R-E-N. Tapi seriusan deh, di planet mana checkout -- make sense buat nge-undo file? :shakes-fist-at-linus-torvalds:

Tai lah semua, nyerah aja deh gue.

cd ..
sudo rm -r git-repo-dir-tai
git clone https://some.github.url/git-repo-dir-tai.git
cd git-repo-dir-tai

Terima kasih untuk Eric V. buat ini. Kalau lo gak suka karena pake sudo lo marahin aja dia.

Tapi beneran deh, kalau branch lo udah ngacoooo pake banget terus lo pengen reset aja repo lo biar sama dengan remote repo dengan cara yang "git-approved", lo cobain ini, tapi inget cara ini destruktif dan kagak bisa di-recover!

# ambil state terakhir dari origin
git fetch origin
git checkout master
git reset --hard origin/master
# hapus files dan direktori yang untracked
git clean -d --force
# ulangin checkout/reset/clean untuk semua branch yang ngaco

*Sangkalan: Situs ini bukan buat referensi komplit. Dan iye, ada cara lain yang lebih bener atau terserah deh, tapi gue nemuin cara ini dengan penuh keringet dan air mata dan makian, jadi gue punya ide gila ini untuk ngasih tau lo pada. Ikutin atau kagak, bukan urusan gue!

Makasih banyak untuk semua yang udah mau bantuin terjemahin situs ini ke bahasa lain, kece deh lo pade! Michael Botha (af) · Khaja Md Sher E Alam (bn) · Eduard Tomek (cs) · Moritz Stückler (de) · Franco Fantini (es) · Hamid Moheb (fa) · Senja Jarva (fi) · Michel (fr) · Alex Tzimas (gr) · Elad Leev (he) · Aryan Sarkar (hi) · Ricky Gultom (id) · fedemcmac (it) · Meiko Hori (ja) · Zhunisali Shanabek (kk) · Gyeongjae Choi (ko) · Rahul Dahal (ne) · Martijn ten Heuvel (nl) · Łukasz Wójcik (pl) · Davi Alexandre (pt_BR) · Catalina Focsa (ro) · Daniil Golubev (ru) · Nemanja Vasić (sr) · Björn Söderqvist (sv) · Kitt Tientanopajai (th) · Taha Paksu (tr) · Andriy Sultanov (ua) · Tao Jiayuan (zh) . Dengan bantuan tambahan dari Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

Kalo lo pengen bantuin nambahin terjemahan ke bahasa lo, submit PR lo di GitHub