9

私にはたくさんの枝があり、それぞれが異なる機能を持っています。通常、次のようなマスターと機能Aを含む追加のブランチ「not_master」があります。

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

機能Aのマージを解除したいが、コミットx,y,zは「not_master」のままにしておくことがあります。

言い換えれば、私はこれが欲しいです:

(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 Mx、y、zをチェリーピックする必要がありますか?

4

1 に答える 1

9

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

x..z を e にリベースすることも直接指定できるはずですが、コマンドラインのセマンティクスを整理するのは少し面倒です。マニュアルページを正しく読んでいる場合、それはgit rebase --onto <commit e> <commit M> not_master.

編集:テスト済みで動作しているようです:

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

の履歴になります。

initial -- master -- post topic  (master)
      \
       \-- topic                 (topic)
于 2011-01-25T20:21:33.880 に答える