1

継続的インテグレーション サーバーで単体テストに失敗したマージ コミットを修正したいのですが、テストに失敗したコミットを履歴に残したくありません。

このコミットは CI サーバーによってのみ使用されたので (そして、他の誰かによって引き下げられることはありませんでした)、マージを修正してから--forceプッシュして、既存の失敗したマージ コミットを置き換えたいと思います。

私の問題は、失敗したテストを修正し、マージを再コミットしてから、その変更を強制的にプッシュできるように、元のコミットが行われる直前の状態に簡単に戻る方法を見つけられないことです。

解決しなければならない競合のあるファイルがかなりあり、1 つを除いてすべてが正常に解決されたため、マージ全体をやり直す必要はありません。

これまでに試したこと

試行 1:git reset

私の最初の試みは、マージコミットの前に混合リセットをコミットに戻し、マージによって導入されたバグを修正してから再コミットすることでした。

git reset HEAD^
# Fix the failing test
git commit

残念ながら、これにより、すべてのブランチの変更が静かに組み込まれるマージ以外のコミットが発生します。これは、私が望んでいるものではありません。*8')

試行 2: resetstashmerge&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ても同じ問題が発生します。


希望する結果を達成できるワークフローに関するヒントをいただければ幸いです。

4

2 に答える 2

4

最新のコミットをリセットしているだけなので、問題のあるコミット以降、他のコミットを行っていないようです。git addこのため、コードを修正し、変更されたファイルで使用git commit --amendしてから、既存のマージ コミットを置き換えることができるはずです。これにより、マージ情報が保持されます。

于 2012-11-21T15:19:15.890 に答える
1
git branch old_merge
git checkout -b new_merge HEAD~
git merge branch

通常のマージ ツールを使用できる保留中のマージ状態に戻ります。古いマージはold_mergeブランチとして保存されるgit checkout old_merge {file}ため、以前の試みで特定のファイルに対して行った選択を使用するために使用することもできます。完了したら、通常どおりコミットし、以前に作業していたブランチをチェックアウトgit reset --hard new_mergeして、新しいマージ コミットの使用に切り替えることができます。

于 2012-11-21T17:14:51.703 に答える