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
これは機能しますが、変更を元に戻すためだけのものがあれば便利です。もっと良い方法はありますか?
ベストアンサー1
使用できますgit checkout -p
では、作業コピーとインデックスの差分から個々のハンクを選択して元に戻すことができます。同様に、git add -p
インデックスに追加するハンクを選択でき、git reset -p
インデックスと HEAD の diff から個々のハンクを選択して、インデックスを取り消すことができます。
$ 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
使いにくい場合があります。私はマギットは、Git での作業に非常に役立つ Emacs モードです。Magit では、 を実行しmagit-status
、元に戻したい変更の diff を見つけ、元に戻したい行を選択し (または、一度に 1 行ではなく 1 つのハンクを元に戻したい場合は、元に戻したいハンクにカーソルを置きます)、 を押してk
特定の行を元に戻します。Emacs を使用する場合は Magit を強くお勧めします。