web-dev-qa-db-ja.com

gitでコミットの一部を元に戻す

Gitの特定のコミットを元に戻したい。残念ながら、私たちの組織はまだCVSを標準として使用しているため、CVSにコミットすると、複数のgitコミットが1つにロールバックされます。この場合、元のgitコミットを選び出したいのですが、それは不可能です。

git add --patchに似たアプローチで、差分を選択的に編集して、コミットのどの部分を元に戻すかを決定できますか?

125
skiphoppy

--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を使用して追加するファイルは、保持するファイルではなく、元に戻すファイルです。

199
mipadi

以下を正常に使用しました。

最初に完全なコミットを元に戻します(インデックスに入れます)が、コミットしません。

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
36
user1338062

個人的には、自動生成されたコミットメッセージを再利用し、最終的にコミットする前にWordを「部分的に」編集して固定する機会をユーザーに提供するこのバージョンを好みます。

# 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 -- .
4
jeffcook2150

溶液:

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.

別の選択肢(ファイルの現在のバージョンが元に戻そうとしているバージョンからそれほど遠くない場合)は、直前にコミット部分的に元に戻したいもののハッシュを取得することです( 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でやり直すことができます。

2
Walf

Git-revert -nを使用してから、add --patchを使用してハンクを選択できます。

1
William Pursell