特定のコミットを元に戻す最も簡単な方法は次のとおりです。
最新のコミットでなければ、
git reset HEAD
うまくいきません。そしてそれはリモートにプッシュされているので、
git rebase -i
そして
git rebase --onto
リモコンに問題が発生します。
もっとそう、私は歴史を本当に修正したくはありません。悪いコードがあったなら、それは歴史の中にあったので見ることができます。作業コピーでそれを出したいだけなので、リバースマージコミットを気にする必要はありません。
言い換えれば、以下のsvnコマンドの Git と同等のものです。
svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
295から302へのすべての変更を、それらのリビジョンでのすべての変更を新しいコミットとして逆マージすることによって削除します。
svn merge -c -302 ^/trunk
これは302コミットを元に戻します。もちろん、それぞれのコミットからの変更を逆マージする別のコミットを追加することによっても可能です。
Gitではかなり単純な操作で、かなり一般的なユースケースであるべきだと思いました。アトミックコミットのポイントは他に何ですか?
コミットが完全にアトミックであることを確認するために、ステージング スタッシュ およびすべてを用意しています。これらのアトミックコミットの1つ以上を簡単に元に戻すことができないはずですか?
git log
を使用してコミットのハッシュを特定し、次にgit revert <commit>
を使用してこれらの変更を削除する新しいコミットを作成します。ある意味では、git revert
はgit cherry-pick
の逆です - 後者はそれが足りないブランチにパッチを適用し、前者はそれを持っているブランチからそれを削除します。
私はgit revert
のような自動コミットは嫌いなので、これはある人にとっては役に立つかもしれません。
修正したファイルを自動コミットではなく にしたい場合は、--no-commit
を使用できます。
% git revert --no-commit <commit hash>
これは-n
と同じです
% git revert -n <commit hash>
すでにプッシュされているので、履歴を直接操作しないでください。 git revert
は、コミット履歴を操作しないように、新しいコミットを使ってコミットからの特定の変更を元に戻します。