2011-01-25 14 views
8

私はさまざまな機能を備えた複数のブランチを持っています。通常、私はそうのようなマスター+機能Aが含まれているいくつかの余分な枝「not_master」を持っているでしょう:Gitのマージを元に戻しますが、後で変更を保存し、履歴を書き換えます。

(not_master)  a--b--c--d--e---M--x--y--z 
(feature A)   --h--i--j-/ 

は、時々私は、機能Aの結合を解除したいのですが、「not_master」でx,y,zをコミットし続けます。言い換えれば

、私はこれをしたいと思います:

(not_master)  a--b--c--d--e--x--y--z 

を、私は私が私の変更を元に戻し最後にコミット追加されますgit revert -m 1 Mを行うことができていることがわかり、私は本当にしたくありませんこれらのコミットはまだ公開されていないので、より多くのコミットを追加することで、履歴を読みにくくすることができます。

他の人はgit reset --hard Mを実行することをおすすめしますが、それはx,y,zの変更をダンプします。私はちょうどこれについて完全に間違った方法を考えていますか?私はちょうどgit reset --hard Mと桜はx、y、zを選ぶべきですか?

答えて

7

git rebaseはあなたが望むことを行います。 git rebase -i <commit e>は動作するはずです:エディタを開き、マージコミットを削除して保存します。

また、x..zをeにリベースすることも直接指定できますが、コマンドラインのセマンティクスを並べ替えるのは少し毛深いものです。マニュアルページを読んでいればgit rebase --onto <commit e> <commit M> not_masterでなければなりません。

EDIT:テスト済みと動作するように表示されます。

initial -- master -- post topic (master) 
     \ 
     \-- topic     (topic) 
+0

フムの歴史の中で

mkdir foo; cd foo git init touch initial git add initial git commit -m 'initial' git checkout -b topic touch topic git add topic git commit -m 'topic' git checkout master touch master git add master git commit -m 'master' git tag pre_merge git merge topic git tag merge touch post_topic git add post_topic git commit -m 'post topic' git rebase --onto pre_merge merge master 

結果、私はこれを試してみたが、Gitのリベースは、実際にコミットをマージ表示されません。だから、基本的にh、i、jを追跡して、git rebaseでそれらを削除しなければならないでしょう。 – KarateSnowMachine

+2

うわー、それは面倒です。追加した別のコマンドを試してください。 ( '--force-rebase'も必要です)。 – wnoise

+0

うわー、魅力的に働いた。試しても、ありがとう!私はgit-rebaseのマンページを読もうとしていましたが、私は少し心が壊れたと思います。私はこのようなもののためのマージの代わりにリベースをやるつもりだと思うので、これらのインターリーブされたコミットをすべて持っているわけではありません.... – KarateSnowMachine

関連する問題