2

Git に修正できない問題があります。同様のケースを検索しましたが、自分の状況に適した解決策を見つけることができませんでした。

基本的に、master と bugfix の 2 つのブランチがあります。バグ修正は、リリースを行った時点で master から派生します。バグ修正で何かを修正し、バグ修正リリースを行うたびに、それをマスターにマージする必要があります。Master には新しい機能が含まれています (もちろん、バグ修正にマージすることはできません)。誰かが誤って master をバグフィックスとマージしてしまったことがありました。

This is what happened:

 master: x1---x2
                \
 bugfix: y1--y2--M

where M is the merge between bugfix and master

これに対する解決策は、ここで説明されているように、「git revert -m 1 M」(M はマージからの SHA) で行ったマージを元に戻すことでした。バグ修正ブランチには、失いたくない他の変更が既にあり、これはバグ修正ブランチでうまく機能したため、元に戻しました。

Current state:

 master: x1--x2------------x---x

 bugfix: y1--x1--y2--x2--M--y--y--R1

where R1 is the revert of M

この問題は、バグ修正ブランチを master にマージする必要があるときに発生します。私が投稿したリンクで説明されているように、元に戻すとコードの変更は修正されますが、履歴は修正されません。これは、マスターにバグ修正をマージすると、元に戻すが有効になり、マスター (x1 と x2) から変更が削除されることを意味します。私にできることは、マスターにマージする前に、バグ修正で元に戻すことです。

Solution:

 master: x1--x2------------x---x--------M
                                       /
 bugfix: y1--x1--y2--x2--M--y--y--R1--R2

where R2 is the revert of R1

これは機能しますが、マージを行うたびにこの「元に戻す」を行う必要があるため、最終的な解決策ではありません。数日間、これに対する恒久的な解決策を探していましたが、バグ修正ブランチの履歴からマスター コミット (x1 と x2) を消去するしかないようです。ただし、ここでは例として x1 と x2 を使用しています。実際にはもっと多くのコミットがあり、バグ修正ブランチの履歴を分析することは非常に難しく、エラーが発生しやすくなっています。Git がこれを行うのに役立つことは確かですが、方法がわかりません。

どんなアイデアでも非常に役に立ちます。

4

3 に答える 3

2

個人的には、履歴を書き直し ( Uselessの回答を参照)、チームに伝えることをお勧めします。しかし、そのためには、誰もが一定レベルの git の知識を持っている必要があります。書き換えアプローチがリスクが高すぎる場合は、次の代替手段があります。

何が起こっていますか

Aにマージするたびに、git は から到達できるが から到達できないBすべてのコミット/変更を追加します。あなたの復帰はそれらの1つです。お気づきのように、書き直さないとどうしようもありません。ABB

ソリューション

リバートをマスターにマージする必要があります。元に戻したものをマスターに保持したい場合は、その元に戻したものをマスター (= マスターから到達可能) で元に戻す必要もあります。これを実現する最善の方法は、次のコマンドを使用することです。

git checkout -b bugfix-revert bugfix
git revert R1
git checkout master
git merge bugfix-revert
git branch -d bugfix-revert

これらのコマンドを実行すると、すべてのブランチが目的の状態になり、バグ修正を再度マージできます。履歴は次のようになります。

 [master] x1---x2----------------------H
                 \                    /
 [bugfix-revert]  \                  M''
                   \                /
 [bugfix] y1--y2----M--y3--y4--M'--y5

ご覧のとおり、には がmaster含まれていますが、元に戻されたため、M'その変更は にありません。には既に含まれているため、に適用されることはありません。状態は変更されておらず、変更する必要もありません。HM''M'masterbugfix

于 2013-05-23T13:59:11.817 に答える