回答:
--no-commit
(-n
)オプションを使用しgit revert
て変更をステージング解除し、次に使用しますgit add --patch
。
$ git revert -n $bad_commit # Revert the commit, but don't commit the changes
$ git reset HEAD . # Unstage the changes
$ git add --patch . # Add whatever changes you want
$ git commit # Commit those changes
注:git add --patchを使用して追加するファイルは、元に戻したいファイルであり、保持したいファイルではありません。
git reset --hard
いない場合は、コミット後に、元に戻したくない他の変更を破棄するために、最後に必要なコマンドを追加する価値があります。
git reset --hard
初心者にとっては、編集内容が失われる可能性があるため危険です。代わりにgit status
、これはgit checkout -- FILE..
、物事をより安全に戻すためのヒントになります。
git
。 git revert
ただ--patch
引数を取る必要があります。
git revert
コミット全体を元に戻すために使用されます。を使用git checkout -p
して、戻すビットをインタラクティブに選択できます。
commit
最初に、またはstash
、それからしてみてくださいrevert
。
私は以下をうまく使いました。
最初に完全なコミットを元に戻します(インデックスに入れます)が、コミットはしません。
git revert -n <sha1> # -n is short for --no-commit
次に、元に戻されたGOOD変更をインデックスからインタラクティブに削除します
git reset -p # -p is short for --patch
次に、悪い変更の逆差分をコミットします
git commit -m "Partially revert <sha1>..."
最後に、元に戻されたGOOD変更(resetコマンドによってステージングが解除された)は、まだ作業ツリーにあります。それらをクリーンアップする必要があります。他にコミットされていない変更が作業ツリーに残っていない場合、これは
git reset --hard
reset HEAD .
動作するディレクトリの最終的なクリーンアップを必要としないため、受け入れられた回答(を使用)の優れた代替手段ではありませんか?
reset -p
、のreset HEAD
後に続くよりも短いため、優れていadd -p
ます。ただし、リセットされた「正常な」ハンクはコミット後も作業ディレクトリに残っているため、クリーンアップが必要です。
個人的には、自動生成されたコミットメッセージを再利用し、ユーザーが「部分的に」という単語を編集して最後にコミットする前に貼り付ける機会をユーザーに提供するこのバージョンを好みます。
# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>
# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1
# interactively add reversions
git add -p
# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>
# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .
解決:
git revert --no-commit <commit hash>
git reset -p # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- . # Don't forget to use it.
(ファイルの現在のバージョンが元に戻そうとしているバージョンからそれほど遠くない場合)もう1つの方法は、部分的に元に戻したい(直前の)コミットのハッシュを取得することですgit log
。次に、コマンドは次のようになります。
$ git checkout -p <hash_preceding_commit_to_revert> -- file/you/want/to/fix.ext
これは作業ツリー内のファイルを変更しますが、コミットは作成しません。そのため、本当に詰まっている場合は、からやり直すことができますgit reset --hard -- file/you/want/to/fix.ext
。
git-revert -nを使用してから、add --patchを使用してハンクを選択できます。