Come evitare l'inferno merge-commit su GitHub / BitBucket


101

Stiamo finendo con un sacco di commit come questo nel nostro repository:

Merge branch 'master' of bitbucket.org:user/repo

Ciò accade ogni volta che uno sviluppatore sincronizza il suo fork locale con il repository di primo livello.

C'è comunque per evitare che questo inferno di merge-commit ingombra tutto il registro del repository? È possibile evitarli quando si iniziano in qualche modo le richieste pull?

So che posso fare git rebase se questo viene fatto solo nella mia VM locale, c'è qualche equivalenza nell'interfaccia utente GitHub / BitBucket?

Come fate voi ragazzi a farlo?

Risposte:


136

Ribasare i rami delle funzionalità prima della fusione

Se vuoi evitare i commit di unione, devi assicurarti che tutti i commit siano in avanti veloce. Puoi farlo assicurandoti che il tuo ramo di funzionalità si basi in modo pulito sulla tua linea di sviluppo prima di un'unione in questo modo:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase ha anche molti flag, incluso il rebase interattivo con il -iflag, ma potresti non averne bisogno se stai mantenendo le cose il più semplici possibile e vuoi preservare tutta la cronologia del tuo ramo su un'unione.

Usa la --ff-onlybandiera

A parte il rebase, l'uso del --ff-onlyflag assicurerà che siano consentiti solo i commit di avanzamento rapido. Se invece fosse un commit di unione, non verrà effettuato un commit. La pagina di manuale di git-merge (1) dice:

--ff-only

Rifiuta di unire e uscire con uno stato diverso da zero a meno che l'attuale HEAD non sia già aggiornato o l'unione possa essere risolta come un avanzamento rapido.


1
Questa è un'ottima risposta. Uso rebase il più spesso possibile. Tuttavia non sapevo della bandiera --ff-only. Abbastanza bello!
Leo Correa

3
Grazie per il rebase e i consigli --ff-only. Tuttavia, come detto nella mia domanda, come posso farlo all'interno dell'interfaccia utente di GitHub / BitBucket?
Niklas9

3
@Niklas Sono abbastanza sicuro che dovrai ricorrere alla CLI per fare quello che vuoi. GitHub non espone tutta la potenza di Git; solo un sottoinsieme delle sue caratteristiche più alcuni elementi grafici e di social networking. In bocca al lupo!
Todd A. Jacobs

3
Una cosa da notare con questo processo è che, prima di unire nuovamente il ramo dell'argomento (funzionalità / pippo) nel master, è meglio git pull origin master (se si utilizza un telecomando), per assicurarsi che il ramo master sia aggiornato . Se sono stati trovati aggiornamenti, assicurati di ricondurre nuovamente il master nel ramo dell'argomento prima di unirlo di nuovo nel master.
chikamichi

19
@CodeGnome non chiamatelo "ricorrere" alla CLI ... in realtà dovreste avvertire di "ricorrere" alla UI!
Droogans

9

"Todd A. Jacobs" già citato "rebase" è il concetto qui. Questo è solo un modo più dettagliato di fare le cose.

Diciamo che sei nel ramo principale

$ git branch
  * master

Volete fare una correzione, quindi create un "ramo fisso" che è ramificato dal master

$ git checkout -b fixbranch

Forse avresti lavorato per un paio di giorni su questo ramo e avresti avuto un paio di commit.

Il giorno in cui volevi trasferire i tuoi impegni al repository principale centrale! Checkout master e ottieni le ultime modifiche dal repository principale centrale

$ git checkout master
$ git pull origin master

Ribassa il tuo fixbranch con il master per avere una cronologia pulita e risolvere gli eventuali conflitti nel repository locale stesso.

$ git checkout fixbranch
$ git rebase master

Ora fixbranch è aggiornato con il master centrale, fammi unire fixbranch nel ramo master

 $ git checkout master
 $ git merge fixbranch

Ho finito! fammi spingere il master locale al master centrale

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing


Apprezzo questa risposta.
lasec0203
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.