3816

コミットを削除する方法を教えてください。

つまり、あたかもそのコミットをdelete行わなかったかのようであり、将来プッシュを実行しても、変更はリモートブランチにプッシュされません。

git helpを読みましたが、使用すべきコマンドはですgit reset --hard HEAD。これは正しいです?

4

35 に答える 35

4883

注意: git reset --hard 作業ディレクトリの変更は削除されます。このコマンドを実行する前に、保持したいローカルの変更を必ず隠してください。

あなたがそのコミットに座っていると仮定すると、このコマンドはそれをワクワクさせます...

git reset --hard HEAD~1

は、頭の前のHEAD~1コミットを意味します。

または、の出力をgit log確認し、バックアップするコミットのコミットIDを見つけて、次のようにすることもできます。

git reset --hard <sha1-commit-id>

すでにプッシュしている場合は、強制的にプッシュして取り除く必要があります...

git push origin HEAD --force

ただし、他の人がそれを引っ張った可能性がある場合は、新しいブランチを開始することをお勧めします。彼らが引っ張るとき、それは彼らの仕事にそれをマージするだけであり、あなたはそれを再び押し戻すでしょう。

すでにプッシュしている場合は、を使用git revertして、変更を元に戻す「ミラーイメージ」コミットを作成することをお勧めします。ただし、両方のコミットがログに記録されます。


参考までに-進行中の作業git reset --hard HEADを取り除きたい場合に最適です。最新のコミットにリセットされ、作業ツリーとインデックスのすべての変更が消去されます。


最後に、「削除」したコミットを見つける必要がある場合git reflog、リポジトリをガベージコレクションしていない限り、通常はそこに存在します。

于 2009-08-27T03:44:04.727 に答える
806

コミットをまだどこにもプッシュしていない場合は、を使用git rebase -iしてそのコミットを削除できます。まず、そのコミットが(おおよそ)どれくらい前にあるかを調べます。次に、次のことを行います。

git rebase -i HEAD~N

手段は最後のコミット~Nをリベースします(たとえば、数値である必要があります)。次に、Gitが提示するファイルを編集して、問題のあるコミットを削除できます。そのファイルを保存すると、Gitは、削除したコミットが存在しないかのように、以下のすべてのコミットを書き換えます。NNHEAD~10

Git Bookには、写真と例を使用したリベースに関する優れたセクションがあります。

ただし、これに注意してください。他の場所にプッシュしたものを変更した場合強制プッシュを実行する予定がない限り、別のアプローチが必要になります。

于 2009-08-27T03:51:04.913 に答える
622

もう1つの可能性は、私の個人的なお気に入りのコマンドの1つです。

git rebase -i <commit>~1

-iこれにより、コミットする直前の時点でインタラクティブモードでリベースが開始されます。それ以降、エディターはすべてのコミットのリストを開始します。消去するコミットを含む行を削除して、ファイルを保存します。Rebaseは残りの作業を行い、そのコミットのみを削除し、他のすべてをログに再生します。

于 2009-08-27T03:49:27.727 に答える
401

作業をコミットしようとしたばかりの人が、Gitの使用ミスのために、その作業をすべて削除したいと思う理由がわからないため、この回答を追加します。

作業を続けて、そのコミットコマンドを「元に戻す」だけの場合(リポジトリにプッシュする前にキャッチしました):

git reset --soft HEAD~1

最後のコミット以降に進行中の作業を破棄する場合を除いて、-hardフラグを使用しないでください。

于 2012-10-15T18:17:58.640 に答える
235

コミット全体を削除する

git rebase -p --onto SHA^ SHA

明らかに、「SHA」を削除したい参照に置き換えてください。そのコマンドの「^」はリテラルです。

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep

于 2015-08-31T19:36:46.360 に答える
92

リポジトリからコミット2と4を削除したいとします。(コミットの新しい番号が大きいほど、0が最も古いコミット、4が最新のコミットです)

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

注:とを使用しているため、リポジトリに対する管理者権限が必要です--hard-f

  • git checkout b3d92c5最後に使用可能なコミットをチェックアウトします。
  • git checkout -b repair作業する新しいブランチを作成します。
  • git cherry-pick 77b9b82コミット3を実行します。
  • git cherry-pick 2c6a45bコミット1を実行します。
  • git checkout masterチェックアウトマスター。
  • git reset --hard b3d92c5マスターを最後に使用可能なコミットにリセットします。
  • git merge repair新しいブランチをマスターにマージします。
  • git push -f origin masterマスターをリモートリポジトリにプッシュします。
于 2017-09-05T07:19:36.527 に答える
58

変更を公開しなかった場合は、最新のコミットを削除するために、次のことができます。

$ git reset --hard HEAD^

(これにより、コミットされていない変更もすべて削除されることに注意してください。注意して使用してください)。

削除するコミットをすでに公開している場合は、gitrevertを使用してください

$ git revert HEAD
于 2009-08-27T10:47:42.983 に答える
52

強制的に履歴を変更する

最後のコミットを削除するだけでなく、最後のn個のコミットの特定のコミットを削除したい場合は、次のようにします。

git rebase -i HEAD~<number of commits to go back>したがってgit rebase -i HEAD~5、最後の5つのコミットを確認したい場合。

次に、テキストエディタで、削除するすべてのコミットの横にある単語pickを変更します。dropエディターを保存して終了します。出来上がり!

履歴を追加的に変更する

試してみてくださいgit revert <commit hash>元に戻すと、指定したコミットを元に戻す新しいコミットが作成されます。

于 2017-06-15T23:01:07.147 に答える
51
git reset --hard commitId

git push <origin> <branch> --force

PS:CommitIdは、元に戻したいものを指します

于 2014-10-16T09:51:32.437 に答える
46
git rebase -i HEAD~2

ここで、「2」はリベースするコミットの数です。

'git rebase -i HEAD`

すべてのコミットをリベースしたい場合。

次に、これらのオプションの1つを選択できるようになります。

p, pick = use commit

r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit

これらの行は並べ替えることができます。それらは上から下に実行されます。ここで行を削除すると、そのコミットは失われます。ただし、すべてを削除すると、リベースは中止されます。空のコミットはコメントアウトされていることに注意してください

オプション「d」を使用するか、コミットのある行を削除するだけで、そのコミットを削除できます。

于 2016-05-18T23:39:53.993 に答える
39

[素早い回答]

たとえば、次のような多くの選択肢があります。

  • 代替案1:

    git rebase -i <YourCommitId>~1
    

    YourCommitIdを、元に戻したいコミットの数に変更します。

  • 代替案2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    YourCommitIdを、元に戻したいコミットの数に変更します。

    進行中の作業が失われる可能性があるため、このオプションはお勧めしません。

  • 代替案3:

    git reset --soft HEAD~1
    

    作業を続けて、コミットを元に戻すことしかできません。

于 2019-10-30T11:14:37.703 に答える
35

最新のコミットを修正する場合は、次のようにして、コミットを元に戻し、その中のファイルのステージングを解除できます。

git reset HEAD~1

これにより、ファイルをステージングするgitaddコマンドの前の状態にリポジトリが戻ります。変更は作業ディレクトリにあります。HEAD〜1は、ブランチの現在の先端の下にあるコミットを指します。

N個のコミットをコミット解除したいが、コードの変更を作業ディレクトリに保持したい場合:

git reset HEAD~N

最新のコミットを削除したいが、コードの変更を保持したくない場合は、「ハード」リセットを実行できます。

git reset --hard HEAD~1

同様に、最後のN個のコミットを破棄し、コードの変更を保持したくない場合は、次のようにします。

git reset --hard HEAD~N
于 2014-05-31T07:19:37.447 に答える
19

ローカルブランチで削除するには、

git reset --hard HEAD~1

リモートブランチで削除するには、

git push origin HEAD --force
于 2014-08-28T16:06:07.947 に答える
14

ソース:https ://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

最後のコミットを削除します

たとえば、最後のコミット

git push origin + aa61ab32 ^:master

今、あなたはこのコミットを削除したいので、これを行う簡単な方法は次のとおりです

手順

  1. まず、ブランチを現在のコミットの親にリセットします

  2. リモートに強制的にプッシュします。

git reset HEAD^ --hard

git push origin -f

特定のコミットについては、リセットしたいのは次のとおりです

git reset bb676878^ --hard

git push origin -f
于 2018-06-22T13:40:59.530 に答える
10

上記のすべてのコマンドは、コミットを行う前の状態で作業ツリーとインデックスの状態を復元しますが、リポジトリの状態は復元しません。それを見ると、「削除された」コミットは実際には削除されておらず、単に現在のブランチの先端にあるものではありません。

磁器のコマンドでコミットを削除する手段はないと思います。唯一の方法は、ログとreflogから削除してから、を実行することgit prune --expire -nowです。

于 2012-10-04T07:19:22.587 に答える
10

これを行う別の方法は次のとおりです。

復元するブランチをチェックアウトしてから、ローカルの作業コピーをリセットして、リモートサーバー上で最新のブランチにしたいコミットに戻します(それ以降はすべてバイバイになります)。これを行うには、SourceTreeで右クリックし、[BRANCHNAMEをこのコミットにリセット]を選択しました。コマンドラインは次のとおりです。

git reset --hard COMMIT_ID

リモートからブランチをチェックアウトしたばかりなので、失うことを心配するローカルの変更はありません。しかし、あなたがそうするならば、これはそれらを失うでしょう。

次に、リポジトリのローカルディレクトリに移動して、次のコマンドを実行します。

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

これにより、ローカルリポジトリ内の現在のコミット以降のすべてのコミットが消去されますが、その1つのブランチのみが消去されます。

于 2013-05-13T17:20:01.013 に答える
9

コミットと復帰を表示して履歴を保持したい場合は、以下を使用する必要があります。

git revert GIT_COMMIT_HASH

なぜ元に戻すのかを説明するメッセージを入力してから、次のようにします。

git push  

発行git logすると、「間違った」コミットと元に戻すログメッセージの両方が表示されます。

于 2015-01-07T15:13:35.507 に答える
9

間違い:

git rebase -i --rootは自分のブランチを編集しましたが、マスターとは異なる最初のコミットを言い換えることができると無意識のうちに考えていました(GitHub for Windowsのデフォルトビューはマスターとの比較であり、全体を非表示にしています)。

900以上のコミットがSublimeにロードされている間、私はシリコンバレーのひげを生やしました。変更を加えずに終了し、バッテリーを充電してからシェービングに進みました。900以上の個々のコミットがすべてさりげなくリベースされたため、コミット時間が現在にリセットされました。

Gitを打ち負かし、元の時間を維持することを決意したので、このローカルリポジトリを削除し、リモートから再クローンしました。

これで、削除したいマスターへの最新の不要なコミットが再度追加されたので、そのように進めました。

オプションを使い果たす:

私は望んでいませんでしたgit revert-それは追加のコミットを作成し、Gitを優勢にします。

git reset --hard HEAD何もしませんでした。チェックした後reflog、最後で唯一HEADのクローンでした-Gitが勝ちました。

最新のSHAを取得するために、github.comのリモートリポジトリを確認しました。マイナーウィンです。

うまくいったと思っgit reset --hard <SHA>た後、私は別のブランチをマスターに更新し、1 ... 2 ... poof!コミットが戻った-Gitが勝つ。

マスターに戻ってチェックアウトし、試してからgit rebase -i <SHA>、行を削除してください...無駄に、悲しいことに。「ここで行を削除すると、コミットが失われます」。ああ... 2.8.3リリースノートのn00bをトロールする新機能に光沢があります。

ソリューション:

git rebase -i <SHA>その後d, drop = remove commit

確認するために、私は別のブランチにチェックアウトしました。マスターからフェッチ/プルするための非表示のコミットはありません。

https://twitter.com/holman/status/706006896273063936

良い一日を。

于 2016-05-25T20:33:19.700 に答える
8

ここでは、そのための明確なパイプラインを1つ投稿します

ステップ1:gitlogを使用してコミットIDを取得します。

git log

ここに画像の説明を入力してください

ステップ2:git resetを使用して、以前のバージョンに戻ります。

git reset --hard <your commit id>
于 2021-02-06T02:45:21.003 に答える
7

最後のコミットを台無しにして(間違ったメッセージ、いくつかの変更を追加するのを忘れた)、公開リポジトリにプッシュする前に修正したい場合は、次を使用してください。

git commit --amend -m "New message here"

新しくステージングされた変更がある場合、それらは最後のコミット(削除しようとしている)と組み合わされ、そのコミットを置き換えます。

もちろん、プッシュした後にコミットを修正すると、履歴が書き換えられるので、それを行う場合は、その影響を必ず理解してください。

前のコミットのメッセージを使用したい場合は、「-m」の代わりに「--no-edit」オプションを渡すこともできます。

ドキュメント: http: //git-scm.com/docs/git-commit.html

于 2014-05-26T23:24:22.347 に答える
7

すでにプッシュしている場合は、最初にHEAD ($ GIT_COMMIT_HASH_HERE)で実行したいコミットを見つけてから、次のコマンドを実行します。

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

次に、リポジトリのクローンが作成された場所ごとに、次のコマンドを実行します。

git reset --hard origin/master
于 2017-01-30T00:25:54.880 に答える
6

私がコミットしてプッシュするときに私が通常行うこと(誰かが彼のコミットをプッシュした場合、これは問題を解決します):

git reset --hard HEAD~1

git push -f origin

この助けを願っています

于 2017-06-14T09:22:56.520 に答える
6

私はすでにプッシュしました。一部のコミットをリモートで返す必要があります。多くのバリエーションを試しましたが、 Justinからgitbush経由でこれだけがうまく機能しています:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
于 2019-02-08T21:29:18.757 に答える
5

ローカルブランチでリセット

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

原点への強制プッシュ

git push -f origin
于 2018-05-29T07:38:04.107 に答える
5
// display git commit log    
$ git log --pretty=oneline --abbrev-commit

// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2

参照:git、local、remoteでコミットを削除する方法

于 2019-06-26T12:46:32.140 に答える
5

git reset --hard HEAD~1
これで前の頭になります。枝を引っ張る。新しいコードをプッシュします。コミットはgitから削除されます

于 2020-01-20T13:14:20.197 に答える
4

一時フォルダにコードのバックアップを取ります。次のコマンドはサーバーと同じようにリセットされます。

git reset --hard HEAD
git clean -f
git pull

変更を保持し、最近のコミットを削除する場合

git reset --soft HEAD^
git pull
于 2016-07-14T11:25:31.087 に答える
3

あなたがIntelliJユーザーなら、インターフェースは単純に素晴らしいです。ワンクリックで、同時に効果をすぐに確認できます。この場所へのショートカット:Cmd + 9MacOSの場合。

ここに画像の説明を入力してください

于 2021-07-08T15:50:52.507 に答える
2

ローカルコミットを削除する

上の画像でわかるように、revert "test change 2" commit(SHA1 ID:015b5220c50e3dfbb1063f23789d92ae1d3481a2gitk (gitbashのコマンドを使用してSHA1IDを取得できます))を削除します。

そのために私は使用できます(以下のコマンドはすべてローカルでのみ機能します。削除後にプッシュする必要があります):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2//そのコミットにバックアップします(テスト変更4コミットのSHA1 IDは515b5220c50e3dfbb1063f23789d92ae1d3481a2です
  2. git reset --hard HEAD~1//1つのコミットの前にバックアップします。
  3. git reset --hard HEAD^ //最後のコミットをgitから削除するには

削除後:

コミットを削除した後

于 2018-07-03T06:51:42.047 に答える
1

git reset --hard

git push origin HEAD --force

1つ以上のコミットにタグが付けられている場合は、最初にタグを削除します。それ以外の場合、タグ付けされたコミットは削除されません。

于 2015-07-24T14:45:51.583 に答える
1

私にとってリベースはトリックをしました

$ git rebase -i HEAD~98

# Delete everything except for the most recent commit on the shown editor caused by "rebase"

$ git push origin -f production-static

注: コメントを減らすためにプッシュを強制した後。次に、別のファイルセットをプッシュしてから、同じ「リポジトリとブランチ」を使用して別のコンピューターでプルしてみました。驚くべきことに、競合はありません。これは、同じgitを使用する他のローカルでのプルの競合を回避しながらリポジトリサイズを減らすための私の方法になりました

于 2021-01-04T17:25:57.050 に答える
0

git revert https://git-scm.com/docs/git-revertを使用します。すべてのコードが元に戻り、次のコミットを実行できます。次に、ヘッドがその最後のコミットをポイントします。元に戻されたコミットは削除されませんが、最後のコミットには影響しません。

于 2017-03-01T15:15:44.030 に答える
0

私の場合、この目的のための私の魔法のコードはこれです:

git reset --hard @{u}

それをテストして教えてください。私はいくつかの異なるものを試しましたが、これが私を助けた唯一のものでした。

于 2019-11-13T13:06:49.353 に答える
0

ここに30以上の回答があるので、自分に合ったものを使ってシンプルに保ちます

.gitフォルダーを削除すると、gitリポジトリで問題が発生する可能性があります。すべてのコミット履歴を削除したいが、コードを現在の状態のままにしておきたい場合は、次のように行うのが非常に安全です。

チェックアウト

git checkout --orphan latest_branch

すべてのファイルを追加します

git add -A

変更をコミットする

git commit -m "commit message"

ブランチを削除します

git branch -D master

現在のブランチの名前をmasterに変更します

git branch -m master

最後に、リポジトリを強制的に更新します

git push -f origin master

PS:これはあなたの古いコミット履歴を保持しません。

于 2022-02-07T11:05:16.237 に答える
-1

リモートリポジトリにプッシュしていないと仮定すると、リポジトリのクローンを再作成できます。これは私の選択の数回です。

于 2014-12-31T06:54:56.300 に答える