2011-09-20 1 views
103

Esiste un modo per simulare uno git merge tra due rami, il ramo di lavoro corrente e il master, ma senza apportare modifiche?Come testare un'unione senza effettivamente unire prima

Spesso ho conflitti quando devo fare un git merge. C'è un modo per simulare l'unione prima?

+2

vedere anche http: // stackoverflow.it/questions/501407/is-there-a-git-merge-dry-run-option –

+1

Possibile duplicato di [Esiste un'opzione git-merge --dry-run?] (http://stackoverflow.com/questions/501407/is-there-a-git-merge-dry-run-option) –

risposta

91

Non penso che ci sia un modo per simulare ciò che accadrà fino a quando non si prova l'unione. Tuttavia, se ci si assicura che l'output di git status sia vuoto prima di eseguire l'unione, è abbastanza sicuro andare avanti e provarlo. Se si ottiene conflitti, si può immediatamente tornare allo stato foste a prima con:

git reset --merge 

Dal git 1.7.4, è anche possibile annullare l'unione facendo:

git merge --abort 

(come the commit message that added that option explains, questo è stato aggiunto per coerenza con git rebase --abort e così via.)

+2

@ La risposta di Amber sta rispondendo esattamente a cosa viene chiesto "come simulare l'unione". usare '--no-commit' è molto più semplice a mio avviso – samirahmed

+8

@samirahmed: @Amber ha risposto alla domanda in modo più letterale, certo, anche se con' --no-commit' stai ancora cambiando l'indice e l'albero di lavoro, che non è esattamente "senza apportare modifiche" :) Il mio punto è che quando le persone fanno questo tipo di domande, è generalmente perché non sono consapevoli che il modo migliore per vedere come sarebbe stata un'unione è stato _try the merge_, spesso perché non sono consapevoli di quanto sia facile tornare allo stato in cui si trovavano prima se si sono rivelati problemi. –

+2

Non so se questo è stato aggiunto in una versione più recente di git, ma nella documentazione (1.8.4) si afferma "git merge --abort' è equivalente a' git reset --merge' quando 'MERGE_HEAD 'è presente", quindi è più facile da ricordare :) –

91

È possibile utilizzare git merge --no-commit per impedire che l'unione venga effettivamente eseguita e, se non vi piace come funziona l'unione, è sufficiente ripristinare la testina originale.

Se non si desidera finalizzare l'unione, anche se è un avanzamento rapido (e quindi non ha conflitti, per definizione), è possibile aggiungere anche --no-ff.

+0

Non penso che 'git merge --abort' esista - forse intendi' git reset --merge'? –

+0

Nah, ho appena dimenticato che a differenza di 'rebase' non c'è un' --abort' per 'git merge'. – Amber

+5

Lancio anche su '--no-ff'. Per evitare che si verifichi una fusione di ff. – Andy

3

Sono stato in grado di utilizzare git merge --abort, di recente. Tuttavia, questo può essere utilizzato solo se esiste un conflitto di unione. Se sei sicuro di non voler commettere, usa gli altri metodi sopra citati.

66

Se voglio mettere a confronto le modifiche su un ramo argomento da padroneggiare, lo trovo più semplice e più sicuro per fare quanto segue:

git checkout master 
git checkout -b trial_merge 
git merge topic_branch 

Dopo aver completato la fusione, è facile vedere il cambiamento consolidata da maestro

git diff master 

al termine, è sufficiente eliminare il ramo trial_merge

git checkout master 
git branch -D trial_merge 

In questo modo, il ramo principale non cambia mai.

+0

Ottima idea. Grazie. – djangofan

+0

Funziona bene per me! – user1176783

+0

strategia piacevole e sicura, grazie! – Tol182

1

uso:

git merge --ff-only 

secondo documentation:

rifiutano di fondersi e di uscita con uno stato diverso da zero a meno che la HEAD corrente è già up-to-data o l'unione può essere risolto come un fast forward.

Non è proprio una simulazione perché ci sarà una fusione veloce in avanti in caso di conflitti tra i due rami. Ma in caso di conflitti, sarai informato e non accadrà nulla.

1

Perché non creare un ramo usa e getta (git checkout -b) ed eseguire un test di unione?