誰かが持ってはいけないプルリクエストを受け入れました。これで、壊れたコードの束がマージされました。プルリクエストを元に戻すにはどうすればよいですか?マージの直前に変更をコミットに戻すつもりでしたが、それが一連のコミットにマージされていることに気づきました。したがって、マージの数日前から、この人からのこれらすべてのコミットがあります。これを元に戻すにはどうすればよいですか?
8 に答える
この問題にはもっと良い答えがありますが、これを段階的に分解することはできます。
次のように、最新のアップストリームの変更を取得してチェックアウトする必要があります。
git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar
コミット ログを見ると、次のようなものが見つかるはずです。
commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269 Merge: 9271e6e a507888 Author: Tim Tom <tim@tom.com> 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 <john@doe.com> Date: Mon Apr 29 12:13:29 2013 +0000 Add bar commit 470ee0f407198057d5cb1d6427bb8371eab6157e Author: John Doe <john@doe.com> Date: Mon Apr 29 10:29:10 2013 +0000 Add foo
ここで、プル リクエスト全体を元に戻し、後で元に戻すことができるようにしたいと考えています。そのためには、マージ コミットの ID を取得する必要があります。
上記の例では、マージ コミットは"Merged pull request #123..."と表示されている一番上にあります。
これを実行して両方の変更 ( "Add bar"と"Add foo" ) を元に戻すと、1 つのコミットでプル リクエスト全体が元に戻り、後で元に戻すことができ、変更履歴をクリーンに保つことができます。
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
コミット グラフを確認します (gitk または同様のプログラムを使用)。プル リクエストからのコミットが表示され、自分のコミットとマージ コミット (早送りマージでない場合) が表示されます。マージ前に自分の最後のコミットを見つけて、ブランチをこのコミットにリセットするだけです。
(ブランチの reflog がある場合は、マージ前にコミットを見つけるのがさらに簡単になるはずです。)
(コメントで詳細を確認してから編集してください:)
最後の (一番右の) コミットは、プル リクエストによる間違ったマージであり、ここに表示されている青い線がマージされたと思います。最後の適切なコミットは、ここでは赤でマークされた黒い線の前のコミットになります。
このコミットにリセットすれば、問題ないはずです。
これは、ローカルの作業コピーでこれを行うことを意味します (たとえば、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 のブランチのコミットの一部のみが必要な場合は、cherry-pick
代わりにmerge
. または、RogerPaladin に連絡して別のブランチに移動し、新しいプル リクエストを送信してください。
プルが彼がした最後のことだったら
git reset --hard HEAD~1
2014 年 6 月 24 日以降、PR を簡単にキャンセルできます (「プル リクエストの取り消し」を参照)。
[元に戻す] をクリックすると、GitHub のプル リクエストを簡単に元に戻すことができます。
元に戻した変更を含む新しいプル リクエストを作成するよう求められます。
そのリバートが使用する-m
かどうかはまだテストされていません(マージのリバートにも)
しかし、Adil H Razaはコメントに次のように付け加えています (2019 年 12 月)。
これは予想される動作です。新しいブランチが作成され、この新しいブランチから
master
.
このようにして、将来、必要に応じて元に戻すことができます。これは最も安全なオプションであり、直接変更することはありませんmaster
。
警告: Korayemはコメントで次のように指摘しています。
元に戻した後、Git ブランチにさらに変更を加え、同じソース/宛先ブランチから新しい PR を作成したとします。
PR には新しい変更のみが表示されますが、元に戻す前にあったものは何も表示されません。
Korayem は、詳細については、「Github: 元に戻した後に無視された変更 ( git cherry-pick
, git rebase
)」を参照してください。