1649

以前のコミットを誤って修正しました。特定のファイルに加えた変更の履歴を保持するために、コミットは分離されている必要があります。

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

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

4

12 に答える 12

2910

あなたがする必要があるのは、現在のHEADコミットと同じ詳細で、しかし親が以前のバージョンのである新しいコミットを作成することですHEADgit 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}
于 2009-09-22T10:23:44.350 に答える
170

ref-logを使用します:

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

その後、以前に修正したすべての変更を作業コピーにのみ入れて、再度コミットできるようにする必要があります

以前のインデックスタイプの完全なリストを表示するにはgit reflog

于 2009-09-22T10:02:55.730 に答える
120

次の方法で修正されたコミットを見つけます。

git log --reflog

注:--patchわかりやすくするために、コミットの本文を確認するために追加することができます。と同じgit reflog

次に、次の方法で問題がなかった時点で、HEADを以前のコミットにリセットします。

git reset SHA1 --hard

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

次に、その上に必要な他のコミットをチェリーピックします。

git cherry-pick SHA1
于 2016-03-27T01:56:18.807 に答える
74

を使用したこれらの答えはどれも私にとっては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コミットと誤ってマージしたすべての変更が含まれるようになります。

于 2021-01-30T19:49:55.723 に答える
30

コミットをリモートにプッシュしてから、そのコミットへの変更を誤って修正した場合、これで問題が解決します。コミットする前に、を発行し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
于 2019-04-24T18:26:25.177 に答える
25

あなたはいつでもコミットを分割することができます、マニュアルから

  • git rebase -i commit ^を使用してインタラクティブなリベースを開始します。ここで、commitは分割するコミットです。実際、そのコミットが含まれている限り、どのコミット範囲でもかまいません。
  • 分割するコミットをアクション「編集」でマークします。
  • そのコミットを編集する場合は、git resetHEAD^を実行します。その効果は、HEADが1つ巻き戻され、インデックスがそれに追随することです。ただし、作業ツリーは同じままです。
  • 次に、最初のコミットで必要な変更をインデックスに追加します。これを行うには、git add(おそらくインタラクティブ)またはgit-gui(またはその両方)を使用できます。
  • 現在適切なコミットメッセージを使用して、現在のインデックスをコミットします。
  • 作業ツリーがきれいになるまで、最後の2つの手順を繰り返します。
  • gitrebase--continueを使用してリベースを続行します。
于 2009-09-22T10:01:22.310 に答える
24

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

于 2017-03-03T18:45:09.960 に答える
20

たぶんgit reflog、修正前と修正後に2つのコミットを取得するために使用できます。

次に、を使用git diff before_commit_id after_commit_id > d.diffして、修正前と修正後の差分を取得します。

git checkout before_commit_idコミットする前に戻るための次の使用

そして最後に使用git apply d.diffして、実際に行った変更を適用します。

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

于 2016-09-20T12:39:49.167 に答える
10

あなたはあなたの元に戻すために以下を行うことができます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>これで、ブランチにプッシュすることができます。

于 2018-06-25T11:46:23.123 に答える
8

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

終わり。

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

(以前に上書きされた切り離されたコミットヘッドの日付を含む)

于 2018-06-17T21:55:20.993 に答える
3
  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. ファイルを追加して新しいコミットにコミットします。

于 2016-03-04T07:28:58.390 に答える
3

シンプルなソリューション ソリューションが機能する場合:HEADコミットがリモートコミットと同期している場合。

  • ローカルワークスペースにもう1つのブランチを作成し、リモートブランチとの同期を維持します。
  • 新しく作成されたブランチに対して実行されたブランチ(git commit --amend)からHEADコミットをチェリーピックします。

厳選されたコミットには、古い変更ではなく、最新の変更のみが含まれます。これで、このコミットの名前を変更できます。

于 2020-09-10T13:47:39.440 に答える