Come applicare Git Commit Diffs a file diversi

0
185

Git è un potente sistema di controllo della versione che consente più versioni ramificate del tuo progetto con fusione automatica. È fantastico, ma a volte si rompe quando i file vengono rinominati o non sono nel posto giusto. Fortunatamente, puoi applicare manualmente patch a file diversi.

Il problema

Quando usi i branch di Git, è spesso necessario per applicare le modifiche da un ramo all'altro. Un caso d'uso comune sono i rami con versione—se hai una vecchia versione di LTS, potresti voler applicare la patch occasionale a una vecchia versione. O forse stai fornendo due build di software destinati a diverse toolchain o ambienti e devi mantenerli sincronizzati.

Se i tuoi rami hanno lo stesso layout, puoi usare git cherry-pick, che può copiare singoli commit da un ramo all'altro. Ad esempio, estraendo un commit da un ramo di funzionalità sul master prima che l'intero elemento venga unito:

RELAZIONATO: Cosa fa Git Cherry Pick e quando dovresti usarlo?

Tuttavia, il software non è sempre pulito e, durante il processo di refactoring, potresti riscontrare casi in cui i file sono stati spostati o rinominati. Git funziona sui percorsi delle directory, quindi questo interrompe completamente git cherry-pick, poiché Git non può applicare modifiche a file che non esistono.

Git ha strumenti per risolvere questo problema, quindi quando la normale fusione si interrompe, puoi correggere manualmente i file con gli aggiornamenti usando git patch.

Uso di Git Diffs e Patch

Per mostrare ciò, creeremo un repository vuoto con un singolo file: Old.java. Con questo file viene creato un nuovo ramo, la vecchia versione, più alcune modifiche. Questo file viene rinominato con alcune modifiche successive sul ramo principale in New.java, interrompendo la compatibilità tra i rami.

Pubblicità

Ed ecco come appare la cronologia del ramo, mostrata nella GUI del programma Git Fork:

In questo esempio, dobbiamo spostare il pulsante “Aggiungi altro codice” commit sul ramo della versione precedente. Per farlo, devi ottenere l'ID di quel commit dal log di riferimento:

git reflog

Quindi, esegui format-patch con l'ID e il flag -1, che creerà una patch file:

git format-patch 82176b5 -1

Questo genererà un file di patch nella directory corrente. Potresti voler spostarlo in una cartella diversa che si trova nel .gitignore config, in modo che non sia interessato dalla modifica dei rami.

Quindi, controlla il ramo della versione precedente e applica le modifiche alla patch utilizzando l'utilità di patch di Linux. Git ha i propri strumenti, git apply e git am, che possono gestirlo, ma a meno di modificare manualmente il file di patch, non hanno opzioni per cambiare il file di destinazione in caso di rinomina/spostamento.

Pubblicità

Puoi passare il nome del file con il parametro -p1 e passare il file della patch con -i.

patch -l -p1 old -i Patches/0001-Add-more-code.patch

Questo dovrebbe modificare il file e aggiungere le modifiche, che dovrai confermare. Uno svantaggio di patch rispetto a git am è che non conserva le informazioni di commit, anche se puoi trovarle nel file .patch se vuoi mantenere il messaggio originale.

Tuttavia, i conflitti di unione possono ancora verificarsi se il ramo di destinazione viene modificato nel frattempo, e nel caso in cui lo faccia, tu& #8217;rimarrai bloccato con la modifica manuale, poiché git merge non può risolverlo per te. patch restituirà file contenenti le differenze, che dovrai correggere manualmente.

In alternativa, puoi spostare il file di destinazione nella directory di destinazione prevista da Git, consentendo a Git di selezionare e applicare le modifiche. Quindi, copia il file nella posizione originale ed elimina il file temporaneo.

Patch può anche avere problemi con le terminazioni di avanzamento riga (LF) rispetto all'avanzamento di riga di ritorno a capo (CRLF) che possono derivare dalla modifica di Windows . Potrebbe essere necessario passare a LF nel tuo editor di testo affinché la patch venga applicata correttamente.