61

私はコミットを行い、元に戻しました

git revert HEAD^

ただgitlog

➜  git:(master) git log
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio <danpal@gmail.com>
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

しかし、git logを実行すると、すべてが表示されます。機密情報が含まれているため、履歴から削除する必要があります

git log --all
commit 5d44355080500ee6518f157c084f519da47b9391
Author: Daniel Palacio
Date:   Tue Jan 17 16:40:48 2012 -0800

    This commit has to be reset

commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio 
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

コミット5d44355080500ee6518f157c084f519da47b9391も履歴から削除するにはどうすればよいですか?

4

5 に答える 5

68

まず、git revertここで間違ったコマンドです。これにより、古いコミットを元に戻す新しいコミットが作成されます。それはあなたが求めているものではありません。HEAD次に、の代わりに元に戻したいようですHEAD^

これをどこにもプッシュしていない場合はgit reset --hard HEAD^、最新のコミットを破棄するために使用できます(これにより、コミットされていない変更も破棄されるため、保存したい変更がないことを確認してください)。機密情報が自分のコピーに含まれていて、他の誰も持っていないことに問題がないと仮定すると、これで完了です。あなたは仕事を続けることができ、その後git pushはあなたの悪いコミットをプッシュしません。

それが安全な仮定ではない場合(理由を聞きたいのですが)、reflogを期限切れにして、すべての未処理のオブジェクトを今すぐ収集するガベージコレクションを強制する必要があります。あなたはそれをすることができます

git reflog expire --expire=now --expire-unreachable=now --all
git gc --prune=now

ただし、これは本当に絶対に行う必要がある場合にのみ行う必要があります。


あなたコミットをプッシュした場合、あなたはほとんど運が悪いです。強制プッシュを実行してリモートで元に戻すことはできますが(ただし、リモート側で許可されている場合のみ)、リモート側のデータベースからコミット自体を削除することはできないため、そのリポジトリにアクセスできる人は誰でもコミットを見つけることができます。何を探すべきかを知っています。

于 2012-01-18T01:33:03.193 に答える
46

コミットを気にしない場合は、次のようにしてください。

git reset --hard HEAD~

コミットを吹き飛ばします。

変更を作業ディレクトリに配置する場合は、次の手順を実行します。

git reset HEAD~

で行ったことによってはgit revert、上記のコマンドを変更する必要がある場合があります。Revertは、元に戻したいコミットを元に戻す新しいコミットを作成します。したがって、2つのコミットがあります。HEAD~2両方を削除する必要があるかもしれません。

通常、変更を元に戻すには、元に戻す方が安全な方法であることに注意してください。ただし、ここでは機密データを削除する必要があるため、リセットが最善の方法です。

于 2012-01-18T01:35:26.297 に答える
13

ここに素晴らしい解決策があります。最後の(一番上の)コミットを削除するには、

git push [remote] +[bad_commit]^:[branch]

ここで、[bad_commit]は、[branch]が現在指しているコミットです。または、[branch]がローカルでチェックアウトされている場合は、次のこともできます。

git reset HEAD^ --hard
git push [remote] -f
于 2016-01-22T16:07:57.040 に答える
8

まだコミットをプッシュしていない場合は、次のことができます。

git reset --hard HEAD〜2

(HEAD〜2を使用して、元のコミットと「元に戻す」コミットを削除します)。

これにより、現在のブランチが、削除するコミットの前の履歴のポイントにリセットされます。そのコミットが他のブランチにない場合、オリジンにプッシュされません。

于 2012-01-18T01:34:45.700 に答える
3

これは、リモートから最後のコミットを削除する簡単な解決策です。

  1. リポジトリのクローンを作成し、最後の「適切な」コミットを見つけます(.... c407)
$ git clone git@host:PROJ/myrepo.git 
$ cd myrepo 
$ git log --pretty=oneline

234987fed789de97232ababababcef3234958723 bad_commit
e4a2ec4a80ef63e1e2e694051d9eb3951b14c407 v4.3
2f116449144dbe46e7260d5dac2304803751b5c2 v4.2
  1. 新しい一時ブランチへの最後の適切なコミットをチェックアウトします
$ git checkout e4a2ec4a80ef63e1e2e694051d9eb3951b14c407
$ git checkout -b temp_branch
  1. リモートブランチを置き換えます(tempを削除してプッシュします)
git push origin --delete dev_branch
git push origin temp_branch:dev_branch
于 2018-07-26T06:06:56.597 に答える