web-dev-qa-db-ja.com

プルリクエストでマージを元に戻しますか?

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

131
Will

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

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

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
120
errordeveloper

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

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


(コメントの詳細を編集した後:)

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

screenshot 1

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

enter image description here

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

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

85
Paŭlo Ebermann

プルが最後にした場合

git reset --hard HEAD~1
32
samthebest

2014年6月24日から、次の方法でPRのキャンセルを簡単に試すことができます(「 プルリクエストを元に戻す 」を参照)

元に戻すボタンの紹介

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

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

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

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

ただし、その復帰が-mを使用するかどうかはテストされたままです(マージも復帰するため)

20
VonC

削除しないコミット全体でgithubプルリクエストを元に戻すには、次を実行する必要があります。

git reset --hard --merge <commit hash>

プルリクエストをマージする前のコミットハッシュであるコミットハッシュ。これにより、履歴内のコミットに影響を与えることなく、プルリクエストからすべてのコミットが削除されます。

これを見つける良い方法は、現在閉じられているプルリクエストに行き、このフィールドを見つけることです:

Pull Request Image プルリクエストイメージ

git resetを実行した後、次を実行します。

git Push Origin --force <branch name>

これは、プルリクエストからのコミット間のコミット履歴に影響を与えるブランチ内のコミットに影響を与えることなく、プルリクエストがブランチを元に戻す必要があります。

編集:

プルリクエストで元に戻すボタンをクリックすると、ブランチで追加のコミットが作成されます。コミットもマージも解除されません。つまり、元に戻すボタンを押すと、新しいプルリクエストを開いてこのコードをすべて追加することはできません。

6
FluffySamurai

いつもこの場所を使っています、ありがとう。

プルリクエストを元に戻す方法を探していて、ここに来ました。

「かなり前」にgit reset --hardして、プルリクエストを行う前の場所に早送りしました。

ここを見るだけでなく、同僚に何をするかを尋ねたところ、通常は良い答えが得られました。上記の最初の回答の出力例を使用してください。

git reset --hard 9271e6e

Gitのほとんどの場合と同様に、簡単ではない何らかの方法でそれを行っている場合は、おそらく間違っているでしょう。

0
Mike Marshall