新しい名前でファイルの古いリビジョンをgit-checkout


264

main.cppエディタでファイル「」を開いています。

main.cpp」の以前のリビジョンもエディタで確認したい。

今のやり方はこんな感じです。

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

簡略化できるので、エディタで「main.cpp」を閉じる必要はありませんか?

私が期待しているのは、git-checkoutこれを実行できるバリアントです。


更新:Mac OSX 10.5.7でGitを使用しています

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2:JakubNarębskiの回答は次のとおりです。

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

UPDATE3:特定のリビジョンに対するKarmiの回答:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

どのエディタを使用していますか?おそらくそれはプラグイン/アドオン/ Gitのサポートを追加するモジュールを持っていますか?
JakubNarębski、2009年

私はテキストメイトを使用しています。いくつかのgitサポートがありますが、それが可能かどうかは確認していません。
neoneye 2009年

TextMateはgitのバンドルしていますgithub.com/timcharper/git-tmbundle:(あなたはgitのウィキにInterfacesFrontendsAndToolsページをチェックしているはずgit.or.cz/gitwiki
ヤクブNarębski

ちなみに、EmacsのVCインターフェース(Gitはvc-git.elの形式でもサポートされています)には、「他のバージョンを表示」コマンドがあります。TexMate Git Bundle(git-tmbundle)にない場合は、追加する価値があります。
JakubNarębski、2009年

私は、TextMateでのプロジェクトをよりよく追跡するためにシンボリックリンクを使用しています。25 dirs、300ファイル。これは、builddirやその他の無関係なディレクトリを隠すのに役立ちます。ただし、git / TextMateはこれらのシンボリックリンクに満足しているわけではないため、:-(
neoneye 2009年

回答:


312

「git show」を使用できます。

prompt> git show HEAD^:main.cpp > old_main.cpp

(コロン[注記があること:との間】文字HEAD^main.cpp。)<revision>:<path>構文に記載されているgitのREV-解析次「リビジョンを指定」セクションの最後の点に、マンページ。

  • <rev>:<path>、たとえばHEAD:README、:README、master:./ README

    接尾辞と:それに続くパスは、コロンの前の部分で指定されたツリーっぽいオブジェクトの特定のパスにあるblobまたはツリーを指定します。:path(コロンの前に空の部分がある)は、次に説明する構文の特殊なケースです。指定されたパスのインデックスに記録されたコンテンツ。

    ./または../で始まるパスは、現在の作業ディレクトリからの相対パスです。指定されたパスは、作業ツリーのルートディレクトリからの相対パスに変換されます。これは、作業ツリーと同じツリー構造を持つコミットまたはツリーからBLOBまたはツリーをアドレス指定するのに最も役立ちます。

<path>ここでFULLからの相対パストップディレクトリプロジェクトの、とすなわちディレクトリ.git/のディレクトリ。(または、より正確には " <revision> "(これは一般に任意の<tree-ish>、つまりツリーを表すものにすることができます))

現在のディレクトリからの相対パスを使用する場合は、./<path>構文を使用する(または../path現在のディレクトリから上に移動する)必要があります。

2015-01-15を編集:相対パス構文に関する情報を追加


ほとんどの場合、低レベル(配管)git cat-fileコマンドを使用して同じ出力を取得できます。

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
完全なコピーに興味がありますが、git-showは違いのみを表示します。--prettyオプションを試してみました.. prompt> git show --pretty = fuller HEAD ^ main.cppしかし、そうではありませんでした解決しない。
neoneye 2009年

7
"git show HEAD ^ main.cpp"(HEAD ^とmain.cppの間にスペースがある)は、 "git show HEAD ^:main.cpp"(HEAD ^とmain.cppの間にコロン ':'がある)とは異なります。
JakubNarębski、2009年

えーと、コロンではこのエラーが表示されるので、コロンは間違いだと思いました。はい、それはコロンが行く方法のようですが、どうすればこれを解決できますか?prompt> git show HEAD ^:main.cpp fatal:あいまいな引数 'HEAD ^:main.cpp':不明なリビジョンまたはパスが作業ツリーにありません。パスをリビジョンプロンプトから分離するには、「-」を使用します>
neoneye 2009年

2
これはおそらく、間違ったPATHNAMEを指定したことを意味します(残念ながら、 "git show"マジックのため、gitはより良いエラーメッセージを提供できません)。プロジェクトのトップディレクトリからの相対パスで指定する必要があります:$(git ls-tree -r --name-only HEAD ^ | grep main.cpp)
JakubNarębskiMay

3
フルパスの代わりに、ドキュメントから:「./または../で始まるパスは、現在の作業ディレクトリからの相対パスです。」1.8.5バージョンで動作します。
LVB、2015年

24

Jakubの答えに追加するだけです:>ターミナルでファイルの内容をざっと読みたいだけなら、出力をファイルにリダイレクトする必要すらありません。あなただけを実行することができます$ git show 58a3db6:path/to/your/file.txt

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