2011-02-22 9 views
12

Capisco che la "nostra" strategia di unione (ascoltare le virgolette intorno a unione?) In realtà non utilizzi alcun commit dall'altro ramo.Perché si dovrebbe usare "git merge -s ours"?

La "nostra" strategia viene talvolta citata come "mantenere la storia dell'altro". Ma registra quella storia come "applicata". Strano. Ci sono casi in cui desidero questo comportamento?

In alternativa, si potrebbe anche importare l'altro ramo e lasciare che la sua storia lì, dove appartiene.

Nota che sto chiedendo la strategia "-s our", non l'opzione "-X nostra" a "-s ricorsiva" (che è diversa in quanto applica quei commit che non sono in conflitto).

+0

Anche se molto tardi: Date un'occhiata [qui] (http://stackoverflow.com/a/1426163/5784831) – Christoph

risposta

10

Un uso è quello di "saltare" un commit effettuato su un ramo di manutenzione che non è destinato ad andare di nuovo nel tuo ramo principale/di sviluppo del tronco. Vedere questa domanda precedente per un esempio: git - skipping specific commits when merging

2

Sto usando questa pseudo-unione in un ramo aggiuntivo usato per tracciare gli altri rami, compresi quelli abbandonati. Questo ramo aggiuntivo ha in realtà solo un file (chiamato branches-list), che contiene un elenco di testo dei rami attivi e inattivi, ma nei punti importanti (per lo più branch-points e "end-of-branch", si fondono o si abbandonano) i rami di sviluppo sono uniti (con "-s nostro") a questo ramo.

Ecco una recente screenshot di our project:

screenshot

Così, ho infine ramificati elo-test da maestro, e poi da questo ho ramificata stroke-transform-example per il mio question here (e la risposta - questo avrebbe dovuto essere due diversi commette, però). In corrispondenza di ciascun punto di diramazione e, cosa più importante, in ogni punto in cui un ramo termina senza essere unito a qualche altro ramo (che succederà a stroke-transform-example quando ripulisco), ora unisco questo ramo con -s ours alle meta- filiale branches.

Quindi posso eliminare i rami non utilizzati più senza perdere la cronologia, quindi l'output di git branch -a è sempre piuttosto ridotto. Se poi voglio rivedere quello che ho fatto, posso facilmente trovarli.

(credo che questo non è davvero quello che questa opzione è fatto per, ma funziona piuttosto bella.)

+0

Grazie per la tua risposta illustrativa. Dopo * merge -sours ", discriminare questa fusione" pseudo "da" real merges "richiede di guardare il diff, sto ottenendo questo giusto? –

+0

btw & ot, penso che proverò questo [link] (http: //www.fencing -game.de/en/rules) occasionalmente (con carta e matita)! –

+1

Sì, hai ragione, nel mio caso sto usando questi pseudo si fonde solo sul ramo 'branches', quindi è facile da vedere. il gioco è molto più facile da giocare con il supporto del computer, dal momento che non dovresti vedere i punti nascosti del tuo contro-giocatore. Sentiti libero di guardare il nostro programma, è gratis giocare online :-) –

0

Un altro uso è un'alternativa a un push di forza che non causa modifiche non fast-forward per gli altri.

E.g. vuoi annullare un commit (stupido) in arrivo, ma non vuoi fare git push -f perché poi trascorrerai la prossima mezz'ora a guidare il tuo cliente attraverso il recupero e vuoi un'alternativa più breve a

git checkout -b temp remote/origin 
git revert HEAD 
git push temp:origin 
git checkout master 
git merge origin/master 

quindi è sufficiente fare

git merge -s ours origin/master 
1

un altro motivo è quando si dispone di un ramo che è molto fuori sincronia con il ramo attivo, e si desidera aggiornare il vecchio con quella attiva, ma possibile unire i conflitti evitare che ciò avvenga facilmente con una normale unione.

Ad esempio, il mio caso d'uso era:

Hai un ramo master e dev, e per qualche motivo, non hanno aggiornato il tuo branch master in settimane, e il vostro tentativo di unire il ramo dev in padrone ora genera conflitti di fusione. Quello che potresti voler fare è sovrascrivere il tuo ramo principale con lo stato attuale del tuo ramo dev, quindi portali entrambi in sincronia.

Ciò che è possibile fare in questo caso è il seguente, utilizzando i passaggi descritti da un altro utente SO in another SO answer here. Ma si prega di consultare la mia nota di avvertimento sotto.

git checkout dev 
git merge -s ours master 
git checkout master 
git merge dev 

Merita una breve nota: Alla fine di esso, il mio maestro è stato aggiornato con il mio dev, ma dev ha mostrato 4 impegna a essere spinto al telecomando, che è strano. Ci dovrebbe essere 0 per spingere, come volevo aggiornare master. Tuttavia, il codice sembrava buono. Vale la pena notare che non avevo mai usato lo git merge -s ours prima di questo, quindi non sono al 100% sul suo utilizzo.

ho trovato anche un'altra risposta utilizzando ours che potrebbe essere utile alle persone: https://stackoverflow.com/a/13307342/339803