Recentemente ho riscontrato un problema in cui un file vuoto è stato rinominato in modo diverso in due rami ma è stato unito senza che si verificasse un conflitto.Rilevamento di rinominazione Git del file vuoto
I passaggi per ricreare sono i seguenti.
Creare un file vuoto.
git init touch empty git add empty git commit -m "add empty file"
Rinominarlo nel ramo.
git checkout -b branch git mv empty empty-in-branch git commit -m "empty -> empty-in-branch"
Rinominarlo in modo diverso nel master.
git checkout master git mv empty empty-in-master git commit -m "empty -> empty-in-master"
Unire il ramo al master.
git merge --no-commit branch
Questo dà il messaggio Automatic merge went well; stopped before committing as requested
.
git status
mostra solo il nuovo file empty-in-branch
. Ma non c'è la cancellazione di empty-in-master
quindi se ci impegniamo in questa fase otterremo entrambi i file.
Mi aspetto che questo sia contrassegnato come un conflitto di merge che necessitava di una risoluzione manuale (ovvero decidere quale file vuoto conservare). Questo è ciò che accade se il file originale non è vuoto.
C'è qualcosa di speciale sui file vuoti che influisce sul rilevamento della ridenominazione? Ci sono dei parametri che potrei aggiungere allo git merge
che lo otterrà per rilevare il conflitto (ad esempio modificando la strategia di fusione)?
Comportamento interessante di sicuro. Non sei sicuro della causa, ma ... Git memorizza i file in base al loro contenuto. Quindi due file vuoti sarebbero tecnicamente considerati uguali. A causa del potenziale per un numero enorme di sovrapposizioni, avrebbe senso avere una logica speciale qui. – Barett
Sembra che ci possa essere una gestione speciale per i file vuoti. Ma Git memorizza già solo una copia di ciascun oggetto in base al suo hash, quindi non c'è alcuna differenza tra un sacco di file vuoti duplicati e un sacco di file duplicati non vuoti (cioè non è necessario un trattamento speciale dei file vuoti). –