|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
[Git] Rebase
Ciao!
Non ho ben capito quale sia la differenza tra "rebase" e "merge". Grazie in anticipo! Ultima modifica di Alessio465 : 22-03-2015 alle 13:13. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12900
|
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? |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
|
|
|
|
|
|
#5 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
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. Ultima modifica di Alessio465 : 22-03-2015 alle 19:14. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2010
Città: Londra
Messaggi: 620
|
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 Codice:
git checkout develop poi si fa un branch per la nuova feature, ad esempio per un nuovo sistema mail Codice:
git checkout -b new-mail-system Codice:
git checkout develop Codice:
git merge new-mail-system il passo successivo e' dare un occhiata a continuous integration / deployment |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
Grazie! Ho letto attentamente la guida. I passi descritti sono esattamente gli stessi che ho seguito, eppure non fa quel desidero... Farò altre prove..
Ultima modifica di Alessio465 : 23-03-2015 alle 01:01. |
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Nov 2010
Città: Londra
Messaggi: 620
|
Se quel che hai scritto e' corretto, NON stai facendo come ho spiegato
Cerco di risponderti punto per punto 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. Quote:
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. vedi sopra, se fai commit e push del branch "master" stai probabilmente sovrascrivendo le modifiche del tuo amico. Quote:
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. |
||
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
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. Codice:
git checkout -b branchB git ... (aggiunge files, ecc..) git checkout master git pull git merge branchB Facendo git pull dal master, non mi viene scaricato tutto il suo contenuto... solo una parte (?) Ultima modifica di Alessio465 : 23-03-2015 alle 02:14. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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. |
|
|
|
|
|
#11 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
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. (?) Ultima modifica di Alessio465 : 23-03-2015 alle 17:42. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
|
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
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? |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
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.
|
|
|
|
|
|
#15 |
|
Junior Member
Iscritto dal: Jul 2014
Messaggi: 7
|
Grazie mille! Risolto
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:03.




















