1

彼のブランチでいくつかの開発作業を行い、それらのコミットを行うとしましょう:

A -> B -> C -> D -> E

私はレビュアーであり、コミット B で変更されるべきではないいくつかのファイルが変更されていることに気付きました。

私はそのケースを解決するための最良の方法を見つけようとしています。

A -> B -> X -> Y -> C -> D -> E

どこ:

  • X は B のリバートです
  • Y は B であり、不要な変更はありません

私は次のことを考えていましたが、まったく同じに見えないことはわかっています:

  • git checkout -b on B
  • X で B を元に戻す
  • YでBをより良い方法で行う
  • ブランチに CDE をマージする
  • すべてを dev ブランチに戻します

上記は機能しますか?これが最善の方法ですか、それとももっと良い方法がありますか?

注:履歴の書き換えも含む解決策を聞きたいです。

4

4 に答える 4

4

このブランチはアップストリームにプッシュされて公開されているため、履歴を書き換えないでください。それは他の開発者の枝を壊します。

あなたがすべきことは:

A -> B -> C -> D -> E -> X -> Y

Eまでの履歴を保持します(私はそうだと思いますHEAD)。次にgit revert B、これは不正なコミットをcommitとして元に戻しXます。次に、コミットで修正しますY

または、git revert -n Bコミットを待機してコミットを編集できるようにすることもできます。これにより、1回のコミットですべての修正を行うことができます(Xのみ、いいえY)。これは、この問題を処理するためのより洗練された方法です。

于 2012-12-04T12:57:11.043 に答える
3

あなた自身が指摘したように、B自体の復帰は別のコミットです(X)および(Y)は、不要なファイルのない追加のコミットです。元のコミットを元に戻さずに、不要なファイルを削除して一度コミットしてみませんか? このように: A -> B -> C -> D -> E -> Z ここで、Z をコミットすると、不要なファイルがまだ存在する場合は削除されます。

于 2012-12-04T12:59:57.810 に答える
1

だから私は自分のニーズに合った解決策を見つけましたrebase -i(この機能ブランチのケースでは履歴を書き換えてもかまいません)

  • git rebase -i A (B の前のコミット)
  • git reset HEAD^1 filename (変更が不要なファイルに対して必要なだけこれを行います)
  • git commit --修正
  • git rebase -- 続行

コミットから削除したいファイルを手動で削除し、マージしないという文字通り必要なことを行うので、私はそれが好きです。

于 2012-12-04T13:28:17.513 に答える
0

Yuval の答えは、このブランチの開発に対する正しいアプローチですが、これがメイン ブランチとは別に取り組んでおり、将来的にマージされるフィーチャー ブランチである場合 (たとえば、これらのコミットはオンdevで、メイン ブランチは ですmaster):

  1. Yuvalの回答に従って、元に戻ってX修正しますY
  2. 通常どおり開発する
  3. 機能をマージするときは、実行しますgit rebase -i master
  4. 移動XYてすぐにフォローするB
  5. 必要に応じて、markXYasfixupを指定すると、それらは squash されますB
  6. CDおよびの競合を修正します。E

devこれで、必要な順序でコミットされたローカルブランチが作成されました。このブランチをブランチにマージしmasterて削除できるようになりましたdev。このようにして、誰の開発作業も中断することなく、希望するクリーンな履歴を取得できます。

于 2012-12-04T13:29:18.277 に答える