Como manter o arquivo local ou remoto durante a mesclagem usando o Git e a linha de comando?

194

Eu sei como mesclar modificações usando o vimdiff, mas, supondo que eu sei que todo o arquivo é bom para manter ou jogar fora, como faço isso?

Eu não quero abrir o vimdiff para cada um deles, eu mudo para um comando que diz 'manter local' ou 'manter remoto'.

EG: Eu tenho uma mesclagem de arquivos marcados como alterados porque alguém o abriu no Windows, alterou o EOL e, em seguida, confirmou. Ao mesclar, quero apenas manter minha própria versão e descartar a dele.

Também estou interessado no contrário: estraguei tudo e quero aceitar o arquivo remoto, descartando minhas alterações.

e-satis
fonte

Respostas:

309

Você também pode:

git checkout --theirs /path/to/file

para manter o arquivo remoto e:

git checkout --ours /path/to/file

para manter o arquivo local.

Então git addeles e tudo está feito.

Edição: lembre-se de que isso é para um mergecenário. Durante a rebase --theirsrefere-se ao ramo em que você está trabalhando.

A aguardar Dev ...
fonte
4
Eu fiz isso .. mas nada acontece .. como eu sei que está pegando o arquivo correto? Estou usando git version 1.8.4se isso importa.
Rosdi Kasim
3
por que a palavra inversa usa? Presumo "deles" seria arquivo remoto e "nosso" seria meu arquivo
phuclv
1
Então é isso, @ LưuVĩnhPhúc
Waiting for Dev ...
7
não, seus significados são invertidos stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 deles seria meus arquivos e os nossos são os arquivos na filial remota
phuclv
6
"Fácil", sim. Intuitivo? Não.
Wilbur Whateley
107

Essa abordagem parece mais direta, evitando a necessidade de selecionar cada arquivo individualmente:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

ou

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Copiado diretamente de: Resolver conflitos de mesclagem do Git em favor de suas alterações durante um pull

Keflavich
fonte
3
Amo este. Especialmente se houver mais de um arquivo.
Tek
A pergunta era para dois comandos diferentes, mas não há descrição do que esses dois fazem. O que cada linha faz?
18716 Alex
Passei por pelo menos cinco respostas de fluxo de pilha antes de encontrar isso, que é o que eu queria. Obrigado.
Bolton Bailey
14

git checkout {branch-name} -- {file-name}

Isso usará o arquivo da filial de sua escolha.

Eu gosto disso porque o posh-gitpreenchimento automático funciona muito bem com isso. Também remove qualquer ambiguidade sobre qual ramificação é remota e qual é local. E --theirsnão funcionou para mim de qualquer maneira.

Ben Wilde
fonte
Nenhuma ambiguidade, funciona para {mine} e {deles}, suporta a adição de diretórios inteiros. Essa deve ser a resposta aceita.
dotancohen 14/09/17
9

Para obter informações sobre o final da linha, consulte man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Certifique-se de adicionar autocrlf = falsee / ousafecrlf = false ao clone do Windows (.git / config)

Usando git mergetool

Se você configurar uma ferramenta de fusão como esta:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Então um simples

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Fará o trabalho

Usando comandos git simples

Em outros casos, eu assumo

git checkout HEAD -- path/to/myfile.txt

deve fazer o truque

Edite para fazer o inverso (porque você errou):

git checkout remote/branch_to_merge -- path/to/myfile.txt
ver
fonte
+1 nas dicas, mas não aceito, mas não é o que eu pedi. Quero algo que funcione em todos os casos, não apenas nos casos de exemplo. Além disso, o "git checkout remote / branch_to_merge - path / to / myfile.txt" não funcionará se você já iniciou sua mesclagem: dirá que você está no meio de uma mesclagem e impedirá que você faça isso.
e-satis 11/07
1
@ e-satis: isso é surpreendente. Eu consideraria um erro, pois o checkout com um caminho não é um checkout regular (e não afeta o HEAD). Vou testá-lo agora, porque não consigo acreditar
veja
1
@ e-satis: Soooo ... eu estava certo; git checkout remote/branch_to_merge -- path/to/myfile.txtfunciona como um encanto ao resolver um conflito de mesclagem. (git 1.7.1)
sehe
1
Adicionada uma solução baseada no git mergetool agora
sehe