Domanda

Sto usando Git su Windows (msysgit) per tenere traccia delle modifiche per alcuni lavori di progettazione che ho svolto.

Oggi ho lavorato su un PC diverso (con repository remoto brian) e ora sto cercando di unire le modifiche apportate oggi nella mia normale versione locale sul mio laptop.

Sul mio laptop, ho usato git pull brian master per inserire le modifiche nella mia versione locale. Tutto andava bene a parte il documento principale di InDesign - questo dimostra come un conflitto.

La versione sul PC (<=>) è la versione più recente che voglio conservare ma non so quali comandi dice al repository di utilizzare questa.

Ho provato a copiare direttamente il file sul mio laptop ma questo sembra interrompere l'intero processo di unione.

Qualcuno può indicarmi la giusta direzione?

È stato utile?

Soluzione

git checkout accetta un'opzione --ours o --theirs per casi come questo. Quindi se hai un conflitto di unione e sai che vuoi solo il file dal ramo in cui ti stai unendo, puoi fare:

$ git checkout --theirs -- path/to/conflicted-file.txt

per usare quella versione del file. Allo stesso modo, se sai di volere la tua versione (non quella da unire) puoi usare

$ git checkout --ours -- path/to/conflicted-file.txt

Altri suggerimenti

Devi risolvere il conflitto manualmente (copiando il file sopra) e quindi eseguire il commit del file (non importa se lo hai copiato o utilizzato la versione locale) in questo modo

git commit -a -m "Fix merge conflict in test.foo"

Git normalmente si autocommuta dopo l'unione, ma quando rileva conflitti non può risolversi da solo, applica tutte le patch che ha capito e lascia il resto per risolvere e eseguire il commit manualmente. La Pagina Git Merge Man , la Git-SVN Crash Course o questo post di blog potrebbe fare luce su come dovrebbe funzionare.

Modifica: vedi il post in basso, in realtà non devi copiare i file da solo, ma puoi usare

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

per selezionare la versione del file desiderato. La copia / modifica del file sarà necessaria solo se si desidera un mix di entrambe le versioni.

Contrassegna la risposta mipadis come corretta.

Puoi anche superare questo problema con

git mergetool

che causa git la creazione di copie locali del file binario in conflitto e la creazione dell'editor predefinito su di essi:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

Ovviamente non è possibile modificare in modo utile i file binari in un editor di testo. Invece si copia il nuovo <=> file su <=> senza chiudere l'editor. Quindi quando chiudi l'editor <=> vedrà che la copia di lavoro non decorata è stata modificata e il conflitto di unione è risolto nel solito modo.

Per risolvere mantenendo la versione nel tuo ramo corrente (ignora la versione dal ramo in cui ti stai unendo), aggiungi e impegna il file:

git commit -a

Per risolvere sovrascrivendo la versione nel tuo ramo corrente con la versione del ramo in cui ti stai unendo, devi prima recuperare quella versione nella tua directory di lavoro, quindi aggiungerla / eseguirla:

git checkout otherbranch theconflictedfile
git commit -a

Spiegato in modo più dettagliato

La risposta di mipadi non ha funzionato abbastanza per me, dovevo farlo:

  

checkout git - il percorso / / / file.bin

oppure, per mantenere l'unione della versione:

  

git checkout - il loro percorso / a / file.bin

poi

  

git aggiungi percorso / a / file.bin

E poi sono stato in grado di fare " git mergetool " di nuovo e continuare con il prossimo conflitto.

Dai git checkout documenti

  

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

     

--ours
   --theirs
  Quando si verificano i percorsi dall'indice, consultare la fase 2 (ours) o # 3 (theirs) per i percorsi non uniti.

     

L'indice può contenere voci non unite a causa di una precedente unione non riuscita. Per impostazione predefinita, se si tenta di estrarre tale voce dall'indice, l'operazione di verifica fallirà e non verrà eseguito il checkout. L'uso di -f ignorerà queste voci non unite. I contenuti di un lato specifico dell'unione possono essere estratti dall'indice utilizzando -m o <=>. Con <=>, le modifiche apportate al file dell'albero di lavoro possono essere scartate per ricreare il risultato dell'unione in conflitto originale.

Questa procedura serve a risolvere i conflitti di file binari dopo aver inviato una richiesta pull a Github:

  1. Quindi su Github, hai scoperto che la tua richiesta pull ha un conflitto su un file binario.
  2. Ora torna allo stesso ramo git sul tuo computer locale.
  3. (a) ri-creare / ricostruire nuovamente questo file binario e (b) eseguire il commit del file binario risultante nello stesso ramo git.
  4. Quindi premi nuovamente lo stesso ramo git su Github.

Su Github, su tua richiesta pull, il conflitto dovrebbe scomparire.

Mi sono imbattuto in un problema simile (volevo eseguire un commit che includeva alcuni file binari che causavano conflitti durante l'unione), ma mi sono imbattuto in una soluzione diversa che può essere fatta interamente usando git (cioè non dover copiare manualmente i file) . Ho pensato di includerlo qui, per lo meno posso ricordarlo la prossima volta che ne ho bisogno. :) I passaggi si presentano così:

% git fetch

Questo recupera gli ultimi commit dal repository remoto (potrebbe essere necessario specificare un nome di ramo remoto, a seconda della configurazione), ma non tenta di unirli. Registra il commit in FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update

Questo prende la copia dei file binari che desidero e sovrascrive ciò che è nell'albero di lavoro con la versione recuperata dal ramo remoto. git non tenta di eseguire alcuna fusione, quindi si ottiene semplicemente una copia esatta del file binario dal ramo remoto. Una volta fatto, puoi aggiungere / eseguire il commit della nuova copia come al solito.

Mi sono imbattuto in due strategie per la gestione della differenza / unione di file binari con Git su Windows.

  1. Tortoise git ti consente di configurare strumenti diff / merge per diversi tipi di file in base alle loro estensioni. Vedi 2.35.4.3. Diff / Merge Advanced Settings http://tortoisegit.org/docs/tortoisegit/tgit- dug-settings.html . Questa strategia ovviamente si basa sulla disponibilità di strumenti di diff / merge adeguati.

  2. Usando gli attributi git puoi specificare uno strumento / comando per convertire il tuo file binario in testo e poi lasciare che il tuo strumento diff / mer di default faccia la sua cosa. Vedi http://git-scm.com/book/it/ v2 / Personalizzazione-Git-Git-Attributi . L'articolo fornisce anche un esempio dell'uso dei metadati per le immagini diff.

Ho avuto entrambe le strategie per lavorare con file binari di modelli software, ma siamo andati con tortoise git in quanto la configurazione era semplice.

Se il binario è qualcosa di più di una dll o qualcosa che può essere modificato direttamente come un'immagine o un file di fusione (e non è necessario eliminare il cestino / seleziona un file o l'altro) una vera unione sarebbe come:

Suggerisco di cercare uno strumento diff orientato ai file binari, ad esempio ce ne sono alcuni gratuiti per i file di immagine

e confrontali.

Se non esiste uno strumento diff per confrontare i tuoi file, allora se hai il generatore originale del file bin (ovvero esiste un editor per esso ... come Blender 3d, puoi quindi ispezionare manualmente quei file, anche vedere i registri e chiedere all'altra persona cosa dovresti includere) ed esegui un output dei file con https: // git -scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

Uso Git Workflow per Excel - https: //www.xltrail. com / blog / git-workflow-for-excel per risolvere la maggior parte dei problemi di unione relativi ai miei file binari. Questa app open-source mi aiuta a risolvere i problemi in modo produttivo senza spendere troppo tempo e mi permette di scegliere la versione giusta del file senza alcuna confusione.

il mio caso sembra un bug .... usando git 2.21.0

Ho fatto un tiro ... si è lamentato dei file binari:

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

E poi nulla in nessuna delle risposte qui ha prodotto un risultato che avesse un senso.

Se guardo quale file ho ora ... è quello che ho modificato. Se lo faccio anche io:

git checkout --theirs -- <path>
git checkout --ours -- <path>

Ottengo l'output:

Updated 0 paths from the index

e ho ancora la mia versione del file. Se rm e poi checkout, dirà invece 1, ma mi dà ancora la mia versione del file.

dice git mergetool

No files need merging

e lo stato git dice

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

Un'opzione è annullare il commit ... ma sono stato sfortunato e ho avuto molti impegni, e questo cattivo è stato il primo. Non voglio perdere tempo a ripeterlo.

per risolvere questa follia:

Ho appena corso

git commit

che perde la versione remota e probabilmente spreca spazio per la memorizzazione di un file binario aggiuntivo ... quindi

git checkout <commit where the remote version exists> <path>

che mi restituisce la versione remota

quindi modificato di nuovo il file ... e quindi esegui il commit e il push, il che probabilmente significa sprecare spazio con un'altra copia del file binario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top