216

誰かが持ってはいけないプルリクエストを受け入れました。これで、壊れたコードの束がマージされました。プルリクエストを元に戻すにはどうすればよいですか?マージの直前に変更をコミットに戻すつもりでしたが、それが一連​​のコミットにマージされていることに気づきました。したがって、マージの数日前から、この人からのこれらすべてのコミットがあります。これを元に戻すにはどうすればよいですか?

4

8 に答える 8

226

この問題にはもっと良い答えがありますが、これを段階的に分解することはできます。

次のように、最新のアップストリームの変更を取得してチェックアウトする必要があります。

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
于 2013-04-30T11:03:38.677 に答える
90

コミット グラフを確認します (gitk または同様のプログラムを使用)。プル リクエストからのコミットが表示され、自分のコミットとマージ コミット (早送りマージでない場合) が表示されます。マージ前に自分の最後のコミットを見つけて、ブランチをこのコミットにリセットするだけです。

(ブランチの reflog がある場合は、マージ前にコミットを見つけるのがさらに簡単になるはずです。)


(コメントで詳細を確認してから編集してください:)

さて、グラフを見てみましょう:

スクリーンショット 1

最後の (一番右の) コミットは、プル リクエストによる間違ったマージであり、ここに表示されている青い線がマージされたと思います。最後の適切なコミットは、ここでは赤でマークされた黒い線の前のコミットになります。

ここに画像の説明を入力

このコミットにリセットすれば、問題ないはずです。

これは、ローカルの作業コピーでこれを行うことを意味します (たとえば、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 に連絡して別のブランチに移動し、新しいプル リクエストを送信してください。

于 2011-06-26T01:48:55.190 に答える
42

プルが彼がした最後のことだったら

git reset --hard HEAD~1
于 2013-02-27T16:26:02.090 に答える
38

2014 年 6 月 24 日以降、PR を簡単にキャンセルできます (「プル リクエストの取り消し」を参照)。

元に戻すボタンの紹介

[元に戻す] をクリックすると、GitHub のプル リクエストを簡単に元に戻すことができます。

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

元に戻した変更を含む新しいプル リクエストを作成するよう求められます。

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

そのリバートが使用する-mかどうかはまだテストされていません(マージのリバートにも)

しかし、Adil H Razaはコメントに次のように付け加えています (2019 年 12 月)。

これは予想される動作です。新しいブランチが作成され、この新しいブランチからmaster.
このようにして、将来、必要に応じて元に戻すことができます。これは最も安全なオプションであり、直接変更することはありませんmaster


警告: Korayemはコメントで次のように指摘しています。

元に戻した後、Git ブランチにさらに変更を加え、同じソース/宛先ブランチから新しい PR を作成したとします。
PR には新しい変更のみが表示されますが、元に戻す前にあったものは何も表示されません

Korayem は、詳細については、「Github: 元に戻した後に無視された変更 ( git cherry-pick, git rebase)」を参照してください。

于 2014-06-27T19:17:22.123 に答える