以前のコミットをチェックアウトした後、最新のコミットに戻す方法は?


477

以前のバージョンのコードをチェックアウトして調べたりテストしたりすることがあります。以前のコミットを変更したい場合はどうすればよいかについての説明を見ましたが、変更を加えないとします。たとえばgit checkout HEAD^、を実行した後、ブランチの先端に戻るにはどうすればよいですか?.. git logは、最新のコミットのSHAを表示しなくなりました。


11
git log質問の文については、いつでも実行できますgit log --all(より便利には、git log --oneline --graph --all)。
ワイルドカード2016年

回答:


606

戻りたいコミットがブランチの先頭であるか、タグ付けされていることがわかっている場合は、

git checkout branchname

を使用git reflogして、HEAD(またはその他の参照)が過去に指し示した他のコミットを確認することもできます。


追加するように編集:

Gitの新しいバージョンではgit checkoutHEAD一度だけ実行するために実行したり、何か他のものを実行したりする場合も、

git checkout -

最後のチェックアウト前の場所に切り替えます。これは、シェルのイディオムcd -に例えると、以前にあった作業ディレクトリに戻るように動機付けられました。


27
典型的な例は「git checkout master」です。私がgitを使用することを学んでいた難しさの1つは、「branchname」のようなプレースホルダー単語の代わりに実際に使用できる特定のキーワード(たとえば、「master」)がわからないことでした。
AbePralle

3
master実際にはどのようなキーワードでもありませんHEAD。これは、新しいリポジトリのデフォルトのブランチ名にすぎません。実行git branchして、リポジトリ内のブランチのリストを取得し、git tag -lタグのリストを取得できます。同様に、originはリポジトリのクローン元であるリモートのデフォルト名ですが、特別なことは何もありません。
Phil Miller

3
明確でない場合はgit reflog、ハッシュのリストが表示され、その時点でを使用できますgit checkout [commit-hash]
jbnunn 2014年

ファイルを削除してコマンドを試しましたが、完全にリセットされません。まず、再帰的ではありません。次に、削除したファイルでこれを試すと、後でgitからHEADが切り離されていることがわかります。何をすべきか?
Daniel S.

1
@DanielS .: ファイルについて話しているときの質問と私の答えは、コミットに関するものでした。Gitはそれらをかなり異なって扱います。
Phil Miller

27

gitチェックアウトマスター

masterはチップ、つまり最後のコミットです。 gitkは、その時点でツリーのどこにいるかを表示するだけです。 git reflogはすべてのコミットを表示しますが、この場合はヒントだけが必要なので、git checkout masterを使用します。


1
この。またはgit checkout branchname
Alex

19

たった今この質問に出くわして、何か追加する必要があります

最新のコミットに移動するには:

git checkout $(git log --branches -1 --pretty=format:"%H")

説明:

git log --branchesすべてのローカルブランチからのコミットのログ
-1を1つのコミットに制限して表示→ チェックアウトの引数としてサブシェルの出力を使用
--pretty=format:"%H"するコミットハッシュのみを表示する最新のコミット形式
git checkout $(...)

注意:

ただし、これによりヘッドが分離されます(コミットに直接チェックアウトするため)。これはsed、以下で説明するように、を使用してブランチ名を抽出することで回避できます。


最新のコミットのブランチに移動するには:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

説明:

git log --branchesすべてのローカルブランチからのコミットのログ
-1を1つのコミットに制限して表示→
--pretty=format:"%D"参照名のみを表示する最新のコミット形式
| sed 's/.*, //g'複数の参照の最後を除くすべてを無視(*)
git checkout $(...)チェックアウトの引数としてサブシェルの出力を使用

*)HEADとリモートブランチが最初にリストされ、ローカルブランチがアルファベット順に降順で最後にリストされるため、残りのブランチはアルファベット順で最初のブランチ名になります

注意:

これは常に、そのコミットに複数ある場合にのみ、(アルファベット順で)最初のブランチ名のみを使用します。


とにかく、最善の解決策は、最新のコミットの参照名を表示して、どこにチェックアウトするかを知ることだと思います。

git log --branches -1 --pretty=format:'%D'

たとえばgit top、そのコマンドのエイリアスを作成します。


1
どういうわけか私は2番目のコマンドを間違えました...それを修正しました、それは今最新のコミットのブランチからあなたを正しくチェックするでしょう。
816-8055

頭に戻るコマンドのBash / zshエイリアスalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel

9

グラフィカルなGUIを見てください... gitkすべてのコミットが表示されます。時にはグラフィカルに作業する方が簡単です... ^^


はい、これは実際に私が過去に行った方法です-しかし、現時点ではGUIを利用できません
Leo Alekseyev

7

これには、次のいずれかのgitコマンドを使用できます。

git checkout master
git checkout branchname

4

すべてのブランチを表示し、git log --branches --onelineをコミットし
ます

最後のコミットを表示
git log --branches -1 --oneline

最後のコミットの前に表示
git log --branches -2 --oneline


最初のコマンドは実際に現在ステージングされているコードをコミットしますか、それとも私はこれを誤解していますか?
Lazerbeak12345


0

マスターとは異なるブランチがある場合、1つの簡単な方法は、そのブランチをチェックアウトしてからマスターをチェックアウトすることです。ほら、あなたはマスターの先端に戻っています。おそらくもっと賢い方法があります...


0

簡単にできますgit pull origin branchname。最新のコミットを再度フェッチします。


アップストリームからプルしたくない場合、これはお勧めしません。マージの競合は、準備が整ったときにのみ処理する必要があります。
Lazerbeak12345

その場合、最新のコミットにチェックアウトしても、ヘッドは切り離された状態のままになります。
Ankit Singh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.