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! 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 pertolongan tambahan dari Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil
Jika Anda ingin membantu menambahkan terjemahan ke bahasa Anda, kirim PR Anda di GitHub