web-dev-qa-db-ja.com

最後のコミットを元に戻し、履歴から削除する方法は?

私はコミットして、元に戻しました

git revert HEAD^

ちょうどgit log

➜  git:(master) git log
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio <[email protected]>
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も履歴から削除するにはどうすればよいですか?

49
daniel

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

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

それが安全な仮定ではない場合(そうでない場合は理由を聞きたいのですが)、reflogsを失効させ、すぐにすべての未解決のオブジェクトを収集するガベージコレクションを強制する必要があります。あなたはそれをすることができます

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

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


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

54
Lily Ballard

コミットを気にしない場合は、次のようにします。

git reset --hard HEAD~

コミットを吹き飛ばすために。

変更を作業ディレクトリに保存する場合は、次を実行します。

git reset HEAD~

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

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

36
manojlds

ニースの解決策があります こちら 。最後の(トップ)コミットを削除するには、次のようにします。

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

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

git reset HEAD^ --hard
git Push [remote] -f
8
dyrssen

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

git reset --hard HEAD〜2

(元のコミットと「元に戻す」コミットを削除するには、HEAD〜2)。

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

6
Bruno Oliveira

リモートから最後のコミットを削除する簡単な作業ソリューションを次に示します。

  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. リモートブランチを置き換えます(削除して一時をプッシュします)
git Push Origin --delete dev_branch
git Push Origin temp_branch:dev_branch
1
chenchuk