Existe uma maneira de resolver o conflito para todos os arquivos usando checkout --ours
e --theirs
? Eu sei que você pode fazer isso para arquivos individuais, mas não conseguiu encontrar uma maneira de fazer isso para todos.
Existe uma maneira de resolver o conflito para todos os arquivos usando checkout --ours
e --theirs
? Eu sei que você pode fazer isso para arquivos individuais, mas não conseguiu encontrar uma maneira de fazer isso para todos.
Respostas:
Basta navegar pelo diretório de trabalho e enviar a saída por meio do comando xargs:
grep -lr '<<<<<<<' . | xargs git checkout --ours
ou
grep -lr '<<<<<<<' . | xargs git checkout --theirs
Como isso funciona: grep
pesquisará todos os arquivos no diretório atual (o .
) e subdiretórios recursivamente (o -r
sinalizador) procurando por marcadores de conflito (a string '<<<<<<<')
o sinalizador -l
ou --files-with-matches
faz com que o grep exiba apenas o nome do arquivo onde a string foi encontrada. A digitalização é interrompida após a primeira correspondência, de modo que cada arquivo correspondido é reproduzido apenas uma vez.
Os nomes de arquivo correspondentes são então canalizados para xargs , um utilitário que divide o fluxo de entrada canalizado em argumentos individuais para git checkout --ours
ou--theirs
Mais neste link .
Já que seria muito inconveniente ter que digitar isso todas as vezes na linha de comando, se você se pegar usando muito, pode não ser uma má ideia criar um alias para o shell de sua escolha: Bash é o usual .
Este método deve funcionar com pelo menos as versões 2.4.x do Git
git diff --name-only --diff-filter=U
.
git status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]
. Mais rápido do que o grep se você tiver um projeto grande.
CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
.
Você pode -Xours
ou -Xtheirs
com git merge
também. Assim:
git reset --hard HEAD
)git merge -Xours
ou git merge -Xtheirs
)AVISO LEGAL: é claro que você pode escolher apenas uma opção, -Xours
ou -Xtheirs
use uma estratégia diferente, você deve ir arquivo por arquivo.
Não sei se existe uma maneira para checkout
, mas honestamente não acho que seja terrivelmente útil: selecionar a estratégia com o comando checkout é útil se você quiser soluções diferentes para arquivos diferentes, caso contrário, basta ir para a abordagem de estratégia de fusão.
--theirs
ou --ours
-Option para git v1.9.4. Uma abordagem seria git merge -s recursive -Xtheirs BRANCH
.
--theirs
e --ours
não estão disponíveis nem com git 2.2.0
. Ou minha resposta não foi precisa ou eles estavam disponíveis em uma versão mais antiga do git (essa resposta é muito antiga na época da TI). A abordagem certa é com -X
. Eu atualizo de acordo
git checkout --[ours/theirs] .
fará o que você quiser, desde que você esteja na raiz de todos os conflitos. o nosso / deles afeta apenas os arquivos não mesclados, então você não deve ter que usar o grep / find / etc conflitos especificamente.
error: path 'foo/bar/blah' does not have our version
.
git diff --name-only --diff-filter=U | xargs git checkout --theirs
Parece fazer o trabalho. Observe que você precisa ter o cd do diretório raiz do repositório git para fazer isso.
No caso de alguém estar simplesmente procurando sobrescrever tudo de um branch (digamos master) com o conteúdo de outro, há uma maneira mais fácil:
git merge origin/master --strategy=ours
Obrigado a https://stackoverflow.com/a/1295232/560114
Ou, ao contrário, consulte Existe uma versão "deles" de "git merge -s nosso"?
git checkout --ours -- .
? Os.
meios do diretório atual, quando aplicado a partir da raiz diretório de trabalho, por isso basicamente significa que todo o diretório de trabalho. Não tenho certeza se isso vai funcionar com o--ours
sinalizador, e não tenho certeza de como ele vai lidar com conflitos de arquivos excluídos ou renomeados.