2012-04-18 7 views
5

Ok, ecco la mia Q. "git rerere" confronta gli hash di due file per capire la risoluzione? Cioè, dicono che ho un file XML che contiene questo tag:Come fa Git Rerere a capire le somiglianze tra due conflitti?

<number>12</number> 

Quando ho un conflitto, che il numero di solito viene cambiato a qualcosa come 13, 14, ecc, quindi mi sono bloccato con:

<<<<<<< 
<number>12</number> 
======= 
<number>13</number> 
>>>>>>> 

È possibile rieseguire automaticamente questo conflitto anche se i numeri non corrispondono a quelli dell'ultima volta? Voglio sempre risolverlo in modo tale da richiedere il numero più alto (nell'esempio sopra, 13). Quindi, se registra la risoluzione per i numeri 12 e 13, risolverà il conflitto con numeri diversi? Ho il sospetto che non lo farà, ma potrebbe anche chiedere.

risposta

7

Può rerere automaticamente risolvere questo conflitto, anche se i numeri non sono gli stessi come l'ultima volta? Voglio sempre risolverlo in modo tale da richiedere il numero più alto (nell'esempio sopra, 13).

No, git rerere non può farlo.

Quando si utilizza git rerere, si sta chiedendo di ricordare due cose:

  • un conflitto specifico (cioè il testo letterale dei fusti che sono in conflitto e le file che sono in); e
  • la risoluzione che dovrebbe essere applicata a tale conflitto

Perché questi sono fusto letterali (ad esempio "sostituire 12 con 13") piuttosto che qualche tipo di funzione di trasformazione (ad esempio "sostituire N con N + 1 "), git non è in grado di dedurre che si desidera sostituire ogni numero con uno più alto.

Se in seguito si incontra un conflitto che non corrisponde a nessuno dei conflitti precedentemente ricordati, è come se non si fosse mai verificato quel conflitto, anche se potrebbe essere simile (come nell'esempio in cui i numeri sono sempre uno spento).

Una via d'uscita è possibile se questo file XML viene generato automaticamente. In tal caso, potresti voler considerare di non tenerlo affatto nel controllo del codice sorgente e invece di generarlo in fase di runtime. Quindi non avrai mai i conflitti corrispondenti da ripulire.

Un altro approccio è evitare del tutto git rerere, e invece scrivere un driver di unione personalizzato che risolverà le cose per voi. L'ho già fatto, ma è una quantità di lavoro non banale e richiede di scrivere e testare del codice. Se sei interessato a questa strategia, vedi the link in Karl's answer.

+0

Ah, pensavo. Grazie per una risposta approfondita.Sfortunatamente, questi numeri sono sempre inseriti da umani, quindi sembra che darò un'occhiata al driver di fusione personalizzato. Grazie per il suggerimento, tu e Karl. – mart1n

2

Vanity git non confronta i file in questo modo. Fa un confronto string stringente e non sa nulla della semantica di esso.

Tuttavia, dare un'occhiata a "Definizione di un driver di unione personalizzato" nello gitattributes man page. Ti consente di scrivere il tuo programma per risolvere alcune fusioni come preferisci, inclusa la scelta del numero più alto.

Problemi correlati