以前のブランチをgit checkoutする方法はありますか?


703

cd -はgit と同等のものが欲しいです。私がブランチmasterにいてチェックアウトしている場合は、戻ってfoo何かを入力できるようにgit checkout -したいしmaster、それをもう一度入力してに戻ることができるようにしたいと思っていfooます。

このようなものは存在しますか?実装するのは難しいですか?


2
前のgit checkoutコマンドを見つけるために上矢印を入力したいと思います:p
Kit Ho

11
これには、ホームポジションから手を離し、gc-を入力する方が高速で、目的のものが見つかるまで押し上げる
Matt Briggs

@MattBriggsは、あなたが実際に入力しないgc-ため、その省略形をかましたgit checkout -
jewbix.cube

2
@ jewbix.cubeシェルとgitの両方について、エイリアスについて学ぶ必要があります。
Gauthier

@KitHo:私はそれを常にやりたいと思っていますが、たとえばブランチを作成したばかりの場合、必要なコマンドが履歴に存在しない場合もあります。
M_M

回答:


1227

1.6.2リリースノートから

@{-1}あなたがいた最後のブランチを参照する方法です。これは
、オブジェクト名が必要な場所だけでなく、ブランチ名が必要な場所でも受け入れられ、ブランチ名を入力したかのように機能します。
例えばgit branch --track mybranch @{-1}git merge @{-1}
git rev-parse --symbolic-full-name @{-1}期待どおりに動作します。

そして

git checkout -の省略形ですgit checkout @{-1}


46
うわー、私は完全にそれを試してみるべきでした!考え出した-シェル主義であり、機能がgitにある場合、それは何か異なるものになる
Matt Briggs

9
このお二回コミットSHAチェックアウト時に、その場合には、うまく動作しません@ { - 1}のポイントをあなたが最初のチェックアウトの前にいた場所に...
user716468

1
私はZSHを使用しており、引用符で@ {-1}を囲む必要がありました。それ以外の場合、Gitの窒息:error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
マーフィーランドル

14
これはおそらく、SOの回答が手に負えないほど微笑んだ初めてのことです。これはとても難しいだろうと思いました!
オーウェン

25
使用される教育学のための追加の称賛:一般的な施設を見せて、次にコンパクトだが一般的ではない省略形に言及してください!…私@{u}は、現在のブランチの上流ブランチであるをよく使用します。これは、たとえばgit log @{u}..まだプルされていない上流のコミットをリストする場合に非常に役立ちます。そして、git log ..@{u}まだプッシュされていないローカルコミットだけの逆です。
ベンジョン2016年

208

最近これを行う最も簡単な方法は次のとおりです。

git checkout -

...これは次のエイリアスです:

git checkout @{-1}

gitチェックアウトマイナス

これについて詳しく知りたい場合は、こちらの記事全体をここに書きました:Checkout The Previous Branch In Git


3
完璧です。これを行うgitの方法を調べていたため、この正確なエイリアスを作成できました。それが存在するのを見てうれしいです。
タビサ2016年

3
以前のブランチをチェックアウトせずにリストする方法はありますか?
Erotemic

7
@Erotemic使用してbashの-for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
Bonsaigin

'git checkout-'エイリアスを見るのは素晴らしいことです!それはまさに私が探していたuxです:)
James Tayler '28

PowerShellで@Erotemicになるでしょうgit reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] } 。bashでは、同等のものを書く必要があります(reflogを取得して、 ":checkout:"文字列を含む行にフィルター処理してから、ブランチ名を抽出します)。これは実際にgitが行うことです
Mariusz Pawelski

28

@Karlが指摘し、git checkoutマニュアルから:

特別なケースとして、N番目の最後のブランチの「@ {-N}」構文は、(デタッチするのではなく)ブランチをチェックアウトします。「@ {-1}」と同義の-も指定できます。

両方だから、git checkout -およびgit checkout @{-1}このケースで動作します

最も近いと思うのは、を使用しgit reflogて最新のものmoving from branch1 to branch2を解析し、git checkout branch1


11

が機能するメカニズムを理解するために、以前の回答にさらに詳細を追加するだけgit checkout @{-N}です。reflogをたどってチェックアウト履歴を調べます。そのため、自分で同様の何かを実装したい場合はgit reflogcheckout:行を探して出力を解析できます。gitソースの実装sha1_name.c、特に関数を確認できますinterpret_nth_prior_checkout



10

Gitバージョンで2.23は、git switchそれを行うために使用できるコマンド(およびその他)が導入されました。公式ドキュメントを引用:

指定したブランチに切り替えます。作業ツリーとインデックスがブランチに一致するように更新されます。すべての新しいコミットはこのブランチの先端に追加されます。

特定のケースでgit switch -は、以前に行っていたブランチに戻るように発行できます。同じコマンドを再度実行して、最初のブランチに戻ることができます。

PSそれはあなたがすでに(私はあなたがこの質問をしたので、それが7年をされている意味)それを行う方法を知らないということはないが、それは一般的な対処として、このコマンドはあまり初心者に混乱し、フレンドリーされ、混乱使用する場合に発生しますgit checkout


5

私は以前のブランチをチェックアウトするのと同じ考えでこの質問にたどり着きました。私はohmyzを使用していMacます。以下のコマンドは私を助けました。

$ gco -
$ git checkout -

他のzshパッケージマネージャーと比較してohmyzが非常に遅いということを知っておいてください。抗原またはzplugを確認することをお勧めします。
2016年

2
はっきりしない場合は、Oh My ZshのGitプラグインgcoが短い記述方法として定義されているため、これは機能しgit checkoutます。したがってgco -、を呼び出すだけgit checkout -です。
Rory O'Kane

もちろん私の友人。説明する必要はありませんgit checkout -。フェイルセーフの更新。
Venkat.R

1

最も一般的なソリューションは次のとおりです。

git checkout @{-N}

ここで、N-チェックアウト履歴に戻る分岐のステップ数。


1

以下は、Gitのドキュメントの中で、他の回答によって提供されるgit checkout -git checkout @{-1}解決策を説明する部分へのポインタです。

  • コマンドのGitリビジョンを指定する場合@{-<n>}、たとえば@{-1}、「現在のブランチの前にチェックアウトされたn番目のブランチ/コミット」を意味します。git checkout <branch>繰り返しのドキュメント:「@{-N}構文を使用して、git checkout操作を使用してチェックアウトされた最後のN番目のブランチ/コミットを参照できます。」

  • <branch>引数にはgit checkout、「 ' -'と同義の' ' も指定できます@{-1}。」

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