Baru-baru ini saya melihat bagaimana saya dan tim saya menggunakan Git dan bagaimana alur kerja kami bekerja. Kami saat ini menggunakan alur kerja cabang fitur yang tampaknya berfungsi dengan baik.
Saya juga melihat beberapa orang di tim kami menggunakan alur kerja berdasarkan simpanan git . Alur kerjanya berjalan seperti ini:
- Bekerja di cabang utama (seperti
master
) - Buat komitmen saat Anda pergi
- Jika Anda perlu mendapatkan perubahan atau beralih cabang, dorong perubahan Anda yang tidak dikomit ke simpanan
- Setelah pembaruan Anda selesai, buang perubahan dari simpanan.
Saya harus menyebutkan bahwa alur kerja ini digunakan sebagai pengganti alur kerja cabang fitur. Alih-alih mengambil cabang dan mengerjakannya, pengembang di sini hanya pernah bekerja pada satu cabang tunggal dan mendorong / pop dari tumpukan sesuai keinginan mereka.
Saya sebenarnya tidak berpikir ini adalah alur kerja yang hebat, dan percabangan akan lebih tepat daripada menggunakan simpanan git dengan cara ini. Saya dapat melihat nilai git simpanan sebagai operasi darurat, tetapi tidak untuk menggunakannya dalam alur kerja harian yang teratur.
Apakah menggunakan git simpanan secara teratur dianggap sebagai anti-pola? Jika demikian, apa saja masalah khusus yang bisa muncul? Jika tidak, apa manfaatnya?
If you need to get changes or switch branches, push your uncommitted changes onto the stash
- thats persis apa simpanan adalah untuk.Jawaban:
Dari Git SCM Book :
Dengan uraian ini, saya akan mengatakan ini adalah Pola Anti. Penjelasan Git Stash yang terlalu disederhanakan adalah bahwa itu adalah "Potong dan Tempel" dari kontrol sumber. Anda mengambil banyak file yang diubah, "menyimpannya" dalam pena di luar alur kerja percabangan normal Git, dan kemudian mengajukan kembali perubahan itu ke cabang lain di kemudian hari.
Kembali sedikit lebih jauh, berkomitmen untuk menguasai adalah pola anti di sini. Gunakan cabang. Untuk itulah mereka dirancang.
Ini benar-benar bermuara pada ini:
Anda dapat memalu sekrup ke dinding dan itu akan menahan gambar, tetapi menggunakan obeng adalah apa yang harus Anda lakukan. Jangan gunakan palu saat obeng duduk tepat di samping Anda.
Tentang Komit "Rusak" Kode
Sementara berikut ini adalah opini, saya sampai pada pendapat ini dari pengalaman.
Berkomitmen awal, dan komit sering. Komit sebanyak mungkin kode yang Anda inginkan. Lihat riwayat komit lokal Anda sebagai "save points" saat Anda meretas sesuatu. Setelah Anda melakukan pekerjaan logis, buatlah sebuah komit. Tentu itu bisa menghancurkan segalanya, tapi itu tidak masalah selama Anda tidak mendorong komitmen itu. Sebelum mendorong, rebase dan remas komit Anda.
Untuk OP, utas pesan kernal Linux ini mungkin menarik, karena kedengarannya seperti beberapa anggota tim OP menggunakan Git dengan cara yang sama.
@RibaldEddie mengatakan dalam komentar di bawah ini:
(dengan risiko menimbulkan kemarahan banyak orang)
Linus berkata:
Apa yang saya pikirkan @RibaldEddie coba katakan adalah bahwa Anda dapat menggunakan
git stash
alur kerja cabang fitur - dan ini benar. Bukan penggunaangit stash
itu masalahnya. Ini adalah kombinasi dari komitmen untuk menguasai dan menggunakangit stash
. Ini adalah pola anti.Mengklarifikasi
git rebase
Dari komentar @ RibaldEddie:
(Penekanan milikku)
Memodifikasi riwayat komit bukanlah hal yang buruk, asalkan itu adalah sejarah komit lokal . Jika Anda rebase melakukan yang sudah Anda dorong, Anda pada dasarnya akan yatim piatu dengan orang lain menggunakan cabang Anda. Ini buruk.
Sekarang, katakan Anda telah membuat beberapa komitmen selama sehari. Beberapa komitmen bagus. Beberapa ... tidak begitu baik. The
git rebase
perintah dalam hubungannya dengan meremas komit Anda adalah cara yang baik untuk membersihkan sejarah komit lokal Anda. Sangat menyenangkan untuk menggabungkan satu komit ke cabang publik karena menjaga komit sejarah cabang bersama tim Anda bersih. Setelah rebasing, Anda akan ingin menguji lagi, tetapi jika tes lulus maka Anda dapat mendorong satu komit bersih daripada beberapa yang kotor.Ada thread Linux Kernel lain yang menarik tentang clean commit history .
Lagi, dari Linus:
(penekanan milikku)
Kesimpulan
Pada akhirnya, OP memiliki beberapa pengembang melakukan ini:
Ada dua masalah disini:
git stash
dangit pull
menguasai saat mereka harus menggunakan cabang fitur.Tidak ada yang salah dengan menggunakan
git stash
- terutama sebelum tarikan - tetapi menggunakangit stash
dengan cara ini adalah pola anti ketika ada alur kerja yang lebih baik di Git.Mereka menggunakan
git stash
herring merah. Bukan itu masalahnya. Berkomitmen untuk menguasai adalah masalahnya.sumber
Saya pribadi hanya menggunakan
stash
untuk gangguan pendek dan tak terduga, seperti seseorang yang mengajukan pertanyaan yang memerlukan perubahan ke cabang yang berbeda. Saya melakukan ini karena saya sudah lupa tentang simpanan sebelumnya, maka mereka tidak akan berlaku bersih. Komit reguler pada cabang fitur jauh lebih sulit untuk dilupakan, dan lebih mudah untuk digabung, jadi sekarang saya cenderung membuat komit yang rusak, lalu melakukan agit reset HEAD~1
atau rebase jika saya tidak ingin menyimpannya nanti.Namun, hal hebat tentang kontrol versi terdistribusi adalah orang-orang dapat menggunakan alur kerja pilihan mereka dalam repositori mereka sendiri, selama repositori bersama memenuhi standar. Saya akan memastikan orang tidak hanya menggunakan
stash
alur kerja karena mereka tidak memiliki cukup pelatihan atau kesadaran akan alternatif, tetapi jika mereka masih memilih alur kerja yang Anda temukan kurang optimal, saya akan membiarkannya.sumber
Saya pikir bagian dari pertanyaan Anda yang merupakan anti-pola adalah penggunaan satu cabang master bersama . Namun, jika Anda menyertakan cabang pengembangan di samping cabang master dan kemudian menggunakan simpanan untuk menangani sakelar konteks Anda sendiri di cabang pengembangan, itu tidak akan menjadi anti-pola, dan itu sangat erat mencerminkan beberapa alur kerja dijelaskan oleh organisasi seperti Etsy dan Facebook.
Yang telah dikatakan, jawaban @Greg Burghardt di atas agak terlalu menguntungkan untuk apa yang disebut aliran kerja git-flow atau fitur-cabang. Saya dulu menganjurkan untuk strategi yang sama tetapi setelah menyadari bahwa itu menambah kompleksitas yang tidak perlu dan menciptakan rasa aman yang salah, saya tidak lagi melakukannya. Ini juga peninggalan dari hari-hari sistem kontrol versi non-desentralisasi seperti subversi.
Pertama karena Git adalah sistem kontrol versi terdesentralisasi tidak seperti subversi, repositori lokal pengembang pada dasarnya adalah cabang raksasa dari kode itu sendiri. Apa yang dikembangkan individu tidak secara lokal dan tidak seharusnya berdampak pada anggota tim lainnya kecuali kode yang rusak atau bermasalah didorong ke cabang yang dibagikan di repositori bersama.
Perintah rebase, bagaimanapun, dapat merusak sejarah cabang ketika ada konflik gabungan di salah satu komit yang diputar ulang. Dari http://ryantablada.com/post/the-dangers-of-rebasing-a-branch
Lebih jauh lagi, beberapa model percabangan mengandaikan bahwa tidak ada dua cabang yang bisa mengandung perubahan kode yang saling tergantung. Ketika hal itu benar-benar terjadi, pengembang sekarang harus menyulap lebih banyak cabang agar bekerja secara efisien.
Anti-pola dasar yang saya lihat tidak terkait dengan cabang vs simpanan, tetapi lebih tentang jenis masalah yang telah dibicarakan oleh beberapa orang yang sangat cerdas untuk sementara waktu sekarang: apakah Anda memiliki keyakinan pada kode Anda melalui penggunaan unit test dan arsitektur yang bagus? Apakah Anda dapat membuat perubahan tambahan pada kode Anda sedemikian rupa sehingga pengembang Anda dapat beralasan tentang perubahan dengan mudah dan memahami apa yang akan dilakukan perubahan? Apakah pengembang Anda bahkan menjalankan kode baru sekali untuk melihat apakah itu benar-benar berfungsi? (Ya saya pernah melihat ini sebelumnya).
Jika jawaban untuk pertanyaan-pertanyaan itu adalah tidak, maka tidak masalah berapa banyak cabang yang Anda miliki - pengembang akan mengatakan bahwa kode siap, berfungsi, dan cocok untuk produksi ketika sebenarnya tidak, dan tidak ada jumlah cabang yang akan membantu Anda ketika kode itu tetap berproduksi.
sumber
git stash
adalah alat. Itu sendiri bukanlah suatu pola, juga bukan anti-pola. Ini adalah alat, seperti palu adalah alat. Menggunakan palu untuk menggerakkan paku adalah sebuah pola dan menggunakan palu untuk menggerakkan sekrup adalah pola anti. Demikian juga, ada alur kerja dan lingkungan di managit stash
alat yang tepat untuk digunakan, dan alur kerja dan lingkungan di mana itu salah.Alur kerja 'semua orang berkomitmen dan mendorong ke arus utama' adalah yang bekerja cukup masuk akal di mana tidak ada perubahan risiko tinggi. Ini sering terlihat digunakan dalam lingkungan svn di mana ada satu server pusat otoritatif yang memiliki kode.
Git, bagaimanapun, ada hubungannya dengan server pusat. Setelah semua pengembang melakukan
commit
,pull
(ataurebase
jika Anda suka itu),push
sepanjang waktu dapat membuat kekacauan besar.Masalah terbesar muncul ketika Anda memiliki sesuatu yang sedang berjalan yang rusak dan Anda perlu mengerjakan bug prioritas. Ini berarti Anda perlu sedikit mengesampingkan pekerjaan itu, mengambil yang terbaru, mengerjakannya tanpa memiliki pekerjaan sebelumnya yang sedang berjalan menyebabkan masalah dengan bangunan yang Anda coba lakukan.
Untuk ini,
git stash
akan menjadi alat yang tepat untuk digunakan.Namun, ada masalah yang lebih besar yang mengintai di jantung alur kerja ini. Apakah adalah bahwa semua peran cabang kontrol versi berada di cabang tunggal. Arus utama, pengembangan, pemeliharaan, akumulasi, dan pengemasan semuanya ada di Master. Ini masalah. (Lihat Strategi Cabang SCM Lanjutan untuk lebih lanjut tentang pendekatan ini ke cabang)
Dan ya, Anda memang memanggilnya bahwa itu bukan alur kerja yang hebat dan bahwa ada masalah dengannya. Namun, masalahnya bukan pada alat
git stash
. Masalahnya adalah kurangnya percabangan yang berbeda untuk peran atau untuk kebijakan yang tidak kompatibel .git stash
Namun, adalah sesuatu yang saya gunakan ketika saya memiliki situasi di mana saya telah membangun sedikit, dalam keadaan lengket yang saya tidak yakin apakah itu yang benar ... jadi saya menyembunyikan perubahan saya dan kemudian mengeksplorasi pendekatan lain untuk memecahkan masalah tersebut. Jika itu berhasil - hebat, buang barang-barang di simpanan dan lanjutkan. Jika eksplorasi lain menjadi lebih lengket kemudian reset kembali ke perubahan sebelumnya dan mengajukan kembali simpanan untuk mengerjakannya. Alternatifnya adalah dengan melakukan, checkout, cabang dan kemudian melanjutkan pada cabang baru ini atau kembali dan mengatur ulang. Pertanyaannya adalah apakah itu benar-benar layak dimasukkan ke dalam sejarah ketika itu hanya sesuatu yang ingin saya jelajahi sebentar?git stash
bukan pola anti. Menggunakangit stash
sebagai alternatif untuk bercabang sementara semua orang berkomitmen untuk Master adalah anti pola - tetapi bukan karenagit stash
.Jika Anda belum menekannya, tunggulah sampai Anda memiliki masalah dengan build , ketika seseorang perlu membuat perubahan arsitektur yang signifikan pada banyak file (dan konflik gabungan) atau beberapa pekerjaan yang belum teruji dalam kode progres yang bocor ke produksi untuk ini anti-pola untuk mengejar ketinggalan dengan Anda.
sumber