の前のいくつかのコミットであるいくつかのコミットがありHEAD
ます。コミット中に、気付かなかった段階的な変更がいくつかありました。私の目を見て、git log
これらの望ましくない変化に気づきました。グーグルで検索'undo changes for an arbitrary commit'
すると、コミット全体を元に戻し、インデックスの変更を削除することで多くの結果が返されます。しかし、この任意のコミットでこれらの変更を削除する方法は何ですか?
まず、作業ツリーがクリーンであることを確認してください。git status
これを見つけるのに役立ちます。コミットされるのを待っている変更を報告するべきではありません。変更がある場合は、どちらかそれらをコミット(一時的なブランチに必要な場合)、またはでき隠しておくそれらを。
作業ツリーがクリーンであることを確認したら、現在のコミットにブランチを作成しますが、チェックアウトはしません。
$ git branch backup
これは実際には必要ありません。代わりに reflog を使用できますが、この方法の方が簡単です (より見やすくなります)。backup
は、私がブランチに選んだ名前であり、特別なものではありません。唯一の制約は、それがまだ存在してはならないということです。
過去の 3 番目のコミットを変更したいと仮定して、次を実行します。
$ git rebase --interactive HEAD~4
Git は、デフォルトのエディターで、コンテンツが次のような一時ファイルを開きます。
pick 7f0c5e794 the commit you want to change
pick 9f96dcae9 commit message #2
pick 02ed04062 commit message #3
pick beac35780 the most recent commit
これがリベースの予定です。もちろん、過去 3 回のコミットのハッシュとサブジェクトが含まれています。それらは、HEAD~4
時系列順 (古い順) で( のため)最後の 4 つのコミットです。
変更したいコミットの行 (最初の行) を編集します。変更pick
しedit
てファイルを保存し、エディターを終了します。
エディターを終了すると、Git はリベースを開始します。コミットHEAD~3
をチェックアウトして終了edit
し、プランで要求されたとおりにコミットできるようにします。
必要な変更を加えてステージングし、実行git commit --amend
してコミット (目標) を変更します。変更を行う最良の方法は、次を実行することです。
$ git reset --mixed HEAD~1
これにより、リポジトリは変更したいコミットの前の状態になり、作業ツリーでファイルが変更され、インデックスには何も追加されません。必要なファイルのみをインデックスに追加し、コミットします (なし --amend
)。これは、あなたが望んでいた「編集済み」の1コミットです。
コミットを編集した後も、まだコミットされていない変更が作業ツリーに残っています。それらをコミットする (元の履歴に存在しなかった新しいコミットを作成する) か、それらを stash する (そしてリベースを完了した後に適用する) か、完全に破棄する (git reset --hard
実行する; 本当に必要ないことを確認してください)このコマンドを実行する前にそれらを参照してください)。
コミットされていない変更の問題を何らかの方法で解決したら、次を実行します。
$ git rebase --continue
Git はリベースを続行します。計画で伝えたように、他のコミットを処理します。私たちの計画はpick
他のコミットについて言及しており、これは、Git は変更したくないこれらのコミットの変更のみを適用することを意味します。
すべてがうまくいけば、このコマンドが完了すると、希望どおりの新しい履歴行が作成されます。それがあなたが望むように見えない場合は、実行できます
$ git reset --hard backup
最初の場所に戻って最初からやり直すこと。
リベースが正常に完了しない場合 (競合が発生する可能性があります)、 を実行することでいつでも中止できますgit rebase --abort
。Git はすべての変更を元に戻し、開始した場所 (backup
ブランチが指すコミット上) に戻ります。
または、競合を解決しgit rebase --continue
、リベースが完了するまでコミットして実行することができます。
何らかの方法でリベースを終了し、結果に満足するか、過去のコミットを変更するという考えをやめたら、実行git branch -D backup
してバックアップ ブランチを削除します。
1 Git のコミットは不変です。コミットを編集することはできません。実際、コミットを「編集」すると、古いコミットの代わりに使用される新しいコミットが作成されます。もちろん、新しいコミットには元のコミットとは異なるハッシュがあります。
古いコミットはまだリポジトリに存在し、そのハッシュまたはブランチを使用してアクセスできます。アクセスに使用できるブランチがなく、reflogにそのブランチへの参照がない場合、コミット オブジェクトは次のガベージ コレクション サイクルで削除されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加