1. ホーム
  2. git

[解決済み] リモートレポにプッシュされたGitの特定のコミットを元に戻す

2022-03-17 22:17:07

質問

ある特定のコミットを取り消す最も簡単な方法は何ですか。

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

なぜなら、それが最新のコミットでない場合。

git reset HEAD

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

git rebase -i

そして

git rebase --onto

を使用すると、リモートで何らかの問題が発生する可能性があります。

もっと言えば、本当は履歴を修正したくないんです。もし悪いコードがあったとしても、それは履歴に残っていて見ることができます。私はただそれを作業コピーから取り除きたいだけで、逆マージコミットは気にしません。

つまり、何が Git 以下のsvnコマンドに相当します。

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

で、295 から 302 までのリビジョンのすべての変更を逆マージして、新しいコミットとして削除しています。

svn merge -c -302 ^/trunk

は、302 のコミットを取り消します。もちろん、そのコミットからの変更を逆マージする別のコミットを追加することで取り消します。

Gitではかなり単純な操作で、かなり一般的なユースケースであるはずだと思ったのです。アトミックコミットの意義は他にあるのでしょうか?

私たちはステージング 貯蓄 といった具合に、コミットが完全にアトミックであることを保証しています。アトミックなコミットの一つや複数を簡単に取り消すことはできないのでしょうか?

解決方法は?

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