membatalkan ralat!
Jika anda menggunakan Git sebagai sistem kawalan versi anda, anda sudah mempunyai set "alat undo" yang kuat. Artikel ini akan menunjukkan kepada anda lima cara yang kuat untuk membatalkan kesilapan dengan Git!mata utama
git restore
untuk membuang perubahan pada tahap patch. -p
Perintah git log
untuk memulihkan fail ke versi sebelum komit yang salah. git checkout
Reflog
Reflog
Pengguna boleh menggunakan arahan git cherry-pick
git reset
mari kita lihat senario sampel yang mengandungi beberapa perubahan "tempatan" (iaitu perubahan yang belum diserahkan).
NOTA: Untuk gambaran yang lebih baik dan visualisasi yang lebih jelas, saya menggunakan klien Desktop Menara Git dalam beberapa tangkapan skrin. Anda tidak memerlukan menara untuk mempelajari tutorial ini.
mari kita selesaikan masalah dalam pertama. Perubahan yang kami buat sepenuhnya ke arah yang salah. Mari kita membatalkan semua perubahan dan mencipta status komit terakhir fail:
general.css
Sila ambil perhatian bahawa, atau, saya boleh menggunakan arahan
$ git restore css/general.css
yang sedikit dikemas kini (ia hanya memberi tumpuan kepada jenis tugas ini). git checkout
git checkout
Soalan kedua kami dalam git restore
agak rumit. Beberapa perubahan yang kami buat dalam fail ini sebenarnya baik, dan hanya sebahagiannya perlu didokumentasikan.
akan menyelesaikan masalah - tetapi kali ini anda perlu menggunakan bendera git restore
, kerana kita akan masuk ke dalam tahap "patch": -p
$ git restore css/general.css
dalam fail itu - jika anda mahu membuangnya.
anda akan melihat bahawa saya menaip "n" untuk perubahan blok pertama (untuk menyimpannya) dan "y" untuk perubahan blok kedua (untuk membuangnya). Sebaik sahaja proses selesai, anda akan melihat bahawa hanya sekeping pertama perubahan berharga kekal -seperti yang kita mahu!
Kadang -kadang, anda mungkin mahu memulihkan fail
spesifik . Sebagai contoh, anda tahu bekerja dengan baik pada satu ketika pada masa lalu, tetapi tidak sekarang. Pada ketika ini anda ingin kembali masa, tetapi hanya untuk fail khusus ini, bukan keseluruhan projek!
kita perlu mengetahui versi tepat yang kita mahu pulihkan. Menggunakan set parameter yang betul, anda boleh memaparkan index.html
paparan sejarah fail individu anda:
git log
$ git restore -p index.html
yang berubah -ubah, yang sangat berguna untuk mencari versi "Apple Bad" yang menyebabkan masalah muncul.
ini, anda boleh menggunakan bendera index.html
untuk memaparkan perubahan sebenar dalam komitmen ini:
Sebaik sahaja kita mendapati komitmen yang salah yang menyebabkan fail kecil kita comel kita rosak, kita boleh meneruskan untuk memperbaiki ralat. Kami akan melakukan ini dengan memulihkan versi fail sebelum -p
komit! Ini penting: bukannya meneruskan fail dalam komitmen yang salah, kami memulihkan keadaan yang terakhir-yang satu sebelum komit!
$ git log -- index.html
Menghadiri kepada nilai hash komit yang salah akan mengarahkan Git untuk melakukan perkara berikut: Pergi ke versi komit yang dirujuk sebelum
.$ git log -p -- index.html
Selepas melaksanakan perintah ini, anda akan mendapati bahawa ~1
telah diubahsuai dalam salinan kerja tempatan anda: Git memulihkan versi terakhir yang baik untuk kami!
pulih versi yang hilang menggunakan reflog
Satu lagi alat undo yang kuat dalam kit pertolongan cemas git adalah "reflog". Anda boleh memikirkannya sebagai log di mana Git merekodkan semua pergerakan penunjuk kepala yang berlaku di repositori tempatan-seperti komitmen, checkout, gabungan dan rebase, ceri-memilih, dan menetapkan semula. Semua operasi yang lebih penting akan direkodkan dengan baik di sini! index.html
Sudah tentu, log semacam itu sesuai untuk situasi di mana perkara tidak berjalan lancar. Oleh itu mari kita buat bencana kecil terlebih dahulu - maka kita boleh memperbaikinya dengan reflog.
Katakan anda yakin bahawa beberapa komitmen terakhir anda tidak baik: anda ingin menyingkirkannya, jadi anda menggunakan git reset
untuk kembali ke versi sebelumnya. Akibatnya, "kesilapan" komitmen hilang dari sejarah komit anda - seperti yang anda mahukan.
Ini adalah kes klasik alat reflog Git! Mari lihat bagaimana ia menyelamatkan anda:
$ git restore css/general.css
mari kita memecahkannya satu demi satu:
Pertama sekali, Reflog sangat mudah dibuka: A Simple
sudah cukup.git reflog
git reset
$ git restore -p index.html
Pulihkan cawangan yang dipadam
Reflog juga boleh berguna dalam situasi lain. Sebagai contoh, apabila anda secara tidak sengaja memadamkan cawangan yang anda tidak sepatutnya memadamkan. Mari kita lihat senario contoh kami: git reset
Di atas, anda dapat melihat bahawa dalam senario contoh kami, kami sedang menyemak cawangan:
$ git log -- index.html
$ git restore css/general.css
git memberitahu kita kita akan melakukan sesuatu yang sangat serius: Sejak feature/analytics
mengandungi komitmen unik yang tidak wujud di tempat lain, memadamkannya akan memusnahkan beberapa data (mungkin berharga). Ok ... kerana ciri ini tidak lagi diperlukan, kita boleh meneruskan:
$ git restore -p index.html
Anda mungkin menjangkakan apa yang akan berlaku seterusnya: Pemimpin klien/pasukan kami/pengurus projek dengan senang hati memberitahu kami bahawa ciri ini kembali! Mereka mahu terus menerus! ?
Begitu juga, kita menghadapi situasi yang buruk di mana kita mungkin kehilangan data berharga! Oleh itu, mari kita lihat jika reflog dapat menyelamatkan kita lagi:
$ git log -- index.html
untuk beralih ke cawangan lain (kerana git tidak membenarkan anda memadam cawangan semasa). Sudah tentu, checkout ini juga direkodkan dalam reflog. Untuk memulihkan cawangan yang telah kita hapus, kita kini boleh menggunakan keadaan git checkout
sebelum sebagai titik permulaan untuk cawangan baru:
$ git log -p -- index.html
Jika anda menggunakan GUI desktop seperti menara, membatalkan kesilapan tersebut biasanya semudah menekan
cmd z .
bergerak komited ke cawangan yang berbeza
Hari ini, banyak pasukan telah merumuskan peraturan yang melarang penyerahan langsung kepada cawangan jangka panjang seperti "utama", "tuan" atau "membangunkan". Biasanya, komitmen baru hanya boleh mencapai cawangan ini dengan menggabungkan/rebase. Walau bagaimanapun, kita kadang -kadang lupa dan mengemukakan terus ...
mari kita ambil senario berikut sebagai contoh.
kita sepatutnya menyerahkan tetapi secara tidak sengaja mencetuskan komit pada cawangan
feature/newsletter
Pertama sekali, kita perlu memastikan kali ini kita berada di cawangan yang betul, jadi kita sedang menyemak master
:
feature/newsletter
Sekarang kita boleh memindahkan komit dengan selamat dengan menggunakan perintah
$ git checkout <bad-commit-hash>~1 -- index.html
cherry-pick
kita boleh menyemak
$ git reflog
feature/newsletter
Setakat ini, semuanya berjalan lancar. Tetapi cherry-pick
tidak memadamkan komit dari cawangan master
(ia selama -lamanya tidak boleh berada di sana). Oleh itu, kita perlu membersihkan kekacauan kita di sana juga:
$ git restore css/general.css
Kami beralih kembali ke master
dan gunakan git reset
untuk memadam (di sini) yang tidak diingini dari sejarah.
akhir, semuanya kembali ke normal-jadi anda boleh memulakan tarian gembira anda sekarang! ???
Saya katakan sebelum ini, dan malangnya kita semua tahu itu benar: kita tidak dapat mengelakkan kesilapan! Tidak kira betapa baiknya kita pengaturcara, kita akan merosakkannya setiap sekarang dan kemudian. Jadi persoalannya bukan sama ada kita membuat kesilapan, tetapi bagaimana kita mengendalikannya dengan berkesan dan menyelesaikan masalah? Jika anda ingin mengetahui lebih lanjut mengenai alat Git Undo, saya sangat mengesyorkan "Git First Aid Kit". Ini adalah koleksi video pendek (percuma) yang menunjukkan cara membersihkan dan membatalkan kesilapan dalam Git.
Saya ingin anda perkembangan yang lancar, keberanian untuk mencuba, dan sudah tentu anda mesti baik untuk membaiki!Soalan Lazim Mengenai Menggunakan Git Untuk Membatalkan Kesalahan (FAQ)
Apakah perbezaan antara
git reset
git revert
dan Gerakkan penunjuk kepala anda ke komit tertentu. Ini bermakna ia sebenarnya "lupa" semua yang anda miliki selepas menetapkan semula kepada komitmen. Ini adalah operasi yang merosakkan dan harus digunakan dengan berhati -hati. Sebaliknya, git reset
mencipta komit baru untuk membatalkan perubahan yang dibuat dalam komit tertentu. Ini adalah operasi yang selamat kerana ia tidak mengubah sejarah yang sedia ada. git revert
git reset
Bagaimana untuk membatalkan operasi git revert
?
git add
untuk menyimpan perubahan dan ingin membatalkan ini, anda boleh menggunakan perintah . Sekiranya anda ingin membatalkan semua perubahan, anda boleh menggunakan git add
tanpa menentukan fail tersebut. git reset
git reset <file></file>
Bolehkah saya membatalkan git reset
?
git commit
atau Gerakkan penunjuk kepala anda kembali ke komit yang anda mahu membatalkan, berkesan menghapus komitmen yang tidak diingini. Sebaliknya, git reset
akan mewujudkan komit baru untuk membatalkan perubahan yang dibuat dalam komit yang tidak diingini. git revert
git commit
Bagaimana untuk membatalkan perubahan dalam fail tertentu? git reset
git revert
Jika anda telah membuat perubahan pada fail tertentu dan ingin membatalkan perubahan ini, anda boleh menggunakan perintah
git stash
Apa itu? git stash
adalah arahan yang membolehkan anda menyimpan perubahan sementara yang anda tidak mahu menyerahkan segera. Ini berguna jika anda perlu beralih ke cawangan yang berbeza tetapi tidak mahu melakukan perubahan semasa. Anda boleh menggunakan perubahan sementara kemudian menggunakan git stash apply
.
anda boleh menggunakan arahan git log
untuk melihat sejarah git anda. Ini akan menunjukkan kepada anda senarai semua komitmen dalam repositori, serta mesej komitmen mereka.
git push
? Ya, anda boleh membatalkan git push
, tetapi ini sedikit lebih rumit daripada membatalkan perubahan tempatan. Anda perlu menggunakan perintah -f
dengan pilihan --force
atau git push
untuk menimpa repositori jauh dengan repositori tempatan anda. Berhati -hati dengan perintah ini, kerana ia boleh menyebabkan masalah bagi orang lain yang berurusan dengan repositori yang sama.
Jika anda ingin membatalkan pelbagai komitmen, anda boleh menggunakan perintah git reset
dan sintaks HEAD~<number></number>
. Sebagai contoh, git reset HEAD~3
menggerakkan penunjuk kepala anda sebelum tiga melakukan.
Reset lembut menggerakkan penunjuk kepala anda ke komit tertentu, tetapi tidak mengubah direktori kerja dan kawasan pementasan anda. Ini bermakna anda masih akan melihat perubahan daripada "terlupa" yang dilakukan sebagai perubahan yang tidak komited. Sebaliknya, tetapan semula keras akan membuang semua perubahan dalam direktori kerja dan kawasan pementasan, dengan berkesan memulihkan repositori anda ke negeri pada masa komit yang ditentukan.
Ya, komited boleh disambung semula selepas penetapan semula keras, tetapi tidak mudah. Git menyimpan log untuk semua kemas kini ref (seperti pointer kepala bergerak) dalam reflog. Anda boleh menggunakan perintah git reflog
untuk mencari komited yang anda ingin pulih, dan kemudian gunakan git branch
untuk membuat cawangan baru pada komit itu.
Atas ialah kandungan terperinci 5 cara untuk membatalkan kesilapan dengan git. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!