[解決済み] 1つのファイルを以前のバージョンに戻すにはどうすればよいですか?重複
質問
あるファイルについて、異なるコミットを経ていく方法はありますか? 例えば、あるファイルを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
は、速度を犠牲にして、そのようなものをより注意深く検索するように指示することができます。もし、履歴が単純だと自信があるなら、気にする必要はないだろう。
関連
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git リポジトリで削除されたファイルを検索して復元する方法
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] Git で管理されているプロジェクトのローカルな変更をすべて以前の状態に戻すにはどうすればよいですか?
-
[解決済み] Git リポジトリからファイルを削除するにはどうすればよいですか?
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ローカルに変更があるにもかかわらず、git pushが「すべて最新」と言う
-
[解決済み】gitの「not something we can merge」エラーの解決方法
-
[解決済み] ERROR: リモートレポ 'origin' のクローン作成に失敗しました。
-
[解決済み] TortoiseGitで「git did not exit cleanly (exit code 128)」というエラーを解決するには?[クローズド]
-
[解決済み] .gitignore と "以下の追跡されていない作業ツリーファイルはチェックアウトによって上書きされるでしょう"
-
[解決済み] git ls-remote と git ls-remote origin の違い。
-
[解決済み] GitのFETCH_HEADとはどういう意味ですか?
-
[解決済み] Gitのフォルダ構造で変更・追加されたファイルのみをエクスポートする機能
-
[解決済み] "fatal: This operation must be run in work tree." というメッセージが表示されるのはなぜですか?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?