コミットを削除する方法を教えてください。
つまり、あたかもそのコミットをdelete
行わなかったかのようであり、将来プッシュを実行しても、変更はリモートブランチにプッシュされません。
git helpを読みましたが、使用すべきコマンドはですgit reset --hard HEAD
。これは正しいです?
コミットを削除する方法を教えてください。
つまり、あたかもそのコミットをdelete
行わなかったかのようであり、将来プッシュを実行しても、変更はリモートブランチにプッシュされません。
git helpを読みましたが、使用すべきコマンドはです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
して、変更を元に戻す「ミラーイメージ」コミットを作成することをお勧めします。ただし、両方のコミットがログに記録されます。
参考までに-進行中の作業git reset --hard HEAD
を取り除きたい場合に最適です。最新のコミットにリセットされ、作業ツリーとインデックスのすべての変更が消去されます。
最後に、「削除」したコミットを見つける必要がある場合git reflog
、リポジトリをガベージコレクションしていない限り、通常はそこに存在します。
コミットをまだどこにもプッシュしていない場合は、を使用git rebase -i
してそのコミットを削除できます。まず、そのコミットが(おおよそ)どれくらい前にあるかを調べます。次に、次のことを行います。
git rebase -i HEAD~N
手段は最後のコミット~N
をリベースします(たとえば、数値である必要があります)。次に、Gitが提示するファイルを編集して、問題のあるコミットを削除できます。そのファイルを保存すると、Gitは、削除したコミットが存在しないかのように、以下のすべてのコミットを書き換えます。N
N
HEAD~10
Git Bookには、写真と例を使用したリベースに関する優れたセクションがあります。
ただし、これに注意してください。他の場所にプッシュしたものを変更した場合、強制プッシュを実行する予定がない限り、別のアプローチが必要になります。
もう1つの可能性は、私の個人的なお気に入りのコマンドの1つです。
git rebase -i <commit>~1
-i
これにより、コミットする直前の時点でインタラクティブモードでリベースが開始されます。それ以降、エディターはすべてのコミットのリストを開始します。消去するコミットを含む行を削除して、ファイルを保存します。Rebaseは残りの作業を行い、そのコミットのみを削除し、他のすべてをログに再生します。
作業をコミットしようとしたばかりの人が、Gitの使用ミスのために、その作業をすべて削除したいと思う理由がわからないため、この回答を追加します。
作業を続けて、そのコミットコマンドを「元に戻す」だけの場合(リポジトリにプッシュする前にキャッチしました):
git reset --soft HEAD~1
最後のコミット以降に進行中の作業を破棄する場合を除いて、-hardフラグを使用しないでください。
コミット全体を削除する
git rebase -p --onto SHA^ SHA
明らかに、「SHA」を削除したい参照に置き換えてください。そのコマンドの「^」はリテラルです。
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
リポジトリからコミット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
マスターをリモートリポジトリにプッシュします。変更を公開しなかった場合は、最新のコミットを削除するために、次のことができます。
$ git reset --hard HEAD^
(これにより、コミットされていない変更もすべて削除されることに注意してください。注意して使用してください)。
削除するコミットをすでに公開している場合は、gitrevertを使用してください
$ git revert HEAD
強制的に履歴を変更する
最後のコミットを削除するだけでなく、最後のn個のコミットの特定のコミットを削除したい場合は、次のようにします。
git rebase -i HEAD~<number of commits to go back>
したがってgit rebase -i HEAD~5
、最後の5つのコミットを確認したい場合。
次に、テキストエディタで、削除するすべてのコミットの横にある単語pick
を変更します。drop
エディターを保存して終了します。出来上がり!
履歴を追加的に変更する
試してみてくださいgit revert <commit hash>
。元に戻すと、指定したコミットを元に戻す新しいコミットが作成されます。
git reset --hard commitId
git push <origin> <branch> --force
PS:CommitIdは、元に戻したいものを指します
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」を使用するか、コミットのある行を削除するだけで、そのコミットを削除できます。
たとえば、次のような多くの選択肢があります。
代替案1:
git rebase -i <YourCommitId>~1
YourCommitIdを、元に戻したいコミットの数に変更します。
代替案2:
git reset --hard YourCommitId
git push <origin> <branch> --force
YourCommitIdを、元に戻したいコミットの数に変更します。
進行中の作業が失われる可能性があるため、このオプションはお勧めしません。
代替案3:
git reset --soft HEAD~1
作業を続けて、コミットを元に戻すことしかできません。
最新のコミットを修正する場合は、次のようにして、コミットを元に戻し、その中のファイルのステージングを解除できます。
git reset HEAD~1
これにより、ファイルをステージングするgitaddコマンドの前の状態にリポジトリが戻ります。変更は作業ディレクトリにあります。HEAD〜1は、ブランチの現在の先端の下にあるコミットを指します。
N個のコミットをコミット解除したいが、コードの変更を作業ディレクトリに保持したい場合:
git reset HEAD~N
最新のコミットを削除したいが、コードの変更を保持したくない場合は、「ハード」リセットを実行できます。
git reset --hard HEAD~1
同様に、最後のN個のコミットを破棄し、コードの変更を保持したくない場合は、次のようにします。
git reset --hard HEAD~N
ローカルブランチで削除するには、
git reset --hard HEAD~1
リモートブランチで削除するには、
git push origin HEAD --force
ソース:https ://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
たとえば、最後のコミット
git push origin + aa61ab32 ^:master
今、あなたはこのコミットを削除したいので、これを行う簡単な方法は次のとおりです
手順
まず、ブランチを現在のコミットの親にリセットします
リモートに強制的にプッシュします。
git reset HEAD^ --hard git push origin -f
特定のコミットについては、リセットしたいのは次のとおりです
git reset bb676878^ --hard
git push origin -f
上記のすべてのコマンドは、コミットを行う前の状態で作業ツリーとインデックスの状態を復元しますが、リポジトリの状態は復元しません。それを見ると、「削除された」コミットは実際には削除されておらず、単に現在のブランチの先端にあるものではありません。
磁器のコマンドでコミットを削除する手段はないと思います。唯一の方法は、ログとreflogから削除してから、を実行することgit prune --expire -now
です。
これを行う別の方法は次のとおりです。
復元するブランチをチェックアウトしてから、ローカルの作業コピーをリセットして、リモートサーバー上で最新のブランチにしたいコミットに戻します(それ以降はすべてバイバイになります)。これを行うには、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つのブランチのみが消去されます。
コミットと復帰を表示して履歴を保持したい場合は、以下を使用する必要があります。
git revert GIT_COMMIT_HASH
なぜ元に戻すのかを説明するメッセージを入力してから、次のようにします。
git push
発行git log
すると、「間違った」コミットと元に戻すログメッセージの両方が表示されます。
間違い:
私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
良い一日を。
最後のコミットを台無しにして(間違ったメッセージ、いくつかの変更を追加するのを忘れた)、公開リポジトリにプッシュする前に修正したい場合は、次を使用してください。
git commit --amend -m "New message here"
新しくステージングされた変更がある場合、それらは最後のコミット(削除しようとしている)と組み合わされ、そのコミットを置き換えます。
もちろん、プッシュした後にコミットを修正すると、履歴が書き換えられるので、それを行う場合は、その影響を必ず理解してください。
前のコミットのメッセージを使用したい場合は、「-m」の代わりに「--no-edit」オプションを渡すこともできます。
ドキュメント: http: //git-scm.com/docs/git-commit.html
すでにプッシュしている場合は、最初に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
この助けを願っています
私はすでにプッシュしました。一部のコミットをリモートで返す必要があります。多くのバリエーションを試しましたが、 Justinからgitbush経由でこれだけがうまく機能しています:
git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
ローカルブランチでリセット
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~1
これで前の頭になります。枝を引っ張る。新しいコードをプッシュします。コミットはgitから削除されます
一時フォルダにコードのバックアップを取ります。次のコマンドはサーバーと同じようにリセットされます。
git reset --hard HEAD
git clean -f
git pull
変更を保持し、最近のコミットを削除する場合
git reset --soft HEAD^
git pull
上の画像でわかるように、revert "test change 2" commit(SHA1 ID:015b5220c50e3dfbb1063f23789d92ae1d3481a2gitk
(gitbashのコマンドを使用してSHA1IDを取得できます))を削除します。
そのために私は使用できます(以下のコマンドはすべてローカルでのみ機能します。削除後にプッシュする必要があります):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
//そのコミットにバックアップします(テスト変更4コミットのSHA1 IDは515b5220c50e3dfbb1063f23789d92ae1d3481a2です)git reset --hard HEAD~1
//1つのコミットの前にバックアップします。git reset --hard HEAD^
//最後のコミットをgitから削除するには削除後:
git reset --hard
git push origin HEAD --force
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を使用する他のローカルでのプルの競合を回避しながらリポジトリサイズを減らすための私の方法になりました
git revert https://git-scm.com/docs/git-revertを使用します。すべてのコードが元に戻り、次のコミットを実行できます。次に、ヘッドがその最後のコミットをポイントします。元に戻されたコミットは削除されませんが、最後のコミットには影響しません。
私の場合、この目的のための私の魔法のコードはこれです:
git reset --hard @{u}
それをテストして教えてください。私はいくつかの異なるものを試しましたが、これが私を助けた唯一のものでした。
ここに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:これはあなたの古いコミット履歴を保持しません。
リモートリポジトリにプッシュしていないと仮定すると、リポジトリのクローンを再作成できます。これは私の選択の数回です。