以前のコミットを誤って修正しました。特定のファイルに加えた変更の履歴を保持するには、コミットを個別にする必要がありました。
最後のコミットを元に戻す方法はありますか?のようなことをする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_branch
git 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}
。