作業コピーを一時的に特定のGitコミットに切り替える


248

その後に行われたすべてのコミットを失うことなく、特定のGitコミットに切り替える方法は?

ローカルファイルを変更したいのですが、コミットのデータベースはそのまま残り、現在の位置のポインタのみが現在選択されているコミットに設定されます。

ファイルの状態を特定のコミットに変更し、プロジェクトを実行し、終了したら、ファイルを最後のコミットに戻します。

プロジェクトのフォルダ全体を圧縮せずにこれを行う方法は?


回答:


344

特定の支店にいる場合は、mybranch先に進んでくださいgit checkout commit_hash。その後、でブランチに戻ることができますgit checkout mybranch。今日、同じゲームでバグを二分していました:)また、git bisectについて知っておく必要があります。


6
git checkout commit_hashクリーンなリポジトリを使用していて、ブランチを行う必要がない場合にのみ実行できます。一部のユースケース(私のような)の方が簡単かもしれません。
エンダーランド2013年

@enderland:HEADは常にいくつかのブランチを指し、通常は:)
Alexander Pavlov

部分的なハッシュが受け入れられなかったため、コミットハッシュ全体を使用しなければならないという問題がありました。
マイティアム2014

6
git bisect参照に賛成票を投じてください。非常に便利なツールです。
Niek

54

まず、を使用git logしてログを表示し、必要なコミットを選択して、コミットの識別に使用されているsha1ハッシュを書き留めます。次に、を実行しgit checkout hashます。完了したら、git checkout original_branch。これには、HEADを移動しないという利点があり、作業コピーを特定のコミットに切り替えるだけです。


4
と思いますgit checkout <original_branch>git checkout HEAD実質的にNOOPです
Abe Voelker 2012

3
git reset --hard <hash>現在のブランチのHEADを変更しgit checkout <hash>ますが、ブランチを変更しない独立したチェックアウトを取得します。この回答に示すように、ブランチの元のハッシュIDを知らなくても簡単に戻ることができます。
jofel 2012

@Femaref初心者の質問:この質問のコンテキスト(以前のコミットに一時的に切り替える)を考えると、なぜHEADを移動するか移動しないことが有利または不利なのでしょうか?
nattyについてnattyについて2013

@nuttyaboutnatty私の編集が承認されたとすると、それはあなたの質問に答えるはずです。HEADは実際にはどのような場合でも移動します。しかし、チェックアウトでは、HEADが指すブランチ参照自体は移動されません。
echristopherson 2013

15

ここで他の回答に加えて、git checkout <the-hash-you-want>使用していた場所に切り替えることができることを知っておく価値がある方法を示します。

git checkout @{-1}

多くの場合、これは次の方法より便利です。

git checkout what-was-that-original-branch-called-again-question-mark

予想通り、git checkout @{-2}2 git checkout秒前のブランチに戻ります。他の数値についても同様です。あなたがより大きな数のためにどこにいたのかを思い出すことができるなら、あなたはそのためにある種のメダルを獲得するべきです。


悲しいことに、生産性のためgit checkout @{1}に、あなたが将来あなたが行くであろうブランチにあなたを連れて行きません、それは残念です。


1
これgit checkout -git checkout @{-1}
Nathanael

@Nathanael OMGODまさか ...これはすべてを変えます!いいね、ありがとう!…これを回答に組み込むつもりでしたが@{n}、多くのgitコマンドで機能するため、一般的な構文について知ることも役立つと思います。私は答えをかなり混乱させずに略記を追加するのは難しいと思いました。代わりに私はあなたのコメントに投票しました–人々がそれを見ることを望んでいます。再度、感謝します。
ベンジョン

1
問題ない。とにかく、この議論は実際の質問に接しています。もっとボーナス!私はしばしば、機能をリリースにマージするために同じ構文を使用します。たとえばgit merge -、最後にチェックアウトしたブランチを現在チェックアウトしているブランチにマージします。それcd -はバッシュのようなものです。
ナタナエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.