Gitリポジトリを以前のコミットに戻すにはどうすればよいですか?

2010年11月07日に質問されました。  ·  閲覧回数 6.5M回  ·  ソース

Crazy Serb picture
2010年11月07日

現在の状態から特定のコミットで作成されたスナップショットに戻すにはどうすればよいですか?

git logを実行すると、次の出力が得られます。

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <[email protected]>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <[email protected]>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <[email protected]>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <[email protected]>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

11月3日からコミットに戻すにはどうすればよいですか?つまり0d1d7fcコミットしますか?

回答

Cascabel picture
2010年11月07日
10226

これは、「元に戻す」の意味に大きく依存します。

一時的に別のコミットに切り替えます

一時的に戻って、だましてから、現在の場所に戻りたい場合は、目的のコミットを確認するだけです。

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

または、そこにいる間にコミットを行いたい場合は、先に進んで、そこにいる間に新しいブランチを作成します。

git checkout -b old-state 0d1d7fc32

元の場所に戻るには、もう一度行っていたブランチを確認してください。 (ブランチを切り替えるときはいつものように、変更を加えた場合は、必要に応じて対処する必要があります。リセットして破棄することも、スタッシュ、チェックアウト、スタッシュポップして持ち運ぶこともできます。コミットすることもできます。そこにブランチが必要な場合は、そこにブランチします。)

未公開のコミットをハード削除する

一方、それ以降に行ったすべてのことを本当に取り除きたい場合は、2つの可能性があります。 1つは、これらのコミットをまだ公開していない場合は、リセットするだけです。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

混乱した場合は、ローカルの変更をすでに破棄していますが、少なくとも再度リセットすることで、以前の場所に戻ることができます。

公開されたコミットを新しいコミットで元に戻す

一方、作品を公開した場合は、ブランチをリセットしたくないでしょう。これは、履歴を効果的に書き換えるためです。 その場合、実際にコミットを元に戻すことができます。 Gitでは、元に戻すには非常に具体的な意味があります。逆パッチを使用してコミットを作成し、それをキャンセルします。 このようにして、履歴を書き換えることはありません。

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes (non inclusive of first hash):
git revert 0d1d7fc..a867b4a

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

git-revertマンページは、実際にはその説明でこれの多くをカバーしています。 もう1つの便利なリンクは、git-revertについて説明している

結局元に戻したくないと判断した場合は、元に戻すか(ここで説明)、元に戻す前にリセットすることができます(前のセクションを参照)。

この場合、この回答が役立つこともあります。
HEADを前の場所に戻すにはどうすればよいですか?

Yarin picture
2014年02月12日
2170

ここには複雑で危険な答えがたくさんありますが、実際には簡単です。

git revert --no-commit 0766c053..HEAD
git commit

これにより、すべてがHEADからコミットハッシュに戻ります。つまり、 0766c053後のすべてのコミットがウォークバックされたかのように、作業ツリーにそのコミット状態が再作成されます。 次に、現在のツリーをコミットできます。これにより、「元に戻した」コミットと本質的に同等の新しいコミットが作成されます。

--no-commitフラグを使用すると、gitはすべてのコミットを一度に元に戻すことができます。そうしないと、範囲内のコミットごとにメッセージの入力を求められ、不要な新しいコミットが履歴に散らばります。)

これは、前の状態にロールバックするための安全で簡単な方法です。 履歴が破棄されることはないため、すでに公開されているコミットに使用できます。

boulder_ruby picture
2012年08月21日
1661

ローグコーダー?

自分で作業して、それを機能させたいですか? 以下のこれらの指示に従ってください、彼らは私と他の多くの人のために何年もの間確実に働きました。

他の人と一緒に働いていますか? Gitは複雑です。 何か発疹を起こす前に、この回答の下にあるコメントを読んでください。

作業コピーを最新のコミットに戻す

変更を無視して、前のコミットに戻すには:

git reset --hard HEAD

ここで、HEADは現在のブランチの最後のコミットです。

作業コピーを古いコミットに戻す

最新のコミットよりも古いコミットに戻すには:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft [email protected]{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

クレジットは同様のStackOverflowの質問に送られます、GitのSHAハッシュによるコミットに戻しますか?

Pogrindis picture
2013年10月22日
227

私とおそらく他の人にとって最良のオプションは、Gitリセットオプションです:

git reset --hard <commidId> && git clean -f

これは私にとって最良の選択肢でした! シンプル、高速、効果的です!


**注:**コメントで述べたように、古いコミットのコピーを持っている他の人とブランチを共有している場合は、これを行わないでください

また、コメントから、より少ない「ballzy」メソッドが必要な場合は、使用できます

git clean -i
CodeWizard picture
2015年02月06日
191

答える前に、このHEADが何であるかを説明する背景を追加しましょう。

First of all what is HEAD?

HEADは、現在のブランチの現在のコミット(最新)への単なる参照です。 一度に存在できるHEADは1つだけです( git worktreeを除く)。

内容HEAD内部に格納されている.git/HEAD 、それが現在のSHA-1バイト40がコミット含ま。


detached HEAD

最新のコミットを行っていない場合、つまりHEADが履歴内の以前のコミットを指している場合、それはdetached HEADと呼ばれます。

Enter image description here

コマンドラインでは、次のようになります- HEADが現在のブランチの先端を指していないため、ブランチ名の代わりにSHA-1:

Enter image description here


切り離されたHEADから回復する方法に関するいくつかのオプション:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

これにより、目的のコミットを指す新しいブランチがチェックアウトされます。 このコマンドは、特定のコミットにチェックアウトします。

この時点で、ブランチを作成し、この時点から作業を開始できます。

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

reflogもいつでも使用できます。 git reflog は、 HEADを更新した変更を表示し、目的のreflogエントリをチェックアウトすると、 HEADがこのコミットに戻ります。

HEADが変更されるたびに、 reflog新しいエントリがあります。

git reflog
git checkout [email protected]{...}

これにより、目的のコミットに戻ることができます

Enter image description here


git reset HEAD --hard <commit_id>

頭を目的のコミットに「移動」します。

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • 注:( Git 2.7以降git rebase --no-autostashも使用できます。

このスキーマは、どのコマンドが何を実行するかを示しています。 ご覧のとおり、 reset && checkoutHEADます。

Enter image description here

Stephen Ostermiller picture
2014年03月05日
152

「コミット解除」し、最後のコミットメッセージを消去し、変更したファイルをステージングに戻す場合は、次のコマンドを使用します。

git reset --soft HEAD~1
  • --softは、コミットされていないファイルを、それらを破棄する--hardなく、作業ファイルとして保持する必要があることを示します。
  • HEAD~1が最後のコミットです。 3つのコミットをロールバックする場合は、 HEAD~3使用できます。 特定のリビジョン番号にロールバックする場合は、SHAハッシュを使用してロールバックすることもできます。

これは、間違ったことをコミットし、最後のコミットを元に戻したい場合に非常に便利なコマンドです。

ソース: http

kiran boghra picture
2014年12月12日
140

これは、次の2つのコマンドで実行できます。

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

以前のGitコミットが削除されます。

変更を保持したい場合は、次を使用することもできます。

git reset --soft [previous Commit SHA id here]

次に、変更を保存します。

Roman Minenok picture
2012年07月29日
114

私はGitでローカルの変更を元に戻すために多くの方法を試しましたが、最新のコミット状態に戻したいだけの場合は、これが最も効果的であるようです。

git add . && git checkout master -f

簡単な説明:

  • git revertようにコミットは作成されません。
  • git checkout <commithashcode>ようにHEADを切り離すことはありません。
  • ブランチでの最後のコミット以降に、すべてのローカル変更を上書きし、追加されたすべてのファイルを削除します。
  • ブランチ名でのみ機能するため、この方法でブランチ内の最新のコミットにのみ戻すことができます。

上記の結果を達成するためのはるかに便利で簡単な方法を見つけました。

git add . && git reset --hard HEAD

ここで、HEADは現在のブランチでの最新のコミットを指します。

これはboulder_rubyが提案したものと同じコードコードですが、最後のコミット以降に作成されたすべての新しいファイルを消去するために、 git reset --hard HEAD前にgit add .を追加しました。これは、ほとんどの人がに戻るときに信じていることです。最新のコミット。

Alireza picture
2017年07月20日
90

OK、 Gitで前のコミットに戻るのはとても簡単です...

変更を保持せずに元に戻します。

git reset --hard <commit>

変更を保持したまま元に戻します。

git reset --soft <commit>

説明: git resetを使用すると、特定の状態にリセットできます。 上記のように、コミットハッシュで使用するのが一般的です。

ご覧のとおり、違いは2つのフラグ--soft--hardを使用することです。デフォルトでは、 git reset --softフラグを使用しますが、常にを使用することをお勧めします。フラグ、私は各フラグを説明します:


- 柔らかい

説明されているデフォルトのフラグは、提供する必要はなく、作業ツリーを変更しませんが、コミットする準備ができているすべての変更されたファイルを追加するため、ファイルへの変更がステージングされないコミットステータスに戻ります。


- ハード

このフラグに注意してください。 作業ツリーと追跡ファイルへのすべての変更がリセットされ、すべてが失われます。


また、Gitを使用した実際の生活で発生する可能性のある以下の画像を作成しました。

Git reset to a commit

markreyes picture
2016年05月11日
74

マスターとそのそれぞれのブランチについて話していると仮定します(つまり、これはあなたが関係している任意の作業ブランチである可能性があります):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

ブログ投稿で答えを見つけました(現在は存在しません)

これはリモートへの変更のリセットと強制であることに注意してください。チームの他のメンバーがすでにgitプルしている場合は、問題が発生します。 あなたは変更履歴を破壊しています。これは、人々が最初にgitを使用する重要な理由です。

リセットよりも元に戻す(他の回答を参照)を使用することをお勧めします。 あなたが一人のチームなら、それはおそらく問題ではありません。