Como eu ‘sobrescrevo’, ao invés de ‘mesclar’, um ramo em outro ramo no Git?

Eu tenho dois ramos, e- email e staging . staging é o último e eu não preciso mais das mudanças antigas na ramificação do email , mas não quero excluí-las.

Então eu só quero despejar todo o conteúdo do staging em email para que ambos apontem para o mesmo commit. Isso é possível?

Você pode usar a estratégia de mesclagem ‘nossa’:

 $ git checkout staging $ git merge -s ours email # Merge branches, but use our branch head 

Se você quiser que as duas ramificações ’email’ e ‘staging’ sejam as mesmas, você pode marcar a ramificação ’email’ e redefinir a ramificação ’email’ para a ramificação ‘staging’:

 $ git checkout email $ git tag old-email-branch $ git reset --hard staging 

Você também pode rebase a ramificação ‘staging’ na ramificação ’email’. Mas o resultado conterá a modificação dos dois ramos.

As outras respostas deram-me as pistas certas, mas não ajudaram completamente.

Veja o que funcionou para mim:

 $ git checkout email $ git tag old-email-branch # This is optional $ git reset --hard staging $ $ # Using a custom commit message for the merge below $ git merge -m 'Merge -s our where _ours_ is the branch staging' -s ours origin/email $ git push origin email 

Sem o quarto passo da fusão com a nossa estratégia, o push é considerado uma atualização sem avanço rápido e será rejeitado (pelo GitHub).

Eu vi várias respostas e esse é o único procedimento que me permite corrigir isso sem conflitos.

Se você quiser todas as alterações de branch_new em branch_old, então:

 git checkout branch_new git merge -s ours branch_old git checkout branch_old git merge branch_new 

uma vez aplicado esses quatro comandos você pode empurrar o branch_old sem qualquer problema

Se você é como eu e não quer lidar com a mesclagem, é possível executar as etapas acima, exceto usar força em vez de mesclar, porque isso criará uma trilha de papel de log de distração:

 git checkout email git reset --hard staging git push origin email --force 

Nota: Isto é somente se você realmente nunca quiser ver as coisas no e-mail novamente.

Eu queria mesclar duas ramificações para que todo o conteúdo em old_branch fosse atualizado com o conteúdo de new_branch

Para mim, isso funcionou como um encanto:

 $ git checkout new_branch $ git merge -m 'merge message' -s ours origin/old_branch $ git checkout old_branch $ git merge new_branch $ git push origin old_branch 

E se:

 git branch -D email git checkout staging git checkout -b email git push origin email --force-with-lease 

Outras respostas pareciam incompletas.
Eu tentei abaixo na íntegra e funcionou bem.

NOTA:
1. Faça uma cópia do seu repository antes de tentar abaixo, para estar no lado seguro.

Detalhes:
1. Todo o desenvolvimento acontece no dev
2. qa é apenas a mesma cópia do dev
3. De vez em quando, o código dev precisa ser movido / sobrescrito para qa branch

então precisamos sobrescrever o ramo qa, do ramo dev

Parte 1:
Com os comandos acima, o qa antigo foi atualizado para o novo desenvolvedor:

 git checkout dev git merge -s ours qa git checkout qa git merge dev git push 

Comentário automático para o último impulso dá abaixo:

 // Output: // * Merge branch 'qa' into dev,* 

Este comentário parece reverso, porque a sequência acima também parece reversa

Parte 2:

Abaixo estão os commits locais novos e inesperados no dev, os desnecessários
então, precisamos jogar fora e fazer com que o dev não seja tocado.

 git checkout dev // Output: // Switched to branch 'dev' // Your branch is ahead of 'origin/dev' by 15 commits. // (use "git push" to publish your local commits) git reset --hard origin/dev // Now we threw away the unexpected commits 

Parte 3:
Verifique se tudo está conforme o esperado:

 git status // Output: // *On branch dev // Your branch is up-to-date with 'origin/dev'. // nothing to commit, working tree clean* 

Isso é tudo.
1. o qa antigo agora é sobrescrito pelo novo código do ramo de desenvolvimento
2. local é limpo (origem remota / dev não é tocada)

 git checkout email git merge -m "Making email same as staging disregarding any conflicts from email in the process" -s recursive -X theirs staging