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

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 日のコミット、つまり commit に戻すにはどうすればよいですか0d1d7fc?

ベストアンサー1

これは、「元に戻す」が何を意味するかによって大きく異なります。

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

一時的に戻っていろいろ試してから元の状態に戻りたい場合は、目的のコミットをチェックアウトするだけです。

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

あるいは、そこにいる間にコミットしたい場合は、そのついでに新しいブランチを作成してください。

git checkout -b old-state 0d1d7fc32

元の場所に戻るには、元のブランチをもう一度チェックアウトするだけです。(ブランチを切り替えるときはいつもそうであるように、変更を加えた場合は、適切に対処する必要があります。変更を破棄するには reset を実行できます。変更を持ち出すには stash、checkout、stash pop を実行できます。そこにブランチが必要な場合は、そのブランチにコミットできます。)

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

一方、それ以降に行ったすべての操作を本当に削除したい場合は、2 つの方法があります。1 つは、これらのコミットを 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 では、revert は非常に特別な意味を持ちます。つまり、リバース パッチを使用してコミットを作成し、それをキャンセルします。この方法では、履歴を書き換えることはありません。

まず、どのコミットを元に戻すかを決めます。以下で選択した手法に応じて、マージ コミットのみを元に戻すか、非マージ コミットのみを元に戻すかを選択します。

# This lists all merge commits between 0d1d7fc and HEAD:
git log --merges --pretty=format:"%h" 0d1d7fc..HEAD | tr '\n' ' '

# This lists all non merge commits between 0d1d7fc and HEAD:
git log --no-merges --pretty=format:"%h" 0d1d7fc..HEAD | tr '\n' ' '

注意: 複数のコミットを元に戻す場合は、順序が重要になります。最新のコミットから開始します。

# This will create three separate revert commits, use non merge commits only:
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. You can also use a range of merge commits here.
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-scm.com の git-revert に関するセクション

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

この場合、この回答も役立つかもしれません:
HEAD を以前の場所に戻すにはどうすればよいですか? (切り離されたヘッド) & コミットを元に戻す

おすすめ記事