2011-01-19 26 views
10

私はGitに慣れていないので、大きな問題が私の周りに落ちています。git mergeを元に戻す

は、ここに私の現在のブランチがどのように見えるかです:

feature  /---F1-----F2----\ 
      /    \ 
master -----M0-----M1-----M2-----M3-----M4 
      \      /
bugfix  \--B1-----B2-----------/ 

状況:

誰かが非常に悪いことをしたし、本当に悪いマージ(M3)を押しました。 B1とB2をM4にマージした後、私たちのモデル(ソースコードではない)がロードされないとき、私は悪いマージに気づいただけです。幸いにも、私はまだM4をプッシュしていません。

問題:

私は再び右のものを設定するにはどうすればよいですか?私はM0、M1、M2、F1、F2、B1、およびB2が欲しいです。しかし、私はM3とM4を望んでいません(M4は明らかに壊れているので)。私は、変更を放棄するを持っている場合は、F1とF2を犠牲にすることができます:)

私はgit revertに見えたが、私は完全にそれがどのように動作するかを理解すると確信していませんよ。だから...私は本当にこれを解決する方法の助けを望んでいる。

ありがとうございます。

答えて

6

これは明らかですが、これは正しいですか?

feature  /---F1-----F2 
      /    
master -----M0-----M1-----M2 
      \    
bugfix  \--B1-----B2 

HEADfeaturebugfixはそれぞれF2B2に残っていることを確認してください。

編集featurebugfixは何のブランチがない場合(それがコミットされていないであれば、あなたの仕事を隠しておく)、それらの枝ます

git checkout F2 
git branch feature 
git checkout B2 
git branch bugfix 

編集終了

は、次にM2にマスターをリセット:

git checkout master 
git reset M2 --hard 

(リセットするとあなたがそれを望まないのであれば、隠しておいてください)。

M3M4はすぐに破棄されませんが、最終的には破棄されません。 git logまたはgitkに表示されるべきではありません。

次に、featureをマージして、M3'を正しい時刻にします。

+0

「機能」、「マスター」、「バグ修正」は実際にはブランチではありませんが、混乱していると思われます。つまり、3 pplはマスターブランチの独自の変更にコミットしました。 1人の男が悪い併合をして押しました。私は悪い合併を引っ張った。今私は個々の変更をすべて維持しながら、悪いマージを排除する方法を望んでいます... – aberrant80

+0

'feature'と' bugfix'はブランチではありませんか?確かに 'フィーチャー'の作者は自分のレポにブランチを持っています。あなたはマスターをM2にリセットし、 'feature'の作者に同じことを(ブランチの' feature'を失わないように)頼んで、今度はマージをやり直してください。自分で更新したい場合は、私の更新を参照してください。 – Gauthier

+0

あなたは本当に 'master'ブランチのないレポを持っていますか? – Gauthier

1

まだマージコミットをプッシュ(公開)していない場合は、git resetを使用してください。例えば。マスターブランチで、あなたの作業ツリーがきれいであると仮定して、git reset -hardを実行します。

さらに詳しい情報: Undo a Git merge that hasn't been pushed yet

、あなたの変更を公開しなかった場合は、元に戻すには代わりにコミットすることを検討することをお勧めします。詳細情報はこちら http://progit.org/2010/03/02/undoing-merges.html