
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 G
pareça bom, agora queremos sincronizar com o topo do master
branch. 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 H
parece bom, queremos avançar master
para incluir nossa mesclagem fixa:
git checkout master
git merge merge_fix
Na verdade, isso apenas move o master
ponteiro 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:
- Redefina para o commit antes de sua mesclagem.
- Execute a mesclagem novamente
- 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 --force
irá 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)
redo-branch
deve ser completamente mesclado E
após a fusãoredo-branch
ter ocorridonenhuma outra mesclagemredo-branch
deve ser completamente mesclado E
após a mesclagemredo-branch
já houveoutras fusões, que deve ser mantidoredo-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)
- você deve estar bem com a soluçãohttps://superuser.com/a/691497/308385
- a mesma solução que 1 pode funcionar
- 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