1

私はそのようなファイルでプロジェクトを与えられました:

MyProject/
  a.txt
  b.txt
  c.txt

ディレクトリでGitリポジトリを初期化しましたが、(愚かにも)最初にすべてのファイルをリポジトリに追加しませんでした。代わりに、ファイルを変更する必要があることに気付く直前に、ファイルをリポジトリに追加しました。

git add a.txt; git commit -m "Pristine A"
<awesome changes to a.txt>
git commit -am "Awesome Changes"

残念ながら、私の熱狂的な編集の中で、いくつかのファイルに対してこれを行うのを忘れていました。(読み取り:多くのディレクトリにある数十のファイル。明示的なパスでは見つけるのが困難になります。)

<awesome changes to b.txt>
git status # Uh oh, new file b.txt

素晴らしい変更を加える前にプロジェクトのスナップショットを取得できるので、Gitはそれ以降に変更されたファイルを教えてくれます。ただし、すでに追加した数十のコミット(説明付き)を失いたくありません。

「元の」スナップショットを取得し、既存のコミットを失うことなく、また変更されたがコミットにすでに記録されているファイルの誤検知を取得することなく、作業ディレクトリと比較して変更されたファイルをGitに計算させるにはどうすればよいですか?

FWIW最初にディレクトリ全体を追加しなかった私の最初の「正当化」は、自分の作業に関係のないファイルが何千もあり、ディレクトリは高遅延のSMBでのみ利用可能であり、どのファイルが重要かを知っていると思ったためです。

4

1 に答える 1

3

元のスナップショットを使用して、それを使用して新しいgitリポジトリを作成します(すべてのファイルを追加してコミットします)。

現在のリポジトリで、

git remote add pristine /path/to/pristine/repository

その後

git remote update pristine

これで、元のリポジトリのマスターをで参照できます。git diff

git diff pristine/master   

作業ディレクトリと元のコミットの完全な差分を確認します。チェンジセットのみが必要な場合--summaryは、探しているオプションである必要があります。git diffのマニュアルページには、他のすべてのスイッチの詳細が記載されています。

これにより、すでに追加されたファイルが、すでに変更されているが追加されていないファイルとは異なる方法で言及されるチェンジセットが発生するはずです。

後でそれをどうするかはあなた次第ですが、元のコミットを取得してリベースを使用し、ツリーの先頭に配置し、すべてのファイルを追加し、後ですべてのコミットを再生することができるはずです。

于 2012-07-12T17:19:51.320 に答える