Quali sono le differenze tra git branch, fork, fetch, merge, rebase e clone?


502

Voglio capire la differenza tra un ramo, una forchetta e un clone in Git?

Allo stesso modo, cosa significa quando faccio un git fetchinvece di un git pull?

Inoltre, cosa rebasesignifica rispetto a merge?

Come posso schiacciare i singoli si impegna insieme?

Come vengono utilizzati, perché vengono utilizzati e cosa rappresentano?

Come si inserisce GitHub?


19
puoi cambiare la risposta accettata per essere la risposta di Michael Durrant?
siride,

11
Certo che può , ma questa deve essere la sua scelta, e francamente la maggior parte delle persone che arrivano qui (come me) vogliono qualcosa di più conciso, esattamente come la risposta che ha scelto, che in quel momento era quella da solo =)
user1271772

Risposte:


366

Un clone è semplicemente una copia di un repository. In superficie, il suo risultato è equivalente a svn checkout, dove si scarica il codice sorgente da qualche altro repository. La differenza tra VCS centralizzato come Subversion e DVCS come Git è che in Git, quando clonate, in realtà state copiando l'intero repository di sorgenti, inclusi tutta la cronologia e i rami. Ora hai un nuovo repository sulla tua macchina e tutti i commit che esegui vanno in quel repository. Nessuno vedrà alcuna modifica fino a quando non trasferirai tali commit in un altro repository (o quello originale) o fino a quando qualcuno non effettuerà il pull dei commit dal tuo repository, se è accessibile pubblicamente.

Un ramo è qualcosa che si trova all'interno di un repository. Concettualmente, rappresenta un filo di sviluppo. Di solito hai un ramo principale, ma potresti anche avere un ramo in cui stai lavorando su alcune funzionalità xyz e un altro per correggere bug abc. Dopo aver verificato un ramo, tutti i commit che esegui rimarranno su quel ramo e non saranno condivisi con altri rami fino a quando non li unirai o li riposizionerai sul ramo in questione. Ovviamente, Git sembra un po 'strano quando si tratta di rami fino a quando non si guarda il modello sottostante di come vengono implementati i rami. Piuttosto che spiegarlo da solo (ho già detto troppo, penso), collegherò alla spiegazione "informatica" di come Git modella i rami e si impegna, presa dal sito web Git:

http://eagain.net/articles/git-for-computer-scientists/

Una forchetta non è davvero un concetto Git, è più un'idea politico / sociale. Cioè, se alcune persone non sono contente di come sta andando un progetto, possono prendere il codice sorgente e lavorarci da soli separatamente dagli sviluppatori originali. Sarebbe considerato un fork. Git semplifica il fork perché ognuno ha già la propria copia "master" del codice sorgente, quindi è semplice come tagliare i legami con gli sviluppatori del progetto originale e non richiede l'esportazione della cronologia da un repository condiviso come potresti avere a che fare con SVN .

EDIT: poiché non ero a conoscenza della moderna definizione di "fork" utilizzata da siti come GitHub, dai un'occhiata ai commenti e anche alla risposta di Michael Durrant sotto la mia per ulteriori informazioni.


125
Un fork non significa necessariamente che lo sviluppatore non sia soddisfatto del repository principale. In genere, significa che un altro sviluppatore ha letto, ma non scrive, l'accesso a quel repository. Lo sviluppatore può eseguire il fork del repository, apportare modifiche, ma poiché non è in grado di scrivere nel repository principale, deve inviare le modifiche come patch. Quindi, il fork è anche un mezzo per incoraggiare la collaborazione senza concedere l'accesso in scrittura.
brycemcd,

5
Suppongo sia vero. Ho sempre visto "fork" utilizzato nel contesto della creazione di una nuova versione potenzialmente competitiva di un progetto.
siride,

32
Si potrebbe dire che un fork è un ramo che non dovrebbe essere unito a monte
masonk,

6
L'hub Git usa "fork" come fork. È un nuovo repository archiviato su github, separato dall'originale. Tuttavia, github rende anche molto semplice implementare le richieste pull. Le richieste di pull essenzialmente chiedono al proprietario del repository originale di "riportare" le modifiche dal fork del repository all'origine. In questo modo, tutti possono utilizzare il controllo del codice sorgente e avere una cronologia di tutte le modifiche, incluso il loro, ma non tutti hanno bisogno dell'accesso in scrittura al repository originale.
mklauber,

4
Ho aggiornato la mia risposta per dire alla gente di guardare la risposta di Michael Durrant per ulteriori informazioni sul modello di Github.
siride,

531

Idiota

Questa risposta include GitHub come molte persone hanno chiesto anche a questo proposito.

Archivi locali

Git (localmente) ha una directory ( .git) in cui si impegnano i file e questo è il 'repository locale'. Ciò è diverso dai sistemi come SVN in cui si aggiunge e si impegna immediatamente nel repository remoto.

Git memorizza ogni versione di un file che cambia salvando l'intero file. A questo proposito è anche diverso da SVN in quanto potresti passare a qualsiasi versione individuale senza "ricrearla" attraverso modifiche delta.

Git non "blocca" i file e quindi evita la funzionalità di "blocco esclusivo" per una modifica (vengono in mente sistemi più vecchi come pvcs), quindi tutti i file possono sempre essere modificati, anche quando non in linea. In realtà fa un ottimo lavoro di unire le modifiche ai file (all'interno dello stesso file!) Durante pull o fetch / push in un repository remoto come GitHub. L'unica volta che è necessario apportare modifiche manuali (in realtà modificando un file) è se due modifiche coinvolgono le stesse righe di codice.


filiali

I rami ti consentono di conservare il codice principale (il ramo "principale"), fare una copia (un nuovo ramo) e quindi lavorare all'interno di quel nuovo ramo. Se il lavoro richiede un po 'di tempo o il master riceve molti aggiornamenti da quando è stato creato il ramo, è necessario eseguire l'unione o la riformulazione (spesso preferita per una cronologia migliore e conflitti più facili da risolvere) con il ramo principale. Al termine, unisci le modifiche apportate nel ramo al repository principale. Molte organizzazioni utilizzano i rami per ogni lavoro, sia esso una caratteristica, un bug o un lavoro di routine. Altre organizzazioni utilizzano le filiali solo per modifiche importanti come gli aggiornamenti di versione.

Fork: con un branch controlli e gestisci il branch, mentre con un fork qualcun altro controlla di accettare il codice.

In generale, ci sono due approcci principali per fare rami. Il primo è mantenere la maggior parte delle modifiche sul ramo principale, usando solo i rami per cose più grandi e più lunghe come le modifiche di versione in cui si desidera avere due rami disponibili per esigenze diverse. Il secondo è quello in cui fondamentalmente crei un ramo per ogni richiesta di funzione, correzione di bug o lavoro di routine e poi decidi manualmente quando unire effettivamente quei rami nel ramo principale principale. Anche se questo sembra noioso, questo è un approccio comune ed è quello che attualmente uso e raccomando perché questo mantiene il ramo principale più pulito ed è il maestro che promuoviamo per la produzione, quindi vogliamo solo codice completo, testato, tramite il rebasing e fusione di rami.

Il modo standard per portare un ramo 'in' al master è fare un merge. Le filiali possono anche essere "ridisegnate" per "ripulire" la storia. Non influisce sullo stato corrente e viene fatto per fornire una cronologia "più pulita".

Fondamentalmente, l'idea è che ti sei ramificato da un certo punto (di solito dal maestro). Da quando ti sei ramificato, lo stesso "maestro" da allora si è spostato in avanti da quel punto di diramazione. Sarà "più pulito" (più facile da risolvere i problemi e la cronologia sarà più facile da capire) se tutte le modifiche che hai fatto in un ramo sono giocate contro lo stato attuale del master con tutte le sue ultime modifiche. Quindi, il processo è: salvare le modifiche; ottenere il 'nuovo' master e quindi riapplicare (questa è la parte rebase) le modifiche di nuovo rispetto a ciò. Ricorda che rebase, proprio come l'unione, può provocare conflitti che devi risolvere manualmente (ad es. Modifica e correzione).

Una linea guida da notare:
rifare solo se il ramo è locale e non lo hai ancora inviato al telecomando!
Ciò è dovuto principalmente al fatto che il rifacimento può alterare la storia che altre persone vedono e che può includere i propri impegni.

Tracciamento dei rami

Questi sono i rami che sono chiamati origin/branch_name(al contrario di giusto branch_name). Quando si spinge e si estrae il codice da / verso repository remoti, questo è in realtà il meccanismo attraverso il quale ciò accade. Ad esempio, quando si git pushchiama un ramo building_groups, il ramo passa prima a origin/building_groupse poi al repository remoto. Allo stesso modo, se si esegue un git fetch building_groups, il file recuperato viene inserito nel origin/building_groupsramo. Puoi quindi scegliere di unire questo ramo nella tua copia locale. La nostra pratica è di fare sempre una git fetchfusione manuale piuttosto che solo una git pull(che fa entrambe le precedenti in un solo passaggio).

Recupero di nuovi rami.

Ottenere nuovi rami: nel punto iniziale di un clone avrai tutti i rami. Tuttavia, se altri sviluppatori aggiungono rami e li spingono sul telecomando, deve esserci un modo per "conoscere" quei rami e i loro nomi per poterli abbattere localmente. Questo viene fatto tramite un git fetchche porterà tutti i rami nuovi e modificati nel repository locale usando i rami di tracciamento (ad es origin/.). Una volta fetched, è possibile git branch --remoteelencare i rami di tracciamento e git checkout [branch]passare a uno qualsiasi.

Fusione

L'unione è il processo di combinazione delle modifiche al codice da rami diversi o da versioni diverse dello stesso ramo (ad esempio quando un ramo locale e un telecomando non sono sincronizzati). Se uno ha sviluppato lavoro in un ramo e il lavoro è completo, pronto e testato, allora può essere unito al masterramo. Questo viene fatto git checkout masterper passare al masterramo, quindi git merge your_branch. L'unione riunirà tutti i diversi file e anche diverse modifiche negli stessi file . Ciò significa che cambierà effettivamente il codice all'interno dei file per unire tutte le modifiche.

Quando si fa il checkoutdi masterè anche consigliato di fare una git pull origin masterper ottenere la versione più recente del maestro a distanza fuse in tuo padrone locale. Se il master remoto è cambiato, cioè moved forwardvedrai informazioni che riflettono ciò durante quello git pull. Se questo è il caso (master modificato), ti viene consigliato git checkout your_branche quindi rebasemaster, in modo che le tue modifiche vengano effettivamente "riprodotte" in cima al "nuovo" master. Quindi si continuerà ad aggiornare Master come mostrato nel paragrafo successivo.

Se non ci sono conflitti, al master verranno aggiunte le nuove modifiche. Se ci sono conflitti, ciò significa che gli stessi file hanno modifiche attorno a righe di codice simili che non possono unire automaticamente. In questo caso git merge new_branchsegnalerà la presenza di conflitti da risolvere. Li 'risolvi' modificando i file (che avranno entrambe le modifiche), selezionando le modifiche che desideri, eliminando letteralmente le righe delle modifiche che non desideri e quindi salvando il file. Le modifiche sono contrassegnate con separatori come ========e <<<<<<<<.

Una volta risolti eventuali conflitti, lo farai di nuovo git adde git committali modifiche continueranno a fondersi (riceverai feedback da Git durante questo processo per guidarti).

Quando il processo non funziona bene, troverai git merge --abortmolto utile ripristinare le cose.

Rinnovo interattivo e compressione / riordino / rimozione di commit

Se hai lavorato in molti piccoli passaggi, ad esempio, impegni il codice come "work-in-progress" ogni giorno, potresti voler "schiacciare" quei piccoli piccoli commit in alcuni commit più grandi. Ciò può essere particolarmente utile quando si desidera eseguire revisioni del codice con i colleghi. Non vuoi ripetere tutti i 'passaggi' che hai fatto (tramite commit), vuoi solo dire che qui è l'effetto finale (diff) di tutte le mie modifiche per questo lavoro in un unico commit.

Il fattore chiave da valutare quando si considera se fare questo è se i commit multipli sono contro lo stesso file o più file più di una volta (in questo caso è meglio eseguire i commit di compressione). Questo viene fatto con lo strumento di rebasing interattivo. Questo strumento ti consente di eliminare i commit, eliminare i commit, riformulare i messaggi, ecc. Ad esempio, git rebase -i HEAD~10( nota: che è a ~, non a- ) fa apparire quanto segue:

rebasing interattivo in Git

Fai attenzione però e usa questo strumento "con cautela". Esegui uno squash / elimina / riordina alla volta, esci e salva quel commit, quindi rientra nello strumento. Se i commit non sono contigui, puoi riordinarli (e quindi schiacciarli se necessario). Puoi effettivamente eliminare anche i commit qui, ma devi davvero essere sicuro di quello che stai facendo quando lo fai!

forchette

Esistono due approcci principali alla collaborazione nei repository Git. Il primo, dettagliato sopra, è direttamente tramite i rami che le persone tirano e spingono da / a. Questi collaboratori hanno le loro chiavi SSH registrate nel repository remoto. Ciò consentirà loro di spingere direttamente verso quel repository. Il rovescio della medaglia è che devi mantenere l'elenco degli utenti. L'altro approccio, il fork, consente a chiunque di "fork" il repository, fondamentalmente facendo una copia locale nel proprio account repository Git. Possono quindi apportare modifiche e, una volta terminato, inviare una 'richiesta pull' (in realtà è più una 'spinta' da loro e una richiesta 'pull' per l'effettivo manutentore del repository) per ottenere il codice accettato.

Questo secondo metodo, utilizzando forks, non richiede a qualcuno di mantenere un elenco di utenti per il repository.


GitHub

GitHub (un repository remoto) è una sorgente remota che normalmente si spinge e si tira su quelle modifiche commesse se si dispone (o si aggiunge a) un tale repository, quindi locale e remoto sono in realtà abbastanza distinti. Un altro modo di pensare a un repository remoto è che è una .gitstruttura di directory che vive su un server remoto.

Quando si 'fork' - nella GUI del browser Web GitHub è possibile fare clic su questo pulsante Immagine del pulsante a forcella- si crea una copia ('clone') del codice nel proprio account GitHub. Può essere un po 'sottile la prima volta che lo fai, quindi assicurati di guardare in quale repository è elencata una base di codice - o il proprietario originale o "biforcuto" e tu, ad esempio, in questo modo:

Immagine del nome del repository biforcato

Una volta che hai la copia locale, puoi apportare le modifiche che desideri (tirandole e spingendole su un computer locale). Quando hai finito, invia una "richiesta pull" al proprietario / amministratore del repository originale (sembra fantasioso, ma in realtà fai semplicemente clic su questo:) Immagine del pulsante di richiesta pulle lo "inseriscono".

Più comune per un team che lavora insieme sul codice è "clonare" il repository (fare clic sull'icona "copia" nella schermata principale del repository). Quindi, digitare git clonee incollare localmente . Questo ti installerà localmente e puoi anche spingere e tirare nella posizione (condivisa) di GitHub.

cloni

Come indicato nella sezione su GitHub, un clone è una copia di un repository. Quando si dispone di un repository remoto, si emette il git clonecomando sull'URL e si finisce con una copia locale o clone del repository. Questo clone ha tutto , i file, il ramo principale, gli altri rami, tutti i commit esistenti, l'intero shebang. È questo clone che fai i tuoi add-on e si impegna e quindi il repository remoto stesso è ciò a cui spingi quei commit. È questo concetto locale / remoto che rende Git (e sistemi simili ad esso come Mercurial) un DVCS ( Distributed Version Control System) al contrario dei CVS più tradizionali (Code Versioning Systems) come SVN, PVCS, CVS, ecc. Dove ti impegni direttamente nel repository remoto.

visualizzazione

È possibile visualizzare la visualizzazione dei concetti chiave
http://marklodato.github.com/visual-git-guide/index-en.html e
http://ndpsoftware.com/git-cheatsheet.html#loc=index

Se desideri una visualizzazione visiva del funzionamento delle modifiche, non puoi battere lo strumento visivo gitg( gitxper macOS) con una GUI che chiamo "la mappa della metropolitana" (in particolare London Underground), ottima per mostrare chi ha fatto cosa, come le cose cambiano, divergono e si fondono, ecc.

Puoi anche usarlo per aggiungere, eseguire il commit e gestire le tue modifiche!

Immagine dell'interfaccia gitg / gitx

Sebbene gitg / gitx sia abbastanza minimo, il numero di strumenti della GUI continua ad espandersi. Molti utenti Mac usano il fork di gitx di Brotherbard e per Linux, un'ottima opzione è smart-git con un'interfaccia intuitiva ma potente:

Immagine della GUI di smart-git

Nota che anche con uno strumento GUI, probabilmente eseguirai molti comandi dalla riga di comando.

Per questo, ho i seguenti alias nel mio ~/.bash_aliasesfile (che viene chiamato dal mio ~/.bashrcfile per ogni sessione terminale):

# git
alias g='git status'
alias gcob='git checkout -b '
alias gcom='git checkout master'
alias gd='git diff'
alias gf='git fetch'
alias gfrm='git fetch; git reset --hard origin/master'
alias gg='git grep '
alias gits='alias | grep "^alias g.*git.*$"'
alias gl='git log'
alias gl1='git log --oneline'
alias glf='git log --name-status'
alias glp='git log -p'
alias gpull='git pull '
alias gpush='git push '

E ho i seguenti "alias git" nel mio ~/.gitconfigfile - perché questi?
Quindi il completamento del ramo (con il tasto TAB) funziona!

Quindi questi sono:

[alias]
  co = checkout
  cob = checkout -b

Esempio di utilizzo: git co [branch] <- il completamento della scheda per i rami funzionerà.

Strumento di apprendimento della GUI

È possibile che https://learngitbranching.js.org/ sia utile per apprendere alcuni dei concetti di base. Schermata: Video: https://youtu.be/23JqqcLPss0inserisci qui la descrizione dell'immagine

Finalmente 7 salvavita chiave!

  1. Apporti le modifiche, le aggiungi e le impegni (ma non spingere) e poi oh! ti rendi conto di essere padrone!

    git reset [filename(s)]
    git checkout -b [name_for_a_new_branch]
    git add [file(s)]
    git commit -m "A useful message"
    
    Voila!  You've moved that 'master' commit to its own branch !
  2. Si incasinano alcuni file mentre si lavora in una filiale locale e si desidera semplicemente tornare a ciò che si è verificato l'ultima volta che si è eseguito un git pull:

    git reset --hard origin/master  # You will need to be comfortable doing this!
  3. Inizi a fare modifiche localmente, modifichi mezza dozzina di file e poi, oh merda, sei ancora nel ramo principale (o in un altro):

    git checkout -b new_branch_name  # just create a new branch
    git add .                      # add the changes files
    git commit -m"your message"    # and commit them
  4. Hai incasinato un particolare file nel tuo ramo corrente e vuoi sostanzialmente "resettare" quel file (perdere le modifiche) su come è stato l'ultima volta che l'hai estratto dal repository remoto:

    git checkout your/directories/filename

    Questo in realtà reimposta il file (come molti comandi Git non è ben chiamato per quello che sta facendo qui).

  5. Apporti alcune modifiche localmente, vuoi assicurarti di non perderle mentre fai un git reseto rebase: faccio spesso una copia manuale dell'intero progetto ( cp -r ../my_project ~/) quando non sono sicuro se potrei sbagliare in Git o perdere importanti i cambiamenti.

  6. Stai ribassando ma le cose si incasinano:

    git rebase --abort # To abandon interactive rebase and merge issues
  7. Aggiungi il tuo ramo Git al tuo PS1prompt (vedi https://unix.stackexchange.com/a/127800/10043 ), ad es.

    Immagine del prompt

    Il ramo è selenium_rspec_conversion.


1
20/02/12 Aggiunte informazioni su merge vs. rebase
Michael Durrant,

1
16/06/12 Aggiunta sezione sui cloni per renderla più completa.
Michael Durrant,

4
Tanto testo !! Seguirò la mia semplice Subversion :-)
Jonny il

6
eh? Un utente di sovversione potrebbe anche scrivere un libro sull'uso di sovversione. Ritengo che la sovversione sia una tecnologia precedente con meno funzionalità. Personalmente trovo git molto facile da usare. ymmv
Michael Durrant,

3
Wow, Micheal! SO è tutto sulla condivisione della conoscenza. Grazie per l'ottimo lavoro, sicuramente +1
Michiel,

143

Ecco l'immagine di Oliver Steele di come tutto si combina:

inserisci qui la descrizione dell'immagine


6
Questa immagine potrebbe essere aggiornata per aggiungere "clone git" che sono sicuro che la maggior parte delle persone hanno familiarità in ogni caso.
Contango,

3
@Gravitas, adoro questa grafica, ma non mi dice quando i file vengono sovrascritti e quando vengono uniti. Potresti farmi sapere quale è quale per questi comandi? Forse i comandi di sovrascrittura in alto e i comandi di fusione sotto le unità? Grazie.
Zylstra,

Da quello che ho capito, git pull tirerà giù da un telecomando qualunque cosa tu chieda (quindi, qualunque tronco tu stia chiedendo) e lo fonderà immediatamente nel ramo in cui ti trovi quando fai la richiesta. Pull è una richiesta di alto livello che esegue "fetch", quindi un "unisci" per impostazione predefinita o un rebase con "–rebase". Potresti farne a meno, è solo una comodità.
Contango,

Dove andrebbe esattamente il clone di git in questo diagramma? Anche git merge? Sono molto nuovo con Git ma mi piace questa foto.
Mishelle,

2
Vedrò se posso fare una versione aggiornata del diagramma.
Contango,

8

Fork vs. Clona: due parole che significano entrambe copia

Si prega di vedere questo diagramma. (Originariamente da http://www.dataschool.io/content/images/2014/Mar/github1.png ).

.-------------------------.     1. Fork     .-------------------------.
| Your GitHub repo        | <-------------- | Joe's GitHub repo       |
| github.com/you/coolgame |                 | github.com/joe/coolgame |
| ----------------------- | 7. Pull Request | ----------------------- |
| master -> c224ff7       | --------------> | master -> c224ff7 (c)   |
| anidea -> 884faa1 (a)   |                 | anidea -> 884faa1 (b)   |
'-------------------------'                 '-------------------------'
    |                 ^
    | 2. Clone        |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 | 6. Push (anidea => origin/anidea)
    v                 |
.-------------------------.
| Your computer           |  3. Create branch 'anidea'
| $HOME/coolgame          |
| ----------------------- |  4. Update a file
| master -> c224ff7       |
| anidea -> 884faa1       |  5. Commit (to 'anidea')
'-------------------------'

(a) - after you have pushed it
(b) - after Joe has accepted it
(c) - eventually Joe might merge 'anidea' (make 'master -> 884faa1')

Forchetta

  • Una copia del tuo repository remoto (cloud) che lo collega a Joe
  • Una copia è quindi possibile clonare nel repository locale e F *% $ - su
  • Al termine, è possibile tornare al telecomando
  • Puoi quindi chiedere a Joe se vuole usarlo nel suo progetto facendo clic su pull-request

Clone

  • una copia nel tuo repository locale (hard disk)

Si noti che il vero vantaggio DVCS è che non è necessario alcun permesso di accesso specifico al repository Joe per farlo. Se Joe vuole che tu contribuisca più spesso, potrebbe concederti i diritti di accesso push: loro potrebbero spingere anideadirettamente al suo repository e salvarti le faccende di mantenere aggiornato il tuo fork. OTOH se non riuscirai a raggiungere un accordo con Joe, potresti semplicemente continuare a sviluppare e utilizzare il fork (e vedere se riesci a fargli cambiare idea in seguito).
Alois Mahdal,

6

Solo per aggiungere ad altri, una nota specifica per il fork.

È bene rendersi conto che tecnicamente, la clonazione del repository e il fork del repository sono la stessa cosa. Fare:

git clone $some_other_repo

e puoi toccare te stesso sul retro --- hai appena biforcato qualche altro repository.

Git, in quanto VCS, si occupa in effetti della clonazione di fork. Oltre a "solo navigare" usando l'interfaccia utente remota come cgit, c'è molto poco a che fare con il repository git che non comporta il biforcamento della clonazione del repo ad un certo punto.

Però,

  • quando qualcuno dice che ho effettuato il fork del repository X , significa che hanno creato un clone del repository da qualche altra parte con l'intenzione di esporlo ad altri, ad esempio per mostrare alcuni esperimenti o per applicare diversi meccanismi di controllo dell'accesso (ad esempio per consentire alle persone senza Accesso Github ma con account interno aziendale per collaborare).

    Fatti che: il repository è probabilmente creato con un comando diverso da git clonequello, che molto probabilmente è ospitato da qualche parte su un server rispetto al laptop di qualcuno, e molto probabilmente ha un formato leggermente diverso (è un "repository nudo", cioè senza albero funzionante) sono solo dettagli tecnici.

    Il fatto che molto probabilmente conterrà diversi set di rami, tag o commit è probabilmente il motivo per cui lo hanno fatto in primo luogo.

    (Cosa fa Github quando si fa clic su "fork", è solo la clonazione con aggiunta di zucchero: clona il repository per te, lo inserisce nel tuo account, registra il "biforcuto" da qualche parte, aggiunge il telecomando chiamato "upstream" e, soprattutto, riproduce la bella animazione.)

  • Quando qualcuno dice che ho clonato il repository X , significa che ha creato un clone del repository localmente sul proprio laptop o desktop con l'intenzione di studiarlo, giocare con esso, contribuire ad esso o creare qualcosa dal codice sorgente in esso.

Il bello di Git è che rende tutto perfettamente adatto: tutti questi repository condividono la parte comune della catena di commit a blocchi , quindi è possibile (in sicurezza) unire le modifiche avanti e indietro tra tutti questi repository come meglio credi.


Nota: "in sicurezza" purché non si riscriva la parte comune della catena e fintanto che le modifiche non sono in conflitto.

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.