Então, cometi um grande erro. Fiz um commit, puxei, mesclei (mas atrapalhei o código enquanto fazia isso) e depois empurrei. Gostaria de refazer essa mesclagem e obter o código correto. Há alguma maneira de fazer isso?
Eu uso bitbucket.
Então, cometi um grande erro. Fiz um commit, puxei, mesclei (mas atrapalhei o código enquanto fazia isso) e depois empurrei. Gostaria de refazer essa mesclagem e obter o código correto. Há alguma maneira de fazer isso?
Eu uso bitbucket.
Respostas:
Não tenho certeza se essa é a maneira "abençoada" de fazê-lo, mas aqui está o que eu fiz para resolver o mesmo problema sem ter que "forçar o empurrão" ou algo do tipo.
Vamos supor que seu histórico se parece com isso (e M é a mesclagem em flocos):
-A--B--C--M (master points here)
\ /
D----E
Correr git checkout -b merge_fix <commit ID E>
cria um ramo antes de cometermos erros:
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
Agora, vamos refazer a mesclagem em nosso novo ramo. Não podemos simplesmente nos unir master
, por isso precisamos escolher manualmente o commit antes da nossa mesclagem incorreta: git merge <commit ID C>
não cometa os mesmos erros que você fez 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 a parte superior do master
ramo. Este comando diz ao git para ignorar as alterações que foram feitas para dominar 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)
Por fim, (supondo novamente que o commit H
pareça bom, queremos avançar rapidamente master
para incluir nossa mesclagem fixa:
git checkout master
git merge merge_fix
Isso realmente move o master
ponteiro de ramificação 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 com êxito a mesclagem sem invalidar nenhum histórico!
Você pode fazer isso assim:
Isso é:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Lembre-se de que git push --force
reescreverá o que você tinha na ramificação remota e outras pessoas que usarem essa ramificação também poderão ser afetadas por isso. (Normalmente você não deve fazer isso.)
git push --force
não é seguro
git merge --abort
e então você pode mesclar novamente
Por favor, verifique esta esperança de que seja útil para você
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html