Existe uma maneira de refazer uma mesclagem no git?

Existe uma maneira de refazer uma mesclagem no git?

Então cometi um grande erro. Fiz um commit, puxei, mesclei (mas baguncei o código ao fazer isso) e depois empurrei. Gostaria de refazer essa mesclagem e acertar o código. Há alguma maneira de fazer isso?

Eu uso bitbucket.

Responder1

Não tenho certeza se esta é a maneira "abençoada" de fazer isso, mas aqui está o que fiz para resolver o mesmo problema sem ter que "forçar o push" ou algo nojento assim.

Vamos supor que seu histórico seja parecido com isto (e M é a mesclagem incorreta):

-A--B--C--M (master points here)
  \      /
   D----E

A execução git checkout -b merge_fix <commit ID E>cria um branch antes de cometermos algum erro:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Agora, vamos refazer a mesclagem em nosso novo branch. Não podemos simplesmente mesclar master, então precisamos escolher manualmente o commit antes de nossa mesclagem incorreta: git merge <commit ID C>Não cometa os mesmos erros da última vez!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Supondo que o commit Gpareça bom, agora queremos sincronizar com o topo do masterbranch. Este comando diz ao git para ignorar as alterações feitas no master e forçar nossas alterações a se tornarem o resultado da mesclagem:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Finalmente, (novamente assumindo que o commit Hparece bom, queremos avançar masterpara incluir nossa mesclagem fixa:

git checkout master
git merge merge_fix

Na verdade, isso apenas move o masterponteiro do branch para H, mas aproveitarei a oportunidade para limpar um pouco minha arte ASCII:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

E aí está! você refez a mesclagem com sucesso sem invalidar nenhum histórico!

Responder2

Você pode fazer isso assim:

  1. Redefina para o commit antes de sua mesclagem.
  2. Execute a mesclagem novamente
  3. Forçar empurrão

Aquilo é:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Apenas tenha em mente que isso git push --forceirá reescrever tudo o que você tinha na filial remota, e outras pessoas que usam essa filial também podem ser afetadas por isso. (Normalmente você não deve fazer isso.)

Responder3

git merge --abort e então você pode mesclar novamente

Responder4

Eu tinha uma configuração diferente e um pouco mais complicada.

há basicamente três pontos de partida: (e todas as outras soluções assumem 1 ou 2)

  1. redo-branchdeve ser completamente mesclado E
    após a fusão redo-branchter ocorridonenhuma outra mesclagem
  2. redo-branchdeve ser completamente mesclado E
    após a mesclagem redo-branchjá houveoutras fusões, que deve ser mantido
  3. redo-branché umramo de longa vidaser mesclado repetidamente E
    apenas uma série de revisõeseraparte da fusãoE
    houveoutros commits/mesclas no masterapós a falha na mesclagem (ai)

uma configuração para (3) seria

---A--B--C--M   (master points here)
  /        /
-X--D-----E--Y  (that's the long-living redo-branch)
  1. você deve estar bem com a soluçãohttps://superuser.com/a/691497/308385
  2. a mesma solução que 1 pode funcionar
  3. vamos começar :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge

# now let's pick all the revisions D through E
git cherry-pick D^1..E

# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge

informação relacionada