2016-08-20 4 views
2

私はオープンソースプロジェクトのプルリクエストに取り組んでいましたが、私のローカルmasterブランチへの変更を偶然コミットしました。それを十分に考えずに、私は先に進んで私の起源にプッシュし、PRとして私の支店を提出しました。その後、上流のマスターをマスターに引っ張って、マージ競合を修正してPRを最新の状態に保つことができました。それ以来、より多くのコミットが上流に行われました。フォーク内でマングルされたマスターブランチを修正する

は、だから今私が持っている:Xは私のPRの最初のバージョンだった、そしてYは、だから今、私のフォーク

X.

へのC-Hのマージです
upstream master: A - B - C ... H - I - J 

my fork master: A - B - X - Y 

は非常にもつれです。私は、Bの前にブランチを起動せずに、毎回上流のマスターをそのブランチに引き込むことなく無関係のPRで作業することはできません。私のオリジナルのPRが拒否されたり、フィードバックを得るのに1年かかったりすると、私はこの状態で無期限に拘束されます。

これを修正するオプションはありますか?私は私のPRを傷つけなくてはならないのですか?そしてXとYがコミットし、手動でやり直しますか?あるいは、私のPRをどうにかして元の枝を上流に同期させて戻すことができますか?ビットのようになります私は、このシナリオで行うだろう

答えて

2

まず、既存のmasterから新しいブランチをチェックアウト:

git checkout -b master-preserve 

次に、あなたのmasterupstream/masterにをリセットします。

git checkout master 
git fetch upstream 
git reset --hard upstream/master 

もう1つブランチを作成してください。

git checkout -b upstream-with-commits 

そして、それにXYを桜選ぶ:

git cherry-pick X Y # Replace with the appropriate commit IDs 

次に、あなたのフォークにこのブランチをプッシュし、既存のPRをNUKE、およびupstream-with-commitsに対する新しいものを開きます。バックオーダーであなたのフォークのmasterを取得するには、実行します。

git checkout master 
git push -f origin HEAD 

git push -fをプッシュを強制し、origin/master内の任意の歴史を上書きします。あなたのフォークから他の人がクローンを作成した場合、それが問題を引き起こす可能性があることに注意してください。

ああ、とmaster-preserveを削除することを忘れないでください:

git branch -D master-preserve 

あなたはそれからcherry-pick編をしたら、それはもはや必要ません。

+0

これは美しく機能しました。私は一度だけそれを行うことができるので、誰もが私のためにこれをupvote。 :) Githubの1つの素晴らしいこと...固定マスターブランチを強制的にプッシュすると、自動的に元のPRを閉じました。 – Tenfour04

+0

私の誤植を修正していただきありがとうございます。誤って '-b'を落としてしまったことに気付かなかった。 :) –

関連する問題