コミットを削除する方法を知りたいのですが。
delete
と言うと、それはあたかもそのコミットをしなかったかのようであり、将来的にプッシュを実行したときには、私の変更はリモートブランチにプッシュしません。
私はgitのヘルプを読みました、そして私が使うべきコマンドはgit reset --hard HEAD
だと思います。これは正しいです?
注意: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
にあります。
まだどこにもコミットをプッシュしていない場合、 git rebase -i
を使用してそのコミットを削除できます。最初に、そのコミットがどれくらい前にあるかを調べます(およそ)。それから:
git rebase -i HEAD~N
~N
は、最後のN
コミットをリベースすることを意味します(N
は、HEAD~10
などの数字でなければなりません)。その後、Gitから提示されるファイルを編集して、問題のあるコミットを削除できます。そのファイルを保存すると、Gitは、削除したものが存在しないかのように、次のすべてのコミットを書き換えます。
Git Bookには リベースのセクション があり、写真と例があります。
ただし、他の場所にプッシュしたhaveを変更する場合は、強制プッシュを行う予定がない限り、別のアプローチが必要になるため、これには注意してください。
もう一つの可能性は私の個人的なお気に入りのコマンドの一つです:
git rebase -i <commit>~1
これは、攻撃したいコミットの直前の時点で、対話モード-i
でリベースを開始します。それ以降、エディタはすべてのコミットを一覧表示するようになります。消去したいコミットを含む行を削除してファイルを保存します。 Rebaseは残りの作業を行い、そのコミットだけを削除し、他の全てをログに再生します。
この回答を追加しているのは、Gitを誤って使用したために、作業をコミットしようとしたばかりの人がその作業をすべて削除したい理由がわからないためです。
自分の作業を続けて、そのコミットコマンドを単に「元に戻す」場合(リポジトリに移動する前にキャッチした):
git reset --soft HEAD~1
最後のコミット以降に進行中の作業を破棄しない限り、--hard フラグを使用しないでください。
コミット全体を削除する
git rebase -p --onto SHA^ SHA
明らかに "SHA"をあなたが取り除きたいリファレンスに置き換えてください。そのコマンドの "^"はリテラルです。
変更を公開していない場合は、最新のコミットを削除するために、次の操作を実行できます。
$ git reset --hard HEAD^
(これにより、コミットされていない変更もすべて削除されます。注意して使用してください)。
すでに削除予定のコミットを公開している場合は、 git revert を使用してください。
$ git revert HEAD
git reset --hard commitId
git Push <Origin> <branch> --force
シモンズ:CommitIdはあなたが戻って戻りたいものを指します
最新のコミットを修正したい場合は、次のようにしてコミットを取り消し、その中のファイルをステージング解除できます。
git reset HEAD~1
これはあなたのリポジトリをgit addコマンドがファイルをステージングする前の状態に戻します。あなたの変更はあなたの作業ディレクトリにあります。 HEAD〜1はブランチの現在のチップの下のコミットを指します。
Nのコミットをコミットしたくないが、コードの変更は作業ディレクトリに残してください。
git reset HEAD~N
最新のコミットを取り除き、コードの変更を保存したくない場合は、「ハード」リセットを実行できます。
git reset --hard HEAD~1
同様に、最後のN個のコミットを破棄し、コードの変更を保存したくない場合は、次のようにします。
git reset --hard HEAD~N
リポジトリからコミット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をリモートリポジトリにプッシュします。履歴を強制的に変更
最後のコミットを単に削除したくないが、最後のn個のコミットのうちの特定のコミットを削除したいとします。
最後の5回のコミットを見たい場合はgit rebase -i HEAD~<number of commits to go back>
、git rebase -i HEAD~5
。
次にテキストエディタで、削除したいコミットの横にあるWordのpick
をdrop
に変更します。保存してエディタを終了します。ほら!
追加的な変更履歴
git revert <commit hash>
を試してください。 元に戻す は、指定したコミットを元に戻すnewコミットを作成します。
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"を使ってそのコミットを削除するか、またはあなたのコミットがある行を削除することができます。
ローカルブランチで削除するには、
git reset --hard HEAD~1
リモートブランチで削除するには、
git Push Origin HEAD --force
間違い:
私は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
良い一日を。
これを行う別の方法は次のとおりです。
元に戻したいブランチをチェックアウトしてから、ローカルの作業コピーをリモートサーバ上の最新のものにしたいコミットに戻します(それ以降のすべてのステップはバイバイになります)。これを行うには、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
これはあなたのローカルリポジトリの現在のコミットの後の全てのコミットを消去しますが、その一つのブランチだけです。
上記のコマンドはすべて、コミット前の作業ツリーとインデックスの状態を復元しますが、リポジトリの状態は復元しません。見てみると、 "削除された"コミットは実際には削除されていません。現在のブランチの先端にあるものではありません。
磁器コマンド を使ってコミットを削除する方法はないと思います。唯一の方法はそれをログとreflogから削除してからgit Prune --expire -now
を実行することです。
最後のコミット(誤ったメッセージ、いくつかの変更を追加するのを忘れた)をめちゃめちゃにして、それを一般のレポにプッシュする前に修正したいのであれば:
git commit --amend -m "New message here"
新たに変更を加えた場合、それらは最後のコミット(あなたが取り除こうとしているもの)と組み合わされ、そのコミットを置き換えます。
もちろん、コミットした後にコミットを修正した場合は履歴を書き換えているので、その場合は必ずその意味を理解してください。
前のコミットのメッセージを使用したい場合は、 ' - m'の代わりに '--no-edit'オプションを渡すこともできます。
履歴を残してコミットと復帰を表示したい場合は、次のようにします。
git revert GIT_COMMIT_HASH
元に戻す理由を説明するメッセージを入力してから、
git Push
git log
を発行すると、「間違った」コミットとログメッセージの復元の両方が表示されます。
ソース: https://Gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
たとえば最後のコミット
gitプッシュオリジン+ aa61ab32 ^:master
今、あなたはこのコミットを削除したいです。
ステップ
最初に現在のコミットの親にブランチをリセットします
リモコンに押します。
git reset HEAD^ --hard git Push Origin -f
特定のコミットに対して、リセットしたいのは以下の通りです
git reset bb676878^ --hard
git Push Origin -f
すでにプッシュしている場合は、まずHEAD ($ GIT_COMMIT_HASH_HERE) にするコミットを見つけてから、次のコマンドを実行します。
git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force
それからレポがクローンされたそれぞれの場所で、実行してください:
git reset --hard Origin/master
コミットしてプッシュするときに私が通常すること(誰かが彼のコミットをプッシュした場合、これで問題は解決します):
git reset --hard HEAD~1
git Push -f Origin
この助けを願って
ローカルブランチでリセット
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
原点への強制プッシュ
git Push -f Origin
// 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 reset --hard HEAD
git clean -f
git pull
変更を保存して最近のコミットを削除したい場合
git reset --soft HEAD^
git pull
git reset --hard
git Push Origin HEAD --force
1つ以上のコミットがタグ付けされている場合は、最初にタグを削除します。 そうでなければタグ付けされたコミットは削除されません。
上の画像でわかるように、私は元に戻す "test change 2"コミットを削除したいです(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (git bashでgitk
コマンドを使ってSHA1 IDを取得できます))。
そのために私は使用することができます(以下のコマンドはすべてローカルでのみ動作します。削除後にプッシュする必要があります)。
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
//そのコミットにバックアップします(SHA1 IDの テスト変更4 commitは 515b5220c50e3dfbb1063f23789d92ae1d3481a2 ) git reset --hard HEAD~1
//コミットの前にバックアップします。git reset --hard HEAD^
// gitから最後のコミットを削除する削除後