Kawalan versi Git telah menjadi standard dalam kotak alat pemaju moden. Perintah seperti
, commit
dan push
telah lama menjadi memori otot. Walau bagaimanapun, secara relatifnya, beberapa pemaju memahami ciri -ciri "lebih maju" dalam Git dan nilai besar ciri -ciri ini! Artikel ini akan meneroka salah satu alat yang paling berkuasa dalam Git - "Rebase Interaktif". pull
git rebase -i
Rebase interaktif boleh digunakan untuk mengedit maklumat komit lama, memadam komitmen yang tidak perlu, dan menggabungkan pelbagai komitmen menjadi satu, dengan itu mengoptimumkan dan membersihkan sejarah komit. Bandingkan dengan sejarah komit yang bersih dan berstruktur: ia membantu menjadikan asas kod projek lebih mudah dibaca dan
dan lebih mudah difahami. Ini adalah bahagian yang diperlukan dari program yang sihat dan berkekalan!
apa yang boleh dilakukan oleh perubahan asas interaktif untuk andaRebase interaktif membantu anda mengoptimumkan dan membersihkan sejarah komit anda. Ia meliputi banyak kes penggunaan yang berbeza, beberapa di antaranya membolehkan anda melakukan perkara berikut:
Seperti beberapa alat git lain, secara interaktif semula "menulis semula sejarah". Ini bermakna apabila anda menggunakan operasi rebase interaktif untuk mengendalikan satu siri komitmen, bahagian sejarah komit akan ditulis semula oleh : Hash sha-1 komit akan berubah. Mereka adalah objek komit baru, jadi untuk mengatakan. Hakikat bahawa
memerlukan peraturan yang mudah tetapi penting untuk diikuti: Jangan gunakan rebase interaktif (atau alat lain untuk menulis semula sejarah) pada komitmen yang telah anda kongsi dengan rakan sekerja di repositori terpencil. Sebaliknya, gunakannya untuk membersihkan komitmen tempatan anda sendiri -contohnya, di salah satu cawangan ciri anda sendiri -dan kemudian menggabungkannya ke cawangan pasukan.mekanisme asas operasi asas interaktif
Langkah 1: Di manakah anda harus memulakan sesi?
Soalan pertama yang perlu anda jawab ialah: "Bahagian sejarah komit yang saya mahu beroperasi?" Mari kita berikan contoh praktikal, katakan kita ingin mengedit maklumat komit lama (ini adalah apa yang akan kita lakukan kemudian dalam amalan).
Langkah 2: Mulakan sesi sebenar!
Memulakan sesi sebenar adalah sangat mudah:
dengan bendera
(menunjukkan bahawa kami benar -benar mahu ia menjadi "interaktif") dan memberikan komit asas (yang kami datang dengan langkah pertama di atas). Dalam contoh ini, saya menggunakan<code>$ git rebase -i HEAD~3</code>
-i
Langkah 3: Beritahu git apa yang anda mahu lakukan git rebase
HEAD~3
Selepas memulakan sesi rebase interaktif, anda akan melihat tetingkap editor di mana git menyenaraikan satu siri komitmen -dari komitmen terbaru sepanjang jalan ke (tetapi tidak termasuk) komit asas yang anda pilih dalam langkah 1 sebagai penyerahan komitom asas .
Dalam langkah ini, dua mata perlu diberi perhatian kepada:
Salah satu kes penggunaan yang paling popular untuk rebase interaktif ialah anda boleh mengedit penyerahan lama selepas itu. Anda mungkin tahu bahawa
juga membolehkan anda menukar maklumat yang dikemukakan - tetapi ini hanya terpakai kepada penyerahan terkini mari kita lihat senario tertentu. Berikut adalah imej maklumat penyerahan ralat yang perlu diperbetulkan. git commit --amend
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 mengikuti tutorial ini.
Untuk contoh kami, katakan kami ingin mengedit mesej untuk penyerahan semasa bertajuk "Optimalkan Struktur Markup dalam Indeks ...".
Langkah pertama kami adalah untuk menentukan komit asas sesi rebase interaktif ini. Oleh kerana kita harus (sekurang -kurangnya) kembali kepada komitmen induk "Apple Bad" kami, kami menggunakan (tiga komitmen di belakang Ketua komitmen, iaitu komitmen bertajuk "Tukar Tajuk ...") sebagai titik permulaan untuk Sesi:
Selepas melaksanakan arahan ini, editor kegemaran anda akan membuka dan memaparkan senarai komitmen yang anda pilih (dengan memberikan komit asas).
HEAD~3
<code>$ git rebase -i HEAD~3</code>
. Dalam kes kita, kita mahu mengatasi komitmen (yang bermaksud kita mahu mengubah maklumat komit, tetapi menyimpan komit lain).
Malah, semua kata kunci tindakan yang ada ditentukan di bahagian bawah tetingkap ini - jadi tidak perlu ingat apa -apa!
dengan kata kunci tindakan pilihan anda (yang bermaksud "menerima komitmen seperti"), anda hanya menyimpan dan menutup tetingkap. Selepas melakukan ini, tetingkap editor baru akan dibuka dengan maklumat komit semasa. Akhirnya, kita boleh melakukan apa yang kita rancangkan pada mulanya: edit mesej komit lama ini!
lama yang berkomitmen dari sejarah yang anda tidak perlukan (atau tidak mahu). Bayangkan anda secara tidak sengaja memasukkan kata laluan peribadi dalam penyerahan baru -baru ini: Dalam kebanyakan kes, maklumat sensitif tersebut tidak boleh dimasukkan ke dalam asas kod.
Juga ingat bahawa hanya memadam maklumat dan melakukannya sekali lagi tidak menyelesaikan masalah anda: Ini bermakna kata laluan masih disimpan di repositori sebagai komit lama. Apa yang anda mahukan ialah memadam data ini sepenuhnya bersih dari repositori!
Sila ambil perhatian bahawa kali ini saya menggunakan hash SHA-1 tertentu dalam perintah untuk mengendalikan komit itu.
untuk menghilangkan komitmen yang tidak diingini. Atau, dalam kes khas ini, kita hanya boleh memadamkan keseluruhan baris dari editor. Sekiranya baris tidak lagi wujud apabila menjimatkan dan menutup tetingkap (mewakili komit), Git akan memadamkan komit yang sama. Apa sahaja yang anda pilih, selepas menyimpan dan menutup tetingkap editor, penyerahan akan dipadamkan dari sejarah repositori anda!
Satu lagi kes penggunaan untuk rebase interaktif adalah apabila anda ingin menggabungkan pelbagai komitmen berasingan Secara umumnya, membuat komit "lebih besar" (dengan menggabungkan pelbagai komitmen menjadi satu) bukan strategi yang baik dalam kebanyakan kes. Peraturan umum adalah untuk mengekalkan komitmen sekecil mungkin, sebagai "lebih kecil" bermaksud "lebih mudah untuk dibaca dan difahami". Walau bagaimanapun, dalam beberapa kes, ini masih masuk akal. Berikut adalah dua contoh: mari kita lengkapkan contoh praktikal bersama -sama dan gunakan situasi yang ditunjukkan dalam gambar berikut sebagai keadaan permulaan kita. Katakan bahawa semantiknya lebih masuk akal untuk menggabungkan kedua -dua komitmen ini. Menggunakan alat rebase interaktif, kita boleh melakukan ini: Setakat ini, anda sudah terbiasa dengan apa yang sedang berlaku: Tetingkap editor akan dibuka dengan senarai penyerahan. Saya telah menyebut bahawa dalam kes ini kita akan menggunakan kata kunci operasi berfungsi: dalam contoh kami.
Saya harap anda bersetuju bahawa alat rebase interaktif Git sangat berharga! Sebagai pemaju, kita mesti berusaha untuk sejarah komitmen yang bersih dan jelas. Ini adalah faktor utama dalam menjaga asas kod yang sihat dan mudah difahami (untuk rakan sepasukan anda dan diri anda, selepas beberapa ketika telah berlalu). Jika anda ingin mengetahui lebih lanjut, saya sangat mengesyorkan "Git First Aid Kit". Ini adalah koleksi video pendek (percuma) yang menunjukkan cara membersihkan dan membatalkan kesilapan dalam Git. Bersenang -senang! git rebase dan git gabungan adalah dua cara yang berbeza untuk mengintegrasikan perubahan dari satu cawangan ke yang lain. GIT Gabungan adalah cara untuk menggabungkan kod secara langsung dari dua cawangan yang berbeza. Ia mewujudkan komitmen baru dalam sejarah, memelihara urutan kronologi yang dilakukan. Git Rebase, sebaliknya, adalah cara untuk bergerak atau menggabungkan satu siri komitmen menjadi komitmen asas baru. Ia seperti mengatakan "Saya mahu menambah kerja orang lain mengenai perubahan saya". Dalam erti kata lain, ia membolehkan anda meletakkan perubahan pada cawangan semasa di bahagian atas cawangan lain. Jika anda ingin membatalkan rebase git, anda boleh menggunakan arahan Git Interactive Rebase membolehkan anda menukar komitmen dalam pelbagai cara, seperti penyuntingan, pemadaman, dan pemampatan. Anda bukan sahaja boleh mengubah maklumat komit, tetapi juga menukar kod sebenar (jika anda membuat kesilapan). Ini adalah alat yang berkuasa yang memberi anda kawalan sepenuhnya ke atas sejarah penyerahan projek anda. pemampatan adalah perbuatan menggabungkan pelbagai komitmen dalam satu komit. Dalam Git, anda boleh memampatkan komit menggunakan arahan Walaupun Git Interactive Rebase adalah alat yang berkuasa, ia boleh berbahaya jika digunakan secara tidak wajar. Ia menulis semula sejarah komit, yang boleh menyebabkan masalah jika anda berhadapan dengan cawangan awam yang orang lain juga berurusan. Adalah disyorkan untuk menggunakannya di cawangan tempatan yang belum ditolak. Bentrokan mungkin berlaku semasa proses rebase. Git akan berhenti sejenak dan membolehkan anda menyelesaikan konflik ini sebelum meneruskan. Anda boleh membetulkan perubahan yang bercanggah dengan mengedit fail dan kemudian gunakan Ya, anda boleh memecah komitmen yang lebih kecil menggunakan Git Interactive Rebase. Ini sangat berguna jika anda membuat pelbagai perubahan dalam satu komit tetapi kemudian memutuskan bahawa mereka harus berasingan. anda boleh mengedit maklumat penyerahan semasa rebase interaktif. Dalam senarai penyerahan, gantikan Ya, anda boleh menggunakan Git Interactive Rebase untuk menukar susunan komitmen. Dalam senarai komit, anda hanya boleh menukar susunan baris untuk menukar susunan komitmen. Ini sangat berguna jika anda ingin menjadikan sejarah komit anda lebih logik atau lebih jelas.
Rebase interaktif juga membolehkan anda memadam
<code>$ git rebase -i HEAD~3</code>
git rebase -i
HEAD~2
drop
ke dalam satu. Sebelum kita menyelam bagaimana untuk bekerja, mari kita menghabiskan beberapa minit membincangkan kapan atau mengapa ia boleh menjadi berharga.
squash
<code>$ git rebase -i HEAD~3</code>
Garis yang anda tandakan dengan kata kunci akan bergabung dengan garis -garis di atas!
squash
squash
Selepas menyimpan dan menutup tetingkap ini, tetingkap baru akan dibuka. Ini kerana, dengan menggabungkan pelbagai komitmen, kita tentu akan membuat komit baru. Dan penyerahan ini juga memerlukan maklumat penyerahan, sama seperti penyerahan lain!
squash
Gunakan fungsi kuat perubahan asas interaktif
Git Perubahan Interaktif Base FAQ (FAQ)
Apakah perbezaan antara git rebase dan git gabungan?
bagaimana untuk membatalkan git rebase?
git reflog
untuk mencari komit yang anda ingin kembali, dan kemudian gunakan arahan git reset --hard HEAD@{number}
. Perintah git reflog
memaparkan senarai setiap perubahan yang dibuat ke kepala, dan arahan git reset
membolehkan anda menetapkan kepala semasa ke keadaan yang ditentukan. Apakah tujuan Git Interactive Rebase?
Bagaimana menggunakan penyerahan mampatan pembolehubah asas interaktif Git?
git rebase -i
diikuti oleh hash komit untuk memampatkan. Dalam editor teks terbuka, anda boleh menandakan komit yang anda ingin memampatkan dengan menggantikan pick
dengan squash
atau s
. Apakah risiko menggunakan Git Interactive Rebase?
Bagaimana menyelesaikan konflik semasa asas perubahan git?
git add
untuk menambah fail yang diselesaikan untuk menyelesaikan konflik. Selepas semua konflik diselesaikan, anda boleh terus mengubah asas menggunakan git rebase --continue
. Bolehkah saya menggunakan asas perubahan interaktif git untuk memisahkan komit?
Bagaimana untuk mengedit maklumat penyerahan menggunakan asas perubahan interaktif Git?
pick
dengan reword
atau r
untuk menandakan penyerahan untuk diedit. Apabila meneruskan, GIT akan membuka editor teks untuk setiap penyerahan yang ditandakan reword
, membolehkan anda menukar maklumat penyerahan. Apakah perbezaan antara git rebase dan tarik git?
Git pull
adalah arahan yang mengambil perubahan dari repositori jauh dan menggabungkannya ke cawangan semasa. Sebaliknya, Git rebase
adalah arahan yang bergerak atau menggabungkan satu siri komitmen menjadi komitmen asas baru. Walaupun kedua -dua arahan digunakan untuk perubahan integrasi, ia dilakukan secara berbeza. Bolehkah saya menggunakan rebase interaktif git untuk menukar perintah komitmen?
Atas ialah kandungan terperinci Panduan untuk Git Interactive Rebase, dengan contoh praktikal. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!