Resolvendo o Git com Arquivos Binários

Eu usei o Git no Windows (msysgit) para rastrear mudanças em alguns trabalhos de design que fiz.

Hoje eu estava trabalhando em outro PC (com um brian ), e agora estou tentando mesclar as alterações feitas hoje em minha versão local regular no meu laptop.

No meu laptop eu usei git pull brian master para fazer alterações na minha versão local. Tudo era diferente do documento principal do InDesign - é exibido como um conflito.

A versão para PC ( brian ) é a última que quero manter, mas não sei quais equipes estão falando sobre esse repo.

Eu tentei copiar diretamente o arquivo para o meu laptop, mas isso parece quebrar todo o processo de mesclagem.

Alguém pode me apontar na direção certa?

326
10 нояб. definido por Kevin Wilson 10 de nov 2008-11-10 18:03 '08 às 18:03 2008-11-10 18:03
@ 9 respostas

git checkout aceita a --theirs ou --theirs para tais casos. Portanto, se você tiver um conflito de mesclagem e souber que deseja apenas o arquivo da ramificação com a qual você mescla, será possível fazer:

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

para usar esta versão do arquivo. Da mesma forma, se você sabe que quer sua versão (e não aquela que foi mesclada), você pode usar

 $ git checkout --ours -- path/to/conflicted-file.txt 
646
29 янв. a resposta é dada por mipadi em jan. 2010-01-29 20:48 '10 at 8:48 PM 2010-01-29 20:48

Você deve resolver o conflito manualmente (copiando o arquivo) e, em seguida, corrigir o arquivo (independentemente de ter copiado ou usado a versão local), como este

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

O Git geralmente é gravado automaticamente após uma mesclagem, mas quando detecta conflitos, ele não pode resolver sozinho, aplica todas as correções calculadas e deixa tudo o mais para você resolver e corrigir manualmente. Página de fusão do Git Man , git -SVN Crash Course ou esta entrada de blog pode esclarecer como deve funcionar.

Editar: Veja a mensagem abaixo, você não precisa copiar os arquivos você mesmo, mas você pode usar

border=0
 git checkout --ours -- path/to/file.txt git checkout --theirs -- path/to/file.txt 

para selecionar a versão do arquivo desejado. Copiar / editar o arquivo será necessário somente se você quiser usar uma combinação das duas versões.

Por favor, marque mipadis como correto.

136
10 нояб. a resposta é dada VolkA 10 nov. 2008-11-10 18:49 '08 às 18:49 2008-11-10 18:49

Você também pode superar esse problema com

 git mergetool 

que faz com que o git crie cópias locais do código binário conflitante e invoque seu editor padrão nelas:

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

Obviamente, você não pode editar arquivos binários em um editor de texto. Em vez disso, você copia o novo {conflicted}.REMOTE Arquivo {conflicted}.REMOTE sobre {conflicted} sem fechar o editor. Então, quando você fechar o editor, o git verá que a cópia de trabalho despreparada foi alterada e seu conflito de mesclagem foi resolvido da maneira usual.

87
24 авг. a resposta é dada por RobM 24 ago. 2009-08-24 14:31 '09 às 14:31 2009-08-24 14:31

Para resolver, salve a versão na ramificação atual (ignore a versão da ramificação na qual você está se fundindo), simplesmente adicione e bloqueie o arquivo:

 git commit -a 

Para resolver, sobrescrevendo a versão em sua ramificação atual com a versão da ramificação que você está inserindo, primeiro você precisa extrair essa versão em seu diretório de trabalho e, em seguida, incluir / corrigir:

 git checkout otherbranch theconflictedfile git commit -a 

Explicado em mais detalhes

12
29 янв. A resposta é dada por Joshua Flanagan em 29 de janeiro. 2010-01-29 20:43 '10 às 20:43 2010-01-29 20:43

A resposta do mipadi para mim não funcionou bem, eu precisava fazer isso:

git checkout --our caminho / para / file.bin

ou, para salvar a versão em:

git checkout - theways caminho / para / file.bin

então

git adicionar caminho / para / file.bin

E então eu pude rodar o git mergetool novamente e passar para o próximo conflito.

5
24 нояб. a resposta é dada por kris em 24 de novembro. 2014-11-24 05:45 '14 às 5:45 am 2014-11-24 05:45

De git checkout docs

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

--ours
--theirs
Ao verificar os caminhos do índice, verifique a etapa nº 2 ( ours ) ou nº 3 ( theirs ) para caminhos não relacionados.

Um índice pode conter registros não relacionados devido a uma fusão anterior com falha. Por padrão, se você tentar verificar essa entrada do índice, a operação de verificação falhará e nada será verificado. Usando -f irá ignorar essas entradas não relacionadas. O conteúdo de um lado específico da mesclagem pode ser verificado no índice usando --ours ou --theirs . Com -m alterações feitas no arquivo da árvore de trabalho podem ser descartadas para recriar o resultado da mesclagem conflitante original.

5
30 мая '13 в 4:07 2013-05-30 04:07 a resposta é dada por user456814 May 30 '13 às 4:07 2013-05-30 04:07

Eu me deparei com um problema semelhante (querer retirar uma confirmação que incluía alguns binários que causavam conflitos ao mesclar), mas deparei com outra solução que pode ser feita inteiramente com o git (ou seja, você não precisa copiar manualmente os arquivos acima). Eu pensei que eu iria incluí-lo aqui para que pelo menos eu me lembre da próxima vez que eu precisar dele :) Os passos são assim:

 % git fetch 

Seleciona a confirmação mais recente do repositório remoto (talvez seja necessário especificar o nome da ramificação remota, dependendo de sua instalação), mas não tenta mesclá-los. Escreve o commit para FETCH_HEAD

 % git checkout FETCH_HEAD stuff/to/update 

Ele pega uma cópia dos arquivos binários que eu quero e sobrescreve o que está na árvore de trabalho com a versão obtida da ramificação remota. git não tenta mesclar, então você acabou de obter uma cópia exata do binário da ramificação remota. Depois disso, você pode adicionar / copiar uma nova cópia, como de costume.

2
22 июля '09 в 1:29 2009-07-22 01:29 respondido a Brian Webster julho 22, '09 em 1:29 am 2009-07-22 01:29

Eu corri em duas estratégias para gerenciar diff / merge de arquivos binários com o Git no Windows.

  • O Tortoise Git permite que você personalize ferramentas de diff / merge para diferentes tipos de arquivos baseados em suas extensões de arquivo. Veja 2.35.4.3. Configurações avançadas Diff / Merge http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html . Essa estratégia, claro, depende de ferramentas adequadas para demarcar / mesclar.

  • Usando os atributos do Git, você pode especificar uma ferramenta / comando para converter seu arquivo binário em texto e, em seguida, permitir que sua ferramenta padrão / mesclagem padrão faça isso. Veja http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes . O artigo até dá um exemplo do uso de metadados para comparar imagens.

Eu tenho as duas estratégias para trabalhar com arquivos binários de modelo de software, mas seguimos com a tartaruga Git, já que a configuração era fácil.

1
27 нояб. A resposta do BoJohDoh é 27 de novembro 2014-11-27 18:46 '14 às 18:46 2014-11-27 18:46

Se o arquivo binário contiver mais de uma dll ou algo que possa ser editado diretamente como uma imagem ou um arquivo de mesclagem (e você não precisa de lixo / selecionar um arquivo ou outro), a mesclagem real ficará assim:

Eu sugiro procurar uma ferramenta de comparação que se concentre no fato de que você é um arquivo binário, por exemplo, existem alguns arquivos gratuitos para arquivos de imagem, por exemplo

e compare-os.

Se não houver uma ferramenta de comparação para comparar arquivos, então se você tiver o gerador de arquivos bin original (ou seja , há um editor para ele ... como blender 3d, você pode procurar manualmente esses arquivos, também navegar nos logs e perguntar a outra pessoa o que você é deve habilitar) e gerar arquivos usando 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

0
14 авг. resposta dada tyoc213 14 ago. 2015-08-14 00:03 '15 às 0:03 2015-08-14 00:03