サニティーチェック
git revert
まず、ハッシュをリストした順序でパッチを元に戻すことに注意してください。時間をさかのぼりたいので、ハッシュを最新のものから古いものへリストする必要があります。だから、私はあなたのハッシュを呼び出すつもりです
<hash1> ... <hashN>
どこ<hash1>
より古い<hash2>
...より古いです<hashN>
。だから、あなたがやっていたことを確認してください
git revert <hashN> ... <hash1>
そもそも!
簡単な解決策
次に、正しい順序で元に戻していたと仮定して、次の--no-commit
オプションを試してください。
git revert --no-commit <hashN> ... <hash1>
より複雑なソリューション
3 番目に、簡単な解決策がうまく機能しないが、元に戻したいコミットが単一のコミットとして本当に理にかなっている場合 (そうでない場合は、あまり望みがありません)、これを試してください:元に戻したい 4 つを選択してから、大きなコミットを元に戻します。
大きなコミットを構築します。
最も古いコミットの親にブランチを作成します。
git checkout -b big-commit <hash1>~
新しいブランチにコミットをコピーして折りたたむ:
git cherry-pick --no-commit <hash1> ... <hashN>
git commit -m "Big commit"
これで、ブランチに大きなコミットが 1 つあるはずbig-commit
です。
元に戻そうとしているブランチに大きなコミットを逆に適用します。
git checkout <branch you wanted to revert on>
git revert big-commit
別の比較的簡単な解決策
選択的リベースを使用して、不要なコミットが含まれていないかのように問題のブランチを再構築します。
作業する新しいrebuild
ブランチを作成します。
git checkout -b rebuild <branch you want to revert>
インタラクティブにリベースし、不要なコミットを削除します。
git rebase -i <hash1>~
インタラクティブなリベース エディターで、<hash1>
...の行を削除します<hashN>
。
今、あなたのrebuild
ブランチには<branch you want to revert>
、あたかも<hash1>
...<hashN>
存在しなかったかのように が含まれます。ここで競合が発生した場合、それらは避けられないように思われます。
作業を on にする必要があり、新しいブランチを指す<branch you want to revert>
だけではできない場合:git reset
rebuild
git checkout <branch you want to revert>
git reset --hard rebuild
(たとえば、すでに公開されているため)、代わりに違いを<branch you want to revert>
パッチとして適用できます。
git co <branch you want to revert>
git diff <branch you want to revert> rebuild | patch