web-dev-qa-db-ja.com

git revert-ステージングなしでコミットしない

通常、コマンドgit revertは、どのコミットが元に戻されたかを示すコミットログメッセージとともにいくつかのコミットを自動的に作成します。

自動コミットを避けるために、オプション-n(または--no-commit)があります。

ただし、このコマンドの後、元に戻されたファイルはステージングされた領域にあります。コマンドgit reset HEADを使用してステージングを解除できます。

コミットおよびステージングせずにコミットを元に戻す直接的な方法はありますか?

言い換えると、インデックスに触れずに、変更を作業ディレクトリにのみ適用するコミットを元に戻す直接コマンドはありますか?

38
lornova

単一のコマンドはありません。既に述べたように、git revert -ngit resetを組み合わせて、インデックス内で元に戻すことができます。

その方法に加えて、git apply -Rを使用してパッチを「逆適用」でき、git showを使用してコミットをパッチに変換できます。

$ git show <rev> | git apply -R

同じ効果がありますが、重要な(ただし微妙な)違いが1つあります。 git revertのドキュメントから引用して、独自の強調を追加しましょう。

-n, --no-commit
通常、コマンドは、どのコミットが元に戻されたかを示すコミットログメッセージを含むいくつかのコミットを自動的に作成します。このフラグは、名前付きコミットを作業ツリーとインデックスに戻すために必要な変更を適用しますが、コミットは行いません。さらに、このオプションを使用すると、インデックスはHEAD commit。元の状態に戻すのはインデックスの初期状態に対して行われます。

言い換えると、git revert -nはインデックスで動作し、作業ツリーを更新するという副作用があります。 git applyコマンドは(デフォルトでは)ワークツリーでのみ動作し、実際にはgitリポジトリの外部で使用できます。

40
torek