web-dev-qa-db-ja.com

Git commitの代わりにgit commit --amendを元に戻す方法

誤って前のコミットを修正しました。コミットは私が特定のファイルに対して行った変更の履歴を保持するために別々であるべきでした。

最後のコミットを元に戻す方法はありますか? git reset --hard HEAD^のようなことをした場合、最初のコミットもまた元に戻されます。

(私はまだどのリモートディレクトリにもプッシュしていません)

1083

あなたがする必要があるのは現在の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}
1900
CB Bailey

ref-log :を使用してください。

git branch fixing-things HEAD@{1}
git reset fixing-things

あなたはそれまでに修正したすべての変更をあなたの作業コピーにのみ持つべきであり、再びコミットすることができます。

以前のインデックスタイプの全リストを見るにはgit reflog

116
knittl

次の方法であなたの修正したコミットを見つけてください。

git log --reflog

注:明確にするためにコミットの本文を見るために--patchを追加することができます。 git reflogと同じです。

その後、以下のようにしてHEADを以前のコミットにリセットします。

git reset SHA1 --hard

注:Replace SHA1と実際のコミットハッシュを使用してください。また、このコマンドはコミットされていない変更を失ったするので、それらを前に隠しておくこともできます。あるいは、代わりに最新の変更を保持するために--softを使用してください _そしてそれらをコミットします。

それから、あなたが必要としている他のコミットをチェリーピックしてください。

git cherry-pick SHA1
47
kenorb

いつでもコミットを分割できます、 manual から

  • 対話式リベースを開始するには、git rebase -i commit ^を使用します。ここで、commitは分割するコミットです。実際、そのコミットが含まれている限り、どのようなコミット範囲でも可能です。
  • 分割したいコミットをアクション "edit"でマークします。
  • そのコミットの編集に関しては、git reset HEAD ^を実行してください。その結果、HEADが1つ巻き戻され、インデックスがそれに従います。ただし、作業ツリーは変わりません。
  • それでは、最初のコミットで変更したいインデックスに追加しましょう。そのためには、git add(おそらく対話的に)またはgit-gui(あるいはその両方)を使用できます。
  • 適切なコミットメッセージを使用して、現在のインデックスをコミットします。
  • 作業ツリーがきれいになるまで、最後の2つの手順を繰り返します。
  • Git rebase --continueでリベースを続けます。
22
Arkaitz Jimenez

修正前と修正後に2つのコミットを得るためにgit reflogを使うこともできます。

それからgit diff before_commit_id after_commit_id > d.diffを使って修正前と修正後の差分を取得します。

次にgit checkout before_commit_idを使ってコミット前に戻ります

そして最後にgit apply d.diffを使ってあなたが行った本当の変更を適用します。

それは私の問題を解決します。

13
utzcoz

まだコミットメッセージがあるエディタにいる場合は、コミットメッセージを削除するとgit commit --amendコマンドが中止されることに注意してください。

13
Justin Schulz

git commit —amendを元に戻すには、以下の操作を行います。

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull Origin your_branch_name

===================================

今あなたの変更は前の通りです。 git commit —amendの取り消しは完了です。

これでgit Push Origin <your_branch_name>を実行してブランチにプッシュできます。

3
Pratik

これにはほぼ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

完了しました。

これにより、元のコミットに完全に戻ります。

(以前に上書きされたデタッチされたコミットヘッドの日付を含む)

2
garrettmac
  1. 最後のコミットで一時ブランチにチェックアウト

    git branch temp HEAD@{1}

  2. 最後のコミットをリセット

    git reset temp

  3. 今、あなたはあなたのコミットと前のコミットの全てのファイルを持っているでしょう。すべてのファイルの状況を確認してください。

    git status

  4. コミットファイルをgitステージからリセットします。

    git reset myfile1.js(など)

  5. このコミットをやり直す

    git commit -C HEAD@{1}

  6. ファイルを新しいコミットに追加してコミットします。

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
1
David Sopko