Gitで最新バージョンに戻す方法は?


303

私は最近SVNからGitに移動し、何かについて少し混乱しています。以前のバージョンのスクリプトをデバッガーを介して実行する必要があったので、git checkout <previous version hash>必要なことを実行しました。

最新バージョンに戻したいのですが、ハッシュがわかりません。「」と入力してもgit log、表示されません。

これどうやってするの?また、「2つのバージョンに戻る」や「最新の日付に戻る」など、ハッシュを入力するよりも簡単にバージョンを変更する方法はありますか?

回答:


371

git checkout masterトリックを行う必要があります。2つのバージョンに戻るには、のようgit checkout HEAD~2に言うことができますが、その時間に基づいて一時的なブランチ作成した方がいいので、git checkout -b temp_branch HEAD~2


7
涼しい!git checkout masterまさに私がブランチから切り替える方法です。つまり、以前のバージョンをチェックアウトすると、本質的にブランチが作成されるということですか。
Nathan Long

4
@ネイサン:gitでは、ブランチは実際にはほとんど特定のリビジョンへの移動可能なポインタです。つまり、概念的には、ブランチを作成するようなものですが、gitがブランチを考えるという意味ではありません。
DLHは2010

2
したがって、一連の線形変更がある最も単純なケースでは、以前のリビジョンをチェックアウトすると、HEADポインターがそこに移動しgit logます。つまり、そのポイントに対して相対的に表示されますか?マスターをチェックアウトするときに、ポインターをマスターブランチの最新バージョンに移動しますか?
ネイサンロング

7
@ネイサン:その通り。HEADは、シンボリックrefと呼ばれるものです。一般に、別のref(現在チェックアウトされているブランチ)へのポインタです。git checkoutHEADを移動する方法です。HEADを切り離したとき、その指定されたコミットを直接指すようにしました。もう一度マスターをチェックアウトすると、マスターを指します。(そしてgit log実際に多くの多くのコマンドは実際にはリビジョン範囲をとり、それはデフォルトでHEADになります。)
Cascabel

3
はい-HEADは、「作業ディレクトリにあるコードのバージョン」を指す「代名詞」です。また、「次にコミットするものの親」の代名詞でもあります
Ana Betts

54

特定のコミットにチェックアウトすると、gitは分離ブランチを作成します。だから、あなたが呼び出す場合:

$ git branch 

次のようなものが表示されます。

* (detached from 3i4j25)
  master
  other_branch

マスターブランチヘッドに戻るには、もう一度マスターブランチにチェックアウトする必要があります。

$ git checkout master

このコマンドは、切り離されたブランチを自動的に削除します。

git checkout動作しない場合は、ブランチ間で競合する変更されたファイルがある可能性があります。コードを失うのを防ぐには、gitはこれらのファイルを処理する必要があります。次の3つのオプションがあります。

  1. 変更を隠します(後で変更できます):

    $ git stash
    
  2. 分離されたブランチをリセットする変更を破棄します。

    $ git reset --hard
    
  3. 以前の変更で新しいブランチを作成し、それらをコミットします。

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

この後、masterブランチ(最新バージョン)に戻ることができます。

$ git checkout master

36

これは私にとってはトリックでした(私はまだマスターブランチにいました):

git reset --hard origin/master

34
reset --hardはやり過ぎであり、加えた変更を認識していないことを示します。これにより、コードが失われる可能性があります。
Thomio 2016年

1
私の場合、プッシュされていない誤ってコミットされた変更を取り除きたいと思いました。それを達成する他の方法があることを知っています。プッシュされていないコミット済みの変更を失いたくない場合、これはデータ損失です。
Csaba Toth 2017

8

最新バージョンに戻すには:

git checkout <branch-name> 

たとえば、git checkout masterまたはgit checkout dev


7

たとえば、ブランチ名を使用してチェックアウトできます。

HEADを移動する方法はいくつかありますが、列挙はgitエキスパートにお任せします。

私は提案したかっただけgitk --allです-gitから始めると非常に役に立ちました。


7

私はgitを深く掘り下げ始めたばかりなので、正しく理解しているかどうかはわかりませんが、OPの質問に対する正しい答えは、次のgit log --allようなフォーマット仕様で実行できるということですgit log --all --pretty=format:'%h: %s %d'。これにより、現在のチェックアウト済みバージョンがとしてマークさ(HEAD)れ、リストから次のバージョンを取得できます。

ちなみに、このようなエイリアスを.gitconfig少し良い形式で追加すると、次のように実行できますgit hist --all

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

相対バージョンについては、この投稿を見つけましたが、それは古いバージョンについてのみ話しているため、新しいバージョンを参照することはおそらくないでしょう。


6

ここでの回答のいくつかは、古いコミットをチェックアウトすることを決定する前に、マスターブランチにいると想定しています。これは常にそうであるとは限りません。

git checkout -

以前に使用していたブランチに戻ります(マスターであるかどうかに関係なく)。


ブランチは必要ありません。以前に指していた場所をHEADに指し示します。git checkout hash2git checkout hash1にした場合は、にgit checkout -戻りますhash1
ミハイルバシン

3

以前のバージョンに戻ると、

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

この状況でも、このコマンドで機能ログ(ハッシュ)を確認できます。

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master 別のブランチ名に置き換えることができます。

その後、チェックアウトすると、機能に戻ることができます。

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

Git 2.23以降(2019年8月)ではgit switch混乱を招くgit checkoutコマンドの代わりにを使用することをお勧めします。

古いバージョンに基づいて新しいブランチを作成するには:

git switch -c temp_branch HEAD~2

現在のマスターブランチに戻るには:

git switch master

0

よりエレガントでシンプルなソリューションは、

git stash

ブランチの最も再送信されたローカルバージョンに戻り、変更をstashに保存するので、このアクションを元に戻す場合は次のようにします。

git stash apply

私はそれが非常に古いことを知っていますが、これについてコメントする必要があります(この解決策は使用すべきではないと思うので)-この解決策はこの問題を解決せず、別の問題なので、私はこの解決策を使用しません。このstashソリューションでは、以前のコミットにチェックアウトするたびに、実際にはデータを「保存」しますが、これはこの場合は非常に不要です。(前に述べたように)<branch>をチェックアウトするだけで、より適切でエレガントな方法が得られます。
Maayao
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.