1. ホーム
  2. git

[解決済み] 1つのファイルを以前のバージョンに戻すにはどうすればよいですか?重複

2022-03-14 03:26:23

質問

あるファイルについて、異なるコミットを経ていく方法はありますか? 例えば、あるファイルを5回変更し、すでにコミットしてリポジトリにプッシュした後で、変更点2に戻りたい場合。

私の理解では、唯一の方法は、多くのブランチを維持することだと思います。 もし私が正しければ、数日で何百ものブランチを持つことになるので、おそらく私は本当に理解していないのでしょう。

どなたか教えてください。

解決方法は?

まず、私たちがやりたいことの定性的な説明から始めましょう(この多くはBen Straubの回答に書かれています)。いくつかのコミットを行い、そのうちの5つがあるファイルを変更したので、そのファイルを以前のバージョンのどれかに戻したいと思っています。まず第一に、git は個々のファイルについてバージョン番号を保持していません。コミットは基本的に作業ツリーのスナップショットであり、いくつかのメタデータ(コミットメッセージなど)を含んでいます。そのため、どのコミットが目的のファイルのバージョンを持っているかを知る必要があります。それがわかったら、ファイルをその状態に戻す新しいコミットを作成する必要があります。(私たちは履歴を弄ることはできません。なぜなら、このコンテンツはすでにプッシュされており、履歴を編集すると他のすべての人が混乱してしまうからです)。

では、まず正しいコミットを見つけることから始めましょう。指定したファイルに変更を加えたコミットを簡単に確認することができます。

git log path/to/file

コミットメッセージが十分でなく、各コミットでファイルに何が行われたかを確認する必要がある場合は -p/--patch オプションで指定します。

git log -p path/to/file

または、gitkのグラフィカルなビューが好きな場合

gitk path/to/file

また、gitk を起動した後にビューメニューから行うこともできます。ビューのオプションのひとつに、インクルードするパスのリストがあります。

どちらにしても、欲しいファイルのバージョンを持つコミットの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 は、速度を犠牲にして、そのようなものをより注意深く検索するように指示することができます。もし、履歴が単純だと自信があるなら、気にする必要はないだろう。