web-dev-qa-db-ja.com

Gitのブランチからコミットを削除する

コミットを削除する方法を知りたいのですが。

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

私はgitのヘルプを読みました、そして私が使うべきコマンドはgit reset --hard HEADだと思います。これは正しいです?

2755
hap497

注意: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を使用して、変更を元に戻す "ミラーイメージ"コミットを作成することをお勧めします。ただし、両方のコミットがログに記録されます。


FYI - git reset --hard HEADはWORK IN PROGRESSを取り除きたい場合に最適です。それはあなたを最新のコミットにリセットし、あなたの作業ツリーとインデックスのすべての変更を消去します。


最後に、あなたが "削除"したコミットを見つける必要があるなら、あなたのリポジトリをガベージコレクションしない限り、それは通常git reflogにあります。

3542
gahooa

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

git rebase -i HEAD~N

~Nは、最後のNコミットをリベースすることを意味します(Nは、HEAD~10などの数字でなければなりません)。その後、Gitから提示されるファイルを編集して、問題のあるコミットを削除できます。そのファイルを保存すると、Gitは、削除したものが存在しないかのように、次のすべてのコミットを書き換えます。

Git Bookには リベースのセクション があり、写真と例があります。

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

661
Greg Hewgill

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

git rebase -i <commit>~1

これは、攻撃したいコミットの直前の時点で、対話モード-iでリベースを開始します。それ以降、エディタはすべてのコミットを一覧表示するようになります。消去したいコミットを含む行を削除してファイルを保存します。 Rebaseは残りの作業を行い、そのコミットだけを削除し、他の全てをログに再生します。

444

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

自分の作業を続けて、そのコミットコマンドを単に「元に戻す」場合(リポジトリに移動する前にキャッチした):

git reset --soft HEAD~1

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

305
Rob

コミット全体を削除する

git rebase -p --onto SHA^ SHA

明らかに "SHA"をあなたが取り除きたいリファレンスに置き換えてください。そのコマンドの "^"はリテラルです。

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

65
raittes

変更を公開していない場合は、最新のコミットを削除するために、次の操作を実行できます。

$ git reset --hard HEAD^

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

すでに削除予定のコミットを公開している場合は、 git revert を使用してください。

$ git revert HEAD
48
Jakub Narębski
git reset --hard commitId

git Push <Origin> <branch> --force

シモンズ:CommitIdはあなたが戻って戻りたいものを指します

33
sun34

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

git reset HEAD~1

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

Nのコミットをコミットしたくないが、コードの変更は作業ディレクトリに残してください。

git reset HEAD~N

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

git reset --hard HEAD~1

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

git reset --hard HEAD~N
27
Anurag-Sharma

リポジトリからコミット2と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新しいブランチをmasterにマージします。
  • git Push -f Origin master masterをリモートリポジトリにプッシュします。
26
tk_

履歴を強制的に変更

最後のコミットを単に削除したくないが、最後のn個のコミットのうちの特定のコミットを削除したいとします。

最後の5回のコミットを見たい場合はgit rebase -i HEAD~<number of commits to go back>git rebase -i HEAD~5

次にテキストエディタで、削除したいコミットの横にあるWordのpickdropに変更します。保存してエディタを終了します。ほら!

追加的な変更履歴

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

25
IliasT
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"を使ってそのコミットを削除するか、またはあなたのコミットがある行を削除することができます。

15
Siva Praveen

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

git reset --hard HEAD~1

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

git Push Origin HEAD --force
12
thestar

間違い:

私は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>が機能したと思った後、別のブランチをmasterに更新し、1 ... 2 ...失礼しました!コミットが復活しました-Gitが勝ちました。

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

ソリューション:

git rebase -i <SHA>、次にd, drop = remove commit

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

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

良い一日を。

9
Leo

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

元に戻したいブランチをチェックアウトしてから、ローカルの作業コピーをリモートサーバ上の最新のものにしたいコミットに戻します(それ以降のすべてのステップはバイバイになります)。これを行うには、SourceTreeの中で私は右クリックして "Reset BRANCHNAME to this commit"を選択しました。コマンドラインは次のようになります。

git reset --hard COMMIT_ID

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

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

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

これはあなたのローカルリポジトリの現在のコミットの後の全てのコミットを消去しますが、その一つのブランチだけです。

7
CommaToast

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

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

6
Angelo Borsotti

最後のコミット(誤ったメッセージ、いくつかの変更を追加するのを忘れた)をめちゃめちゃにして、それを一般のレポにプッシュする前に修正したいのであれば:

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

新たに変更を加えた場合、それらは最後のコミット(あなたが取り除こうとしているもの)と組み合わされ、そのコミットを置き換えます。

もちろん、コミットした後にコミットを修正した場合は履歴を書き換えているので、その場合は必ずその意味を理解してください。

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

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

5
Pwnrar

履歴を残してコミットと復帰を表示したい場合は、次のようにします。

git revert GIT_COMMIT_HASH

元に戻す理由を説明するメッセージを入力してから、

git Push  

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

5
Paulo Fidalgo

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

最後のコミットを削除する

たとえば最後のコミット  

gitプッシュオリジン+ aa61ab32 ^:master

今、あなたはこのコミットを削除したいです。

ステップ 

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

  2. リモコンに押します。

git reset HEAD^ --hard

git Push Origin -f

特定のコミットに対して、リセットしたいのは以下の通りです

git reset bb676878^ --hard

git Push Origin -f
4
sagar jethi

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

git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force

それからレポがクローンされたそれぞれの場所で、実行してください:

git reset --hard Origin/master
3
Justin

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

git reset --hard HEAD~1

git Push -f Origin

この助けを願って

3
Chris Sim

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

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

原点への強制プッシュ

git Push -f Origin
2
Ashish Singh
// 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、ローカル、リモートでコミットを削除する方法

1
Shajid

私はすでにプッシュしました。 さまざまなバリエーションを試したことがあるが、git bushを介した this from Justin だけがうまく機能しています。

git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force
0
Serg Burlaka

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

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

変更を保存して最近のコミットを削除したい場合

git reset --soft HEAD^
git pull
0
Lava Sangeetham

git reset --hard 

git Push Origin HEAD --force

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

0
BillChan

delete local commit

上の画像でわかるように、私は元に戻す "test change 2"コミットを削除したいです(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (git bashでgitkコマンドを使ってSHA1 IDを取得できます))。

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

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

削除後

after delete commit

0
ankit