リベースやリセットはしたくないと思いますが、これはマージのみのアプローチです。
2 つのブランチmaster
とがあるとしますfeature
。master
したがって、機能を次のようにマージすることにしました。
$ git merge feature
これで、すべてのfeature
変更がマスターに反映されました。最も困難なシナリオを想定しています。両方のブランチでマージ後にコミットが行われています。しかし、突然、何も機能しないことがわかりfeature
、すべてが壊れており、元に戻すことにしました。あなたの履歴は次のとおりです(で見ることができますgit log --graph feature master
):
* commit 838f29fda2333bdbfc0d1be44d2387e6119dc4e8
|
| f3
|
| * commit 58d1e3f0e032cc77d4ab2bbf0bdfe6407b96b7e6
| |
| | m3
| |
| * commit afb600fe382befe095f9b8a6e9eef98be25c929b
| |\ Merge: 5cddc52 8660a59
| |/
|/|
| | Merge branch 'feature'
| |
* | commit 8660a59eeb13f9b3447846ba6977140f7c86c7a4
| |
| | f2
| |
* | commit 6f76e2288d69808b97981340198fd8044ab47630
| |
| | f1
| |
| * commit 5cddc528de424a01d1d18552ddea93435618e2f7
| |
| | m2
| |
| * commit fa6ebb76f9f0308f7dcd1148503534668fa15358
|/
|
| m1
|
* commit 4e3aa05d6f46eb14bbbc253a42325e9a53a3393e
マージ後にコミットされた f3 と m3 に注目してください。feature
そのため、 に表示されたからの変更のみを慎重に削除する必要がありますmaster
。
master
これを行うには、マスターのベース (パラメーター) を保持したまま、 のマージ コミットを元に戻すことができます-m1
。それを実現するために、マージ ポイントに基づいて新しいブランチを作成し、そこに戻します。
$ git checkout -b feature-revert afb600fe
$ git revert -m1 HEAD
これで、ブランチの変更が元に戻されましたfeature-revert
。マージしてマスターに入れるだけです。
$ git checkout master
$ git merge feature-revert
そのため、現時点では にmaster
は から何もありませんfeature
。ただし、後でフィーチャを再マージする場合、元に戻されたすべての変更は、マージされて元に戻されたため、マスターで失われます。
この問題を解決するには、revert (he-he) を元に戻し、それを にマージして戻す必要がありfeature
ます。
$ git checkout feature-revert
$ git revert HEAD
$ git checkout feature
$ git merge feature-revert
すでにマージしたので、ブランチはもう必要ないと思いますが、必要に応じてそのままにしておくことができます。
$ git branch -d feature-revert
マージして元に戻すと、すべての変更が通常のワークフローmaster
に持ち込まれることに注意してください。feature
これで、修正を行った後、いつでも通常どおりfeature
に再びマージできます。master