Qual è la differenza tra check-in e check-out?


14

Quando si insegnano le classi SCM agli studenti che non hanno familiarità con la gestione della configurazione del software, capita che sorga una domanda come " What's the difference between checkin and checkout?".

E una variazione di ciò è che tali studenti si confondono su questi concetti di SCM (li capiscono come il contrario).

Quindi che tipo di metafora puoi usare per spiegare questo concetto cruciale di SCM a tale pubblico?


checkout = blocco; checkin = sblocco; Si prende il blocco esclusivo per modificare l'oggetto in questione sul ramo su cui si esegue l'operazione.
Jiri Klouda,

Risposte:


8

Per spiegare qualcosa a chiunque, prova a paragonarlo a qualcosa con cui (si spera) già conosce.

Ecco perché rispondo a una domanda del genere in questo modo:

Pensalo come arrivare in un posto dove stare (un hotel, un resort, ecc.):

  • la prima cosa che fai (quando arrivi) è checkin.
  • l' ultima cosa che fai (quando parti) è checkout.

Un concetto SCM simile si applica quando si desidera applicare le modifiche ai componenti software ... tranne che si applica il contrario :

  • la prima cosa che fai (quando inizi) è checkout(o pensare a come prenderlo in prestito).
  • l' ultima cosa che fai (quando finisci) è checkin(o pensare a come restituirlo).

Nota : questo vale per i sistemi centralizzati (come quelli utilizzati negli ambienti mainframe ...). In sistemi come il " checkout" concetto ha un significato completamente diverso (che IMO è anche il motivo per cui in quei sistemi non c'è quasi nessuna confusione su entrambi i concetti).


Forse il codice è più simile a un libro della biblioteca che a una camera d'albergo?
Toby Speight

Questa è una risposta piuttosto ingenua, laica. Ho lavorato per un decennio su interni di sistemi di controllo del codice sorgente, quindi ho aggiunto una risposta un po 'più approfondita alla tua domanda.
Jiri Klouda,

6

È importante notare che i termini "checkin" e "checkout" hanno significati diversi a seconda del tipo di sistema SCM.

I sistemi centralizzati come TFVC, Subversion e Clearcase utilizzano checkout "esclusivi". Questo è come la metafora del prestito del libro di Pierre, in cui solo un utente può fare il check-out di un file alla volta.

I sistemi distribuiti come git hanno un comando "checkout", ma significa qualcosa di completamente diverso. git checkoutviene utilizzato per passare da una filiale all'altra quando si lavora con un repository locale.


Buon punto Dave sui sistemi distribuiti! In realtà è anche per questo che all'inizio (quando ho appreso per la prima volta di GIT) ero terribilmente confuso. Per non invalidare la tua risposta (adattando la mia domanda), ho perfezionato la mia risposta per chiarirla un po '.
Pierre.Vriens

Dovrei chiarire: git checkout è usato per estrarre oggetti dal repository. Può essere un ramo o un singolo file.
Dave Swersky,

4

Per i sistemi centralizzati, pensalo come una biblioteca tecnica. (potrebbe essere un tratto dell'immaginazione come funziona questa ipotetica biblioteca ...)

Se sei un autore di un documento, potresti checkoutcopiare la biblioteca, apportare modifiche, restituirlo check it back inalla biblioteca affinché il mondo possa vederlo.

Questo può diventare un problema se la biblioteca ha copie digitali e io checkoutun documento, qualcun altro anche checks outun documento, entrambi facciamo delle modifiche, ci sarà un conflitto (unisci conflitto) che potrebbe essere difficile da risolvere. Quando poi la "correzione" iniziale per questo è checkoutfunzionalità esclusiva ...


Naturalmente per i grandi progetti le probabilità di un problema critico di fusione conflitto è ridotto (persone lavoreranno su diverse parti del sistema) in modo da checkout/ checkinnon è necessaria quasi tanto. E poiché i sistemi distribuiti in base alla progettazione richiedono in qualche modo una buona funzionalità di unione, insieme a molti altri vantaggi, quel concetto non esiste davvero in Git e altri DVCS


Questo è un altro modo di vederlo. Anche se nella mia esperienza non credo sia una buona idea aggiungere anche cose come "conflitti" e "fusione" (se non si sentono ancora a proprio agio con il checkout e il check-in).
Pierre.Vriens

Giusto, l'ho aggiunto perché è il motivo principale per cui esiste il checkout / checkin a cui potrei pensare. E sentire come afferrare un concetto è molto difficile se non sai a cosa serve effettivamente quel concetto.
Thymine,

2

Con il repository SCM come soggetto principale, quindi '

  • checkout sta ottenendo cambiamenti fuori dal repository locale o remoto (nella directory di lavoro locale).
  • il check-in sta rimettendo le modifiche nel repository locale o remoto (dalla directory di lavoro locale).

Merci per questa risposta anche . Questo è davvero un modo per spiegarlo, anche se mi chiedo ancora se riesci a pensare a una sorta di "metafora" (come nella mia domanda). Ad esempio, per spiegarlo a qualcuno a cui insegneresti, che non ha nemmeno idea di cosa sia realmente un repository locale o remoto .
Pierre.Vriens

È vero, se non hanno idea di cosa sia un repository, allora provare a insegnare il check-in e il check-out non avrà senso. Ora, per una metafora del controllo del codice sorgente in generale, puoi confrontarla con la contabilità / contabilità finanziaria. Fondamentalmente tiene traccia delle modifiche al valore delle attività. Registri singole modifiche singole o gruppi di modifiche (ad es. "Viaggia da A a B" anziché il biglietto del taxi + bus ticker + biglietto del treno + ...) sebbene non gruppi troppo grandi (ad esempio "Tutte le spese del lunedì"). Allo stesso modo un repository tiene traccia delle modifiche al codice sorgente, gruppi individuali o non troppo grandi.
hlovdal,

1
  • Il checkout è un blocco esclusivo sulla modifica di un ramo di oggetto in un repository.
  • Il check-in è una versione del blocco esclusivo.

Esistono due tipi di sistemi di controllo del codice sorgente in base alla più piccola unità di diramazione.

1) Branching per repository (CVS, SVN, GIT, Perforce, ... ecc.)

Nei prodotti in cui si ramifica l'intero repository, il checkout generalmente crea o abilita le modifiche alla filiale locale (copia) dell'intero repository. In questi prodotti, il check-in è spesso inutilizzato e diventa parte dell'operazione di commit , che è immediatamente checkout del ramo remoto, applicazione della patch locale e check-in del ramo remoto in un'unica operazione. Non si effettua il check-in nella propria filiale locale in quanto è permanentemente estratto. (Nota: in GIT non ti impegni a un ramo remoto, spingi il tuo commit locale ad esso. Differenza rigorosamente sintattica. )

2) Per ramificazione di oggetti (ClearCase, AccuRev, Oracle ADE)

Nei prodotti in cui si ramificano singoli oggetti, come directory, file, ecc. Il concetto di checkout e checkin si applica per oggetto per ramo. Bloccherai l'oggetto per modificarlo con il checkout e rilascialo con il check-in . In quei prodotti spesso lavori su un ramo privato in cui i blocchi non impediscono a nessuno di lavorare e al momento dell'unione del tuo ramo locale in un ramo condiviso, gli oggetti vengono anche estratti su ramo di frammenti (principale, principale, ramo di caratteristiche, ecc. ) i conflitti di unione vengono risolti e l'oggetto viene archiviato nel ramo condiviso. Ciò consente a più persone di "impegnarsi" contemporaneamente nel ramo condiviso purché non modifichino gli stessi oggetti.


Ehi Jiri, merci per la tua risposta. Per quei 2 tipi che hai citato sono d'accordo. Ma negli strumenti SCM nel mondo dei mainframe (la mia esperienza ha origine) non si prende in considerazione il "blocco" ... Riesci a pensare a un modo per aggiungere un terzo tipo alla tua risposta?
Pierre.Vriens

Potete darmi un esempio di un prodotto che non rientra in queste due categorie? Posso dirti quale dei 2 si adatta o aggiungere un terzo, se ce n'è davvero uno. Il checkout e il check in sono operazioni su una filiale che dà e libera il diritto di modificarlo. Quindi il partizionamento su ciò che un prodotto dirama (intero repository o singoli oggetti) è naturale per questa domanda. Non so se ci sia qualcosa in mezzo, quale sarebbe? La ramificazione di sottotitoli come in Perforce e Subgit è essenzialmente la prima categoria. Lock è solo un nome diverso per un "diritto esclusivo".
Jiri Klouda,

A proposito, la metafora della biblioteca di cui sopra è davvero una buona. Quando effettui il checkout di un libro, ottieni un diritto esclusivo. Lo porti a casa e lo fai come ti pare. Leggilo o addirittura scarabocchia le note a margine e nessun altro può modificare il libro, mentre lo hai verificato. Come rimuovere alcune delle sue pagine o evidenziare alcune linee. Quando effettui il check in nel libro, le persone possono leggerlo in biblioteca, dove l'occhio vigile del bibliotecario non consente alcuna modifica (atti vandalici) o lo controlla e lo porta a casa. Serializza le modifiche a quel libro.
Jiri Klouda,

Per continuare l'analogia, in un diverso ramo della biblioteca, lo stesso libro potrebbe essere lì con diverse modifiche o completamente inalterato o per niente. Qualcun altro può verificarlo contemporaneamente (ovvero il checkout è per filiale). Ora l'autore originale lavora alla 2a edizione, un ramo principale per così dire. Poteva leggere le note da più rami, unirle insieme, controllare il ramo principale e controllare una seconda edizione. Ogni ramo della biblioteca aggiornerà la propria copia acquistando una seconda edizione. Possono scartare la prima o copiare note ancora utili dai margini alla nuova edizione.
Jiri Klouda,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.