Como resolvo um conflito de mesclagem do git em favor de alterações puxadas?
Basicamente, preciso remover todas as alterações conflitantes de uma árvore de trabalho sem ter que passar por todos os conflitos por um git mergetool
tempo mantendo todas as alterações sem conflitos. De preferência, fazendo isso enquanto puxa, não depois.
git
git-merge
git-merge-conflict
sanmai
fonte
fonte
Respostas:
Ou, simplesmente, para o repositório padrão:
Se você já está em estado de conflito ...
fonte
-s recursive
aqui é redundante, pois essa é a estratégia de mesclagem padrão. Então você pode simplificá-logit pull -X theirs
, o que é basicamente equivalente agit pull --strategy-option theirs
.MERGING
estado. Posso entãogit merge --abort
tentar novamente, mas cada vez que acabo com uma mesclagem. … Eu sei que uma rebase foi enviada para o meu upstream, então talvez isso esteja causando isso?git checkout --theirs path/to/file
. Usou-o durante o rebase e obteve resultados inesperados. Explicação encontrada no doc: Observe que durante o git rebase e o git pull --rebase, o nosso e o deles podem aparecer trocados; --ours fornece a versão do ramo em que as alterações são reformuladas, enquanto --theirs fornece a versão do ramo que mantém o seu trabalho que está sendo reformulado.git checkout --theirs/--ours path
página de manual afirma que funciona para caminhos não mesclados . Portanto, se não houver conflito no caminho, ele já estará mesclado. Este comando não fará nada. Isso pode ocorrer quando você deseja, por exemplo, a versão 'deles' de uma subpasta inteira. Portanto, nesse caso, seria mais seguro fazergit checkout MERGE_HEAD path
ou usar o hash de confirmação.git pull -X theirs
cria uma confirmação de mesclagem se houver conflitos (por exemplo, se outro commit for executadogit push -f
no controle remoto). Se você não deseja consolidação de mesclagem, executegit fetch && git reset --hard origin/master
.Você pode usar a opção de estratégia "deles" recursiva :
git merge --strategy-option theirs
Do homem :
Nota: como a página de manual diz, a opção de estratégia de mesclagem "nossa" é muito diferente da estratégia de mesclagem "nossa" .
fonte
git checkout --theirs
para operar em um único arquivo conflitantegit checkout <ref to theirs> -- the/conflicted.file
; e depoisgit add
as mudanças deles.Se você já está em estado de conflito e deseja apenas aceitar todos :
Se você quiser fazer o oposto:
Isso é bastante drástico, por isso, certifique-se de que realmente deseja limpar tudo dessa maneira antes de fazê-lo.
fonte
.
e especifique o (s) arquivo (s) no lugar do ponto que você deseja fazer o checkout. menos "drástico" e exatamente o que você quer fazer, presumivelmente.git add -u
para ignorar arquivos que não estão sob controle de versão.OK, imagine o cenário em que eu estava:
Você tenta um
merge
, ou talvez umcherry-pick
, e é interrompido comAgora, você visualiza o arquivo em conflito e não deseja realmente manter suas alterações. No meu caso acima, o arquivo estava em conflito com apenas uma nova linha que meu IDE havia adicionado automaticamente. Para desfazer suas alterações e aceitar as delas, a maneira mais fácil é:
O inverso disso (para substituir a versão recebida pela sua versão) é
Surpreendentemente, não consegui encontrar essa resposta com muita facilidade na Internet.
fonte
git status
entrecheckout
eadd
, o arquivo ainda é exibido como "ambos modificados".git reset --hard
e entãogit pull [remote server name] [branch name] -Xtheirs
(desfaz a mesclagem, em seguida, coloca as novas coisas em cima das minhas) - não tenho certeza se é isso que você deseja.As
git pull -X theirs
respostas podem criar uma confirmação de mesclagem feia ou emitir umSe você deseja simplesmente ignorar quaisquer modificações locais nos arquivos do repositório, por exemplo, em um cliente que sempre deve ser um espelho de uma origem, execute isso (substitua
master
pela ramificação desejada):Como funciona?
git fetch
fazgit pull
mas sem mesclar . Em seguida,git reset --hard
faz sua árvore de trabalho corresponder ao último commit. Todas as alterações locais nos arquivos no repositório serão descartadas , mas os novos arquivos locais serão deixados em paz.fonte
git fetch && git reset --hard {remote}/{branch}
foi o que resolveu meu problema. Eu precisava abandonar completamente minhas próprias alterações em favor do estado "deles" de uma ramificação, mas ogit pull -X theirs
sufoquei em alguns arquivos movidos / renomeados. Obrigado!Após a fusão do git, se você tiver conflitos e quiser o seu
fonte
Para resolver todos os conflitos com a versão em uma ramificação específica:
Portanto, se você já está no estado de mesclagem e deseja manter a versão principal dos arquivos conflitantes:
fonte
git cherry-pick --continue
ou umgit commit --allow-empty
comando para confirmar essas alterações, e parece não haver um sistema por trás do qual o comando seja necessário, o que torna a automação um problema. Atualmente, estou resolvendo isso testando a existência de um.git/COMMIT_EDITMSG
arquivo, mas isso parece hacky e quebradiço, e ainda não estou convencido de que ele sempre funcione.git add
) manualmente , poderá resolver o restante em massa por isso.git checkout --ours
/git checkout --theirs
É útil também.Por favor, não que às vezes isso não funcione :
ou
Eu fiz isso, assumindo que HEAD é nosso e MERGE_HEAD é deles
ou:
Depois que fazemos isso e somos bons:
Se você quiser entender mais, consulte o maravilhoso post do torek aqui: git checkout --ours não remove arquivos da lista de arquivos não imersos
fonte
Usuários do IDE do código VS (Git integrado):
Se você deseja aceitar todas as alterações recebidas no arquivo de conflito , execute as seguintes etapas.
Da mesma forma, você pode fazer outras opções, como Aceitar todos os dois, Aceitar todos os atuais etc.,
fonte
Eu tinha uma
next-version
ramificação de longa duração com toneladas de exclusões em arquivos que foram alteradosdevelop
, arquivos que foram adicionados em locais diferentes nos dois ramos etc.Eu queria levar todo o conteúdo do
next-version
ramo paradevelop
, tudo em um imenso commit de mesclagem.A combinação dos comandos acima que funcionou para mim foi:
Não é uma resposta nova, apenas combina bits de muitas respostas, em parte para garantir que você pode precisar de todas essas respostas.
fonte
Se você já está em estado de conflito e não deseja fazer o checkout do caminho um por um. Você pode tentar
fonte
Uma situação que considero útil se quiser que o mestre reflita as alterações de um novo ramo de tópico. Notei que -Xtheirs não se fundem sem conflitos em algumas circunstâncias ... por exemplo
Nesse caso, a solução que encontrei foi
do topicFoo, primeiro mescle no master usando a estratégia -s our, isso criará o commit falso que é apenas o estado do topicFoo. $ git merge -s nosso mestre
verifique a consolidação de mesclagem criada
agora faça o checkout do ramo principal
mesclar o ramo do tópico de volta, mas desta vez usar a estratégia recursiva -Xtheirs, agora você apresentará um ramo mestre com o estado do topicFoo.
fonte