Ao mesclar a ramificação de tópico "B" em "A" usando git merge
, recebo alguns conflitos. Eu sei que todos os conflitos podem ser resolvidos usando a versão em "B".
Eu estou ciente git merge -s ours
. Mas o que eu quero é algo parecido git merge -s theirs
.
Por que isso não existe? Como posso obter o mesmo resultado após a fusão conflitante com os git
comandos existentes ? ( git checkout
todo arquivo não imerso de B)
ATUALIZAÇÃO: A "solução" de descartar qualquer coisa do ramo A (o ponto de confirmação de mesclagem para a versão B da árvore) não é o que estou procurando.
git merge -s their
.git merge -s theirs
(que pode ser alcançado facilmente comgit merge -s ours
e uma filial temporária), uma vez que o nosso -s ignora completamente as mudanças do merge-de galho ...theirs
alémours
??? Este é um sintoma de um dos problemas de engenharia e design de alto nível no Git: inconsistência.Respostas:
Adicione a
-X
opção atheirs
. Por exemplo:Tudo se fundirá da maneira desejada.
A única coisa que vi causar problemas é se os arquivos foram excluídos do branchB. Eles aparecem como conflitos se algo diferente de git fez a remoção.
A correção é fácil. Basta executar
git rm
com o nome de qualquer arquivo que foi excluído:Depois disso, o
-X theirs
deve funcionar como esperado.Obviamente, fazer a remoção real com o
git rm
comando impedirá que o conflito aconteça em primeiro lugar.Nota : Também existe uma opção de formulário mais longa.
Para usá-lo, substitua:
com:
fonte
theirs
". -Xtheirs é a opção de estratégia aplicada à estratégia recursiva . Isso significa que a estratégia recursiva ainda mesclará tudo o que puder e só voltará à lógica "deles" em caso de conflitos. Enquanto isso é o que se precisa na maioria dos casos, como acima, não é o mesmo que "basta pegar tudo do ramo B". De qualquer maneira, ele faz a mesclagem real.Uma solução possível e testada para mesclar branchB em nosso branch de check-out A:
Para automatizá-lo, você pode envolvê-lo em um script usando branchA e branchB como argumentos.
Essa solução preserva o primeiro e o segundo pai do commit de mesclagem, exatamente como você esperaria
git merge -s theirs branchB
.fonte
git reset --soft branchA
?git reset --hard
alterações às quais osbranchA
pontos de confirmação são confirmados .As versões mais antigas do git permitiam usar a estratégia de mesclagem "deles":
Mas isso já foi removido, como explicado nesta mensagem por Junio Hamano (o mantenedor do Git). Conforme observado no link, você faria o seguinte:
Cuidado, porém, que isso é diferente de uma mesclagem real. Sua solução é provavelmente a opção que você está realmente procurando.
fonte
git reset --hard origin
uma solução para uma fusão de estilos deles? Se eu quisesse mesclar o BranchB ao BranchA (como na resposta de Alan W. Smith), como faria isso usando oreset
método?git reset --hard
é uma fusão no estilo “deles”. Obviamente,git reset --hard
não cria nenhuma confirmação de mesclagem ou qualquer confirmação para esse assunto. Seu argumento é que não devemos usar uma mesclagem para substituir o que estiver no HEAD por outra coisa. Eu não necessariamente concordo, no entanto.theirs
sido removido porque a justificativa estava incompleta. Ele falhou em permitir aquelas instâncias em que o código é bom; é apenas que o upstream é mantido em uma base filosófica diferente; portanto, nesse sentido, é "ruim"; portanto, quer-se manter atualizado com o upstream, mas ao mesmo tempo, retenha um bom código de "correções" [git & msysgit têm parte desse "conflito" por causa das filosofias de suas diferentes plataformas de destino]]theirs
porque alterei acidentalmente alguns arquivos em duas ramificações separadas e queria descartar as alterações de uma sem precisar fazer manualmente para cada arquivo.Não está totalmente claro qual é o resultado desejado, por isso há alguma confusão sobre a maneira "correta" de fazê-lo nas respostas e nos comentários deles. Eu tento dar uma visão geral e ver as três opções a seguir:
Tente mesclar e use B para conflitos
Esta não é a "versão deles para
git merge -s ours
", mas a "versão deles paragit merge -X ours
" (que é a abreviação degit merge -s recursive -X ours
):É isso que, por exemplo, a resposta de Alan W. Smith faz.
Use somente conteúdo de B
Isso cria uma consolidação de mesclagem para os dois ramos, mas descarta todas as alterações
branchA
e mantém apenas o conteúdobranchB
.Observe que a mesclagem confirma o primeiro pai agora é de
branchB
e somente o segundo é debranchA
. Isto é o que, por exemplo, a resposta de Gandalf458 faz.Use apenas o conteúdo de B e mantenha a ordem dos pais correta
Esta é a verdadeira "versão deles para
git merge -s ours
". Ele tem o mesmo conteúdo da opção anterior (ou seja, somente a partir debranchB
), mas a ordem dos pais está correta, ou seja, a primeira mãe vembranchA
e a segunda partebranchB
.É o que a resposta de Paul Pladijs faz (sem exigir uma ramificação temporária).
fonte
git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
read-tree
qual o usuário git médio pode não estar acostumado (pelo menos eu não ;-)). As soluções na resposta usam apenas os comandos de alto nível ("porcelana") que a maioria dos usuários do git deve saber. Eu prefiro eles, mas obrigado por sua versão!…commit --amend…
) será "perdido". Estou planejando adicionar algumas explicações gráficas para esta resposta assim que eu tiver tempo para fazê-las ... ;-)Eu usei a resposta de Paul Pladijs desde agora. Descobri que você pode fazer uma mesclagem "normal", ocorrer conflitos, e você
para resolver o conflito usando a revisão da outra ramificação. Se você fizer isso para cada arquivo, terá o mesmo comportamento que você esperaria de
Enfim, o esforço é mais do que seria com a estratégia de mesclagem! (Isso foi testado com a versão 1.8.0 do git)
fonte
git ls-files --modified | xargs git add
eu queria fazer isso para adicionado de ambos os lados se fundem: /git ls-files --modified
que eu acho que essa também é uma solução viável.git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
-X
e qual a diferença entre-X
e-s
? não encontra nenhum documento.Eu resolvi meu problema usando
fonte
Suponho que você tenha criado uma ramificação fora do mestre e agora queira voltar ao mestre, substituindo qualquer um dos itens antigos do mestre. Era exatamente o que eu queria fazer quando me deparei com este post.
Faça exatamente o que você deseja fazer, exceto mesclar primeiro um ramo ao outro. Eu fiz isso e funcionou muito bem.
Em seguida, faça o checkout master e mescle sua filial (ela funcionará sem problemas agora):
fonte
Se você estiver no ramo A, faça:
Testado na versão 1.7.8 do git
fonte
Para realmente fazer uma mesclagem adequada, que recebe apenas a entrada da ramificação que você está mesclando, você pode fazer
git merge --strategy=ours ref-to-be-merged
git diff --binary ref-to-be-merged | git apply --reverse --index
git commit --amend
Não haverá conflitos em nenhum cenário que eu conheça, você não precisa criar ramificações adicionais e ele age como um commit de mesclagem normal.
Isso não funciona bem com submódulos no entanto.
fonte
Embora eu mencione no " comando git para criar um ramo como outro " como simular
git merge -s theirs
, observe que o Git 2.15 (quarto trimestre de 2017) agora é mais claro:Veja commit c25d98b (25 de setembro de 2017) por Junio C Hamano (
gitster
) .(Mesclado por Junio C Hamano -
gitster
- in commit 4da3e23 , 28 de setembro de 2017)-Xtheirs
é uma opção de estratégia aplicada à estratégia recursiva. Isso significa que a estratégia recursiva ainda mesclará tudo o que puder e "theirs
" voltará à lógica em caso de conflito.Esse debate sobre a pertinência ou não de uma
theirs
estratégia de mesclagem foi trazido de volta recentemente neste segmento de setembro de 2017 .Ele reconhece threads mais antigos (2008)
Menciona o apelido:
Yaroslav Halchenko tenta defender mais uma vez essa estratégia, mas Junio C. Hamano acrescenta :
Junio acrescenta, como comentado por Mike Beaton :
fonte
git merge -s ours <their-ref>
efetivamente diz 'mark commits feitos para <their-ref> em suas filiais, pois confirma ser permanentemente ignorado '; e isso é importante porque, se você posteriormente fusão dos estados posteriores do seu ramo, suas alterações posteriores serão trazidos sem as alterações ignorados nunca ser trazido.Veja a resposta amplamente citada de Junio Hamano : se você deseja descartar conteúdo comprometido, apenas descarte os commits ou, de qualquer forma, mantenha-o fora da história principal. Por que incomodar a todos no futuro lendo mensagens de confirmação que não têm nada a oferecer?
Mas, às vezes, existem requisitos administrativos, ou talvez algum outro motivo. Para aquelas situações em que você realmente precisa registrar confirmações que não contribuem com nada, você deseja:
(edit: uau, eu consegui entender isso errado antes. Este funciona.)
fonte
Este usa uma árvore de leitura do comando git plumbing, mas contribui para um fluxo de trabalho geral mais curto.
fonte
Isso mesclará seu newBranch na baseBranch existente
fonte
git commit --amend
no final do seu exemplo, ou os usuários poderão ver a mesclagem confirmadagit log
e assumir que a operação está concluída.Eu acho que o que você realmente quer é:
Isso parece desajeitado, mas deve funcionar. A única coisa que eu realmente não gosto nesta solução é que o histórico do git será confuso ... Mas pelo menos o histórico será completamente preservado e você não precisará fazer algo especial para os arquivos excluídos.
fonte
O equivalente (que mantém a ordem dos pais) a 'git merge -s its branchB'
Antes da mesclagem:
!!! Certifique-se de estar em estado limpo !!!
Faça a mesclagem:
O que fizemos ? Criamos um novo commit, no qual dois pais são nossos e o deles e o conteúdo do commit é branchB - deles
Após a mesclagem:
Mais precisamente:
fonte
Esta resposta foi dada por Paul Pladijs. Eu apenas peguei seus comandos e criei um apelido git por conveniência.
Edite seu arquivo .gitconfig e adicione o seguinte:
Então você pode "git merge -s his A" executando:
fonte
Recentemente, eu precisava fazer isso para dois repositórios separados que compartilham um histórico comum. Comecei com:
Org/repository1 master
Org/repository2 master
Eu queria que todas as alterações
repository2 master
fossem aplicadasrepository1 master
, aceitando todas as alterações que o repository2 faria. Nos termos do git, essa deve ser uma estratégia chamada-s theirs
MAS, não existe. Tenha cuidado, pois-X theirs
é nomeado como seria o que você deseja, mas NÃO é o mesmo (o mesmo diz na página do manual).O jeito que resolvi isso foi
repository2
criar um novo ramorepo1-merge
. Nesse ramo, eu corrigit pull [email protected]:Org/repository1 -s ours
e ele se funde bem, sem problemas. Eu o empurro para o controle remoto.Então volto
repository1
e faço um novo ramorepo2-merge
. Nesse ramo, eu corro,git pull [email protected]:Org/repository2 repo1-merge
que será concluído com problemas.Finalmente, você precisaria emitir uma solicitação de mesclagem
repository1
para torná-la o novo mestre ou apenas mantê-la como uma ramificação.fonte
Uma maneira simples e intuitiva de fazê-lo em duas etapas é
Seguido por
(que marca as duas ramificações como mescladas)
A única desvantagem é que ele não remove os arquivos que foram excluídos no branchB do seu branch atual. Uma diferença simples entre os dois ramos depois mostrará se existem esses arquivos.
Essa abordagem também deixa claro, no log de revisão, o que foi feito - e o que foi planejado.
fonte