2011-05-20 11 views
2

私は3つの変更を加えたmasterからブランチを持っていて、それをmasterに再度rebaseしたい。例:早送りが利用可能なときにGit rebase対話型の非圧縮が発生する

$git checkout master 
$git branch dev && git checkout dev 
$<do 3 commits> 
$git checkout master 
$git rebase dev -i 

通常、-iは3つのコミットを与え、私にスカッシュを許可します。しかしこの場合、それはちょうど "noop"であり、rebaseが完了すると、3つのコミットがマスターに移動したことがわかります。私はここにいると思うが、祖先が発散していないので、早送りが可能であったため、これが起こった。しかし、私はコミットを潰したい。

--no-ffを使ってみましたが、私の元のケースとまったく同じです(noop + no squashing)。

(DEVブランチ上ながら)私も

$git rebase -i HEAD~3 
$git checkout master 
$git rebase dev 

をやってみました。しかし、これは本当に苦痛だと私はHEAD〜X部分のために潰すためにどのように多くのコミット知っている必要があります。

脚注: これは私にとって重要な理由は、この縮小されたチェンジセットがgerritでレビューされることです。別々の場合は、レビューが不可能になります。

答えて

3

あなたの質問でいくつかのことをやっている理由がわかりません。コミットを行う前に実際に$git branch dev && git checkout devを意味していませんか?あなたのバージョンでは、とにかくmasterにそれらを作成しています。 (私が正しい場合なお、ショートカットとしてgit checkout -b devを行うことができます。)

あなただけのNOOPを取得する理由はgit rebaseしようとはしていない現在ブランチ内のすべてのコミットを再適用することですあなたが<upstream>引数として指定したブランチ。したがって、git rebase -i devを実行するときにmasterにある場合、masterにはdevにないコミットがありません。本質的に、あなたはそれを逆にしたいと思っています。私は次のようにします:

devブランチはちょうど1つの潰れたコミットを持ち、好きなようにそれをマスターにマージすることができます。

また、あなたはgit merge --squashを使用することができます。

git checkout master 
git merge --squash dev 
git commit -m "The changes from dev squashed into one commit" 

その後masterは、単一の新しいコミット1に押しつぶさマスターにdevをマージした結果を表している、コミットされます、そして新しいコミットということは一つだけの親を持つことになりますマージコミットではなく、

+0

ここでのキーは、特定の名前付きコミットではなく、実際にはリベースのベースとして 'master'を使用しています。マスターがあまりにも遠く離れていても、スカッシュする可能性のあるものはそれ以来存在することが分かります。 (また、 'merge --squash'はまだ自動コミットしていませんか?) – Cascabel

+0

@Jefromi:私が最近使用したgitのすべてのバージョンで、' git merge --squash'は変更を単にステージングします。それは事実ではありませんでしたか? –

+0

'git merge --squash'(7d0c68871a8)を導入したコミットで追加されたドキュメントには、「実際にコミットしない」と書かれています。 –