2015-12-03 17 views
9

私が誤って走っ:私のリモートgitリポジトリを特定のコミットに戻すには?

git push origin +master 

私のGitHubリポジトリにファイルをプッシュしようとしているとき。このコマンドは、すべてのコミット履歴をリセットし、いくつかのファイルを削除しました。

私のレポをcertain commit having the hash 94b90dc1121ce477131fa60ffdc234591554b6c8にリセットする方法があるのだろうかと思っていました。ここで

+1

私はその変更を知りませんでした。私は、リモートコミットが参照されないようにするrefspecを使ったプッシュは、それが適用される前に '-f'オプションを必要とすると思います。 –

+0

[Gitを使用して特定のリビジョンに特定のファイルをリセットまたは元に戻すことができますか?](http://stackoverflow.com/questions/215718/reset-or-revert-a-specific-file-to-a-specific- revision-using-git) – ErTR

答えて

10
git checkout master 
git reset --hard 94b90dc1121ce477131fa60ffdc234591554b6c8 
git push -f origin master 

がcommmandsの説明だ...

まず、あなたはmasterブランチ上にあるので、マスターにごHEADポイントようcheckoutコマンドを使用していることを確認してみましょう。

HEADとは何ですか? これは基本的に、Gitが現在Gitツリーにいる場所を指し示すポインタです。

実際、HEADやブランチのような概念のほとんどは、ツリー内の異なるポイントへのポインタに過ぎません。 コマンドラインからgitkを実行して、素晴らしいグラフィック形式のツリーを表示します。

次に、元の質問にあった正確なコミットへのHEADポインタをresetとしましょう。これは、基本的にファイルシステムのファイルをコミットするようにします。

あなたは素晴らしい仕事やコミットがまだサーバーにプッシュされていない場合、これが "到達不能"になることがあります。 "このコマンドからコミットすると、普通はreflogを使って戻すことができます。

最後に、マスターブランチのローカルステートをGitHubのマスターブランチにプッシュします。ブランチの履歴を書き直しているので、Gitに "強制"させる必要があるので、-fがそこにあります。

+0

ありがとうございました! – user2821370

+0

これは有効な解決策ですが、gitの機能を理解するためにこれらのコマンドが何をしているのかを詳しく説明しておけばうれしいでしょう。 – k0pernikus

3

ジョナサンの答えは正しいです。これを達成する別の方法は次のとおりです。

git push -f origin 94b90dc1121ce477131fa60ffdc234591554b6c8:master 
+0

Jonathanの答えに構文的に砂糖が使われているのですか、それとも内部で異なった働きをしていますか? – k0pernikus

+0

申し訳ありませんが、私はあなたの方法を試していませんでした。ジョナサンはすでに働いていました。どうもありがとう! – user2821370

+1

@ k0pernikus:主に構文糖です。 Jonathanはローカルの「マスター」を最初に正しいコミットに設定し、それを強制的に起点/マスターに押しますが、この力は地元の「マスター」ブランチを最初に設定せずに参照を原点/マスターに直接プッシュします。 – xbonez

関連する問題