2012-02-01 9 views
9

ように私は、コミットの線形歴史を持つシンプルなリポジトリを持っている:無関係なブランチの上にコミットを再適用するには?

:私は基本的に削除する必要が

[A] -> [B] -> [C] -> [D] -> [E] ... 

は、AとBはので、私は、私は新しいリポジトリを作成したいとのような何かを達成したいと思ったコミット

[X] -> [C] -> [D] -> [E] ... 

は、だから私は、手動でAとBから店舗に関連する情報を受け取りXをコミット作成した新しいリポジトリを作成し、現在は元のリポジトリからC、D、Eなどをコミットもたらすと置かれるコマンドを必要としますそれ私の新しいコミットX.

の上

どうすればいいですか?

編集:提案チェリーピック方法で私が持っている 2つの問題は、次のとおりです。

  1. 転送のコミットは、それぞれの日付を失いました。コミットの日付を保存する方法はありますか?
  2. 私は、元のリポジトリからのマスターをフェッチ(およびリモート・マスターは、任意の新しいリポジトリと共通にコミットしていないこと)、私はトラブルそれらのフェッチコミットを削除しています。私はgit branch -D myoriginalrepo/masterを行うと、それは私がはっきりものは私のGUIツールでコミット見ることができますが、そのような分岐が存在しないことを言います。
+0

git cherry-pickを見てください。 –

+0

日付を変更しないようにする方法を考えたことがありますか? – thinsoldier

答えて

15

わからないマージと仮定すると、C、DとEをコミットブランチという名前freshstartを持って

git checkout -b freshstart A 
# modify the state of the system until it reflects your desired new beginning X 
git commit --amend 
git cherry-pick C D E 

のようなものを試してみてください同じ滞在する日付をコミットするが、ここで行く:

git rebase B E --onto X --committer-date-is-author-date 

B..E場合は、彼らがすることができて(Xと同じリポジトリにないif you create your fresh start in-place)、あなたが最初にそれらを取得する必要があります:もちろん

git fetch <path_to_old_repos> 

を、あなたが実際にそれらを分枝状/タグ付けされていない場合は、ここでBEXは、そのコミット-idを意味します。

あなたはまた、似たような(コミットが、日付は保存されません)あなたの元のリポジトリにAからリベースとその上にBを退治することによって行うことができます。

git rebase -i `A` 

# change "pick b" to "squash b" 

をあなたはコミット変えるチャンスを得るでしょうその時点であなたはそれをXのものにすることができます。

+0

これはこれまでのところ最良のアプローチのように思えますが、 'git fetch'を使ってフェッチされたコミットでの作業に問題があります。どのようにそれらを参照するのですか?彼らはどんな支店にもいないのですか? – Borek

+2

'git fetch'はあなたのために' FETCH_HEAD'という便利なブランチを作成します。このブランチは、あなたの古いリポジトリの 'HEAD'が何であったかをチェックします。さらに、コミットIDはリポジトリ間で正確に同じになるので、例えば、 'git log 'に行くことができます。フェッチ中に対応するブランチを作成することもできます: 'git fetch their_branch:my_branch'。 – antak

3

あなたはgit cherry-pickを使用することができます。あなたの場合:

Xはあなたの頭がそれを行う必要があります。

+0

ありがとう、私はrebaseは私の友人だと思ったが、チェリーピックは使用するコマンドです。元のリポジトリに何百ものものがあるので、私は "C .."のようなコミットを指定できることを願っています。 – Borek

+0

ロットを持っている場合は、それらをグループ化するいくつかのチェリーピックオ​​プションがあります。ドキュメントを確認してください。 Rebaseも機能します。元のリポジトリでAとBをXで置き換えると、探しているのと同じ結果になります。 –

+1

チェリーピックはコミットの日付情報を失うようです(新しいコミットを作成する可能性があります)。問題はリベースと同じですか?それはかなり悪いことです、私はコミットの日付を維持する必要があります。 – Borek

1

あなたは「新しいリポジトリ」を作成したと言います。あなたはおそらくそれをしたくありませんでした。何らかの理由でコミットのAとBが完全に消滅しなければならない場合はコミットあなたは永久に削除する方法について読む必要がありますあなたのリポジトリに(法的な理由でまたはので、例えば誤ってクレジットカード番号やハギスのためのあなたの秘密のレシピを犯しました) 。しかし、最初に残りの木を修正しましょう。

今、あなたの新しいXの始まりを持っており、彼らはX.上にきれいにあなたが必要とする理由

+0

そうです。AとBは履歴から完全に削除する必要があります。新しいリポジトリを作成すると、開始するのがよい方法のようです。私は状態Xを作成し、リモートブランチ元のrepo/masterをフェッチしました。そして、今度は、チェリーをメインブランチにコミットすることができます。私は2つの問題があります:1)チェリーはコミットが日付を失うことを選択しました2)私は元のレポ/マスターブランチを参照することはできません(ローカルマスタと共通の親を持たず、私の 'マスター'私はチェリーを選んだ一時的な支店を削除できません。 – Borek

+1

コミットを完全に削除するために新しいリポジトリは必要ありません。たとえば、rebaseを使用してコミットを排除することができます。唯一のことは、法的な理由やコミットを削除するための何かがある場合、コミットを削除するときにゴミになるオブジェクトがクリーンアップされ、実行中のことを知っている人にはまだ利用できないことを確認します。そしてもちろん、あなたはどこでもレポのすべてのクローンに行き、同じことをしなければならない、または法的義務まで生きていないかもしれません。 – bames53

+0

AとXに共通のコミットがありません。元のリポジトリに親を持たないブランチを作成することは可能ですか? – Borek

関連する問題