回答:
「ours」マージ戦略を使用できます。
$ git checkout staging
$ git merge -s ours email # Merge branches, but use our branch head
;各コマンドの最後にあるのですか?私はなしでやった;、それは働いているようです。また、この回答は不完全です。3番目の手順は、古いブランチ(メール)をチェックアウトしてから、ステージングと再度マージすることです。
                    git rebase -s theirs <oldbranc> <newbranch> 同様に機能します(あなたがどのブランチであるかは関係ありません)。リベースでは、「私たち」が現在コミットを適用しているヘッドであるため、「彼ら」は実際には新しいブランチです。
                    2つのブランチ「email」と「staging」を同じにしたい場合は、「email」ブランチにタグを付けてから、「email」ブランチを「staging」ブランチにリセットします。
$ git checkout email
$ git tag old-email-branch
$ git reset --hard staging
'staging'ブランチを 'email'ブランチにリベースすることもできます。ただし、結果には2つのブランチの変更が含まれます。
git checkout、git check私の知る限り存在しないことを意味します
                    emailブランチのヘッドは同じヘッドを指すだけstagingで、どちらも同じコミット、同じ履歴を持ちます。
                    私はいくつかの回答を見てきましたが、これが競合なしに修正できる唯一の手順です。
branch_oldのbranch_newからのすべての変更が必要な場合:
git checkout branch_new
git merge -s ours branch_old
git checkout branch_old
git merge branch_new
これらの4つのコマンドを適用すると、問題なくbranch_oldをプッシュできます。
他の答えは私に正しい手がかりを与えましたが、それらは完全に助けにはなりませんでした。
$ 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
私たちの戦略とマージする4番目のステップがないと、プッシュは早送りではないと見なされ、拒否されます(GitHubによって)。
merge -m 'This is not my beautiful house.' -s ours origin/email。
                    あなたが私のようなものであり、マージに対処したくない場合は、上記の手順を実行できますが、マージの代わりにforceを使用します。
git checkout email
git reset --hard staging
git push origin email --force
注:これは、本当にメールの内容を二度と見たくない場合のみです。
どうですか:
git branch -D email
git checkout staging
git checkout -b email
git push origin email --force-with-lease
他の回答は不完全に見えました。
私は完全に以下を試しました、そしてそれはうまくいきました。
注意:
 
1.安全のため、以下を試す前にリポジトリのコピーを作成してください。  
詳細:
1.すべての開発はdevブランチで行われます
2. qaブランチはdevの同じコピーです
 
3.時々、コードはqaブランチに移動/上書きする必要があります  
したがって、開発ブランチからqaブランチを上書きする必要があります
パート1:
 
以下のコマンドで、古いqaが新しい開発に更新されました:  
git checkout dev
git merge -s ours qa
git checkout qa
git merge dev
git push
最後のプッシュの自動コメントは以下になります:
// Output:
//  *<MYNAME> Merge branch 'qa' into dev,*  
上記のシーケンスも逆に見えるため、このコメントは逆に見えます
パート2:
以下は、devでの予期しない新しいローカルコミットであり、不要なものである
ので、捨てて、devをそのままにする必要があります。  
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
パート3:
 
すべてが期待どおりであることを確認します。  
git status  
// Output:
//  *On branch dev  
//  Your branch is up-to-date with 'origin/dev'.  
//  nothing to commit, working tree clean*  
それで全部です。
1.古いqaが新しいdevブランチコードによって上書きされるようになりました
2.ローカルがクリーンです(リモートorigin / devはそのままです)  
これは元の新しいブランチを変更せず、最終的なコミットの前にさらに変更を加える機会を与えます。
git checkout new -b tmp
git merge -s ours old -m 'irrelevant'
git checkout old
git merge --squash tmp
git branch -D tmp
#do any other stuff you want
git add -A; git commit -m 'foo' #commit (or however you like)