web-dev-qa-db-ja.com

公開リポジトリで古いGitコミットにロールバック

Gitで特定のコミットにロールバックするにはどうすればいいですか?

私が望むコミットに達するまで、誰かが私にくれる最も良い答えはgit revert X回を使うことでした。

それでは、20コミット前のコミットに戻したいとしましょう。20回実行する必要があります。

もっと簡単な方法はありますか?

このリポジトリは公開されているのでresetを使用することはできません。

710
David

これを試して:

git checkout [revision] .

[revision]はコミットハッシュです(例:12345678901234567890123456789012345678ab)。

最後の.を忘れないでください、非常に重要です。これはツリー全体に変更を適用します。このコマンドはgitプロジェクトのルートで実行する必要があります。サブディレクトリにいる場合、このコマンドは現在のディレクトリ内のファイルのみを変更します。それからコミットしてください、そしてあなたは良いはずです。

これを元に戻すことができます

git reset --hard 

作業ディレクトリとステージング領域からすべての変更が削除されます。

1058
Alex Reisner

特定のコミットにロールバックするには

git reset --hard commit_sha

10コミットをロールバックするには:

git reset --hard HEAD~10

履歴を書き換えたくない場合は、次の記事のように "git revert"を使用できます。

Gitリポジトリを以前のコミットに戻すには?

178
Naga Kiran

問題は、「ロールバック」とはどういう意味ですか。あなたがresetを公開できないためにコミットできず、コミット履歴をそのまま残したいのなら、作業コピーに特定のコミットを反映させたいだけなのでしょうか。 git checkoutとコミットハッシュを使います。

編集:コメントで指摘されたように、ブランチを指定せずにgit checkoutを使うことはあなたを「ブランチなし」状態にしておくでしょう。ブランチにチェックアウトするにはgit checkout <commit> -b <branchname>を、現在のブランチにチェックアウトするにはgit checkout <commit> .を使用してください。

83
Ben

元のポスターの状態:

誰かが私に与えることができる最善の答えは、希望するコミットに達するまで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 revertgit checkoutより優先されます。

git checkoutを使用するように言っているこの回答 とは異なり、git revertは実際にコミットで追加されたファイルをすべて削除することに注意してください。あなたは元に戻しています。これにより、これがリビジョンの範囲を元に戻す正しい方法になります。

ドキュメンテーション

39
user456814

ステップ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

それで全部です。

23
Igor
git read-tree -um @ $commit_to_revert_to

やります。これは「git checkout」ですが、HEADを更新しません。

あなたはと同じ効果を達成することができます

git checkout $commit_to_revert_to
git reset --soft @{1}

便利なコマンドをまとめて文字列にしたい場合。

これらはあなたのワークツリーとインデックスを望みの状態にしたままにします、あなたはgit commitを終了することができます。

10
jthill

何が変わったのかはわかりませんが、オプション--detachがないと特定のコミットをチェックアウトできません。私のために働いた完全なコマンドは次のとおりです。git checkout --detach [commit hash]

デタッチ状態から戻るには、私のローカルブランチをチェックアウトしなければなりませんでした:git checkout master

1
ken

これを行うための例です。

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
0
mcvkr

各コミットに関連するコミットIDはGitHub/BitBucket/Gitlabのコミットセクションにあります。その非常に単純な、あなたのコミットIDが 5889575 であると仮定するなら、あなたがあなたのコードのこの部分に戻りたいなら、あなたは単にタイプする必要があります

git checkout 5889575 .

これにより、コード内のその時点に移動します。

0
Naved Ahmad

HEAD切り離しモードが必要ですか。

絶対に誰もデタッチヘッドモードについて言及していないと信じるのは難しいと思います。

もしあなたがX時間をDETACHED HEADを使って特定のコミットまでロールバックしたいのであれば(どうしても#€%&何もできないことを意味します)、次のようにしてください。

(Xをコミットしたいコミット数に置き換えてください)

git checkout HEAD~X

I.E.もう一度コミットする

git checkout HEAD~1
0
Karl Morrison

あなたがプロジェクトに取り組んでいて、1日かそこら後に働いたとしましょう。あなたは1つの機能がまだあなたにエラーを与えているのに気付きます。しかし、あなたが行った変更がエラーの原因となったことがわかりません。だからあなたは以前の作業コミットをフィッシングしなければなりません。特定のコミットに戻るには

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

それで、コミットはあなたのために働くのです。これ以上エラーはありません。あなたは問題を特定しました。これで最新のコミットに戻ることができます。

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

エラーが発生する前に特定のファイルをチェックアウトします(私の場合はGemfile.lockの例を使用します)。

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

そしてこれは、後でエラーを認識することなく、コミットで作成したエラーを処理する1つの方法です。

0
Donato