Git push para branch errado

98

Trabalhando com git, depois de alguns 'commit' e alguns 'push', percebi que estou usando o branch errado!

Agora eu tenho que remover de alguma forma minhas alterações em wrong_branch e confirmar e enviar as alterações em right_branch

Qual é a melhor (e simples) maneira de fazer isso?

obrigado

Alessandro De Simone
fonte
Boa pergunta @tokland: 99% dos desenvolvedores de ruby ​​usam git, e o projeto que estou trabalhando é em RoR ... mas sei que isso não poderia ser uma boa motivação
Alessandro De Simone
3
Do meu ponto de vista, isso não é uma duplicata do que halfdan comentou, já que também é sobre mover commits para outro branch, não apenas removê-los.
Olenz

Respostas:

141

mude para aquele branch, verifique o git loge git revertaqueles commits individualmente. Depois de fazer isso, volte para o branch desejado e lá você pode usar git cherry-pickpara escolher commits específicos dos refs do git e mesclá-los no branch correto.

git checkout wrong_branch
git revert commitsha1
git revert commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2

Se os commits estão agrupados e não há commits enviados após seus commits sujos, você pode até mesmo usar git resetpara colocar aquele branch errado em um estado antes de seus commits e então seguir isso novamente usando git cherry-pickpara colocar seus commits no branch certo.

git checkout wrong_branch
git reset commitsha3 #commit just before commitsha2
git checkout right_branch
git cherry-pick commitsha1
git cherry-pick commitsha2
Dhruva Sagar
fonte
Revert + cherry-pick parece muito mais simples do que outros métodos possíveis envolvendo redefinir o cabeçote e / ou rebase.
ChrisV
2
Para o git cherry-pick, você pode colocar vários shas em uma única linha, ou seja git cherry-pick commitsha1 commitsha2.
ThomasW
Lifesaver! E não é complicado. Obrigado!
Craig Silver
o que acontece quando você deseja mesclar wrong_branch (por exemplo, desenvolver) em right_branch (por exemplo, recurso / X), então você obtém a reversão desfazendo as alterações que você escolheu.
timB33
3

A maneira mais simples é usando git rebase. Suponha que você tenha essa configuração:

A -- B -- C -- C1 -- C2 # right branch
          \
           \-- D -- C3 -- C4 # wrong branch

Você deseja mover a mudança C3, C4 para o ramo direito.

git checkout -b new_wrong_branch D
git checkout wrong_branch
git rebase D --onto right_branch
git checkout right_branch
git merge right_branch wrong_branch
git branch -d wrong_branch
git branch rename new_wrong_branch wrong_branch

Agora a configuração é

A -- B -- C -- C1 -- C2 -- C3 -- C4 # right_branch
          \
           \ -- D # wrong_branch

Em seguida, você deve empurrar seus resultados com força (SE ninguém tiver sincronizado com seu repo remoto ainda):

git push -f remote:right_branch
Olivier Verdier
fonte
Não tentei essa solução, já estava dando certo na primeira resposta (e funcionou). Não pensei em rebase, parece uma boa alternativa, obrigado
Alessandro De Simone
1
Em vez de git push -fusar melhor git push --force-with-lease. Pelo menos, ele garante que a referência remota será atualizada apenas se ninguém enviar outros commits além de seus commits.
Pierre-Olivier Vares
2

Um pequeno atalho adicionado à resposta de Dhruva

git checkout wrong_branch
git revert commitsha1

git checkout right_branch
git push right_branch

git checkout wrong_branch
git reset commitsha2 #commit just before commitsha1
git push wrong_branch -f
tarikakyol
fonte