リモート リポジトリにプッシュされた Git の特定のコミットを元に戻す
-
22-09-2019 - |
質問
特定のコミットを取り消す最も簡単な方法は次のとおりです。
- 頭や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 revert
はgit cherry-pick
の逆である - 。後者はそれを欠けている枝にパッチを適用し、それを持っている枝から旧削除し、それを
他のヒント
自動コミットは気に入らない git revert
するので、これは一部の人には役立つかもしれません。
自動コミットではなく、変更されたファイルだけが必要な場合, 、使用できます --no-commit
% git revert --no-commit <commit hash>
それは -n
% git revert -n <commit hash>
、あなたは直接の歴史を操作することはできません。 git revert
はそうではないのと、新しいコミットを使用してコミットから特定の変更を元に戻します歴史をコミット操作します。