1. ホーム
  2. ギット

[解決済み】Gitのコピーファイルで履歴を残す【重複

2022-04-09 07:59:25

質問

Gitで少し混乱した質問があります。 例えば、次のようなファイルがあるとします。 dir1/A.txt コミットされ、gitはコミットの履歴を保持します。

次に、このファイルを dir2/A.txt (移動ではなく、コピー)。 私は git mv コマンドが必要なのですが dir2/A.txt と同じコミット履歴を持つようにします。 dir1/A.txtdir1/A.txt がまだ残っていること。

を更新する予定はありません。 A.txt コピーが作成されると、今後の作業はすべて dir2/A.txt

この状況は、Javaベースのモジュール(maven化されたプロジェクト)であり、私たちの顧客が実行時に2つの異なるバージョンを持つ能力を持つように、コードの新しいバージョンを作成する必要があり、最初のバージョンは、アライメントが完了したときに削除されます。 もちろん、mavenのバージョニングを使うことはできますが、私はGitの初心者で、Gitがここで何を提供できるかに興味があるだけです。

どのように解決するのですか?

subversionとは異なり、gitにはファイルごとの履歴がありません。コミットデータ構造を見てみると、前のコミットとこのコミットの新しいツリーオブジェクトを指しているだけです。コミットオブジェクトには、そのコミットによってどのファイルが変更されたのか、また、その変更の性質についての明示的な情報は保存されていません。

変更点を検査するツールは、ヒューリスティックに基づいてリネームを検出することができます。たとえば "git diff" には -M オプションがあり、リネームの検出を有効にすることができます。そのため、リネームを行った場合、"git diff" ではあるファイルが削除され、別のファイルが作成されたと表示されるかもしれません。しかし "git diff -M" では実際に移動を検出し、それに応じて変更を表示します (詳しくは "man git diff" をご覧下さい)。

つまり、gitでは、変更をどのようにコミットするかではなく、コミットした変更を後でどのように見るかの問題なのです。