継続的インテグレーション サーバーで単体テストに失敗したマージ コミットを修正したいのですが、テストに失敗したコミットを履歴に残したくありません。
このコミットは CI サーバーによってのみ使用されたので (そして、他の誰かによって引き下げられることはありませんでした)、マージを修正してから--force
プッシュして、既存の失敗したマージ コミットを置き換えたいと思います。
私の問題は、失敗したテストを修正し、マージを再コミットしてから、その変更を強制的にプッシュできるように、元のコミットが行われる直前の状態に簡単に戻る方法を見つけられないことです。
解決しなければならない競合のあるファイルがかなりあり、1 つを除いてすべてが正常に解決されたため、マージ全体をやり直す必要はありません。
これまでに試したこと
試行 1:git reset
私の最初の試みは、マージコミットの前に混合リセットをコミットに戻し、マージによって導入されたバグを修正してから再コミットすることでした。
git reset HEAD^
# Fix the failing test
git commit
残念ながら、これにより、すべてのブランチの変更が静かに組み込まれるマージ以外のコミットが発生します。これは、私が望んでいるものではありません。*8')
試行 2: reset
、stash
、merge
&apply
次に、stash を使用して、最初のマージ試行中に行った変更を保存しようとしました。
git reset HEAD^
git add . # Since there were untracked files
git stash
git merge branch
git stash apply # Fails
git add .
git stash apply # Merged but with conflicts
残念ながらgit stash apply
、隠した変更を既存の競合するマージ ファイルとマージしようとすると、エラーで失敗します
ダーティな作業ツリーには適用できません。変更をステージングしてください
git add .
実行を使用して作業ディレクトリを忠実にクリーンにするgit stash apply
と、競合が発生するだけでなく、競合が発生し、削除されるべきファイルが再び追加されます。
試行 3:amend
および/またはrebase
.
問題と元のコミットを修正するためにqqxによる素敵でシンプルな提案を試みましたが、実際にマージ途中の状態に戻らないと、マージ ツールにアクセスできなくなります。git commit --amend
コミットするgit mergetool {file}
と、エラーが返されるだけで実行できなくなります。
{file}: ファイルをマージする必要はありません
マージの競合を修正しようとするとき、 のようなツールを使用して、ベース、左、右、および現在のリビジョンをすべて一緒に表示できるのが本当に気に入っていますkdiff3
。
を使用しrebase
ても同じ問題が発生します。
希望する結果を達成できるワークフローに関するヒントをいただければ幸いです。