6 Kesalahan besar yang akan Anda buat - dan cara memperbaikinya

Alasan utama pengembang menggunakan sistem kendali sumber seperti Git adalah untuk menghindari bencana. Jika Anda melakukan sesuatu yang sederhana seperti menghapus file secara tidak sengaja, atau Anda menemukan bahwa perubahan yang Anda buat pada selusin file semuanya tidak benar, Anda dapat membatalkan apa yang telah Anda lakukan dengan sedikit kerumitan.

Beberapa kesalahan Git lebih menakutkan dan sulit untuk dibalik, bahkan untuk pengguna Git berpengalaman. Tetapi dengan sedikit perhatian - dan asalkan Anda tidak panik - Anda dapat memutar kembali dari beberapa bencana Git terburuk yang diketahui oleh pemrogram.

Berikut adalah daftar dari beberapa Git boo-boo yang lebih besar, bersama dengan tip untuk mundur dari mereka dan mencegah beberapa darinya. Semakin jauh Anda turun daftar, semakin besar bencana yang terjadi.

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

Ini adalah salah satu kesalahan Git termudah untuk dipulihkan. Katakanlah Anda melakukan beberapa pekerjaan ke cabang lokal, lalu menyadari Anda tidak melakukan sejumlah file yang dibutuhkan. Atau Anda lupa menambahkan detail tertentu dalam pesan komit.

Tidak takut. Pertama, jika Anda memiliki perubahan baru untuk dipentaskan, lakukan itu. Kemudian ketik git commit --amenduntuk mengedit pesan komit. Setelah Anda selesai, tekan Esc, lalu ketik :xquntuk menyimpan dan keluar dari editor. (Langkah terakhir ini adalah langkah yang sering membuat bingung para pendatang baru Git, yang tidak selalu menyadari bahwa editor Git yang ada di dalamnya adalah hewannya sendiri.)

Jika Anda hanya mengubah file, dan Anda tidak perlu mengubah pesan komit, Anda dapat menggunakan git commit --amend --no-edituntuk menambahkan file dan melewati proses pengeditan pesan.

Salah satu cara untuk menghindari kesalahan semacam ini adalah dengan mengubah cara Anda membuat komitmen di Git. Jika Anda mengerjakan sesuatu di mana Anda terus-menerus membuat komitmen kecil untuk melacak revisi tambahan, lakukan di cabang sekali pakai. Saat Anda melakukan ini, dokumentasikan perubahan besar yang Anda buat di suatu tempat - jangan menunggu sampai Anda dihadapkan pada git commitbaris perintah untuk menuliskan semuanya. Kemudian, saat Anda mencapai tonggak penting, gunakan git merge --squashdari cabang sekali pakai untuk menyimpan hasil ke cabang pekerjaan yang sedang berjalan sebagai komit tunggal, bersih, dan gunakan catatan yang Anda buat untuk pesan komit.

Kesalahan Git # 2: Anda melakukan perubahan pada master (lokal)

Kesalahan umum lainnya: Anda dengan patuh melakukan banyak perubahan ... tetapi ke cabang master repo Anda karena kesalahan. Apa yang Anda benar - benar ingin lakukan adalah mengikatnya ke cabang baru , atau ke devcabang yang Anda miliki secara khusus untuk melanggar perubahan.

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

git branch new-branch

git reset HEAD ~ --hard

git checkout new-branch

Perintah pertama membuat cabang baru yang ingin kita kerjakan. Perintah kedua menyetel ulang cabang utama ke sebelum komit terakhir, tetapi meninggalkan perubahan yang baru saja Anda buat di cabang baru . Terakhir, kami beralih ke cabang baru tempat perubahan Anda menanti Anda.

Jika Anda telah membuat beberapa komit, gunakan git reset HEAD~ --hard, di mana jumlah komit kembali yang ingin Anda tuju. Atau Anda dapat menggunakan git reset , di mana ID hash dari komit target jika Anda memiliki itu.

Untuk menghindari kesalahan ini, biasakan membuat cabang baru dan beralih ke cabang-cabang itu, bahkan jika mereka hanya akan dibuang, setiap kali Anda memulai sesi apa pun dengan kode Anda.

Kesalahan Git # 3: Anda membuang file atau direktori

Bencana umum lainnya adalah secara keliru mencemari konten file ... dan hanya mengetahuinya banyak yang berkomitmen ke cabang setelah fakta. Untungnya ada perbaikan yang mudah.

Pertama, gunakan git logalat Git bawaan IDE Anda untuk menemukan ID hash untuk komit dari sebelum file diubah. Selanjutnya, gunakan git checkout hash_id -- /path/to/fileuntuk memeriksa hanya file itu dari komit yang dimaksud. Perhatikan bahwa jalur tersebut harus relatif terhadap root proyek. Ini akan menempatkan versi file sebelumnya di area pementasan proyek Anda.

Jika Anda hanya ingin kembali dan melakukan, Anda tidak memerlukan ID hash. Anda bisa mengeluarkan perintah git checkout HEAD~ -- /path/to/file, di mana jumlah komit kembali yang ingin Anda tuju.

Jika Anda ingin memeriksa seluruh direktori file, gunakan format wildcard Git untuk jalur file. Misalnya, memasukkan  git checkout HEAD~1 -- ./src/**akan membawa Anda kembali satu komit dan memulihkan semua yang ada di /srcdirektori dari root proyek Anda.

Kesalahan Git # 4: Anda tidak sengaja menghapus cabang

Inilah skenario yang kita semua takuti: secara tidak sengaja menghapus seluruh cabang dari repositori kita. Yang ini bisa sangat mudah untuk dipulihkan atau sedikit lebih rumit, tergantung pada situasinya.

Pertama, gunakan git refloguntuk menemukan komit terakhir yang dibuat ke cabang. Kemudian gunakan ID hash untuk membuat cabang baru:

git checkout -b restored-branch

Perhatikan bahwa ini akan membatalkan penggalian daging Anda hanya jika cabang yang dipermasalahkan sudah digabungkan. Jika Anda menghapus paksa cabang yang tidak digabungkan , Anda memiliki satu cara lagi untuk menemukannya, asalkan Anda belum menjalankannya git gcdi repositori:

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

Ini akan membuang daftar semua hash komit untuk objek yang tidak lagi dapat dijangkau, termasuk cabang yang dihapus. Lihat dari bawah daftar ke atas untuk entri "komit yang tidak dapat dijangkau", dan coba pulihkan ID hash itu ke cabang baru untuk melihat apakah itu yang Anda buang. Jika tidak, lanjutkan ke daftar berikutnya, dan lihat apa yang dapat Anda pulihkan.

Sebagai aturan umum, jangan pernah menghapus paksa cabang secara default, karena Anda dapat dengan mudah berakhir dengan membuang limbah ke cabang yang tidak digabungkan yang masih memiliki sesuatu yang berharga di dalamnya. Jika Anda terbiasa menghapus paksa cabang, itu tandanya kebiasaan kerja Anda dengan cabang harus tidak terlalu berantakan.

Kesalahan Git # 5: Anda memukuli cabang jarak jauh dengan git push

Suatu kali saya mengerjakan salinan lokal dari repositori GitHub, dan secara tidak sengaja mendorong cabang master saya ke salinan jarak jauh dengan --forceopsi. Saya mendapatkan salinan publik dari repo yang tidak dalam keadaan dapat digunakan pada saat itu. Ups besar.

Jika Anda telah membuat kesalahan seperti ini, dan repo Anda telah disinkronkan dengan repo jarak jauh baru-baru ini, Anda dapat menggunakan salinan cabang repo jarak jauh Anda sendiri untuk memperbaikinya. Beralih ke cabang yang perlu Anda sinkronkan ulang, dengan asumsi Anda belum ada di sana, dan berikan perintah ini:

git reset --hard /@{1}

Ini akan menyetel ulang salinan Anda ke versi terakhir yang disinkronkan . Dalam kasus saya, cabang itu masterdan repo jarak jauhnya origin, jadi saya bisa menggunakan git reset --hard origin/[email protected]{1}.

Kemudian gunakan git push -f untuk memulihkan repositori jarak jauh ke keadaan semula.

Salah satu cara untuk mencegah hal ini terjadi lagi adalah dengan melarang dorongan paksa. Anda dapat mengkonfigurasi ini di repo Git jarak jauh dengan perintah ini:

git config --system receive.denyNonFastForwards true

Mungkin ada saatnya Anda perlu melakukan dorongan-paksa, tetapi mungkin yang terbaik adalah mengaktifkannya saat Anda membutuhkannya dan mematikannya saat Anda tidak membutuhkannya.

Kesalahan Git # 6: Anda memasukkan informasi pribadi ke repo publik

Ini mungkin masalah Git yang paling buruk dan paling sulit untuk ditangani. Anda keliru memasukkan data sensitif ke repo publik, dan Anda ingin mengeluarkan file dari repo secara operasi. Anda perlu memastikan data sensitif tidak dapat ditemukan bahkan dengan kembali ke commit sebelumnya, tetapi Anda perlu melakukannya  tanpa menyentuh apa pun.

Ini sangat sulit jika file yang dipermasalahkan telah dibuat, oh, enam minggu yang lalu, dan satu truk penuh pekerjaan penting lainnya telah dilakukan sementara itu. Anda tidak bisa memutar kembali ke sebelum file ditambahkan; Anda akan menghancurkan semua yang lain dalam prosesnya.

Kabar baiknya: Beberapa pakar Git yang pemberani menciptakan sebuah alat, BFG Repo-Cleaner, khusus untuk tujuan menghapus data buruk dari repo Git. BFG Repo-Cleaner memungkinkan Anda dengan cepat melakukan tugas-tugas umum pada repo seperti menghapus semua file yang cocok dengan wildcard tertentu atau berisi teks tertentu. Anda bahkan dapat memasukkan file yang mencantumkan semua teks yang tidak diinginkan.

BFG Repo-Cleaner pada dasarnya adalah otomatisasi untuk penggunaan proses multi-langkah git filter-branch. Jika Anda lebih suka melakukan sesuatu dengan tangan, GitHub memiliki panduan proses yang mendetail. Tetapi alat BFG mencakup sebagian besar kasus penggunaan umum, banyak di antaranya dimasukkan ke dalam opsi baris perintah alat. Plus, prosesnya panjang dan rumit, dan terlalu mudah untuk menembak diri sendiri di suatu tempat di sepanjang jalan jika Anda melakukannya dengan tangan.

Perhatikan bahwa jika Anda membersihkan data dari cabang lokal yang harus disinkronkan di tempat lain, Anda tidak akan bisa menyinkronkan kecuali dengan cara memaksa-push ke cabang jarak jauh. Seluruh pohon komit harus ditulis ulang, jadi pada dasarnya Anda menulis sejarah yang sama sekali baru ke remote. Anda juga perlu memastikan bahwa semua orang menarik salinan baru dari repo yang ditulis ulang setelah perubahan Anda, karena repo mereka juga tidak akan valid.