Apa yang dimaksud dengan komit atom untuk sistem versi?

34

Salah satu alasan mengapa programmer lebih suka SVN daripada CVS adalah karena mantan memungkinkan atom melakukan? Apa artinya ini ?

Kutu buku
sumber
Ini mungkin membantu seseorang , itu menjelaskan apa itu (menggunakan git sebagai contoh, tetapi mungkin dapat diterapkan untuk VCS lainnya)
Fagner Brack

Jawaban:

69

Ini berarti bahwa ketika Anda melakukan komit ke sistem kontrol versi baik semua yang Anda ingin komit masuk, ATAU tidak ada yang berhasil.

Di CVS, ketika Anda mencoba komit, komit mungkin berhasil di beberapa file, lalu gagal di beberapa file lain (karena mereka telah berubah). Ini meninggalkan repositori dalam keadaan yang tidak menguntungkan karena setengah dari komit Anda tidak ada di sana, dan kemungkinan Anda telah meninggalkan beberapa hal dalam keadaan di mana mereka tidak akan dikompilasi atau lebih buruk. Sekarang Anda harus cepat dan mengintegrasikan perubahan apa pun sehingga Anda dapat melakukan file lain sebelum orang lain perlu memperbarui dan mendapatkan set perubahan yang rusak.

Dalam SVN ini tidak akan terjadi - SVN akan melakukan semua yang telah Anda ubah, atau itu akan gagal keseluruhan perubahan. Dengan demikian, Anda tidak akan pernah meninggalkan repositori dalam keadaan rusak karena melakukan masalah.

Michael Kohne
sumber
9
Hasil yang penting dari ini adalah bahwa jika Anda memeriksa di setiap negara diberikan maka hasilnya selalu keadaan konsisten (pembatasan apapun user-kesalahan seperti lupa untuk melakukan sebuah file, tentu saja): Ini baik dari sebelum komit atau dari setelah komit dan tidak ada di antara keduanya. Di CVS bisa dari "setengah jalan melalui komit". Perilaku SVN sangat baik untuk hal-hal seperti integrasi berkelanjutan. Untuk sistem CVS sistem tersebut digunakan untuk menegakkan "periode tenang" di mana mereka hanya menggunakan check-out yang diberikan jika tidak ada lagi komitmen di mana dilakukan sejumlah detik / menit setelah checkout.
Joachim Sauer
2
kenangan buruk tentang penggunaan CVS membuat saya terpukul saat saya membaca ini.
shabunc
9
@Spoike - benar, tapi itu tindakan yang disengaja. Di CVS, masalah bisa terjadi bukan karena kesalahan Anda sendiri, sedangkan di SVN Anda harus bekerja keras.
Michael Kohne
3
@DanNeely - CVS melakukannya satu per satu. Itu sebabnya Anda mendapatkan sebagian komitmen - beberapa file dilewati, lalu berhenti ketika menyentuh satu yang tidak dapat dikomit (karena konflik). Ini adalah hasil dari CVS yang awalnya tumbuh dari RCS, saya pikir.
Michael Kohne
4
Juga, perhatikan bahwa dengan CVS, bahkan jika Anda tidak menemukan kesalahan dan semuanya dikomit, seseorang dengan koneksi yang lebih cepat dapat memperbarui hierarki sumbernya di tengah-tengah komit, membuat mereka dalam keadaan tidak konsisten. (Dan saya berharap cap waktu akan sama tersebar, sehingga mencoba memeriksa pohon sebagai-tanggal / waktu yang jatuh di tengah komit akan memiliki hasil yang sama.)
SamB
15

Ini dijelaskan misalnya dalam Bye-bye CVS. Saya telah ditumbangkan artikel yang ditulis oleh Andy Lester :

Jika saya mencoba melakukan dalam Subversion, tetapi salah satu file memiliki konflik, atau kedaluwarsa, tidak ada file yang melakukan. Di CVS, Anda memiliki set file setengah komitmen yang harus Anda perbaiki SEKARANG.

Fakta bahwa CVS memaksa pemrogram untuk memperbaiki penggabungan dengan segera sama kontraproduktifnya. Dibandingkan dengan itu, opsi untuk menunda / membatalkan / menggabungkan perubahan adalah keuntungan besar.


Manfaat lain dari SVN dibandingkan CVS yang dijelaskan dalam artikel di atas adalah:

  • Versi lokal dari semua yang Anda lakukan
     
    Jika Anda ingin cvs diff, Anda harus dapat terhubung ke repositori Anda. Tidak ada koneksi internet, tidak ada perbedaan. Subversion menyimpan salinan asli apa yang sedang Anda kerjakan, jadi svn diff akan berfungsi dengan baik. Ingin memulai dari awal? svn revert karya tidak terhubung juga.

  • Nama simbol revisi
     
    HEAD adalah nama ujung bagasi di CVS, tapi saya selalu ingin bisa mengatakan "-r-1" seperti saya bisa kembali ketika di hari PVCS. Dengan CVS, saya harus melakukan cvs log pada apa yang saya edit, dan kemudian kurangi satu. Itu tidak seru. Dengan Subversion, saya dapat mengatakan svn diff -r PREV.

  • Pelaporan status nyata
     
    Di CVS, satu-satunya cara Anda dapat melihat apakah ada sesuatu di server yang lebih baru adalah dengan memperbarui cvs dan berharap bahwa apa pun yang turun tidak menyebabkan konflik. Dengan perintah status svn, saya mendapatkan status nyata, jadi saya bisa melihat apakah ada konflik sebelum saya melakukan pembaruan.

  • Penanganan konflik penggabungan yang membantu
     
    Di CVS, jika ada konflik, Anda mendapatkan penanda konflik di file Anda. Di Subversion, Anda mendapatkan penanda konflik, PLUS salinan file asli Anda, sebelum konflik, PLUS versi yang turun dari server, PLUS versi yang awalnya Anda edit. Kemudian, Anda harus secara eksplisit svn menyelesaikan filename.txt untuk memberi tahu Subversion bahwa Anda telah memperbaiki masalahnya. Tidak ada lagi komitmen yang tidak disengaja untuk kembali ke CVS dengan penanda konflik masih ada.

agas
sumber
8

Ini berarti bahwa semua perubahan pada semua file dilakukan dalam satu transaksi, sehingga semua berhasil atau tidak ada.

Ini berarti bahwa Anda lebih kecil kemungkinannya untuk mendapatkan suntingan sebagian di dalam repositori yang menyebabkan build gagal. Anda masih bisa membuat orang lupa untuk memeriksa semua file yang relevan, tetapi itu masalah proses daripada masalah dengan sistem versi.

jk.
sumber
bukankah itu hal yang baik? Kalau tidak, sebagian komitmen akan mengakibatkan file tidak sinkron.
Geek
2
ya itu hal yang baik, sebagian komitmennya buruk
jk.