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


788

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

  • 頭にも頭にもない
  • リモートにプッシュされています。

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

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つ以上を簡単に取り消すことができませんか?

回答:


1210

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


237
また、コードを戻したいが、自動的に再度コミットしない場合は、-nスイッチを使用します。
jaygooby

17
「m」オプションは何をしますか?私はgit revert 8213f7dを試しましたが、代わりに次のエラーが発生しました:エラー:コミット8213f7dad1ed546b434a0d8a64cb783b530a5a30はマージですが、-mオプションが指定されていません。致命的:元に戻せませんでした
Malcolm

10
マージを元に戻すには:git revert -m 1 <hash>
brunozrk '13 / 10/13

31
マージを元に戻したい人への警告:git revertはすべてのデータ変更を取り消します(つまり、ファイルの変更は元に戻ります)が、マージはまだ履歴に残ります。このため、後で同じブランチをマージしようとしても、元に戻すマージ前のマージブランチからのコミットは含まれません。これはおそらくあなたが望むものではありません。ブランチを再び完全にマージするには、最初に元のマージを元に戻したコミットを元に戻す必要があります。詳細はこちらから:kernel.mirrors.pair.com/pub/software/scm/git/docs/howto/...
etreworgy

3
:@etreworgyによるコメント内のリンクは、私は、これはリンクの最新のバージョンにアップしている疑いがある404であるkernel.org/pub/software/scm/git/docs/howto/...
ティム・スミス

368

自動コミットが好きではないgit revertので、これは一部にとって役立つかもしれません。

auto-commitではなく変更されたファイルだけが必要な場合は、--no-commit

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

それは同じです -n

% git revert -n <commit hash>

9
git reset HEAD~1 --softすでに元に戻してしまった場合も行うことができます-n
Daniel

1
しかしgit reset HEAD~n、頭から継続的に到達できないコミットの取り消しを解決しません。クエリは、特定のコミットを元に戻すことです。
sangeethkumarp 2017年

私はこのソリューションを使用しましたが、復帰の途中で衝突を起こしました。衝突を解決した後、私はgit revert --continueそれが私に指示したとおりにしました。うまくいきましたが、悲しいことに結果は出ました。多分私はする必要がありましたgit revert --no-commit --continue
mareoraft

1
@sangeethkumarpダニエルのコメントは、git revertを忘れた場合に、の後に実行できる追加のステップです-n。その時点で最後のコミットが復帰であるため、ソフトリセットはそのコミットを取り消しますが、復帰の関連コード変更は
Oliver

@Danielは私のためにコメント作業で解決策を提供しましたありがとう '' git reset HEAD〜1 --soft ''
Sayed

41

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


1

元に戻したいコミットがマージ済みのコミットである場合(すでにマージされている場合)、-m 1または-m 2以下のようにオプションを選択する必要があります。これにより、マージされたコミットのどの親コミットを使用するかがgitに通知されます。詳細は見つけることができますHERE

  • git revert <commit> -m 1
  • git revert <commit> -m 2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.