Waduh, Git!?!

Git itu sulit: melakukan kesalahan di git mudah, dan mengetahui cara untuk memperbaiki kesalahan tersebut nyaris tidak mungkin. Dokumentasi Git memiliki masalah seperti masalah ayam dan telur di mana Anda tidak bisa keluar dari masalah, kecuali Anda sudah mengetahui terlebih dahulu masalah Anda yang Anda perlu tahu untuk memperbaiki masalah Anda.

Jadi ini adalah beberapa situasi sulit yang pernah Saya hadapi, dan bagaimana cara Saya menyingkapinya dengan bahasa yang mudah dipahami.

Waduh, Saya telah melakukan hal yang teramat salah, tolong beri tahu Saya kalau git memiliki mesin waktu ajaib!?!

git reflog
# Anda akan melihat daftar dari semua hal yang telah Anda 
# lakukan di git, di semua branch yang ada!
# semuanya memiliki sebuah index HEAD@{index}
# temukan satu di mana Anda belum merusak segalanya
git reset HEAD@{index}
# mesin waktu ajaib

Anda bisa melakukan hal ini untuk mendapatkan kembali barang-barang yang tidak sengaja Anda hapus, atau hanya untuk menghilangkan barang-barang yang Anda coba tapi malah merusak repo, atau me-recover setelah merge yang buruk, atau hanya untuk kembali ke masa di mana semua berjalan dengan baik. Saya menggunakan reflog sering sekali. Terima kasih untuk banyak banyak banyak banyak banyak orang yang telah menyarankan untuk menggunakannya!

Waduh, Saya telah melakukan commit dan langsung menyadari bahwa Saya perlu menambahkan sesuatu!

# Anda buat perubahan
git add . # atau tambahkan secara satu-persatu
git commit --amend --no-edit
# sekarang commit terakhir Anda memiliki perubahan tersebut!
# PERINGATAN: jangan pernah amend commit yang bersifat publik

Ini biasanya terjadi saat Saya commit, dan menjalankan tests/linters... dan waduh, Saya tidak meletakkan spasi setelah tanda sama dengan. Anda juga bisa melakukan perubahan sebagai commit yang baru dan lakukan rebase -i untuk melakukan keduanya secara bersamaan, tapi cara ini jauh lebih cepat.

Peringatan: Anda jangan pernah amend commit yang telah di-push ke public/shared branch! Hanya amend commit yang berada di local copy Anda atau Anda akan mengalami periode yang tidak menyenangkan

Waduh, Saya butuh mengubah pesan di commit terakhir milik Saya!

git commit --amend
# ikuti instruksi untuk mengubah pesan commit

Dasar persyaratan format pesan commit yang menyulitkan.

Waduh, Saya tidak sengaja commit sesuatu di master yang seharusnya ada di branch yang baru!

# buat branch baru dari keadaan master yang sekarang
git branch nama-branch-baru
# hilangkan commit terakhir dari branch master
git reset HEAD~ --hard
git checkout nama-branch-baru
# sekarang commit Anda hidup di branch ini :)

Catatan: ini tidak akan bekerja jika Anda telah melakukan push commit Anda ke public/shared branch, dan jika Anda telah commit hal-hal lain, Anda mungkin memerlukan git reset HEAD@{jumlah-commit-anda} alih-alih HEAD~. Sedih yang tak berujung. Juga, banyak banyak banyak orang menyarankan cara lain untuk melakukan hal ini dengan lebih singkat yang tidak Saya ketahui sebelumnya. Terima kasih semua!

Waduh, Saya tidak sengaja melakukan commit ke branch yang keliru!

# undo commit terakhir, tapi perubahannya tetap tersedia
git reset HEAD~ --soft
git stash
# pindah ke branch yang benar
git checkout nama-branch-yang-benar
git stash pop
git add . # atau tambahkan secara satu-persatu
git commit -m "pesan Anda di sini"
# sekarang perubahan Anda ada di branch yang benar

Banyak orang yang menyarankan untuk menggunakan cherry-pick untuk kondisi ini, jadi silakan pilih cara yang Anda paling sukai!

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

Waduh, Saya coba menjalankan diff tapi tidak terjadi apa-apa?!

Jika Anda mengetahui kalau Anda telah melakukan perubahan pada file tapi diff-nya kosong, mungkin Anda add file anda ke staging dan Anda perlu menggunakan flag yang khusus.

git diff --staged

Letakkan cara ini di bawah ¯\_(ツ)_/¯ (ya, Saya mengetahui bahwa ini adalah fitur, bukan bug, tapi ini memusingkan dan tidak jelas jika ini terjadi pertama kali pada Anda!)

Waduh, Saya perlu melakukan undo commit dari 5 commit yang sebelumnya!

# temukan commit yang perlu Anda undo
git log
# gunakan arrow keys untuk scroll ke atas dan bawah di riwayat
# setelah Anda menemukan commit Anda, simpan hash-nya
git revert [hash yang Anda simpan]
# git akan membuat commit baru yang meng-undo commit tersebut
# ikuti instruksi untuk edit pesan commit 
# atau langsung simpan dan commit

Ternyata Anda tidak perlu mencari dan copy-paste isi dari file yang lama ke file yang telah ada untuk undo perubahan! Jika Anda commit sebuah bug, Anda dapat undo semua commit secara langsung dengan revert.

Anda juga bisa revert sebuah file alih-alih semua commit! Tapi tentu saja, dalam git, hal tersebut ada di himpunan instruksi yang berbeda...

Waduh, Saya perlu undo perubahan saya di file!

# temukan hash untuk sebuah commit sebelum file berubah
git log
# gunakan arrow keys untuk scroll ke atas dan bawah di riwayat
# setelah Anda menemukan commit Anda, simpan hash-nya
git checkout [hash yang telah Anda simpan] -- path/to/file
# versi lama dari file tersebut akan ada di index Anda
git commit -m "Wow, Anda tidak perlu copy-paste untuk melakukan undo"

Saat Saya akhirnya mengetahui hal ini, ini adalah hal yang BESAR. BESAR. B-E-S-A-R. Tapi serius, di planet mana checkout -- masuk akal sebai cara terbaik untuk undo sebuah file? :shakes-fist-at-linus-torvalds:

Lupakan semua ini, Saya menyerah.

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

Terima kasih untuk Eric V. untuk saran ini. Semua komplain tentang pengunaan sudo di lelucon ini dapat diarahkan ke dia.

Tapi serius, jika branch Anda sudah sangat kacau sehingga Anda perlu reset state repo Anda sehingga sama dengan remote repo dalam cara yang "disetujui git", coba ini, tapi hati-hati karena aksi ini destruktif dan tidak dapat direcover!

# ambil state terakhir dari origin
git fetch origin
git checkout master
git reset --hard origin/master
# hapus file dan direktori yang untracked
git clean -d --force
# ulangi checkout/reset/clean untuk setiap branch yang kacau

*Penafian: Situs ini tidak ditujukan sebagai referensi yang lengkap. Dan iya, ada cara lain yang istilahnya lebih murni secara teoretis, tapi Saya telah mencoba semua langkah ini dengan melewati berbagai percobaan dan kesalahan, dan Saya memiliki ide yang tidak masuk akal untuk membagikannya dengan dosis kesembronoan yang pas. Silakan mengikuti atau tidak mengikuti langkah Saya!

Terima kasih banyak untuk semua yang telah suka rela menerjemahkan situs ini ke bahasa lain, kalian keren! Björn Söderqvist (sv) · Moritz Stückler (de) · Daniil Golubev (ru) · Łukasz Wójcik (pl) · fedemcmac (it) · Michel (fr) · Andriy Sultanov (ua) · Meiko Hori (ja) · Alex Tzimas (gr) · Martijn ten Heuvel (nl) · Elad Leev (he) · Franco Fantini (es) · Catalina Focsa (ro) · Davi Alexandre (pt_BR) · Nemanja Vasić (sr) · Tao Jiayuan (zh) · Eduard Tomek (cs) · Ricky Gultom (id) · Khaja Md Sher E Alam (bn) · Rahul Dahal (ne) · Taha Paksu (tr) · Kitt Tientanopajai (th) · Gyeongjae Choi (ko) . Dengan pertolongan tambahan dari Iain Murray · Frank Taillandier · David Fyffe · Lucas Larson · Artem Vorotnikov

Jika Anda ingin membantu menambahkan terjemahan ke bahasa Anda, kirim PR Anda di GitHub