誤って前のコミットを修正しました。コミットは私が特定のファイルに対して行った変更の履歴を保持するために別々であるべきでした。
最後のコミットを元に戻す方法はありますか? 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
注:Replace SHA1と実際のコミットハッシュを使用してください。また、このコマンドはコミットされていない変更を失ったするので、それらを前に隠しておくこともできます。あるいは、代わりに最新の変更を保持するために--soft
を使用してください _そしてそれらをコミットします。
それから、あなたが必要としている他のコミットをチェリーピックしてください。
git cherry-pick SHA1
いつでもコミットを分割できます、 manual から
修正前と修正後に2つのコミットを得るためにgit reflog
を使うこともできます。
それからgit diff before_commit_id after_commit_id > d.diff
を使って修正前と修正後の差分を取得します。
次にgit checkout before_commit_id
を使ってコミット前に戻ります
そして最後にgit apply d.diff
を使ってあなたが行った本当の変更を適用します。
それは私の問題を解決します。
まだコミットメッセージがあるエディタにいる場合は、コミットメッセージを削除するとgit commit --amend
コマンドが中止されることに注意してください。
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}
ファイルを新しいコミットに追加してコミットします。
あなたがリモートにコミットし、それからそのコミットへの誤って修正を修正した場合、これはあなたの問題を修正するでしょう。コミットの前にSHAを見つけるためにgit log
を発行してください。 (これはremoteが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