6 Kesalahan Git yang akan anda buat - dan bagaimana memperbaikinya

Sebab besar pembangun menggunakan sistem kawalan sumber seperti Git adalah untuk mengelakkan bencana. Sekiranya anda melakukan sesuatu yang semudah memadam fail, atau anda mendapati bahawa perubahan yang anda buat pada selusin fail semuanya tidak disarankan, anda boleh membuat asal apa yang telah anda lakukan dengan sedikit kerumitan.

Sebilangan kesalahan Git lebih menakutkan dan sukar dibalikkan, bahkan untuk pengguna Git yang berpengalaman. Tetapi dengan sedikit perhatian - dan dengan syarat anda tidak panik - anda boleh kembali dari beberapa bencana Git terburuk yang diketahui oleh pengaturcara.

Berikut adalah senarai beberapa boo-boo Git yang lebih besar, bersama dengan petua untuk mundur dari mereka dan mencegah beberapa dari mereka. Semakin jauh senarai, semakin besar bencana.

Kesalahan Git # 1: Anda lupa menambahkan perubahan pada komit terakhir

Ini adalah salah satu kesalahan Git yang paling mudah untuk dipulihkan. Katakan anda melakukan kerja di cawangan tempatan, dan kemudian menyedari anda tidak membuat sejumlah fail yang diperlukan. Atau anda terlupa untuk menambahkan butiran tertentu dalam mesej komit.

Tidak gentar. Pertama, jika anda mempunyai perubahan baru untuk dipentaskan, lakukan itu. Kemudian ketik git commit --amenduntuk mengedit mesej komit. Setelah selesai, tekan Esc, kemudian ketik :xquntuk menyimpan dan keluar dari editor. (Langkah terakhir ini adalah langkah yang sering menggerakkan pendatang baru Git, yang tidak selalu menyedari bahawa editor Git bawaan adalah haiwannya sendiri.)

Sekiranya anda hanya menukar fail, dan anda tidak perlu mengubah pesan komit, anda dapat menggunakan git commit --amend --no-edituntuk menambahkan fail dan melewatkan proses penyuntingan pesan.

Salah satu cara untuk mengelakkan kesilapan seperti ini adalah dengan mengubah cara anda melakukan kesalahan di Git. Sekiranya anda mengusahakan sesuatu di mana anda sentiasa membuat komitmen kecil untuk mengesan peningkatan secara bertahap, lakukanlah di cabang pelupusan. Semasa anda melakukan ini, dokumentasikan perubahan besar yang anda buat di suatu tempat - jangan tunggu sehingga anda berhadapan dengan git commitbaris arahan untuk menulis semuanya. Kemudian, apabila anda mencapai tonggak utama, gunakan git merge --squashdari cabang pelupusan anda untuk menyimpan hasilnya ke cabang kerja dalam proses sebagai satu, komitmen bersih, dan gunakan nota yang telah anda ambil untuk mesej komit.

Kesalahan Git # 2: Anda melakukan perubahan kepada tuan (tempatan)

Satu lagi kesalahan umum: Anda secara tidak sengaja telah melakukan banyak perubahan ... tetapi secara tidak sengaja ke cabang induk repo anda. Apa yang anda benar-benar mahu lakukan adalah mengikat mereka ke cabang baru , atau ke devcabang yang anda miliki secara khusus untuk memecahkan perubahan.

Semua tidak hilang. Kesalahan ini dapat diperbaiki dalam tiga perintah:

git branch new-branch

git reset KEPALA ~ --hard

git checkout cawangan baru

Perintah pertama membuat cawangan baru yang ingin kita bekerjasama. Perintah kedua menetapkan semula cabang utama sebelum komit terakhir, tetapi meninggalkan perubahan yang baru anda buat di cabang baru . Akhirnya, kami beralih ke cawangan baru di mana perubahan anda menanti anda.

Sekiranya anda telah membuat beberapa komit, gunakan git reset HEAD~ --hard, di manakah jumlah komitmen yang ingin anda lakukan. Atau anda boleh gunakan git reset , di mana ID hash dari komit sasaran jika anda memilikinya.

Untuk mengelakkan kesilapan ini, masuk ke dalam tabiat membuat cawangan baru dan beralih kepada mereka, walaupun mereka hanya akan dibuang, setiap kali anda memulakan sebarang sesi dengan kod anda.

Kesalahan Git # 3: Anda membuang fail atau direktori

Malapetaka lain yang salah adalah membuang kandungan fail secara salah ... dan hanya mengetahui tentangnya, banyak yang melakukan perkara itu kepada pihak cabang setelah fakta tersebut. Nasib baik ada penyelesaian yang mudah.

Pertama, gunakan git logatau perkakas Git bawaan IDE anda untuk mencari ID hash untuk komit dari sebelum fail diubah. Seterusnya, gunakan git checkout hash_id -- /path/to/fileuntuk memeriksa hanya fail tersebut dari komit yang dimaksud. Perhatikan bahawa jalan harus relatif dengan akar projek. Ini akan meletakkan versi fail yang lebih awal di kawasan pementasan projek anda.

Jika anda hanya mahu kembali n adalah melakukan, anda tidak perlu ID hash. Anda hanya boleh mengeluarkan perintah git checkout HEAD~ -- /path/to/file, di mana jumlah komit yang anda mahu pergi.

Sekiranya anda ingin memeriksa keseluruhan direktori fail, gunakan format wildcard Git untuk jalur fail. Sebagai contoh, memasukkan  git checkout HEAD~1 -- ./src/**akan membawa anda kembali satu komit dan memulihkan semua yang ada dalam /srcdirektori dari akar projek anda.

Kesalahan Git # 4: Anda tidak sengaja memotong cawangan

Inilah senario yang kita semua takuti: menghapus keseluruhan cawangan dari repositori kita secara tidak sengaja. Yang satu ini boleh menjadi sangat mudah pulih atau sedikit lebih rumit, bergantung pada keadaannya.

Pertama, gunakan git refloguntuk mencari komitmen terakhir yang dibuat ke cawangan. Kemudian gunakan hash ID untuk membuat cawangan baru:

git checkout -b restored-branch

Perhatikan bahawa ini akan melepaskan bacon anda hanya jika cawangan yang berkenaan sudah digabungkan. Sekiranya anda memaksa cawangan yang tidak digabungkan secara paksa , anda mempunyai satu cara lagi untuk mencarinya, dengan syarat anda belum berjalan git gcdi repositori:

git fsck --full --no-reflogs --unreachable --lost-found

Ini akan membuang senarai semua hash komit untuk objek yang tidak dapat dicapai lagi, termasuk cabang yang dihapuskan. Cari dari bawah senarai untuk mendapatkan entri "komitmen yang tidak dapat dicapai", dan cuba kembalikan ID hash itu ke cabang baru untuk melihat apakah itu yang anda sampah. Sekiranya tidak, jalankan senarai ke senarai berikutnya, dan lihat apa yang anda boleh pulihkan.

Sebagai peraturan umum, jangan sekali-kali memaksakan hapus cawangan secara lalai, kerana anda boleh dengan mudah membuang sampah ke cawangan yang tidak digabungkan yang masih mempunyai sesuatu yang berharga di dalamnya. Sekiranya anda biasa memotong cawangan secara paksa, itu petanda bahawa kebiasaan kerja anda dengan cawangan perlu tidak terlalu kemas.

Kesalahan Git # 5: Anda memikat cawangan terpencil dengan git push

Sekali saya mengusahakan salinan repositori GitHub tempatan, dan secara salah mendorong cabang induk saya ke salinan jauh dengan --forcepilihan. Saya berakhir dengan salinan repo umum yang tidak dalam keadaan boleh digunakan pada masa itu. Alamak besar.

Sekiranya anda melakukan kesalahan seperti ini, dan repo anda diselaraskan dengan repo jarak jauh baru-baru ini, anda boleh menggunakan salinan cawangan repo jauh anda sendiri untuk memperbaikinya. Tukar ke cawangan yang perlu anda segerak semula, dengan anggapan anda belum ada di sana, dan keluarkan arahan ini:

git reset --hard /@{1}

Ini akan menetapkan semula salinan anda ke versi terakhir yang disegerakkan . Dalam kes saya cawangan itu masterdan repo jauh origin, jadi saya boleh menggunakan git reset --hard origin/[email protected]{1}.

Kemudian gunakan git push -f untuk mengembalikan repositori jauh ke keadaannya yang lebih awal.

Salah satu cara untuk mencegah perkara ini berulang adalah dengan menolak penolakan secara paksa. Anda boleh mengkonfigurasinya di repo Git jauh dengan arahan ini:

git config --system receive.denyNonFastForwards true

Mungkin ada saatnya anda perlu melakukan penekanan secara paksa, tetapi mungkin yang terbaik adalah menghidupkannya ketika anda memerlukannya dan mematikan ketika anda tidak memerlukannya.

Kesalahan Git # 6: Anda memberikan maklumat peribadi ke repo awam

Ini mungkin masalah Git yang paling teruk dan sukar untuk ditangani. Anda secara keliru melakukan data sensitif ke repo awam, dan anda ingin mengeluarkan fail dari pembedahan. Anda harus memastikan data sensitif tidak dapat dijumpai walaupun dengan melakukan komitmen sebelumnya, tetapi anda perlu melakukannya  tanpa menyentuh perkara lain.

Perkara ini sangat sukar jika fail yang dimaksudkan telah dibuat, oh, enam minggu yang lalu, dan sebilangan besar kerja penting lain telah dilakukan untuk sementara waktu. Anda tidak boleh kembali ke belakang sebelum fail ditambahkan; anda akan merosakkan semua yang lain dalam proses.

Berita baiknya: Beberapa pengawal Git yang berani membuat alat, BFG Repo-Cleaner, khusus untuk tujuan menghapus data buruk dari repositori Git. BFG Repo-Cleaner membolehkan anda melakukan tugas biasa di repo dengan cepat seperti membuang semua fail yang sepadan dengan wildcard tertentu atau mengandungi teks tertentu. Anda bahkan boleh memasukkan fail yang menyenaraikan semua teks yang tidak diingini.

BFG Repo-Cleaner pada dasarnya adalah automasi untuk proses berbilang langkah menggunakan git filter-branch. Sekiranya anda lebih suka melakukan sesuatu dengan tangan, GitHub mempunyai panduan terperinci mengenai proses tersebut. Tetapi alat BFG merangkumi sebilangan besar kes penggunaan umum, yang kebanyakannya dimasukkan ke dalam pilihan baris perintah alat tersebut. Tambahan, prosesnya panjang dan rumit, dan terlalu mudah untuk menembak kaki anda di suatu tempat di sepanjang jalan jika anda melakukannya dengan tangan.

Perhatikan bahawa jika anda membersihkan data dari cawangan tempatan yang harus disegerakkan di tempat lain, anda tidak akan dapat menyegerakkan kecuali dengan menekan secara kuat ke cabang jauh. Keseluruhan pokok komitmen harus ditulis semula, jadi anda pada dasarnya menulis sejarah yang sama sekali baru. Anda juga perlu memastikan orang lain menarik salinan baru repo yang ditulis semula selepas perubahan anda, kerana repos mereka tidak akan berlaku lagi.