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

このエントリーをはてなブックマークに追加

質問:

現在の状態から、あるコミットの時点でのスナップショットに戻すのってどうやればいいの?
git logをすると、こんなのが出力されるんだけど:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date: Thu 11月 4 18:59:41 2010 -0400
なんとかかんとか...
commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date: Thu 11月 4 05:13:39 2010 -0400
なんとかかんとかかんとか...
commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date: Thu 11月 4 00:55:06 2010 -0400
さらになんとかかんとか...
commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date: Wed 11月 3 23:56:08 2010 -0400
そう、もっともっとなんとかかんとか...

どうやってここから11月3日、つまりコミット0d1d7fc…に戻せばいいの?

By Crazy Serb | 質問日時: 2010年11月6日 16:58



回答1:

これは”元に戻す”がどういう意味かによるかな。

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

もし一時的にそれに戻して、なんか作業して、また元に戻ってきたいのなら、望みのコミットをチェックアウトすればいい:

# これはHEADを切り離す、つまり、ブランチをチェックアウトしないままにする:
git checkout 0d1d7fc32

または、そこに戻してる間にコミットしたい場合は、そこにいる間に新しいブランチを作るべき:

git checkout -b old-state 0d1d7fc32

元の場所に戻るには、もう一度あなたがいた支店をチェックしてください。 (If
ブランチを切り替えるときはいつものように変更を加えました。
必要に応じてそれらと一緒に。あなたはそれらを捨てるようにリセットすることができます。あなたは隠れて、
チェックアウトして、あなたと一緒に連れていってください。それらをブランチにコミットすることができます
そこに支店が必要な場合はそこに。)

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

一方で、あなたが本当にやったことすべてを取り除きたいのであれば
それ以来、2つの可能性があります。 1つ、あなたが
これらのコミットは、単にリセットします:

#これにより、ローカルの変更はすべて破棄されます。
#コミットしたくない作業が残っている場合は、実行しないでください。
git reset --hard 0d1d7fc32

#あるいは、保存する作業がある場合:
git stash
git reset --hard 0d1d7fc32
git stash pop
#これは変更を保存し、リセット後にそのパッチを再適用します。
#マージの競合が発生する可能性があります。
#あなたがリセットしたコミットから変更されました。

面倒なことがあれば、あなたはすでにローカルの変更を投げ捨てましたが、
もう一度リセットすることで、以前の場所に戻ってください。

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

一方、あなたが作品を発表した場合、おそらく
ブランチをリセットすると、効果的に履歴を書き換えられるからです。その場合、
あなたは確かにコミットを元に戻すことができます。 Gitを使うと、元に戻すことは非常に特殊です
意味:逆パッチでコミットを作成して取り消します。このようにして
履歴を書き換えないでください。

#これは3つの別々の復帰コミットを作成します:
git revert a867b4af 25eee4ca 0766c053

#それはまた範囲を取る。これは最後の2つのコミットを元に戻します:
git revert HEAD〜2..HEAD

#同様に、コミットハッシュを使用して一連のコミットを元に戻すことができます。
git revert a867b4af..0766c053

#マージコミットを元に戻す
git revert -m 1 <merge_commit_sha>

#ちょうど1つを得るには、 `rebase -i`を使って後でそれらを押しつぶすことができます
#または、手動で行うこともできます(リポジトリのトップレベルでこれを行うことを忘れないでください)
#HEADを変更せずに、あなたのインデックスと作業ツリーを目的の状態にする:
git checkout 0d1d7fc32。

#次にコミットします。あなたがやったことを説明する良いメッセージを書いてください
git commit

git-revertマンページ
実際にはその説明で多くのことをカバーしています。もう一つの役に立つリンクは[this
git-scm.comブログ投稿でgit-revertについて議論する(http:// git-
scm.com/blog/2010/03/02/undoing-merges.html)。

あなたが結局元に戻したくないと決めたら、元に戻すことができます
(ここで説明したように)、または元に戻す前にリセットすることができます(前の
セクション)。

この回答は、この場合に役立ちます:
HEADを元の場所に戻す方法は? (分離された
head)

# 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.
# 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:
git revert a867b4af..0766c053
# 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

By Jefromi | 回答日時: Nov 6 2010 at 17:04



回答2:

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

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

git reset --hard HEAD

HEADは現在のブランチの最後のコミットね。

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

直近のコミットよりも古いコミットに戻すには:

# インデックスを以前のコミットにリセットする。 '56e05fced'は適宜書き換えて
git reset 56e05fced
# ポインタを前のHEADに戻す
git reset --soft HEAD@{1}
git commit -m "56e05fcedに戻す"
# 新しいコミットを反映するように作業コピーを更新する
git reset --hard

元ネタは同じような質問のページ: SHAハッシュで以前のコミットに戻る方法?

By boulder_ruby | 回答日時: Aug 21 ‘12 at 6:19



回答3:

複雑でヤバい答えがたくさんあるけど、実際は簡単:

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

これは、HEADからコミットハッシュに戻ってすべてを元に戻すよ。つまり、すべてのコミットがその状態に戻ったかのように作業ツリー内のそのコミット状態を再び作成してる。。それから現在のツリーをコミットすると、「元に戻した」コミットと本質的に同等の新しいコミットをするよ。

(--no-commitフラグは、すべてのコミットを一度に元に戻す - そうじゃければ範囲内の各コミットのコメントを入れるように促される、これはコミット履歴を不要な新しいコミットのゴミで汚しちゃうけど)

重要なのは、これは以前の状態にロールバックする安全かつ簡単な方法だってこと。履歴は壊されることなく、すでに公開されているコミットに使用することができる。

By Yarin | 回答日時: Feb 12 ‘14 at 4:18



回答4:

僕にとっては(たぶん他の人にも)、一番いいのはGitリセットオプションだよ:

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

これは僕にとって最高の選択肢だった!シンプルで、速く、効果的!


注意: でも古いコミットのコピーを持っている他の人とブランチを共有している場合は、この方法は使わないこと!

あと、あんまりヤバくない方法がお好みの時は、

git clean -i

By Pogrindis | 回答日時: Oct 22 ‘13 at 11:53



Source: How to revert Git repository to a previous commit?

共有 コメント