1. ホーム
  2. git

[解決済み] gitでステージングされていない変更点の一部を元に戻す

2022-04-23 16:37:43

質問

git でステージされていない変更の一部を元に戻し、残りはステージされていない状態のままにしておくにはどうすればよいのでしょうか? 私が考えた方法は

git commit --interactive
# Choose the parts I want to delete
# Commit the changes
git stash
git rebase -i master # (I am an ancestor of master)
# Delete the line of the most recent commit
git stash apply

これは動作しますが、次のようなものがあるといいですね。 git commit --interactive は、変更の取り消しにのみ使用されます。 何か良い方法があれば教えてください。

解決方法は?

を使用することができます。 git checkout -p これを使うと、作業コピーとインデックスの差分から個々のハンクを選んで元に戻すことができます。同様に git add -p では、インデックスに追加するハンクを選択することができ git reset -p は、インデックスとHEADの差分から個々のハンクを選んで、インデックスから後退させることができます。

$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .

もし、これらの変更を元に戻す前に、あらかじめgitリポジトリをスナップショットして保存しておきたいのであれば、私はそうしたいです。

$ git stash; git stash apply

よく使うなら、エイリアスをつけるといいかもしれませんね。

[alias]
    checkpoint = !git stash; git stash apply

優れたエディタモードやプラグインを使用すれば、個々のハンクや行の復帰はさらに簡単です。 -p は、ちょっと使い勝手が悪いこともあります。私が使っているのは Magit Emacsのモードで、Gitを使うのにとても便利なんです。Magitでは magit-status で、戻したい変更の diff を見つけ、戻したい行を選択し (一度に一行ではなく塊ごとに戻したい場合は、戻したい塊にカーソルを置くだけでよいです)、次に k をクリックすると、特定の行を元に戻すことができます。Emacsを使うなら、Magitを強くお勧めします。