Gitで特定のコミットにロールバックするにはどうすればいいですか?
私が望むコミットに達するまで、誰かが私にくれる最も良い答えはgit revert
X回を使うことでした。
それでは、20コミット前のコミットに戻したいとしましょう。20回実行する必要があります。
もっと簡単な方法はありますか?
このリポジトリは公開されているのでresetを使用することはできません。
これを試して:
git checkout [revision] .
[revision]
はコミットハッシュです(例:12345678901234567890123456789012345678ab
)。
最後の.
を忘れないでください、非常に重要です。これはツリー全体に変更を適用します。このコマンドはgitプロジェクトのルートで実行する必要があります。サブディレクトリにいる場合、このコマンドは現在のディレクトリ内のファイルのみを変更します。それからコミットしてください、そしてあなたは良いはずです。
これを元に戻すことができます
git reset --hard
作業ディレクトリとステージング領域からすべての変更が削除されます。
特定のコミットにロールバックするには
git reset --hard commit_sha
10コミットをロールバックするには:
git reset --hard HEAD~10
履歴を書き換えたくない場合は、次の記事のように "git revert"を使用できます。
問題は、「ロールバック」とはどういう意味ですか。あなたがreset
を公開できないためにコミットできず、コミット履歴をそのまま残したいのなら、作業コピーに特定のコミットを反映させたいだけなのでしょうか。 git checkout
とコミットハッシュを使います。
編集:コメントで指摘されたように、ブランチを指定せずにgit checkout
を使うことはあなたを「ブランチなし」状態にしておくでしょう。ブランチにチェックアウトするにはgit checkout <commit> -b <branchname>
を、現在のブランチにチェックアウトするにはgit checkout <commit> .
を使用してください。
元のポスターの状態:
誰かが私に与えることができる最善の答えは、希望するコミットに達するまで
git revert
X回使用することでした。そこで、20コミットのコミットに戻したいとしましょう。20回実行する必要があります。
これを行う簡単な方法はありますか?
このレポは公開されているため、リセットを使用できません。
git revert
をX回使用する必要はありません。 git revert
はコミット範囲を引数として受け入れることができるため、コミット範囲を元に戻すために1回だけ使用する必要があります。たとえば、最後の20件のコミットを元に戻したい場合:
git revert --no-edit HEAD~20..
コミット範囲HEAD~20..
はHEAD~20..HEAD
の略で、「20番目 HEADコミットの親であり、その後のすべてのコミットをHEADに戻します」。
これにより、最後の20個のコミットが元に戻ります。これらのいずれもマージコミットではないと仮定します。コミットをマージすると、1つのコマンドですべてを元に戻すことはできません。次のコマンドで個別に元に戻す必要があります。
git revert -m 1 <merge-commit>
gitバージョン1.9.0を使用してgit revert
の範囲を使用してテストしたことにも注意してください。の古いバージョンを使用している場合git、git revert
で範囲を使用すると、機能する場合と機能しない場合があります。
この場合、git revert
がgit checkout
より優先されます。
git checkout
を使用するように言っているこの回答 とは異なり、git revert
は実際にコミットで追加されたファイルをすべて削除することに注意してください。あなたは元に戻しています。これにより、これがリビジョンの範囲を元に戻す正しい方法になります。
ステップ1: /コミットのリストを取得する:
git log
この例のようにリストが表示されます。
[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <[email protected]>
Date: Fri Jul 8 23:42:22 2016 +0300
This is last commit message
commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <[email protected]>
Date: Fri Jun 24 20:20:24 2016 +0300
This is previous commit message
commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <[email protected]>
Date: Thu Jun 23 00:41:55 2016 +0300
This is previous previous commit message
...
ステップ2: /必要なコミットハッシュをコピーしてチェックアウト用に貼り付けます。
git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f
それで全部です。
git read-tree -um @ $commit_to_revert_to
やります。これは「git checkout」ですが、HEADを更新しません。
あなたはと同じ効果を達成することができます
git checkout $commit_to_revert_to
git reset --soft @{1}
便利なコマンドをまとめて文字列にしたい場合。
これらはあなたのワークツリーとインデックスを望みの状態にしたままにします、あなたはgit commit
を終了することができます。
何が変わったのかはわかりませんが、オプション--detach
がないと特定のコミットをチェックアウトできません。私のために働いた完全なコマンドは次のとおりです。git checkout --detach [commit hash]
デタッチ状態から戻るには、私のローカルブランチをチェックアウトしなければなりませんでした:git checkout master
これを行うための例です。
cd /yourprojects/project-acme
git checkout efc11170c78 .
各コミットに関連するコミットIDはGitHub/BitBucket/Gitlabのコミットセクションにあります。その非常に単純な、あなたのコミットIDが 5889575 であると仮定するなら、あなたがあなたのコードのこの部分に戻りたいなら、あなたは単にタイプする必要があります
git checkout 5889575 .
これにより、コード内のその時点に移動します。
絶対に誰もデタッチヘッドモードについて言及していないと信じるのは難しいと思います。
もしあなたがX時間をDETACHED HEADを使って特定のコミットまでロールバックしたいのであれば(どうしても#€%&何もできないことを意味します)、次のようにしてください。
(Xをコミットしたいコミット数に置き換えてください)
git checkout HEAD~X
I.E.もう一度コミットする
git checkout HEAD~1
あなたがプロジェクトに取り組んでいて、1日かそこら後に働いたとしましょう。あなたは1つの機能がまだあなたにエラーを与えているのに気付きます。しかし、あなたが行った変更がエラーの原因となったことがわかりません。だからあなたは以前の作業コミットをフィッシングしなければなりません。特定のコミットに戻るには
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
それで、コミットはあなたのために働くのです。これ以上エラーはありません。あなたは問題を特定しました。これで最新のコミットに戻ることができます。
git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
エラーが発生する前に特定のファイルをチェックアウトします(私の場合はGemfile.lockの例を使用します)。
git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock
そしてこれは、後でエラーを認識することなく、コミットで作成したエラーを処理する1つの方法です。