2009-04-21 3 views
0

リベースが機能していないと思われる2つのブランチがあります。format-patchはうまく動作し、より良い方法を探しています

私は、(filter-branchを使用して)たくさんのファイルを削除した "public"ブランチを持っています。コミットの大部分はデルタの点で一致しますが、コミットIDはすべて異なります。私はdevブランチから私の公共支店に変更を加えるためのかなりの方法を試しました...私はそれが私がしたいことをすることができると信じることは難しいと思う - しかし、私はちょうどそれをやる。いずれにせよ、これは正常に動作しますが、間違っています。おそらくフィルターに分岐していないアウトあなたが公共の枝にしたくないファイルが(ただし、どのようにあなたがそれらを取り除くのですか?)が含まれます

git checkout dev 
git format-patch --stdout last_sync_tag > catchup.mbox 
git checkout public 
git am catchup.mbox 
git --skip # talks about a missing file 
git --skip # talks about a missing file 
git --skip # talks about a missing file 

任意のヒントや提案は、歓迎されています。

dev: a-b-c-d-e-f-g-h-i-j-k 
pub: t-u-v-w-x 

トン≅、U≅C、V≅D、E≅W、X≅G:

マイツリー(S)は、このような多かれ少なかれ見えます。私、j、kは私が移動したい新しいパッチです。

checkout pub 
rebase --onto pub i # I really expected this to work 
+0

私はgit rebase --onto pub hを意味するかもしれないと思うのですが、これはpubの頭と同等です。 –

答えて

1

Gitのcherry-pickコマンドが便利です。私はあなたの状況でそれを使用していないが、私はそれが動作するはずだと思う。唯一の痛みは、コミットの範囲で動作するように設計されていないことです。スクリプト/自動化したい場合は、git rev-listのようなものを使用する必要があります。

は再び、私はこれを試していないが、私は.gitignoreにfileitの土地をしない場合は、このようなbashスクリプトは、あなたに良い出発点

まあ
 
git checkout public 
for rev in $(git rev-list --reverse last_sync_tag..dev) ; do 
    git cherry-pick $rev && git tag -f last_sync_tag $rev || exit 1 
done 
+0

私はこれが好きです。私は少し手で桜を摘み取っていました。これは次の論理的なステップのようなものです。 – jettero

+0

私はこの後にかわいい小さなgitコマンドをベースにしています。素晴らしい、ありがとう。 – jettero

0

を与える可能性があります。おそらく、本当のコードではない設定なので、トラッキングは全く必要ありません。

+0

2つの問題があります... git clean -dfxはあなたが無視しているファイルを強制終了し、2つはファイルを追跡する必要があります。 – jettero

1

"filter-branch"を使用しているので、gitがリベースを実行する正しいコミットを見つけるのを助ける必要があります。

私はここで推測するつもりだが、おそらくあなたは「ほとんど」一般的な二つのバージョン、公開ブランチのヘッドと、これは(非フィルタ処理)に対応してコミットあなたのdevの枝上の場所を持っているコミットしています。パブリックヘッドコミット<PH>を呼び出し、これが(フィルタリング前に)<DevPH>に対応するdevコミットを呼び出します。これは、各によって導入されたパッチを取るためにリベース現在のブランチに<DevPH>ので、コミットと<PH>にこれらのコミットを適用するように指示

git rebase --onto <PH> <DevPH> 

:DEVのブランチをチェックアウトして

は、あなたがこのような何かをしたいです。私はこれがあなたが必要とするものだと思います。

編集:質問へ

あなたの更新は時間がのdevの枝のパブリックストリームの先頭に等価であることを示しているとあなたが公共の枝の上のdevの枝の上以降、ここからすべてを移植したいという。もしそうなら、コマンドは

git rebase --onto pub h 
+0

それは私がうまくいくと思ったものですが、そうではありません。私はblargという新しいブランチを作りました。リセットしました - いくつかコミットして、git rebase -v -onto blarg 80d79e3を試しました。ここで80d79e3はdevブランチ上の正しいコミットです。それはちょうど言う:最初に、それの上にあなたの仕事を再生するために頭を巻き戻す... blargへのblargを早送りした。 -vを指定すると、blargのHEADをblargにrebaseしようとしていることがわかります。 – jettero

+0

早送りの場合は、すでに入っているブランチに戻ってリバースしているだけです。 --ontoの引数として他のブランチからのコミットを指定する必要があります。私はあなたがあなたが望むことをリベースで行うことができると確信していますが、あなたのツリーを見ることなく、どこを指定する必要があるかを指摘するのは難しいです。共通のコミットと新しいブランチヘッドの詳細と、それらがあなたの質問にどのように関連しているかについて詳しく説明できますか? –

1

公開されていないdevブランチのファイルを定期的に管理していますか?または、彼らはちょうど回っている?

変更を加える傾向がなく、履歴を少し書き直しても問題ない場合は、パブリックブランチに基づいて1つのコミットとして作成するように設定できます。バック公衆に実際に取得し、それらを停止するには、「-s我々」とのことをマージ(previous answer about git merge -s ours

を何かのように:。だから、

git checkout -b dev public 
git am create-dev-only-files.patch 
git checkout public 
git merge -s ours dev 
git checkout dev 
# write more dev patches... 
git checkout public 
git merge dev 
# and this should merge in the patches without bringing in the 
# dev-only files 

あなたがあなたのdevの枝の上に、その後の変更を行い、合併した場合パブリックに公開されていないファイルを変更していない場合は、他のものはすべて単純に適用されます。しかし、公開されているファイルの変更を抑止したい場合は、これは扱いにくいことがあります。たとえば、パブリックブランチ上のコミットを開始する前に、特定のファイルをステージング解除するために事前コミットフックを追加することで、そのようなことを防ぐことができます。

関連する問題