2012-01-13 9 views
3

は、私はまだトピックのコミットが孤立するようにgitブランチをマージするにはどうすればよいですか?

は以下の歴史を考えると、私はトピックブランチをクリーンアップすることができますどのように単一のコミットとして歴史に表示されますので、マージ... Gitリポジトリのより高度な機能のいくつかでスピードアップ来ていますか?

[master] - - - - - - - C - - - 
    \ 
    [feature] - A - - B - - D - 

理想的には、私は孤立A及びBを残し、Dに[マスター]と[機能]をリベースし、[マスター]に[機能]をマージしたいです。

私は単純にすることによってこれを行うことができると思った:

$ git rebase master # on feature branch 
$ git co master 
$ git merge --no-ff feature 

してから、まだかかわらず、歴史の中でAとBを残し

$ git gc --prune=now --aggressive 

で孤立したコミットをクリーンアップ - 私は何かが足りません?

答えて

1

A、B、Dを「融合」したい場合は、対話型のリベースを使用できます。

ブランチfeatureは(あなたがこのブランチにgit rebase masterを発行した後、それはなります)masterの上にある場合は、操作を行います。

git rebase -i master 

すると、エディタで開きますファイルに置き換えますコミットAとBのpicksquashです。 GitはAとBをDに入れ、エディタはすべての潰れたコミットのコミットメッセージをポップアップ表示します。

+0

これは私が探していたものです - ありがとう! – bodacious

0

なぜAとBを削除するのですか?

git rebase masterは、機能をマスターの先端から分岐させ、コミットすると機能からのすべてのコミットがマスターになります。したがって、あなたはAとB(実際にA 'とB')を表示します

そしてgit gcはあなたが歴史に見るものとは関係ありません。

これらを単一コミットにしたい場合は、--no-commitオプションを試してみるか、git rebase -iのような別の方法を試してみてください(これはAとBのどちらでもかまいません)

3

私は(枝の実際の表現を反映している)枝の先端に分岐マーカーを配置するために、あなたの図を再描画した場合、元の状況は次のとおりです。

o --- C (master) 
\ 
    --- A --- B --- D (feature) 

そして、あなたとして--no-ffでリベースとマージした後あなたが今持っている、説明します。私はそれを理解したよう

o --- C ------------------ M (master) 
\  \    /
    \  A' --- B' --- D' (feature) 
    \ 
    --- A --- B --- D 

は、あなたが今ABDがあなたのリポジトリから消えることを確認します。まず、これらのコミットについて心配しないことを強くお勧めします。

しかし、本当に削除したい場合は、本当に到達できないことを確認する必要があります。git gc --prune=now --aggressiveは削除しません。それでも、彼らはまだfeatureのためのreflogによって(少なくとも)指摘されるでしょう。reflogからエントリを期限切れるには、さまざまな方法があります。 :

git reflog expire --expire=now feature 

...またはより安全なオプションnowthe config variablegc.reflogexpireunreachableを設定し、REFLOGを期限切れにする必要があります。いずれの場合も

git config gc.reflogexpireunreachable 
git reflog expire feature 

、あなたは再び後でgit gc --prune=now --aggressive実行する必要があります。

しかし、上記のことを繰り返して、私はこれをしません。これらのコミットは誰にも害を及ぼさず、reflogはgitを使用する際に貴重なセーフティネットです。

+0

アドバイスと説明をありがとう – bodacious

1

あなたはマスターから、その後、単一のコミットへの分岐の効果を折りたたむしたい場合です:

git merge --squash feature 
git commit 

私見そのままブランチ上の個々のコミットを維持することができるということは、実際に良い機能ですが、ほとんどの時間の

また、ブランチでgit rebase -iを使用して、すべてのコミットを一括してスクラッシュし、スクラッシュした結果をマスターにマージするように指示できます。

+0

答えを削除してください。彼らは同じような淫らです! –

+0

おっと、編集は何とか新しい答えとして保存されました。 – araqnid

関連する問題