2012-03-02 10 views
16

私は誰かのプロジェクトをフォークしてコミットしました。私はプルリクエストを記入し、それは受け入れられませんでした(変更は望ましくないか、または作者が機能を "彼のスタイル"に合わせて書き直しました)。今私はアップストリームに入ることは決してないいくつかの余分なコミットを持って私の地元のフォークに立ち往生しています。私は変更セットを取り消すことができますが、2倍の余分なコミットがあり、永遠にそれらをカートに入れなければなりません。それはちょうど醜いです!Gitを捨てて、拒否したプルリクエストをGithubにコミットします

誰も望んでいないこれらのコミットを放棄し、自分のフォークをアップストリームの追跡に戻す最良の方法は何ですか?私はフォークを完全に削除して再フォークできることを知っていますが、これは本当に重い手であり、私がやっている他の作業を失うことになります。

+0

_proposed_変更を別個の(分岐した)ブランチにしましたか? –

答えて

19

以前のコミットにリセットすることができます。その状態にあなたのレポをリセットするには

git log 

:あなたがあなたのレポをリセットしたいコミット最初の図アウト

git reset --hard <commit_hash> 

あなたはフォークリモートレポを持っている場合は、あなたが戻ってこれらの変更をプッシュすることができますそれ:

git push -f <remote> <branch> 

あなたのワークフローを変更して、将来的にもっと簡単にすることができます。

私がレポをフォークして自分で変更するときは、まず2台のリモコンをセットアップします。 1つのリモコンが私の分岐したレポ(例:origin)を指し、別のリモートポイントを元のレポに追加します(例:original_repo)。 feature

$ git remote 
    origin 
    original_repo 

私は元、内のすべての私の仕事を行うためのブランチを作成します。だから私のようなものがあるかもしれません。プルリクエストをするときは、featureブランチからoriginal_repomasterブランチに転送します。あなたの例のようにプルリクエストが拒否された場合、このブランチを放棄することができます。より多くの変更を行う場合は、masterから別のブランチを作成し、それを使用して作業してください。

また、masterブランチのローカル変更をコミットまたはマージしません。私はmasterブランチを使用して、original_repomasterブランチと同期するだけです。例:

git checkout master 
    git fetch original_repo 
    git merge original_repo/master 

これはmasterブランチは、常にオリジナルのレポのmasterブランチにアップ同期化されることを確実にします。たとえば、プルリクエストが受け入れられ、マージされた場合、フェッチとマージが発生すると、ローカルmasterは、元のレポに使用されたすべての「承認済み」コードを持ちます。

は、基本的にはオリジナルのレポのmasterと同期して、編集をしたいときは常にマスタから分岐するmasterを使用しています。オリジナルのリポジトリへのプルリクエストには、これらのブランチを使用します。

2

マスターブランチをいくつかのステップに戻します(3つのコミットをスキップしたい場合)-fを押してgithub repoを書き直します。

git reset --hard HEAD~3 
git push -f origin master 
関連する問題