Tome o seguinte caso:
Tenho algum trabalho em uma ramificação de tópicos e agora estou pronto para voltar ao master:
Realizo a mesclagem do mestre, resolvo os conflitos e agora tenho:
Agora, a mesclagem levou algum tempo, então eu faço outra busca e percebo que a ramificação principal remota tem novas alterações:
Se eu tentar 'git rebase origin / master' do master, sou forçado a resolver todos os conflitos novamente e também perco a confirmação de mesclagem:
Existe uma maneira limpa de refazer a consolidação de mesclagem para que eu termine com um histórico como o que mostro abaixo?
— jipumarino
TL; DR:git rebase --preserve-merges origin/master
— Ilia K.
Com relação a ter que resolver novamente conflitos, você pode dar uma olhada no git rerere .
— Parker Coates
git config --global pull.rebase preserve para sempre preservar os commits mesclagem durante uma rebase
Aviso: a partir do Git 2.18 (segundo trimestre de 2018, 5 anos depois), git --rebase-mergessubstituirá o antigo git --preserve-merges. Veja o que exatamente o " rebase --preserve-merges" do Git faz (e por quê?)
--preserve-mergesestá obsoleto. Usegit rebase --rebase-merges origin/master
Uma é fazer uma reformulação interativa e editar a confirmação de mesclagem, refazer a mesclagem manualmente e continuar a reformulação.
Outra é usar a --rebase-mergesopção on git rebase, que é descrita a seguir no manual: "Por padrão, um rebase simplesmente remove commits de mesclagem da lista de tarefas e coloca os commits rebased em um único ramo linear. Com --rebase- mescladas, a rebase tentará preservar a estrutura de ramificação dentro das confirmações a serem rebaseadas, recriando as confirmações de mesclagem. Quaisquer conflitos de mesclagem resolvidos ou alterações manuais nessas confirmações de mesclagem terão que ser resolvidos / reaplicados manualmente ".
Eu tentei a opção -p, e ela realmente deixa o histórico de consolidação como eu queria, mas me obriga a resolver os conflitos novamente, mesmo em arquivos que não foram editados na origem / mestre. Como sua primeira sugestão, qual seria a sequência precisa de comandos?
@ jipumarino: git rebase -i (diga para editar o commit de mesclagem), quando ele chegar ao commit de mesclagem, git reset --hard HEAD ^, git merge, consertar conflitos, git commit, git rebase --continue. Você também pode querer olhar para o git rerere, que deve ajudar com esse tipo de coisa (mas eu nunca usei, então não posso oferecer nenhum conselho ou ajuda).
Obrigado. Eu ativei o rerere e tentei com rebase -p e está funcionando como deveria.
Aqui está um excelente post que descreve esta situação exata: rebasing Compromete mesclagem no Git
O rere não é a solução, pois você ainda precisa resolver as mesclagens manualmente na primeira vez.
Ok, essa é uma pergunta antiga e ela já aceitou resposta @siride, mas essa resposta não foi suficiente no meu caso, pois --preserve-mergesobriga você a resolver todos os conflitos pela segunda vez. Minha solução é baseada na ideia, @Tobi Bmas com comandos passo a passo exatos
Então, começaremos nesse estado com base no exemplo da pergunta:
Observe que temos 2 commits à frente do master, portanto, a escolha da cereja não funcionaria.
Primeiro de tudo, vamos criar o histórico correto que queremos:
git rebase --strategy=ours --preserve-merges origin/master
Usamos --preserve-mergespara salvar nosso commit de mesclagem no histórico. Usamos --strategy=oursignorar todos os conflitos de mesclagem, pois não nos importamos com o conteúdo desse commit de mesclagem, precisamos apenas de um bom histórico agora.
A história será assim (ignorando o mestre):
Vamos obter o índice correto agora.
Podemos obter alguns conflitos adicionais de mesclagem aqui, mas isso seria apenas conflitos de arquivos alterados entre 8101fe3e f5a7ca8, mas não inclui conflitos já resolvidos detopic
O histórico ficará assim (ignorando o histórico correto):
A última etapa é combinar nossa ramificação com o histórico correto e ramificar com o índice correto
Usamos reset --softpara redefinir nosso ramo (e histórico) para o histórico correto, mas deixamos o índice e a árvore de trabalho como estão. Em seguida, commit --amendreescrevemos nosso commit de mesclagem, que costumava ter um índice incorreto, com nosso bom índice do master.
No final, teremos esse estado (observe outro ID do top commit):
— Ivan Naydonov
Isso é incrível e ajudou muito! Mas não entendi o truque com o commit --amend: você poderia adicionar mais informações sobre isso? O que exatamente acontece depois que você o executa - notei que o SHA do commit foi alterado - mas por quê? Ou o que acontece se você não executar isso?
— ZenJ
O @ZenJ git commit --amendadiciona as alterações ao último commit (HEAD, neste caso, o commit de mesclagem). Como o conteúdo da confirmação é alterado, o hash é atualizado.
— Dries Staelens
Para pessoas que não têm o 're-redirecionamento' ativado antes de corrigir conflitos, esta solução é ótima porque evita que você precise corrigir os conflitos novamente. Obrigado!
— Shackleford
Como perdi um dia tentando descobrir isso e realmente encontrei uma solução com a ajuda de um colega de trabalho, achei que deveria entrar em cena.
Temos uma grande base de código e temos que lidar com 2 ramificações sendo fortemente modificadas ao mesmo tempo. Existe um ramo principal e um ramo secundário, se você qual.
Enquanto mesclo o ramo secundário no ramo principal, o trabalho continua no ramo principal e, quando termino, não posso enviar minhas alterações porque elas são incompatíveis.
Portanto, preciso "refazer" minha "mesclagem".
Foi assim que finalmente fizemos:
1) anote o SHA. ex .: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
2) Crie o histórico adequado, mas isso interromperá a mesclagem.
3) anote o SHA. ex .: 29dd8101d78
4) Agora redefina para onde você estava antes
5) Agora mescle o mestre atual em seu ramo de trabalho
6) Agora que você possui os arquivos corretos, mas o histórico errado, obtenha o histórico correto em cima de suas alterações com:
7) E então - altere os resultados no seu commit de mesclagem original
— Claude Peloquin
Parece que o que você deseja fazer é remover sua primeira mesclagem. Você pode seguir o seguinte procedimento:
Isso daria o que você quer.
Com o rerere ativado, isso parece fornecer o mesmo resultado que a solução rebase -p fornecida acima pelo siride.
Do seu commit de mesclagem
Escolha a nova mudança que deve ser fácil
copie suas coisas
refaça a mesclagem e resolva os conflitos apenas copiando os arquivos da sua cópia local;)
— Tobi B
Esta resposta parece boa, mas seria mais útil se você deu os comandos reais git, no caso de um usuário é novo para git