以前のコミットを誤って修正しました。特定のファイルに加えた変更の履歴を保持するには、コミットを個別にする必要がありました。
最後のコミットを元に戻す方法はありますか?のようなことをするgit reset --hard HEAD^と、最初のコミットも元に戻されます。
(私はまだリモートディレクトリにプッシュしていません)
以前のコミットを誤って修正しました。特定のファイルに加えた変更の履歴を保持するには、コミットを個別にする必要がありました。
最後のコミットを元に戻す方法はありますか?のようなことをするgit reset --hard HEAD^と、最初のコミットも元に戻されます。
(私はまだリモートディレクトリにプッシュしていません)
回答:
現在のHEADコミットと同じ詳細で、親を以前のバージョンのとして新しいコミットを作成する必要がありますHEAD。git reset --soft次のコミットが現在のブランチヘッドのある場所とは異なるコミットの上で行われるように、ブランチポインタを移動します。
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
git commit --amendます。2番目は、新しいコミットへの「やり直し」です。これらはgit commit、単に機能するだけでなく、すべての機能を果たします--amend。
git commitます。
git reset --soft HEAD@{1}:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions。(JJDに感謝!)にHEAD@{1}示されている同等のコミットハッシュに置き換えたところgit reflog、この答えはすばらしいものでした
HEAD@{1}。echo HEAD@{1}たとえばtcshで実行すると、出力はHEAD@1中括弧がtcshによって解釈されたためです。単一引用符を使用すると、中括弧が保持されます。
git branch fixing-things HEAD@{1}
git reset fixing-things
次に、以前に修正したすべての変更を作業コピーにのみ入れ、再度コミットできます
以前のインデックスタイプの完全なリストを表示するには git reflog
HEAD@{1}ありHEAD~1ますか?
HEAD~1まったく同じでHEAD^、識別子です。一方、これはHEADがこのコミットの前に指し示したコミットを指します。つまり、別のブランチをチェックアウトしたり、コミットを修正したりすると、別のコミットを意味します。HEAD@{1}
git reset HEAD@{1}で十分です。
修正したコミットを見つけるには:
git log --reflog
注:--patch明確にするために、コミットの本文を表示するために追加できます。と同じgit reflog。
次に、以下の方法で問題がなかった時点で、HEADを以前のコミットにリセットします。
git reset SHA1 --hard
注:SHA1を実際のコミットハッシュに置き換えます。また、このコマンドはコミットされていない変更をすべて失うため、以前に隠しておくこともできます。または、代わりにを使用--softして最新の変更を保持してからコミットします。
次に、その上に必要な他のコミットをチェリーピックします。
git cherry-pick SHA1
git reset SHA1 --soft、最新の変更を保持してコミットできます。
git reflog必要なのはこれだけです
git reset代わりにgit reset --soft行い、その後、git add --patch。
エディターにコミットメッセージが表示されている場合は、コミットメッセージを削除するとgit commit --amendコマンドが中止されることに注意してください。
コミットをリモートにプッシュし、そのコミットへの変更を誤って修正した場合、これで問題が解決します。git logコミットの前にSHAを見つけるためにa を発行します。(これは、リモートがoriginという名前であると想定しています)。次に、そのSHAを使用してこれらのコマンドを発行します。
git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone
#save ALL the changes to the stash
git stash
git pull origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend
git stash pop
#git status reveals only the changes you incorrectly amended
#now you can create your new unamended commit
あなたはあなたの元に戻すために以下を行うことができます git commit —amend
git reset --soft HEAD^git checkout files_from_old_commit_on_branchgit pull origin your_branch_name====================================
これで、変更は以前と同じです。これで、元に戻す操作が完了しましたgit commit —amend
これでgit push origin <your_branch_name>、ブランチにプッシュすることができます。
これまでほぼ9年遅れましたが、このバリエーションが同じことを達成することについて言及されていませんでした(これは、これらのいくつかの組み合わせのようなもので、トップアンサー(https://stackoverflow.com/a/1459264/4642530)に似ています) 。
ブランチ上のすべての切り離されたヘッドを検索します
git reflog show origin/BRANCH_NAME --date=relative
次に、SHA1ハッシュを見つけます
古いSHA1にリセット
git reset --hard SHA1
次に、押し上げます。
git push origin BRANCH_NAME
できました。
これにより、以前のコミットに完全に戻ります。
(以前に上書きされたデタッチされたコミットヘッドの日付を含む)
--softは変更を保持するためにリセットしたいと思います。私はそれを個別にコミットしたいだけです
最後のコミットで一時ブランチにチェックアウト
git branch temp HEAD@{1}
最後のコミットをリセット
git reset temp
これで、すべてのファイルが以前のコミットと同様にコミットされます。すべてのファイルのステータスを確認します。
git status
gitステージからコミットファイルをリセットします。
git reset myfile1.js (など)
このコミットを再アタッチ
git commit -C HEAD@{1}
ファイルを追加して新しいコミットにコミットします。
git reflogして、正しい番号を見つけることも行いました{2}。