web-dev-qa-db-ja.com

Gitで以前のバージョンを新しいコミットとして復元するにはどうすればよいですか?

まず、この質問への回答を以前ここで見たことがありますが、質問に正しく答えられない多くの「回答」に埋もれており、再び見つけることができません。

だからここに行く:Gitで私の履歴の以前のバージョンに復元して、現在の履歴の上に新しいコミットになるようにするにはどうすればよいですか?

基本的に、これはバージョン管理システムで私がやりたい最も基本的なことです。単にリセットを実行しても機能しません。履歴が破棄され、単純な復帰も機能しないため、エラーメッセージが表示されることがあります(エラーメッセージがなくても、実行したいことは可能です)。

編集:git revertこのエラーが発生します:

git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
9
Steven Obua

単に「checkout the commit」です。これにより、現在の作業ディレクトリが履歴からの指定したリポジトリのスナップショット(コミット)で上書きされ、希望どおりにステージングおよびコミットできる新しい作業セットになります。直後にcommitを実行すると、checkoutを実行したコミットと同じファイルシステムの内容がリポジトリに格納されます(ステージングされていない、またはステージングされた変更がない場合)。

これはではありません履歴を書き換えたり、以前のコミットを編集または削除したりしないため、Mediawikiの「ロールバック」と同様に機能します:

cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> . 
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"

参照: パブリックリポジトリでの古いGitコミットへのロールバック

.(ドット)について

.(ドット)文字は「現在のディレクトリ」を意味します。これはgitに特別なものや固有のものではなく、Windows、Linux、macOS、さらにはMS-DOSでも同じである標準のコマンドラインファイルシステムの規則です。これは、..が「親ディレクトリ」を意味する方法と同様に機能します。私はこれらを読むことをお勧めします:

checkoutについて

注意:checkoutはgitのオーバーロードされたコマンドです。ブランチを切り替える(la svn switch)か、特定のファイルを取得するか、履歴からコミットしてワークスペースに置く(la svn update -r <id>)。それは他のことも意味する可能性があります: https://git-scm.com/docs/git-checkout -何年もTFSを使用した後にgitを使い始めたとき、特に自分自身を混乱させる可能性があることを認めます(ここで、「チェックアウト」は完全に別のものを意味します)。

13
Dai

Git revert https://git-scm.com/docs/git-revertを使用してください

git revert HEAD~1
0
Vyacheslav Enis

編集:履歴を保持したいので、以下の私の答えは無効になります。ただし、それでも有用です。エディターで行を並べ替えてから続行できます。

さて、元の答えに戻ります。

rebaseコマンドを試すことができます。

git rebase -i HEAD~n

ここで、nは、現在のコミットと元に戻したいコミットの間のコミット数の約1倍です。したがって、最後の3つのコミットを削除するとします。

git rebase -i HEAD~4

そこに移動すると、VIMまたはNano(または他のエディター)で開きます。削除するコミットの行を削除して、エディターを終了します。

VIMそれはescであり、:exitenter

今、それを単に押してください。これはエラーになりますので、強制プッシュを実行してください。

git Push -f

ブランチ名と上流も指定する必要があるかもしれません。それでうまくいくはずです!

このメソッドは、不良コミットを完全に削除するため、変更を元に戻すことで新しいコミットを追加するだけではありません。

これがドキュメントです: https://git-scm.com/docs/rebase

0
spikespaz