View Full Version : [Git] Aggiungere branch al master
Alessio465
22-03-2015, 00:54
Ciao!
Non ho ben capito quale sia la differenza tra "rebase" e "merge". Grazie in anticipo! :)
Merge è un operazione non distruttiva. Ti permette di unire i commit di due branch lasciando gli originali inalterati. Rebase è un operazione simile ma riscrive la storia del progetto modificando tutti i commit del branch sorgente per spostarli in quello di destinazione.
Discussione interessante, direi di tenerla aperta e ne approfitto per chiedere ai più esperti una questione.
Supponiamo di avere due branch, uno master "stabile" e uno experimental (più sperimentale).
Inizialmente sono uguali, dopodiché man mano vengono aggiunte modifiche all'experimental.
A questo punto però si rende necessario un intervento correttivo sul master.
Qual è il modo migliore di importare le modifiche da master su experimental (che adesso è più avanti), ammesso naturalmente che questo abbia senso?
Forse non ho capito bene come è la situazione. Però se experimental è l'unico su cui si è lavorato allora ha poco senso fare un merge da master ad experimental. Non ci sarebbe niente di cambiato.
Alessio465
22-03-2015, 18:11
Attualmente nel master è stato caricato un branch A. Io lavoro in locale su un branch B che ho poi inviato al remoto con vari comandi per tracciare i files e infine "commit" e "push". Se compio delle modifiche a files che ho già caricato devo aggiornare il branch locale con "pull". Ora dovrei unire il mio branch al master, in modo da non sovrascrivere quello del mio amico che è già stato caricato.
Per prova, ho creato un mio repository e due branches. Ma quando faccio le operazioni come quelle precedenti, i files vengono sovrascritti. Quindi mi viene il dubbio di dover usare altri comandi tra cui rebase e merge oppure scaricare l'intero master in locale, aggiungere i file del mio branch e rinviare tutto il pacchetto.
Per progetti complessi vi consiglio di leggere:
http://nvie.com/posts/a-successful-git-branching-model/
Per progetti semplici in genere la strategia che vedo piu' adottata e' tenere branch master che corrisponde al codice che c'e' in produzione, branch develop che corrisponde al codice che c'e' sullo staging e poi ogni qual volta si vuole cambiare qualcosa si ragiona in termine di feature/ticket (agile)/issue e si crea un branch nuovo a partire da develop.
Ad esempio in questa situazione
master <- develop
git checkout develop, e si va nel branch develop.
poi si fa un branch per la nuova feature, ad esempio per un nuovo sistema mail
git checkout -b new-mail-system
si lavora, si fa commit, push, pull quel che va fatto e poi quando si e' finito di lavorare a questa feature si torna in develop
git checkout develop
si fa il merge, risolvendo eventuali problemi
git merge new-mail-system
poi eventualmente push a github e in questo momento develop contiene la feature aggiunta new-mail-system
il passo successivo e' dare un occhiata a continuous integration / deployment :)
Alessio465
22-03-2015, 23:36
Grazie! Ho letto attentamente la guida. I passi descritti sono esattamente gli stessi che ho seguito, eppure non fa quel desidero... Farò altre prove..
Se quel che hai scritto e' corretto, NON stai facendo come ho spiegato :)
Cerco di risponderti punto per punto
Attualmente nel master è stato caricato un branch A.
Non capisco il senso. Il branch principale dovrebbe chiamarsi "master".
Se lo chiami in un altro modo fai confusione.
Lascia il branch principale "master" e crea altri branch per fare le feature come ti ho detto.
Io lavoro in locale su un branch B che ho poi inviato al remoto con vari comandi per tracciare i files
Se lavori in locale su un branch chiamato per ipotesi "branch-b" e lo invii al remoto non sovrascrivi nulla di master.
Se per te "branch B" significa che tu stai lavorando sul tuo master e il tuo amico sta lavorando sul suo master, allora non state usando branch ma siete di fatto tutti e due su master quindi le vostre modifiche vengono sovrascritte l uno dall'altro.
e infine "commit" e "push".
vedi sopra, se fai commit e push del branch "master" stai probabilmente sovrascrivendo le modifiche del tuo amico.
Se compio delle modifiche a files che ho già caricato devo aggiornare il branch locale con "pull". Ora dovrei unire il mio branch al master, in modo da non sovrascrivere quello del mio amico che è già stato caricato.
per fare questo tu lavori sul tuo "branch-b" locale, fai commit e push a remoto di quel branch.
Una volta che hai finito torni su "master' con "git checkout master" (meglio avere un branch intermedio chiamato develop come ti ho detto cmq)
una volta che sei dentro master ti assicuri di avere l'ultima versione quindi fai "git pull"
una volta che sei a pari col remoto puoi fare il merge delle tue modifiche con "git merge branch-b" e se non ci sono file che sono stati toccati dal tuo amico il merge e' immediato altrimenti dovresti risolvere i conflitti.
e' scontato che se tutti e due avete il permesso di fare push al repository avete lo stesso potere di sovrascrivere i file quindi mettetevi d'accordo nel caso tra di voi se devi sovrascrivergli qualcosa.
lui automaticamente la volta dopo deve fare "git pull" per aggiornare il suo master e poi fare merge delle sue modifiche e cosi via per te lo stesso sara' successivamente.
il modo per "decidere" generalmente a parte mandarsi un messaggio in chat puo' essere una cosa piu' formale come aprire una pull request e discutere li delle modifiche fatte e del possibile merge, che puo' essere poi fatto da entrambi sostanzialmente.
altrimenti uno dei due mantiene la possibilita' di fare push e l'altro fa solo pull request che devono essere approvate e mergiate da chi detiene il potere.
Alessio465
23-03-2015, 00:50
Sì, quasi sicuramente sbaglio in qualche punto :)
Mi sono espresso male. Nel mio caso il branch principale (il trunk in SVN) è sempre il master, che inizialmente è vuoto. In un secondo tempo sono stati creati due branch (branchA e branchB). Il branchA è del mio collaboratore, sul branchB lavoro io.
Il branchA (file1 e file2) è in locale sul PC1 , il branchB (file3 e file4) è in locale sul PC2. Infine, tutto il contenuto del branchA è stato inviato al master.
Ora vorrei inviare al master il contenuto del mio ramo branchB, senza sovrascrivere il contenuto del primo, in modo che il master contenga tutti e quattro i file.
git checkout -b branchB
git ... (aggiunge files, ecc..)
git checkout master
git pull
git merge branchB
I files contenuti nel master (provenienti dal branchA) vengono persi, mentre al loro posto trovo i miei...
Facendo git pull dal master, non mi viene scaricato tutto il suo contenuto... solo una parte (?)
Quello che hai scritto sembra giusto. Ho provato in due minuti a ricreare quello che hai descritto e funziona senza problemi. Alla fine ho ho file1, file2, file3 e file4 nella cartella.
State probabilmente sbagliando qualche comando ma senza la sequenza esatta dei comandi che sono stati dati è difficile capire dove commettete l'errore.
Alessio465
23-03-2015, 11:49
1) Ho creato il repository Prova (nel master c'è un file README.md)
2) Sul Desktop ho creato una cartella "prova" in cui ho clonato il repository
3) Ho creato un nuovo branch (ramoA), ho cancellato il file README.md in locale e ho inserito una cartella "ramoA" con dentro un file "testoA.txt"
4) Ho aggiunto i file al ramoA, infine li ho inviati al server remoto. Fin qui ok.
5) Ripasso al master, faccio il pull, e unisco il ramoA... invio al remoto e... sul master trovo la cartella ramoA con dentro testoA.txt, ma il README.md è scomparso. (?)
Ma è normale che non ci sia più README.md. Lo hai cancellato quando eri in ramoA ed hai fatto il commit di quella modifica. Se subito dopo fai il merge in master giustamente lo cancella anche li.
Alessio465
23-03-2015, 13:28
Ok, il punto è questo. Nel mio branch non ho i file del master... voglio solo unirlo a quest'ultimo senza un ulteriore commit con messaggio.
Cosa devo fare, passo per passo?
Ok. Allora spostati in master e dai git pull così sei sicuro di avere l'ultima versione disponibile sul server. Torna nel tuo branch con git checkout ramoA. Ora dai git merge master così prendi le modifiche fatte in master che non ci sono nel tuo branch.
Alessio465
23-03-2015, 16:41
Grazie mille! Risolto :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.