Apa perbedaan antara checkin dan checkout?

14

Saat mengajar kelas SCM kepada siswa yang baru mengenal Manajemen Konfigurasi Perangkat Lunak, terjadilah bahwa pertanyaan muncul seperti " What's the difference between checkin and checkout?".

Dan variasi dari itu adalah bahwa siswa tersebut menjadi bingung tentang konsep SCM ini (mereka memahaminya sebagai sebaliknya).

Jadi, metafora macam apa yang dapat Anda gunakan untuk menjelaskan konsep SCM yang penting ini kepada audiens seperti itu?

Pierre.Vriens
sumber
checkout = kunci; checkin = membuka kunci; Anda mengambil kunci eksklusif untuk mengedit objek yang dipermasalahkan di cabang tempat Anda melakukan operasi.
Jiri Klouda

Jawaban:

8

Untuk menjelaskan sesuatu kepada siapa pun, cobalah membandingkannya dengan sesuatu yang mereka (mudah-mudahan) sudah akrab dengannya.

Jadi itu sebabnya saya jawab pertanyaan seperti itu:

Anggap saja tiba di tempat menginap (hotel, resor, dll):

  • yang sangat pertama hal yang Anda lakukan (ketika Anda tiba) adalah untuk checkin.
  • yang sangat terakhir hal yang Anda lakukan (ketika Anda meninggalkan) adalah untuk checkout.

Konsep SCM serupa berlaku ketika Anda ingin menerapkan perubahan pada komponen perangkat lunak ... kecuali bahwa itu berlaku sebaliknya :

  • yang sangat pertama hal yang Anda lakukan (ketika Anda mulai) adalah untuk checkout(atau berpikir seperti pinjaman itu).
  • yang sangat terakhir hal yang Anda lakukan (setelah selesai) adalah untuk checkin(atau berpikir seperti memberikan kembali).

Catatan : ini berlaku untuk sistem terpusat (seperti yang digunakan di lingkungan mainframe ...). Dalam sistem seperti , checkoutkonsep " " memiliki makna yang sama sekali berbeda (yang IMO juga mengapa dalam sistem itu hampir tidak ada kebingungan tentang kedua konsep).

Pierre.Vriens
sumber
Mungkin kodenya lebih seperti buku perpustakaan daripada kamar hotel?
Toby Speight
Ini adalah jawaban awam yang agak naif. Saya telah bekerja selama satu dekade di internal sistem kontrol sumber, jadi saya telah menambahkan sedikit lebih dalam jawaban untuk pertanyaan Anda.
Jiri Klouda
6

Penting untuk dicatat bahwa istilah "checkin" dan "checkout" memiliki arti yang berbeda tergantung pada jenis sistem SCM.

Sistem terpusat seperti TFVC, Subversion, dan Clearcase menggunakan checkout "eksklusif". Ini seperti metafora peminjaman buku Pierre, di mana hanya satu pengguna yang dapat memeriksa file sekaligus.

Sistem terdistribusi seperti git memiliki perintah "checkout", tetapi itu berarti sesuatu yang sangat berbeda. git checkoutdigunakan untuk berpindah antar cabang saat bekerja dengan repositori lokal.

Dave Swersky
sumber
Poin bagus Dave tentang sistem terdistribusi! Sebenarnya itu juga mengapa saya pada awalnya (ketika saya pertama kali belajar tentang GIT) sangat bingung. Untuk tidak membatalkan jawaban Anda (dengan mengadaptasi pertanyaan saya), saya memperbaiki jawaban saya sendiri untuk sedikit memperjelasnya.
Pierre.Vriens
Saya harus mengklarifikasi: checkout git digunakan untuk memeriksa objek dari repositori. Itu bisa berupa cabang, atau satu file.
Dave Swersky
4

Untuk sistem terpusat, anggap saja seperti perpustakaan teknis. (mungkin hamparan imajinasi bagaimana fungsi perpustakaan hipotetis ini ...)

Jika Anda seorang penulis dokumen, Anda dapat checkoutmenyalin perpustakaan, membuat perubahan, mengembalikannya check it back inke perpustakaan untuk dilihat dunia.

Ini bisa menjadi masalah jika perpustakaan memiliki salinan digital, dan saya checkoutdokumen, orang lain juga checks outdokumen, kami berdua melakukan perubahan, akan ada konflik (menggabungkan konflik) yang mungkin sulit untuk diselesaikan. Ketika kemudian "perbaikan" awal untuk ini adalah checkoutfungsi eksklusif ...


Tentu saja untuk proyek-proyek besar kemungkinan masalah konflik penggabungan kritis berkurang (orang akan bekerja pada bagian sistem yang berbeda) sehingga checkout/ checkintidak dibutuhkan sebanyak mungkin. Dan karena sistem terdistribusi dengan desain agak memerlukan fungsionalitas penggabungan yang baik, bersama dengan banyak manfaat lainnya, konsep itu tidak benar-benar ada di git dan DVCS lainnya

Timin
sumber
Itu cara lain untuk melihatnya. Meskipun dalam pengalaman saya, saya pikir itu bukan ide yang baik untuk menambahkan hal-hal seperti "konflik" dan "penggabungan" (jika mereka bahkan belum merasa nyaman dengan checkout dan check-in).
Pierre.Vriens
Adil, saya menambahkannya karena alasan utama checkout / checkin ada yang bisa saya pikirkan. Dan merasa seperti memahami konsep adalah hal yang sangat sulit jika Anda tidak tahu untuk apa konsep itu sebenarnya berguna.
Thymine
2

Dengan repositori SCM sebagai subjek utama, maka '

  • checkout semakin perubahan keluar dari repositori lokal atau jarak jauh (ke direktori kerja lokal Anda).
  • checkin mengembalikan perubahan ke repositori lokal atau jauh (dari direktori kerja lokal Anda).
hlovdal
sumber
Merci untuk jawaban ini juga . Itu memang cara untuk menjelaskannya, meskipun saya masih bertanya-tanya apakah Anda dapat memikirkan semacam "metafora" (seperti dalam pertanyaan saya). Misalnya untuk menjelaskannya kepada seseorang yang akan Anda ajar, yang bahkan tidak memiliki petunjuk apa sebenarnya repositori lokal atau jauh itu.
Pierre.Vriens
Benar, jika mereka tidak memiliki petunjuk tentang repositori apa maka mencoba mengajarkan checkin dan checkout tidak akan ada artinya. Sekarang, untuk metafora untuk kontrol sumber secara umum Anda dapat membandingkannya dengan akuntansi keuangan / pembukuan. Ini secara fundamental melacak perubahan pada nilai aset. Anda merekam perubahan satu per satu atau kelompok perubahan (mis. "Perjalanan dari A ke B" daripada tiket taksi + ticker bus + tiket kereta + ...) meskipun grup tidak terlalu besar (mis. "Semua pengeluaran pada hari Senin"). Demikian pula repositori melacak perubahan kode sumber, kelompok individu atau tidak terlalu besar.
hlovdal
1
  • Checkout adalah kunci eksklusif untuk memodifikasi cabang objek dalam repositori.
  • Checkin adalah rilis kunci eksklusif.

Ada dua jenis sistem kontrol sumber tergantung pada apa yang merupakan unit percabangan terkecil.

1) Per cabang repositori (CVS, SVN, GIT, Perforce, ... dll)

Dalam produk-produk tempat Anda melakukan percabangan seluruh repositori, checkout biasanya akan membuat atau mengaktifkan modifikasi ke cabang lokal (salinan) dari seluruh repositori. Dalam produk tersebut checkin sering tidak digunakan dan menjadi bagian dari operasi komit , yang sekaligus checkout cabang terpencil, menerapkan patch lokal dan checkin cabang terpencil dalam operasi tunggal. Anda tidak checkin cabang lokal Anda karena diperiksa secara permanen. (Catatan: Di GIT Anda tidak komit ke cabang jarak jauh, Anda mendorong komit lokal Anda untuk itu. Perbedaan sintaksis yang ketat. )

2) Per objek bercabang (ClearCase, AccuRev, Oracle ADE)

Dalam produk tempat Anda bercabang objek individual, seperti direktori, file, dll. Konsep checkout dan checkin berlaku per objek per cabang. Anda akan mengunci objek untuk memodifikasinya dengan checkout dan melepaskannya dengan checkin . Dalam produk-produk tersebut Anda sering bekerja pada cabang pribadi di mana kunci tidak menghalangi siapa pun untuk bekerja dan pada saat penggabungan cabang lokal Anda menjadi cabang bersama, objek juga diperiksa di cabang beling (utama, master, cabang fitur, dll. ) konflik gabungan diselesaikan dan objek diperiksa di cabang bersama. Ini memungkinkan banyak orang untuk "melakukan" pada saat yang sama ke cabang bersama selama mereka tidak memodifikasi objek yang sama.

Jiri Klouda
sumber
Hai Jiri, merci untuk jawaban Anda. Untuk 2 jenis yang Anda sebutkan saya akan setuju. Tetapi dalam alat SCM di dunia mainframe (dari mana pengalaman saya berasal) seseorang tidak mempertimbangkan "mengunci" ... Dapatkah Anda memikirkan cara untuk menambahkan jenis ke-3 ke jawaban Anda?
Pierre.Vriens
Bisakah Anda memberi saya contoh produk yang tidak sesuai dengan dua kategori tersebut? Saya bisa memberi tahu Anda yang mana dari 2 yang cocok atau menambahkan yang ketiga, jika memang ada. Checkout dan checkin adalah operasi pada cabang yang memberi dan melepaskan hak untuk memodifikasinya. Jadi mempartisi pada apa yang cabang produk (seluruh repositori atau objek individu) adalah alami untuk pertanyaan ini. Saya tidak tahu jika ada sesuatu di antara keduanya, apakah itu? Percabangan subtree seperti Perforce dan Subgit pada dasarnya adalah kategori pertama. Lock hanya nama yang berbeda untuk 'hak eksklusif untuk'.
Jiri Klouda
BTW Metafora perpustakaan seperti yang disebutkan sebelumnya benar-benar bagus. Saat Anda checkout buku, Anda mendapatkan hak eksklusif untuk itu. Anda membawanya pulang dan melakukannya sesuka Anda. Baca atau catat catatan di margin dan tidak ada orang lain yang bisa memodifikasi buku, sementara Anda sudah memeriksanya. Seperti menghapus beberapa halamannya atau menyorot beberapa baris. Ketika Anda memeriksa buku, orang-orang dapat membacanya di perpustakaan, di mana mata pustakawan yang waspada tidak mengizinkan modifikasi (vandalisme) atau memeriksanya dan membawanya pulang. Itu membuat serial perubahan pada buku itu.
Jiri Klouda
Untuk melanjutkan analogi, di cabang perpustakaan yang berbeda, buku yang sama mungkin ada di sana dengan modifikasi yang berbeda atau sepenuhnya tidak diubah atau tidak sama sekali. Orang lain dapat memeriksanya di sana pada saat yang sama (yaitu checkout per cabang). Sekarang penulis asli bekerja pada edisi ke-2, cabang master jadi untuk berbicara. Dia bisa membaca catatan dari beberapa cabang, menggabungkannya bersama-sama, memeriksa cabang utama dan memilih edisi kedua. Setiap cabang perpustakaan akan menyegarkan salinannya dengan membeli edisi ke-2. Mereka dapat membuang 1st atau menyalin catatan yang masih berguna dari margin ke edisi baru.
Jiri Klouda