ファイルの異なるコミットを調べる方法はありますか。たとえば、ファイルを 5 回変更し、すでにコミットしてリポジトリにプッシュした後で、変更 2 に戻りたいとします。
私の理解では、唯一の方法は多くのブランチを保持することですが、それは正しいでしょうか? もし私が正しければ、数日のうちに何百ものブランチが存在することになるので、おそらく私はそれを本当に理解していないのでしょう。
誰かそれを明確にしてもらえませんか?
ベストアンサー1
まず、何をしたいのかを定性的に説明しましょう (これについては Ben Straub の回答に多くが書かれています)。いくつかのコミットを行い、そのうち 5 つで特定のファイルを変更しました。このファイルを以前のバージョンのいずれかに戻したいとします。まず、git は個々のファイルのバージョン番号を保持しません。コンテンツを追跡するだけです。コミットは基本的に、作業ツリーのスナップショットと、いくつかのメタデータ (コミット メッセージなど) です。したがって、必要なファイルのバージョンがどのコミットにあるかを知る必要があります。それがわかったら、ファイルをその状態に戻す新しいコミットを作成する必要があります (このコンテンツはすでにプッシュされているため、履歴をいじることはできません。履歴を編集すると、他のすべてのユーザーが混乱します)。
それでは、適切なコミットを見つけることから始めましょう。特定のファイルに変更を加えたコミットを簡単に確認できます。
git log path/to/file
コミット メッセージが十分ではなく、各コミットでファイルに何が行われたかを確認する必要がある場合は、次の-p/--patch
オプションを使用します。
git log -p path/to/file
あるいは、gitkのグラフィカルビューを好む場合は
gitk path/to/file
また、ビュー メニューから gitk を起動した後でもこれを行うことができます。ビューのオプションの 1 つは、含めるパスのリストです。
どちらの方法でも、必要なファイルのバージョンのコミットの SHA1 (ハッシュ) を見つけることができます。あとは、次の操作を行うだけです。
# get the version of the file from the given commit
git checkout <commit> path/to/file
# and commit this modification
git commit
git add
(チェックアウト コマンドは最初にファイルをインデックスに読み込み、次にそれを作業ツリーにコピーするので、コミットの準備としてインデックスに追加するために を使用する必要はありません。)
ファイルに単純な履歴がない場合 (名前の変更やコピーなど)、VonC の優れたコメントを参照してください。git
速度を犠牲にして、そのようなものをより注意深く検索するように指示できます。履歴が単純であると確信している場合は、気にする必要はありません。