回答:
「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)