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.
111
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.
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.Respostas:
Basta navegar pelo diretório de trabalho e enviar a saída por meio do comando xargs:
ou
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
fonte
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
comgit merge
também. Assim:git reset --hard HEAD
)git merge -Xours
ougit 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.fonte
--theirs
ou--ours
-Option para git v1.9.4. Uma abordagem seriagit merge -s recursive -Xtheirs BRANCH
.--theirs
e--ours
não estão disponíveis nem com git2.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 acordogit 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.fonte
error: path 'foo/bar/blah' does not have our version
.Parece fazer o trabalho. Observe que você precisa ter o cd do diretório raiz do repositório git para fazer isso.
fonte
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:
Obrigado a https://stackoverflow.com/a/1295232/560114
Ou, ao contrário, consulte Existe uma versão "deles" de "git merge -s nosso"?
fonte
Eu adicionei esta função no arquivo .zshrc .
Use-os desta forma:
gitcheckoutall theirs
ougitcheckoutall ours
fonte