誰かがすべきではないプルリクエストを受け入れました。これで、一連の壊れたコードがマージされました。プルリクエストを元に戻すにはどうすればよいですか?マージの直前にコミットの変更を元に戻すつもりでしたが、大量のコミットでマージされていることに気付きました。そのため、マージの前日からのこの人物からのこれらすべてのコミットがあります。これをどのようにして元に戻しますか?
誰かがすべきではないプルリクエストを受け入れました。これで、一連の壊れたコードがマージされました。プルリクエストを元に戻すにはどうすればよいですか?マージの直前にコミットの変更を元に戻すつもりでしたが、大量のコミットでマージされていることに気付きました。そのため、マージの前日からのこの人物からのこれらすべてのコミットがあります。これをどのようにして元に戻しますか?
回答:
より良い答えがありますこの問題に私はこれを段階的に分解することができました。
次のように、最新のアップストリームの変更をフェッチしてチェックアウトする必要があります。
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を取得する必要があります。。
上記の例では、マージコミットが「マージされたプルリクエスト#123 ...」と表示されている一番上のコミットです。
これを行って両方の変更を元に戻し("Add bar"と"Add foo")、1つのコミットでプルリクエスト全体を元に戻し、後で元に戻して変更の履歴をクリーンに保つことができます。
git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
git checkout upstream/master -b revert/john/foo_and_bar
?それは正確に何をしますか?
コミットグラフを見てください(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
git reset --hard HEAD~1
、私git push origin -f
はリモートリポジトリを更新するために使用しました。ただし、これを行う前に注意してください。
2014年6月24日以降、PRを簡単にキャンセルすることができます(「プルリクエストを元に戻す」を参照))。
[元に戻す]をクリックすると、GitHubのプルリクエストを簡単に元に戻すことができます。
元に戻された変更を使用して、新しいプルリクエストを作成するように求められます。
それはテストする必要がありますが、その復帰が使用する場合 -m
か(マージをリバートする場合も同様)
しかし、アディルHラザはコメントに追加しました(2019年12月):
これは予想される動作であり、新しいブランチを作成し、この新しいブランチからへのPRを作成できます
master
。
この方法で、将来、必要に応じて元に戻すことができますmaster
。これは最も安全なオプションであり、を直接変更することはありません。
元に戻した後、Gitブランチにいくつかの変更を加え、同じソース/宛先ブランチから新しいPRを作成したとします。
PRには新しい変更のみが表示されますが、元に戻す前の状態は何も表示されません。
Korayemは、詳細について「Github:変更を元に戻した後無視される変更(git cherry-pick
、git rebase
)」と呼んでいます。
削除したくないコミットを含むgithubプルリクエストを元に戻すには、次のコマンドを実行する必要があります。
git reset --hard --merge <commit hash>
コミットハッシュはプルリクエストをマージする前のコミットです。これにより、履歴内のコミットに影響を与えることなく、プルリクエストからすべてのコミットが削除されます。
これを見つける良い方法は、現在閉じられているプルリクエストに移動して、このフィールドを見つけることです。
を実行した後、次を実行しますgit reset
。
git push origin --force <branch name>
これにより、プルリクエストからのコミットの間にコミット履歴にペッパーされたブランチ内のコミットに影響を与えることなく、プルリクエストの前にブランチが元に戻ります。
編集:
プルリクエストで元に戻すボタンをクリックすると、ブランチに追加のコミットが作成されます。コミット解除またはマージ解除されません。つまり、元に戻すボタンを押した場合、新しいプルリクエストを開いてこのコードをすべて追加し直すことはできません。