2017-06-20 13 views
0

ローカルのGitリポジトリに約50個のコミットがあります。私は現在のHEADの特定のファイルにいくつかの変更を加えました。これらのファイル変更をすべての前回のコミットに更新したいと思います。これはgitでこれを達成することが可能ですか?前回コミットしたファイルの内容を現在のデータに変更する

+1

なぜそれをしたいですか? gitの考えは、変更履歴を追跡することです。 – Fede

+0

@Fede - 誰かがこれを行う理由はいくつかあります(そしてそれほど多くの理由はありません)。私は、これを行うことを検討している人は、彼らの推論をチェックして再確認すべきであるとアドバイスすることに同意しませんが、最終的に問題は何ですか?OPは、特定のファイルを置き換えて、約論争している。 –

答えて

1

UPDATE - 私の元の回答のコマンドは機能しますが、リフレクションではインデックスフィルタで使用するのに最適ではないかもしれません。これについてのコメントを追加しました


可能ですが費用がかかります。

「履歴の書き換え」は、すべてのコミットのコミットIDを変更するものです。このレポを単独で使用していて、何か(ドキュメントなど)にコミットID(SHA)値を使用していない場合は、それはおそらく問題ありません。

他の人がrepoを使用している場合(または複数のクローンがある場合)は、カットオーバーを調整する必要があります。基本的に私のアドバイスは、すべての更新が共通のリポジトリ(おそらく起源)にプッシュされた後、すべてのクローンを破棄してから、書き換えを実行して原点を置き換えてから再クローンするように手配することです。技術的にはそうする必要はありませんが、git rebaseのドキュメント(実際には履歴書き換えに適用されます)の「上流リベースからの回復」を参照してください。

したがって、書き直しを行う場合、最も簡単な方法はおそらくgit filter-branchを使用することです。 (あなたのレポについて一定の仮定が真である場合には、rebaseベースのアプローチは、仕事ができる;しかしfilter-branchは、より一般的に適用可能である。)

git filter-branch --index-filter 'git reset master -- file/to/be/rewritten' -- --all 

これはあなた一度削除したいと思ういくつかの「バックアップ」のREFを作成し、結果を検証しました。私はもともとも動作するようです

git filter-branch --index-filter 'git checkout master -- file/to/be/rewritten' -- --all 

を示唆し

注意。 resetコマンドはより完全にインデックスの更新に関連しているので、ここでより良い選択肢になるかもしれません。

+0

ちなみに、置き換えようとしているファイルが唯一のものが変更されたコミットがあれば、そのコミットは親と完全に一致します。必要に応じて、 '--prune-empty'オプションを' filter-branch'に含めることにより、そのコミットを削除することができます –

関連する問題