2010-04-06 10 views
6

Ho un file con una riga in esso. Creo un ramo e aggiungo una seconda riga allo stesso file. Salvare e impegnarsi nel ramo. Ritorno al master. E aggiungi una seconda riga diversa al file. Salva e invia al master. Quindi ci sono ora 3 linee uniche in totale.Perché Git non può unire le modifiche ai file con un genitore/master modificato?

Se ora provo a unire nuovamente il ramo al master, esso subisce un conflitto di unione.

Perché Git non è sufficiente unire ogni riga, una dopo l'altra?

Il mio tentativo di fusione si comporta qualcosa di simile:

PS D:\dev\testing\test1> git merge newbranch 
Auto-merging hello.txt 
CONFLICT (content): Merge conflict in hello.txt 
Automatic merge failed; fix conflicts and then commit the result. 
PS D:\dev\testing\test1> git diff 
diff --cc hello.txt 
index 726eeaf,e48d31a..0000000 
--- a/hello.txt 
+++ b/hello.txt 
@@@ -1,2 -1,2 +1,6 @@@ 
    This is the first line. 
- New line added by master. 
-Added a line in newbranch. 
++<<<<<<< HEAD 
++New line added by master. 
++======= 
++Added a line in newbranch. 
++>>>>>>> newbranch 

C'è un modo per rendere le linee di slot in automatico, una dopo l'altra?

+2

Non sembra che ci sia un modo semplice per determinare l'ordine in cui dovrebbero essere incastrati - dopotutto, l'ordine può certamente avere importanza quando si tratta di codice eseguibile. – Amber

risposta

12

Diciamo che il ramo file A si presenta come:

First line 
Branch A's second line 

e il ramo B si presenta come:

First line 
Branch B's second line 

Quando si uniscono, ci sono due modi diversi per risolverlo. Ecco un modo:

First line 
Branch A's second line 
Branch B's second line 

Ecco un altro modo:

First line 
Branch B's second line 
Branch A's second line 

Git non ha idea che una di queste due opzioni si preferisce, o se uno sono anche unioni accettabili.

1

Posso dirti perché non è possibile unire i due: in base a git, la riga 2 di FileA è "tale e così" mentre la riga 2 di FileB è "qualcos'altro". Secondo git quindi, sta provando a creare File da FileA e FileB con una riga con due valori possibili. Non può decidere quale vuoi, quindi li scarica entrambi e ti fa sistemare.

2

diciamo che avete questa linea:

printf(something); 

in branchA, si rendono:

while(x < 5) 
printf(something); 

in branchB, si fanno:

if(y>10) 
printf(something); 

Come si può unire questo, o meglio, ti fideresti del risultato dell'unione che uno strumento creato per questo?

4

c'è una strategia git merge chiamato union che può essere configurato dal file .gitattributes configurazione che farà questo per voi, ma non avrà alcun controllo sull'ordine le linee conflittuali finiranno nel nel file unito, e nessun indicatore di conflitto per indicare dove si è verificato.

È inoltre possibile definire una strategia di unione personalizzata che potrebbe utilizzare alcune conoscenze specialistiche sulla struttura dei file per determinare l'ordine corretto.

Problemi correlati