[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
質問
現在の状態から、あるコミットで作成されたスナップショットに戻すにはどうすればよいですか?
もし私が
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
?
解決方法は?
これは、quot;revert" が何を意味するかに大きく依存します。
一時的に別のコミットに切り替える
一時的に戻ってふざけた後、元の場所に戻りたい場合は、目的のコミットをチェックアウトすればいいだけです。
# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32
また、その間にコミットを行いたい場合は、新しいブランチを作成してください。
git checkout -b old-state 0d1d7fc32
元の場所に戻るには、元いたブランチをもう一度チェックアウトすればよいのです。(ブランチを切り替えたときにいつものように変更を加えていた場合は、それを適切に処理する必要があります。リセットして捨てたり、stash, checkout, stash pop して持っていったり、そこのブランチが必要ならそこのブランチにコミットしたり......)
未公開コミットのハード削除
一方、それ以降に行ったことをすべて本当に取り除きたい場合、2つの可能性があります。ひとつは、もしこれらのコミットを公開していないのであれば、単純にリセットすることです。
# 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 の revert には、それを打ち消すために逆のパッチを含むコミットを作成するという非常に特殊な意味があります。この方法では、履歴を書き換えることはありません。
# 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
マンページ
は、その説明の中で実際に多くのことをカバーしています。もう一つの有用なリンクは
git-revert について説明している git-scm.com のセクションです。
.
結局リバートしたくなかったと判断した場合は、リバートを元に戻すか (ここで説明したとおり)、リバート前に戻す (前のセクションを参照) ことができます。
このような場合、こちらの回答も参考になると思います。
HEADを前の場所に戻すにはどうしたらいいですか?(Detached head) & Undo commits
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] ファイルをリセットしたり、特定のリビジョンに戻したりするにはどうすればよいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ERROR: Error cloning remote repo 'origin'.
-
[解決済み】Git Extensions。Win32 エラー 487: cygwinのヒープ用に領域を確保できなかった、Win32エラー0
-
git commit リモートエラー [rejected] master -> master (フェッチファースト)
-
[解決済み] ブラウンアウトの一環として、パスワード認証が一時的に無効になっています。代わりに個人用アクセストークンを使用してください[重複]。
-
[解決済み] git reset --hard HEAD' を使って以前のコミットに戻すにはどうしたらいいですか?重複] [重複] [重複
-
[解決済み] GitでSHAハッシュによるコミットの取り消し?重複
-
[解決済み] GitでコミットIDを元に特定のコミットに戻す?重複
-
[解決済み】Gitリポジトリを特定のコミットにロールバック(リセット)する方法とは?[重複しています]
-
[解決済み】git revert で特定のコミットに戻る [重複]。
-
[解決済み】古いコミットをチェックアウトして新しいコミットにする [重複]。