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

StackOverflow https://stackoverflow.com/questions/2318777

質問

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

  • 頭やHEADにはない
  • リモートにプッシュされました。

最新のコミットでない場合は、

git reset HEAD

機能しません。そしてそれはリモートにプッシュされているため、

git rebase -i

そして

git rebase --onto

リモコンに何らかの問題が発生します。

もっと言えば、私は歴史を改変したくありません。不正なコードがあった場合、それは履歴に残されており、確認できます。私はそれを作業コピーに入れたいだけで、リバースマージコミットは気にしません。

言い換えれば、 ギット 次の svn コマンドと同等です。

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 revertgit cherry-pickの逆である - 。後者はそれを欠けている枝にパッチを適用し、それを持っている枝から旧削除し、それを

他のヒント

自動コミットは気に入らない git revert するので、これは一部の人には役立つかもしれません。

自動コミットではなく、変更されたファイルだけが必要な場合, 、使用できます --no-commit

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

それは -n

% git revert -n <commit hash>
それは、既にプッシュされているので、

、あなたは直接の歴史を操作することはできません。 git revertはそうではないのと、新しいコミットを使用してコミットから特定の変更を元に戻します歴史をコミット操作します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top