2014-10-07 16 views
37

Ho sentito parlare di "fusione bolle" per quanto riguarda Git. Sono abbastanza esperto in Git, ma non mi considererei un esperto. Ho sentito alcune cose negative su unire le bolle; che cosa è una "bolla di fusione" in Git, cosa c'è che non va e come posso evitarlo?Che cos'è una "bolla di fusione"?

risposta

38

A una bolla di unione è una "unione banale" in Git che non richiede conflitti da risolvere. La bolla si verifica nel registro in cui viene visualizzata l'unione quando si utilizza l'opzione --graph. per esempio, se è stato eseguito git log --graph si potrebbe vedere qualcosa di simile:

| | 
* | commit d79f3c4e129356b055c659ee5be28081c1f38aa1 
|\ \ Merge: 09bf1ed 4ef9a23 
| | | Author: Peter <[email protected]> 
| | | Date: Wed Sep 17 17:21:07 2014 -0400 
| | | 
| | |  Merge branch 'master' of http://fictitiousrepo.visualstudio.com/DefaultCollection/_git/fictitiousproject 
| | | 
| * | commit 4ef9a2387f0d4db39a6cab8ff8f531815935c305 
| | | Author: Andrew <[email protected]> 
| | | Date: Tue Sep 16 11:54:14 2014 -0500 
| | | 
| | |  updated changelog 
| | | 
* | | commit 09bf1ed0125d77c26b5760939c125998bb046e9a 
|//Author: Peter <[email protected]> 
| | Date: Wed Sep 17 17:20:30 2014 -0400 
| | 
| |  fixed some bugs 

dove le righe "rigonfiamento" è il "merge bolla". Questo può sembrare innocuo; ma molti lo considerano molto meno leggibile di quello che potrebbe essere accaduto, che sarebbe come questo:

| 
* commit 09bf1ed0125d77c26b5760939c125998bb046e9a 
| Author: Peter <[email protected]> 
| Date: Wed Sep 17 17:20:30 2014 -0400 
| 
|  fixed some bugs 
| 
* commit 4ef9a2387f0d4db39a6cab8ff8f531815935c305 
| Author: Andrew <[email protected]> 
| Date: Tue Sep 16 11:54:14 2014 -0500 
| 
|  updated changelog 
| 

... perché nessuno merge era veramente necessario.

Generalmente ciò accade quando si accetta una richiesta di pull unendola automaticamente. A volte questo era dovuto al modo in cui il pulsante "Unisci richiesta pull" usato per lavorare su Github.

Per evitare l'unione di bolle con richieste di pull, è necessario unire manualmente una strategia. Per esempio:

git checkout master 
git remote add remoteorigin git://remotegithost.com/remotegitrepo/remotegitproject 
git fetch remoteorigin 
git merge remoteorigin/remoteprojectbranch 
git push origin master 

Per rimuovere una bolla di fusione recentemente impegnata da una richiesta di pull (quando non avete spinto), una strategia è quella di riporre prima le modifiche correnti, reimpostare la testa per il commit prima che la bolla, tirare con rebase, quindi premere. Per esempio:

git stash save 
git reset --hard HEAD~1 
git pull --rebase 
git push origin HEAD 

Riferimento: http://adammonsen.com/post/1172

+6

+ Domanda e risposta. Spettacolo di una sola persona. –

+3

Questa è come ... la migliore domanda auto-risposta che abbia mai visto. Super solido, grazie per la condivisione. – meagar

+4

Non riuscivo a trovare una risposta su SO, quindi avevo pensato di condividere ... –