git pullを元に戻す、リポジトリを古い状態にする方法


1006

ソース/リポジトリがgit pullを実行する前の古い状態になるように、git pullを元に戻すまたは元に戻す方法はありますか?したくないいくつかのファイルをマージしたので、これを行いたいが、他の残りのファイルのみをマージした。それで、それらのファイルを取り戻したいのですが、それは可能ですか?

編集:私は説明のためにgitマージを元に戻したいです。いくつかの答えを見た後、私はこれをしました

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

今、私は何をすべきですか?やってgit reset --hard OKですか?もうねじ込みたくないので、詳細な手順を尋ねますか?


23
履歴には、クローンとフェッチの2つしかないようです。クローンにリセットするだけです: git reset --hard 01b34faこの場合git reset --hard HEAD^、HEADの前に1つのコミットにリセットすることができます。
jkp

2
--hardは、作業ディレクトリのファイルを変更する場合に必要です
William Pursell 09

3
@ seg.server.fault:うまくいった場合、いつでも答えを受け入れることができます;)
jkp

7
git reset --hard HEAD ^
funroll

7
git refloggitで何が行われたかをすべて表示します。にgit reset --hard [sha1 of something from reflog]表示されているものすべてを元に戻す懸念がありreflogます。不正なデータ(ハプン)のあるオリジンからプルされたマスターブランチのマージを元に戻し、その後、他のブランチで作業した。reflog他のブランチのすべての変更を表示します。ただしgit checkout mastergit reset --hard [SH1 of commit on master branch just before merge]現在のマスターブランチのみをリセットし、オリジンからプルされたマージを削除します。
Vladimir Vukanac 2015

回答:


1427

実行git pullすると、次のタスクが順番に実行されます。

  1. git fetch
  2. git merge

マージステップは、設定でマージされるように設定されているブランチを結合します。マージ手順を元に戻したいが、おそらくフェッチは取り消さないない場合(あまり意味がなく、必要ないはずです)。

マージを元に戻すには、を使用git reset --hardしてローカルリポジトリを以前の状態にリセットします。git-reflogを使用して以前の状態のSHA-1を見つけ、それをリセットします。

警告

このセクションにリストされているコマンドは、コミットされていないすべての変更を削除し、作業が失われる可能性があります。

git reset --hard

または、次のような特定の時点にリセットします。

git reset --hard master@{"10 minutes ago"}

325
以前の状態を選択するための優れた方法は、代わりのgit-REFLOGを使用してハッシュをコピーする、のようなショートカットを使用することでmaster@{1}、以前の位置である、mastermaster@{"5 minutes ago"}、またはmaster@{14:30}。この方法でリビジョンを指定する方法の詳細は、man git-rev-parse「リビジョンの指定」と呼ばれるセクションにあります。
カスカベル

38
この場合、ORIG_HEADも機能するはずです( "git reset --hard ORIG_HEAD")
JakubNarębski09年

@Jelfromi:そのヒントをありがとう、私はあなたが改訂についてとても冗長であるかもしれないとは知りませんでした。HEADに関連するリビジョンを選択することは知っていましたが、質問が出されたとき、彼がどこに行きたかったかはわかりませんでした。
jkp 2009

私が引っ張られたとき、それは述べていますUpdating d2c90a3..035ac4d。ここでは、d2c90a3リセットするパラメーターとしても使用できます。
タイの

reflogを使用する場合、ハッシュを入力する必要はありません。HEAD @ {1}や、reflogで定義されている以前の番号も使用できます。
Simon The Cat

338

jkpの回答と同じですが、完全なコマンドは次のとおりです。

git reset --hard a0d3fe6

ここでa0d3fe6は、

git reflog

元に戻したいポイントを確認します。


git reset HEAD --hardたとえば、なぜ私は単にできないのですか?
Sung Cho

9
@MikeCこのアプローチにより、たとえば、いくつかのプルに戻ることができます
xji

2
左側のIDを使用することはできませんでしたが、git reset --hard HEAD@{n}機能しました
E. Sundin

1
あなたはjkpの回答をほとんどここで複製する代わりに、何年も後にそれを編集することを提案するべきでした。
Abhishek Anand

これをオンにしている場合git reflog:dab04ec HEAD @ {0}、aaaaaaa HEAD @ {1}、bbbbbbb HEAD @ {2}。実行するとgit reset --hard bbbbbbb、HEAD 0および1が失われますか?
pmiranda 2017年

115

マージを元に戻すより近代的な方法は次のとおりです。

git merge --abort

そして少し古い方法:

git reset --merge

以前の回答で説明した古い方法(警告:ローカルの変更はすべて破棄されます):

git reset --hard

しかし、実際に、それは注目に値するであるgit merge --abortだけに相当しgit reset --merge、与えられたMERGE_HEAD存在です。これはgit help for mergeコマンドで読むことができます。

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

何がある場合に失敗し、マージした後、MERGE_HEAD失敗したマージはして元に戻すことはできませんgit reset --merge必ずしもではなくgit merge --abort彼らは同じもののために古いものと新しい構文ではないだけですので。これが私git reset --mergeが日常の仕事ではるかに便利であると思う理由です。


20
git merge --abortマージの最中ではなく、マージ中に機能しgit pullます。したがって、この回答は質問とは無関係のようです。
Abhishek Anand

1
git reset --mergeコミット用にステージングされていないすべての変更を削除します。これを難しい方法で見つけました。
theadriangreen

62

それは最初の使用で動作します: git reflog

以前の状態のSHAを見つけて作成します(HEAD @ {1}が例です)

git reset --hard HEAD@{1}

40

gitkがある場合(「gitコマンドラインからgitk --allを実行してみてください」)、それは簡単です。実行して、ロールバックするコミットを選択し(右クリック)、[マスターブランチをここにリセット]を選択します。コミットされていない変更がない場合は、「ハード」オプションを選択します。


8
あなたがそれを見たことがないなら、これは走る価値があります。クレイジーなGUIがポップアップします。
エヴァンモラン

35

仮定$COMMITあなたが行わ前の最後のコミットIDましたgit pull。最後のプルを元に戻す必要があるのは

git reset --hard $COMMIT

ボーナス:

プルについて言えば、面白いトリックを共有したいと思います。

git pull --rebase

この上記のコマンドは、私のgitライフで最も便利なコマンドであり、多くの時間を節約しました。

新たにコミットをサーバーにプッシュする前に、このコマンドを実行すると、最新のサーバーの変更が自動的に同期され(フェッチ+マージを使用)、コミットがgitログの一番上に配置されます。手動のプル/マージについて心配する必要はありません。

詳細はhttp://gitolite.com/git-pull--rebase


17

これは、プル変更を元に戻す最も簡単な方法です。

** Warning **

新しく作成されたファイルとフォルダが削除されるため、変更したファイルのバックアップをとってください

git reset --hard 9573e3e0

9573e3e0{コミットID}はどこにありますか


この応答は非常に便利です。gitpull originブランチを実行すると、次のような結果が得られるためです。Updating ffce65bd..e929e884実行git reset --hard ffce65bd
Ernesto Alfonso

15

できるよ git reset --hard ORIG_HEAD

「プル」または「マージ」のため、これらのアクションを実行する前にORIG_HEADを現在の状態に設定します。


5

git pullは以下の操作行います。

私。 git fetch

ii。 git merge

プルを元に戻すには、次の操作を行います。

私。git reset --hard ---ローカルの変更もすべて元に戻します

または

ii。git reset --hard master@{5.days.ago} (のような10.minutes.ago1.hours.ago1.days.ago...)ローカルの変更を取得します。

または

iii。 git reset --hard commitid

改善:

次回git pull --rebasegit pull..の代わりに使用してください(フェッチとマージ)によって同期サーバーが変更されます。


4

マージを失敗した場合、これはを元に戻したい最も一般的な理由ですがgit pull、実行するとgit reset --merge正確に期待どおりの結果が得git pullられます。フェッチされたファイルは保持しますが、マージを試みたマージは元に戻します。次に、git mergeときどき発生する混乱のないように何をすべきかを決めることができます。そして、--hard他のすべての回答で述べられている正確なコミットIDを見つける必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.