0

いくつかのコミットがオリジン ブランチにプッシュされました。これらのコミットには、問題を引き起こしたコードが含まれています。問題を解決するためにgit reset --hard <sha>、問題が発生する前にコミットを行いました。

その後、問題を修正し、ローカルにコミットしました。Origin にプッシュしたいのですが、ブランチが Origin より 5 つのコミット (問題の原因) 遅れており、1 つのコミット (修正コミット) 進んでいるため、プッシュできません。すなわち。分岐した枝。

Origin からの変更をマージしたくありません。Origin のヘッドをローカル コミットのヘッドに設定し、ブレーク コミットをローカル ブランチにマージしないようにするにはどうすればよいですか?

ありがとう!

4

2 に答える 2

6

クリーンな方法(履歴を保存する)

  1. 現在のコミットでローカルバグ修正ブランチを作成します
  2. チェックアウトマスター(または起源が何であれ)そしてそれを壊れたリモートHEADに早送りします
  3. git revert悪いコミット(フォークした最後の良いshaとリモートHEADの間のすべて)...これにより、すべての履歴を保持しながら、不要な変更が削除されます
  4. バグ修正ブランチをマスターにマージします。これで、すべてのマスターの変更が元に戻されました。これは簡単なマージになります。

汚い方法(履歴を破棄し、リモートブランチで作業している他の人を混乱させます)

  1. 使用するだけでgit push -f(適切なオプションとrefspecがあることを再確認してください)、他の誰もその下でリモートブランチ履歴が変更されていないことを願っています
于 2012-10-25T16:43:36.707 に答える
2

悪いコミットで他の人が行ったことを破棄したくない場合、つまり、履歴をそこに残しておきたいが、そこで発生した変更を拒否したい場合は、oursマージ戦略を使用できます。

git merge -s ours badbranch

これにより、基本的に、現在のブランチからすべての変更を取得するだけのマージ コミットが作成されます。何が起こったかを完全に無視しますbadbranchが、履歴にはそれらを組み込みます。そのため、そこで発生した変更を調べることができますが、現在のバージョンには影響しませんでした。

それ以外の場合、それらを完全に破棄したい場合、およびリポジトリを完全に制御でき、リポジトリからプルする他の人を気にしない場合は、ブランチを上書きして、基本的にそれらのコミットをリポジトリから削除できます (ただし、それを指している別のブランチがあります)。これを行うには、プッシュを強制します。

git push origin master -f

これにより、リポジトリで作業している他のすべての人が既にそれらの変更をフェッチしている可能性があるため、実際に認識していない限り、それを行わないでください。一般に、不正なコミットを履歴に残しておくことをお勧めします。

于 2012-10-25T16:46:05.983 に答える