2016-10-18 15 views
0

開発者が誤ってマージに失敗し、空のマージコミットをプッシュしたという問題があります。下の図を参照してください。空のGitマージで削除されたコミット

develop ----A----------------------------------F------------------I 
       \        /    /
    feature1 B----------------C----------------------G---------H 
           \   /
feature2 ------------------------D---------E----------------------- 

は、分岐feature1develop枝上の点Aで作成されたことを言います。点Cにおいて、feature1feature2に併合した。ただし、このマージは正しく行われておらず、feature1(つまり、変更BCの間違って拒否された)からのすべての変更を効果的に拒否したコミットコミットであるコミットコミットDがコミットされました。

Eで、feature2developにマージしました。最後に、点Hで、GHをもたらすためにfeature1developにマージしました。

しかし、developが変化BCだけでなく、GHを持っていることをポイントIで期待されています。しかし、彼らは合併時に拒否されたので、私は信じてC -> D、それはありません。

このシナリオを修正する簡単な方法はありますか?実際には、多くのコミットとマージが悪いマージの後に複数のブランチで発生していることに注意してください。私は点Cでブランチdevelopブランチを作成し、これを達成するためにリベースとチェリーピッキングの組み合わせを使用して考えています。しかし、これは非常に面倒なことになるので、状況を迅速かつ安全に救う方法は非常に高く評価されます。

+0

Afeature2に知られているコミットが間違ってDマージが最後から歴史をBCないだけを元に戻すだけでなく、developことに注意してください)

手順のようなものでなければなりませんあなたのダイアグラムでは 'G'というラベルが付いていますが、異なっているようです。 「F」であると思われますか? – torek

+0

@torekはい、あなたは正しいです。一定。 – Dunnie

+0

あなたの計画はかなり正しい方法だと思います。'git rebase'は' git merge'が* new *(must-merge)とみなすコミットをコピーするのを助けるために '-f' /' --no-ff'を持っていることに注意してください。過去にはるかに多くのリワーク(チェリーピックまたはマージのいずれか)に直面するでしょう。 – torek

答えて

0

私はこのインスタンスを修正するために何か迅速かつ/または安全なことはないと思います。

将来のインスタンスを避けるには、リベースの重いワークフローを使用することを考えてください。メインラインに追加するときにのみマージします。

また、多機能のブランチがあり、多くの問題の根本原因になる可能性があります。

幸運。

0

私はあなたが正しくD'としてマージDを再実行し、それはあなたの問題を解決する必要がありDD'I差に適用さだと思います。次の2つのコミットをしてい

git checkout -b tmp_fix D~1 
git merge C 
# now, you have correct D', but you should make it child of D to pick it 
git reset --soft D 
git commit -m "Fix incorrect merge D" 
git checkout develop 
git cherry-pick tmp_fix 
関連する問題