Pergunta

Estou usando o Git no Windows (msysgit) para acompanhar as mudanças para algum trabalho de design que eu tenho feito.

Hoje eu estive trabalhando em um PC diferente (com brian repo remoto) e eu agora estou tentando mesclar a edições feitas hoje de volta para a minha versão local regulares no meu laptop.

No meu laptop, eu usei git pull brian master para puxar as mudanças em minha versão local. Tudo estava bem além do principal documento do InDesign -. Isso mostra como um conflito

A versão no PC (brian) é o mais recente que eu quero continuar, mas eu não sei o que comanda diz o repo de usar este.

Eu tentei copiar o arquivo diretamente do outro lado no meu laptop, mas isso parece quebrar todo o processo de fusão.

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

Foi útil?

Solução

git checkout aceita uma opção --ours ou --theirs para casos como este. Então, se você tem um conflito de mesclagem, e você sabe que você quer apenas o arquivo do ramo que estão se fundindo, você pode fazer:

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

para usar essa versão do arquivo. Da mesma forma, se você sabe que você quer a sua versão (e não a um ser incorporada em) você pode usar

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

Outras dicas

Você tem que resolver o conflito manualmente (copiando o arquivo over) e, em seguida, cometer o arquivo (não importa se você copiou-lo mais ou usado a versão local) como este

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

Git normalmente autocommits após a fusão, mas quando ele detecta conflitos não podem resolver por si só, aplica-se todos os patches que descobri e deixa o resto para você resolver e comprometer manualmente. A git merge Man Página , a Git-SVN Bater Curso ou esta entrada do blog pode lançar alguma luz sobre a forma como é suposto trabalho.

Editar: Veja o post abaixo, você realmente não tem que copiar os arquivos de si mesmo, mas pode usar

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

para selecionar a versão do arquivo que você deseja. Copiar / editar o arquivo só será necessário se você quiser uma mistura de ambas as versões.

Por favor, marque mipadis resposta como a correta.

Você também pode superar este problema com

git mergetool

que faz com que git para criar cópias locais do binário em conflito e gerar seu editor padrão sobre eles:

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

Obviamente você não pode utilmente editar arquivos binários em um editor de texto. Em vez de copiar o novo arquivo {conflicted}.REMOTE sobre {conflicted} sem fechar o editor. Então, quando você faz próximo a git editor verá que o trabalho de cópia de undecorated foi alterado e seu conflito de mesclagem seja resolvido da maneira usual.

Para resolver, mantendo a versão em sua filial atual (ignorar a versão do ramo que estão se fundindo em), basta adicionar e comprometer o arquivo:

git commit -a

Para resolver substituindo a versão em sua filial atual com a versão do ramo que estão se fundindo, você precisa recuperar essa versão em seu diretório de trabalho primeiro, e depois adicionar / cometê-lo:

git checkout otherbranch theconflictedfile
git commit -a

explicado em mais detalhes

A resposta de mipadi não muito trabalho para mim, eu precisava fazer isso:

git checkout --ours path / to / file.bin

ou, para manter a versão que está sendo incorporada em:

git checkout --theirs path / to / file.bin

então

git add caminho / para / file.bin

E então eu era capaz de fazer "git mergetool" novamente e continue para o próximo conflito.

A partir da git checkout docs

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

--ours
--theirs
Ao verificar caminhos do índice, veja etapa # 2 (ours) ou # 3 (theirs) para caminhos unmerged.

O índice pode conter entradas unmerged por causa de uma junção falhou anterior. Por padrão, se você tentar verificar uma entrada como do índice, a operação de saída irá falhar e nada vai ser verificado. Usando -f irá ignorar essas entradas não mescladas. O conteúdo de um lado específico da fusão pode ser verificado do índice usando --ours ou --theirs. Com -m, as alterações feitas para o arquivo árvore de trabalho pode ser descartado para re-criar o resultado da junção conflito originais.

Este procedimento é para resolver conflitos de arquivo binário depois de ter apresentado um pedido puxar para Github:

  1. Assim, no Github, você encontrou o seu pedido puxar tem um conflito em um arquivo binário.
  2. Agora volte para o mesmo ramo git no seu computador local.
  3. Você (a) re-make / re-construir este arquivo binário novamente, e (b) cometer o arquivo binário para esse mesmo ramo git resultou.
  4. Em seguida, você empurrar este mesmo ramo git novamente para Github.

Em Github, em sua solicitação de recebimento, o conflito deve desaparecer.

me deparei com um problema semelhante (querendo puxar uma consolidação que incluiu alguns arquivos binários que causou conflitos quando se fundiu), mas deparei com uma solução diferente que pode ser feito inteiramente usando git (ou seja, não ter que copiar os arquivos manualmente ao longo) . Eu percebi que eu incluí-lo aqui para que pelo menos me lembro-lo na próxima vez que eu precisar dele. :) Os passos parecido com este:

% git fetch

Este vai buscar o último commit (s) a partir do repositório remoto (pode ser necessário especificar um nome de filial remota, dependendo da configuração), mas não tenta fundi-los. Ele registra o commit em FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update

Isso leva a cópia dos arquivos binários que eu quero e sobrescreve o que está na árvore de trabalho com a versão obtido a partir da filial remota. Git não tentar fazer qualquer fusão, de modo que você simplesmente acabar com uma cópia exata do arquivo binário do ramo remoto. Uma vez feito isso, você pode adicionar / comprometer a nova cópia apenas como normal.

Eu vim através de duas estratégias para o gerenciamento de diff / merge de arquivos binários com Git no Windows.

  1. Tortoise git permite que você configure diff / ferramentas de mesclagem para diferentes tipos de arquivos com base em suas extensões de arquivo. Veja 2.35.4.3. Diff / Mesclar Configurações avançadas http://tortoisegit.org/docs/tortoisegit/tgit- cavado-settings.html . Esta estratégia de relys curso sobre / ferramentas de mesclagem diff adequadas estar disponível.

  2. Usando git atributos que você pode especificar uma ferramenta / comando para converter o arquivo binário para texto e, em seguida, deixar a sua ferramenta de comparação por defeito / merge fazer é coisa. Consulte http://git-scm.com/book/it/ v2 / Personalizando-Git-Git-Atributos . O artigo ainda dá um exemplo do uso de metadados para diff imagens.

Eu tenho ambas as estratégias para trabalhar com arquivos binários de modelos de software, mas nós fomos com git tartaruga como a configuração foi fácil.

Se o binário é algo mais do que uma dll ou algo que pode ser editado diretamente como uma imagem ou um arquivo de mistura (e você não precisa de lixo / selecionar um arquivo ou outro) uma verdadeira fusão seria algum tipo:

Eu sugiro procurar uma ferramenta de comparação orientada para o que você arquivo binário, por exemplo, existem alguns livres para arquivos de imagem, por exemplo

e compará-los.

Se não houver nenhuma ferramenta de comparação lá fora, para comparar seus arquivos, então se você tem o gerador de originais do arquivo bin (isto é, existe um editor -lo ... como blender 3D, você pode então inspecionar manualmente esses arquivos, veja também os logs, e pedir a outra pessoa que você deve incluir) e fazer uma saída dos arquivos com 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

Eu uso Git fluxo de trabalho para Excel - https: //www.xltrail. com / blog / git-fluxo de trabalho para-excel aplicação para resolver a maioria dos meus arquivos binários questões de mesclagem relacionados. Este aplicativo de código aberto me ajuda a resolver problemas de forma produtiva, sem gastar muito tempo e me permite cereja escolher a versão correta do arquivo, sem qualquer confusão.

meu caso parece ser um bug .... usando git 2.21.0

Eu fiz um puxão ... ele reclamou arquivos binários:

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 então nada em qualquer uma das respostas aqui resultaram em qualquer saída que fazia qualquer sentido.

Se eu olhar para o arquivo que eu tenho agora ... é o que eu editado. Se eu fizer qualquer um:

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

Eu recebo saída:

Updated 0 paths from the index

e eu ainda tenho a minha versão do arquivo. Se eu rm e, em seguida, check-out, ele vai dizer uma vez, mas ainda me dá a minha versão do arquivo.

mergetool git diz

No files need merging

e status git diz

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

Uma opção é desfazer o commit ... mas eu estava sem sorte e eu tive muitos commits, e este mau foi o primeiro. Eu não quero perder tempo repetindo isso.

modo de resolver esta loucura:

Eu corri

git commit

que perde a versão remota, e provavelmente desperdiça algum espaço armazenar um arquivo binário adicional ... então

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

que me dá de volta a versão remota

, em seguida, editar o arquivo novamente ... e, em seguida, cometer e empurrar, que mais uma vez provavelmente significa desperdiçar espaço com outra cópia do arquivo binário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top