Saya agak baru di dunia luas Git. Saya telah membaca manual dan telah berlatih tetapi saya bingung tentang beberapa aspek dari itu, yang saya tidak tahu setelah mencari.
Aku bertanya-tanya:
Dalam sebuah proyek (posting komit pertama), kapan saat yang tepat untuk mem-stage file sumber? Tepat sebelum melakukan? Tepat setelah menambahkan / menghapus atau memodifikasi?
Jika file dipentaskan di tengah-tengah antara dua commit, dan kemudian mereka dimodifikasi, apa yang terjadi dengan Git? Apakah perlu memperhatikan perubahan konten saat dinyatakan dan menjadi apa sejak saat itu?
Jika saya membuat file baru, buat stage dan kemudian ingin menghapusnya, mengapa Git meminta saya untuk menggunakan flag "-f" dan "git -rm file.ext" sederhana tidak akan berfungsi?
Saya telah membaca "Apa artinya panggung" dan berbagai mata pelajaran lain dari manual dan tutorial lain tentang Git tetapi seperti yang saya katakan, saya masih tidak mengerti hal-hal di atas.
Jadi, jika Anda bisa, tolong jawab pertanyaan dengan kata-kata dan contoh Anda sendiri sehingga saya mungkin memiliki kesempatan yang lebih baik untuk memahaminya.
Terima kasih.
git diff
dangit diff --cached
bagus, tetapi kadang-kadang saya ingin lebih).Jawaban:
Tujuan area pementasan adalah untuk memiliki ruang yang fleksibel untuk komit Anda. Saya pikir ini akan menjadi lebih jelas jika Anda membandingkan git dengan sistem kontrol versi yang tersentralisasi, seperti subversi.
Subversi
Dalam subversi Anda dapat memilih untuk melakukan file tertentu dari copy pekerjaan Anda. Tetapi hanya file lengkap. Sekarang: Bagaimana jika Anda ingin memformat file
A
, bukan fileB
, dan bagian-bagian fileC
yang berhubungan dengan fileA
namun bukan bagian-bagian yang bergantung pada perubahan dalam fileB
(sejak saat itu Anda akan memiliki masalah dengan konsistensi komit).Git
Git memecahkan ini dengan menyediakan pementasan sebagai copy pekerjaan kedua. Dalam area pementasan Anda sedang membuat snapshot yang akan Anda lakukan (secara kasar).
Oleh karena itu dalam area pementasan Anda dapat membuat snapshot yang mencakup perubahan
A
dan versi fileC
yang hanya mencerminkan perubahan dalamA
.Untuk pertanyaan spesifik
Anda dapat menggelar panggung pada titik mana pun yang Anda inginkan. saya pribadi lebih suka naik panggung tepat sebelum meluncurkan komit.
Ketika memiliki perubahan dalam file yang dipentaskan dan kemudian mengubah file itu dalam copy pekerjaan, Anda belum mengubah file yang dipentaskan. Anda dapat memutuskan apakah akan menampilkannya juga atau tidak mengubah perubahan itu. Yaitu jika Anda menjalankan
git gui citool
Anda akan melihat perbedaan versi bertahap dan tidak bertahap (alat yang bagus dan sederhana untuk pementasan dan pelaksanaan garis-bijaksana).Git berhati-hati di sini, yang mungkin merupakan hal yang baik.
Strategi komit umum: Komitmen granular
Saya pikir ketika berbicara tentang pertanyaan "Kapan saya harus naik panggung", seseorang juga harus berbicara tentang kebiasaan berkomitmen.
VCS terpusat
Dalam sistem kontrol versi terpusat di mana Anda berkomitmen ke server pusat, penting bagi Anda rekan kerja bahwa komitmen Anda lengkap dan teruji dengan baik. Jadi orang akan mencoba untuk melakukan tidak terlalu sering dan kemudian melakukan keadaan file lengkap untuk meminimalkan kemungkinan kesalahan. Dengan demikian, komit cenderung merupakan potongan yang cukup besar yang mencakup banyak perubahan (jika itu bukan perbaikan sederhana). Perubahan dalam sebuah komit bisa sama sekali tidak terkait.
Git
Di Git, komit dilakukan secara lokal, hanya mendorongnya ke server yang membuatnya publik. Karena itu komit murah dalam arti tertentu. Komit dalam arti subversi agak sebanding dengan beberapa
git commit
diikuti olehgit push
. Perbedaan ini penting.Git memungkinkan Anda untuk melakukan satu baris kode, bahkan jika Anda telah mengubah baris lain dalam file yang sama. Ini memberi Anda banyak manfaat karena misalnya Anda dapat melakukan perbaikan bug keamanan di baris 100 sementara mengubah baris 300-350 memperkenalkan fitur baru.
Jadi di mana "kontrol kualitas" dan jaminan build dalam komitmen yang diharapkan pengguna subversi? Itu bergeser ke tindakan lain di git. Anda masih ingin menyingkirkan status program yang berfungsi dalam repositori publik. Karena itu Anda memastikan bahwa tes berhasil dan program bekerja sebelum mendorong perubahan Anda.
Juga, cobalah untuk memanfaatkan cabang ke max. Ketika melakukan banyak perubahan kecil, Anda akan berakhir dengan riwayat versi yang cukup besar. Jika Anda bekerja di cabang, Anda bisa mengkategorikan komitmen granular tersebut dengan nama cabang dan kemudian menggabungkannya kembali (opsi
--no-ff
juga akan mempertahankan bahwa fitur ini tinggal di cabang yang unik).Yakni Anda bisa menjaga kebiasaan penggabungan ke
master
cabang saja, jika cabang dalam keadaan baik . Anda juga dapat menggunakan tag untuk melacak tonggak dan rilis.Sekarang untuk kembali ke pementasan: Setelah Anda komit beberapa baris per komit, Anda akan panggung langsung sebelum komit. (Setidaknya begitulah cara saya melakukannya).
sumber
git add -p
sangat bagus.Saya pikir Anda menganggapnya terlalu serius. Pementasan hanya memilih hal-hal yang ingin Anda sertakan dalam komit berikutnya. Sangat jarang penting kapan atau bagaimana Anda melakukan pementasan; dan jika Anda memiliki banyak perubahan bertahap dan tidak bertahap pada suatu waktu tertentu, Anda mungkin perlu merevisi proses pengembangan Anda.
Saya biasanya melakukannya dengan benar sebelum melakukan (kecuali saya melihat kesalahan ketik, jadi saya harus membuat koreksi saat-terakhir dan juga panggung) Prosesnya adalah sebagai berikut: edit, jalankan tes, tahap, komit. Jika Anda melakukan tahapan sebelum pengujian, kemungkinan tes akan gagal dan Anda harus membuat perubahan dan melakukan tahapan juga, jadi mengapa tidak membiarkannya sampai waktu komit?
Ini akan menunjukkan kepada Anda perbedaan antara kondisi repo saat ini dan (komit terakhir + perubahan bertahap). Saat Anda melakukan beberapa perubahan baru, itu hanya akan menghitung ulang keadaan (komit terakhir + perubahan bertahap).
Sekarang saya menebak di sini, tapi itu mungkin karena info yang dipentaskan mungkin penting (jika tidak Anda tidak akan menampilkannya), tetapi belum di bawah kontrol versi (seperti file yang dapat Anda hapus
git -rm
). Jadigit
ingin memastikan Anda tahu apa yang Anda lakukan.sumber