Tome o seguinte caso:
Tenho algum trabalho em uma ramificação de tópicos e agora estou pronto para voltar ao master:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Realizo a mesclagem do mestre, resolvo os conflitos e agora tenho:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
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:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
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:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
Existe uma maneira limpa de refazer a consolidação de mesclagem para que eu termine com um histórico como o que mostro abaixo?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
git
merge
rebase
git-rebase
git-rewrite-history
jipumarino
fonte
fonte
git rebase --preserve-merges origin/master
git config --global pull.rebase preserve
para sempre preservar os commits mesclagem durante uma rebasegit --rebase-merges
substituirá o antigogit --preserve-merges
. Veja o que exatamente o “rebase --preserve-merges
” do Git faz (e por quê?)--preserve-merges
está obsoleto. Usegit rebase --rebase-merges origin/master
Respostas:
Existem duas opções aqui.
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-merges
opção ongit 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 ".fonte
Ok, essa é uma pergunta antiga e ela já aceitou resposta
@siride
, mas essa resposta não foi suficiente no meu caso, pois--preserve-merges
obriga você a resolver todos os conflitos pela segunda vez. Minha solução é baseada na ideia,@Tobi B
mas com comandos passo a passo exatosEntã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:
Usamos
--preserve-merges
para salvar nosso commit de mesclagem no histórico. Usamos--strategy=ours
ignorar 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
8101fe3
ef5a7ca8
, 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 --soft
para 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 --amend
reescrevemos 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):
fonte
git commit --amend
adiciona as alterações ao último commit (HEAD, neste caso, o commit de mesclagem). Como o conteúdo da confirmação é alterado, o hash é atualizado.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
Voila!
fonte
Parece que o que você deseja fazer é remover sua primeira mesclagem. Você pode seguir o seguinte procedimento:
Isso daria o que você quer.
fonte
fonte