あるべきではないプル要求を誰かが受け入れました。これで、壊れたコードの束がマージされました。プルリクエストを元に戻すにはどうすればよいですか?マージの直前にコミットの変更を元に戻すつもりでしたが、コミットの束にマージされていることに気付きました。そのため、マージの数日前からこの人からのこれらすべてのコミットがあります。これをどのように元に戻しますか?
この問題には より良い答え がありますが、これを段階的に分解することもできます。
次のように、最新のアップストリームの変更を取得してチェックアウトする必要があります:
git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar
コミットログを見ると、次のようなものが見つかります。
commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269 Merge: 9271e6e a507888 Author: Tim Tom <[email protected]> Date: Mon Apr 29 06:12:38 2013 -0700 Merge pull request #123 from john/foo_and_bar Add foo and bar commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e Author: John Doe <[email protected]> Date: Mon Apr 29 12:13:29 2013 +0000 Add bar commit 470ee0f407198057d5cb1d6427bb8371eab6157e Author: John Doe <[email protected]> Date: Mon Apr 29 10:29:10 2013 +0000 Add foo
プルリクエスト全体を元に戻し、後で元に戻せるようにしたいとします。そのためには、merge commitのIDを取得する必要があります。
上記の例では、merge commitが一番上の "Merged pull request#123 ... 「。
これを行って、両方の変更を元に戻します( "Add bar"および "Add foo")そしてプルリクエスト全体を1回のコミットで元に戻すことになり、後で元に戻して変更の履歴をクリーンに保つことができます。
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
コミットグラフを見てください(gitkまたは同様のプログラムで)。プルリクエストからのコミットが表示され、独自のコミットとマージコミットが表示されます(早送りマージでない場合)。マージ前に最後のコミットを見つけて、ブランチをこのコミットにリセットするだけです。
(ブランチのreflogがある場合、マージ前にコミットを見つけるのがさらに簡単になるはずです。)
(コメントの詳細を編集した後:)
最後の(一番右の)コミットは間違っていたプルリクエストによるマージで、ここに表示されている青い線がマージされたと思います。最後のgoodコミットは、ここで赤でマークされた黒い行の前のものです。
このコミットにリセットすると、問題ないはずです。
これは、ローカルの作業コピーでこれを行うことを意味します(たとえば、git stashによって、コミットされていないものがもうないことを確認した後)。
git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk
ここで、私がそこにマークしたコミットを本当に実行していることを確認します。その祖先にはプルされたものはありません。
git Push -f Origin master
(githubリモートの名前がOrigin
の場合-名前を変更します)。
これで、すべてがgithubでも正しく見えるはずです。コミットはリポジトリに残りますが、どのブランチからも到達できないため、そこに害を及ぼすことはありません。 (もちろん、彼らはまだRogerPaladinのリポジトリにあります。)
(同じことを行うGithub固有のWeb専用の方法があるかもしれませんが、Githubとそのプルリクエスト管理システムについてはあまり詳しくありません。)
注すでに他の誰かがあなたのマスターを間違ったコミットでプルした可能性がある場合、彼らはあなたと同じ問題を抱えており、実際にはできない貢献します。新しいマスターバージョンにリセットする前に。
これが発生した可能性が高い場合、または単に問題を回避したい場合は、git revert
の代わりにgit reset
コマンドを使用して、古いコミットに戻すのではなく、新しいコミットで変更を元に戻します。 (一部の人々は、あなたが公開されたブランチで決してリセットすべきではないと考えます。)これを行う方法については、この質問に対する他の回答を参照してください。
将来のために:
RogerPaladinのブランチの一部のコミットのみが必要な場合は、merge
の代わりにcherry-pick
の使用を検討してください。または、RogerPaladinと通信して別のブランチに移動し、新しいプルリクエストを送信します。
プルが最後にした場合
git reset --hard HEAD~1
2014年6月24日から、次の方法でPRのキャンセルを簡単に試すことができます(「 プルリクエストを元に戻す 」を参照)
[元に戻す]をクリックすると、GitHubでプルリクエストを簡単に元に戻すことができます。
変更を元に戻した新しいプルリクエストを作成するよう求められます。
ただし、その復帰が-m
を使用するかどうかはテストされたままです(マージも復帰するため)
削除しないコミット全体でgithubプルリクエストを元に戻すには、次を実行する必要があります。
git reset --hard --merge <commit hash>
プルリクエストをマージする前のコミットハッシュであるコミットハッシュ。これにより、履歴内のコミットに影響を与えることなく、プルリクエストからすべてのコミットが削除されます。
これを見つける良い方法は、現在閉じられているプルリクエストに行き、このフィールドを見つけることです:
git reset
を実行した後、次を実行します。
git Push Origin --force <branch name>
これは、プルリクエストからのコミット間のコミット履歴に影響を与えるブランチ内のコミットに影響を与えることなく、プルリクエストがブランチを元に戻す必要があります。
編集:
プルリクエストで元に戻すボタンをクリックすると、ブランチで追加のコミットが作成されます。コミットもマージも解除されません。つまり、元に戻すボタンを押すと、新しいプルリクエストを開いてこのコードをすべて追加することはできません。
いつもこの場所を使っています、ありがとう。
プルリクエストを元に戻す方法を探していて、ここに来ました。
「かなり前」にgit reset --hard
して、プルリクエストを行う前の場所に早送りしました。
ここを見るだけでなく、同僚に何をするかを尋ねたところ、通常は良い答えが得られました。上記の最初の回答の出力例を使用してください。
git reset --hard 9271e6e
Gitのほとんどの場合と同様に、簡単ではない何らかの方法でそれを行っている場合は、おそらく間違っているでしょう。