以前のコミットを誤って修正しました。特定のファイルに加えた変更の履歴を保持するために、コミットは分離されている必要があります。
その最後のコミットを元に戻す方法はありますか?のようなことを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}
ref-logを使用します:
git branch fixing-things HEAD@{1}
git reset fixing-things
その後、以前に修正したすべての変更を作業コピーにのみ入れて、再度コミットできるようにする必要があります
以前のインデックスタイプの完全なリストを表示するにはgit reflog
次の方法で修正されたコミットを見つけます。
git log --reflog
注:--patch
わかりやすくするために、コミットの本文を確認するために追加することができます。と同じgit reflog
。
次に、次の方法で問題がなかった時点で、HEADを以前のコミットにリセットします。
git reset SHA1 --hard
注:SHA1を実際のコミットハッシュに置き換えてください。また、このコマンドはコミットされていない変更を失うため、前にそれらを隠しておくことができることに注意してください。または、代わりにを使用--soft
して最新の変更を保持してからコミットします。
次に、その上に必要な他のコミットをチェリーピックします。
git cherry-pick SHA1
を使用したこれらの答えはどれも私にとってはHEAD@{1}
うまくいきませんでしたので、ここに私の解決策があります:
git reflog
d0c9f22 HEAD@{0}: commit (amend): [Feature] - ABC Commit Description
c296452 HEAD@{1}: commit: [Feature] - ABC Commit Description
git reset --soft c296452
これで、ステージング環境に、c296452コミットと誤ってマージしたすべての変更が含まれるようになります。
コミットをリモートにプッシュしてから、そのコミットへの変更を誤って修正した場合、これで問題が解決します。コミットする前に、を発行しgit log
てSHAを見つけます。(これは、リモートが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 reflog
、修正前と修正後に2つのコミットを取得するために使用できます。
次に、を使用git diff before_commit_id after_commit_id > d.diff
して、修正前と修正後の差分を取得します。
git checkout before_commit_id
コミットする前に戻るための次の使用
そして最後に使用git apply d.diff
して、実際に行った変更を適用します。
それは私の問題を解決します。
あなたはあなたの元に戻すために以下を行うことができます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
終わり。
これにより、完全に古いコミットに戻ります。
(以前に上書きされた切り離されたコミットヘッドの日付を含む)
最後のコミットで一時ブランチにチェックアウト
git branch temp HEAD@{1}
最後のコミットをリセット
git reset temp
これで、以前のコミットだけでなく、コミットしたすべてのファイルが作成されます。すべてのファイルのステータスを確認してください。
git status
コミットファイルをgitステージからリセットします。
git reset myfile1.js
(すぐ)
このコミットを再添付する
git commit -C HEAD@{1}
ファイルを追加して新しいコミットにコミットします。
シンプルなソリューション ソリューションが機能する場合:HEADコミットがリモートコミットと同期している場合。
厳選されたコミットには、古い変更ではなく、最新の変更のみが含まれます。これで、このコミットの名前を変更できます。