17

問題: ブランチには、望ましくないコミットが混在する良好なコミットがあります。

試みられた解決策:

git revert hash5 hash8 hash9 hash23

これが行うと思ったのは、指定されたすべてのコミットを適用し、競合を整理できるようにすることです。

私が今それが起こると思うこと:

  • git はコミット ハッシュ 5 を適用し、その過程で大きな競合が発生します。
  • マージを試み、コードを編集して、より多くの競合の準備を整えます (次のポイントを参照)。
  • git は commit ハッシュ 8 を適用しますが、これはマージで行われた編集と競合します
  • マージを試みます...などなど

質問: 競合の可能性を提示する前に、git にすべての復帰を連続して適用させるにはどうすればよいですか?

4

1 に答える 1

12

サニティーチェック

git revertまず、ハッシュをリストした順序でパッチを元に戻すことに注意してください。時間をさかのぼりたいので、ハッシュを最新のものから古いものへリストする必要があります。だから、私はあなたのハッシュを呼び出すつもりです

<hash1> ... <hashN>

どこ<hash1>より古い<hash2>...より古いです<hashN>。だから、あなたがやっていたことを確認してください

git revert <hashN> ... <hash1>

そもそも!

簡単な解決策

次に、正しい順序で元に戻していたと仮定して、次の--no-commitオプションを試してください。

git revert --no-commit <hashN> ... <hash1>

より複雑なソリューション

3 番目に、簡単な解決策がうまく機能しないが、元に戻したいコミットが単一のコミットとして本当に理にかなっている場合 (そうでない場合は、あまり望みがありません)、これを試してください:元に戻したい 4 つを選択してから、大きなコミットを元に戻します。

  1. 大きなコミットを構築します。

    最も古いコミットの親にブランチを作成します。

    git checkout -b big-commit <hash1>~
    

    新しいブランチにコミットをコピーして折りたたむ:

    git cherry-pick --no-commit <hash1> ... <hashN>
    git commit -m "Big commit"
    

    これで、ブランチに大きなコミットが 1 つあるはずbig-commitです。

  2. 元に戻そうとしているブランチに大きなコミットを逆に適用します。

    git checkout <branch you wanted to revert on>
    git revert big-commit
    

別の比較的簡単な解決策

選択的リベースを使用して、不要なコミットが含まれていないかのように問題のブランチを再構築します。

  1. 作業する新しいrebuildブランチを作成します。

    git checkout -b rebuild <branch you want to revert>
    
  2. インタラクティブにリベースし、不要なコミットを削除します。

    git rebase -i <hash1>~
    

    インタラクティブなリベース エディターで、<hash1>...の行を削除します<hashN>

今、あなたのrebuildブランチには<branch you want to revert>、あたかも<hash1>...<hashN>存在しなかったかのように が含まれます。ここで競合が発生した場合、それらは避けられないように思われます。

作業を on にする必要があり、新しいブランチを指す<branch you want to revert>だけではできない場合:git resetrebuild

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
于 2013-11-27T01:02:07.503 に答える