web-dev-qa-db-ja.com

リモートリポジトリにプッシュされたGitの特定のコミットを元に戻す

特定のコミットを元に戻す最も簡単な方法は次のとおりです。

  • 頭や頭の中にない
  • リモコンに押されています。

最新のコミットでなければ、

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つ以上を簡単に元に戻すことができないはずですか?

694
Lakshman Prasad

git logを使用してコミットのハッシュを特定し、次にgit revert <commit>を使用してこれらの変更を削除する新しいコミットを作成します。ある意味では、git revertgit cherry-pickの逆です - 後者はそれが足りないブランチにパッチを適用し、前者はそれを持っているブランチからそれを削除します。

1076
Andrew Aylett

私はgit revertのような自動コミットは嫌いなので、これはある人にとっては役に立つかもしれません。

修正したファイルを自動コミットではなく にしたい場合は、--no-commitを使用できます。

% git revert --no-commit <commit hash>

これは-nと同じです

% git revert -n <commit hash>
334
user633183

すでにプッシュされているので、履歴を直接操作しないでください。 git revertは、コミット履歴を操作しないように、新しいコミットを使ってコミットからの特定の変更を元に戻します。

35
moatPylon