952

Git リポジトリがあり、いくつかのファイルが数か月前にどのように表示されたかを確認したいと考えています。その日付のリビジョンを見つけました。です27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8。1 つのファイルがどのように見えるかを確認し、それを (「新しい」) ファイルとして保存する必要があります。

を使用してファイルを表示gitkできましたが、保存するオプションがありません。コマンドラインツールで試してみましたが、最も近いものは次のとおりです。

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

ただし、このコマンドはファイルの内容ではなく差分を表示します。後でPAGER=cat出力をファイルにリダイレクトするようなものを使用できることは知っていますが、実際のファイルの内容にアクセスする方法はわかりません。

基本的に、私はsvn catのようなものを探しています。

4

11 に答える 11

877

使用するgit show

あなた自身の答えを完成させるために、構文は確かに

git show object
git show $REV:$FILE
git show somebranch:from/the/root/myfile.txt
git show HEAD^^^:test/test.py

このコマンドは、通常のリビジョン スタイルを使用します。つまり、次のいずれかを使用できます。

  1. ブランチ名 ( ashによって提案される)
  2. HEAD+ x^文字数
  3. 特定のリビジョンの SHA1 ハッシュ
  4. 特定の SHA1 ハッシュの最初の数文字 (おそらく 5 文字)

ヒントgit show" "を使用するときは、現在のディレクトリの位置ではなく、常にリポジトリのルートからのパスを指定することを覚えておくことが重要です。

( Mike Moreartyは、少なくとも git 1.7.5.4 では、./パスの先頭に " " を付けることで相対パスを指定できると述べています。例:

git show HEAD^^:./test.py

)

使用するgit restore

Git 2.23+ (2019 年 8 月) では、わかりにくいコマンドの代わりに which を使用することできgit restore ますgit checkout

git restore -s <SHA1>     -- afile
git restore -s somebranch -- afile

これにより、 「ソース」( -s)コミット SHA1 またはブランチに存在するファイルのみが作業ツリーに復元されますsomebranch
インデックスも復元するには:

git restore -s <SHA1> -SW -- afile

( -SW: の略--staged --worktree)


starwarswiiのコメントで述べたように

コンテンツをファイルにパイプできます。これは、コミットからファイルをすばやく比較したい場合に最適です。

たとえば、次のことができます。

git show 1234:path/to/file.txt > new.txt 
git show 1234~:path/to/file.txt > old.txt

次にそれらを比較します。


低レベルの git 配管コマンドの使用

git1.5.x より前は、これはいくつかの配管で行われていました。

git ls-tree <rev>
コミット内の 1 つ以上の「blob」オブジェクトのリストを表示します

git cat-file blob <file-SHA1>
特定のリビジョン内でコミットされたファイルを cat します (svn cat と同様)。git ls-tree指定された file-sha1 の値を取得するために使用します

git cat-file -p $(git-ls-tree $REV $file | cut -d " " -f 3 | cut -f 1)::

git-ls-tree$fileリビジョン内のオブジェクト ID をリストします$REV。これは出力から切り出され、git-cat-file実際に呼び出される必要があるへの引数として使用されgit-cat-object、単にそのオブジェクトを にダンプしますstdout


git cat-file注: Git 2.11 (2016 年第 4 四半期) 以降、コンテンツ フィルターを出力に適用できます。

commit 3214594、 commit 7bcf341 (2016 年 9 月 9 日)、 commit 7bcf341 (09 Sep 2016)、および commit b9e62f6commit 16dcc29 (24 Aug 2016) by Johannes Schindelin ( dscho)を参照してください。
( 2016 年 9 月 21 日、コミット 7889ed2Junio C Hamanoによってマージされました)gitster

git config diff.txt.textconv "tr A-Za-z N-ZA-Mn-za-m <"
git cat-file --textconv --batch

注: " git cat-file --textconv" は最近 (2017 年) セグメンテーション違反を開始しましたが、これは Git 2.15 (2017 年第 4 四半期) で修正されています。

Jeff King ( )によるcommit cc0ea7c (2017 年 9 月 21 日)を参照してください。( 2017 年 9 月 28 日コミット bfbc2fcJunio C Hamanoによってマージされました)peff
gitster

于 2009-03-04T12:22:46.363 に答える
536

現在のブランチのファイルのコンテンツを前のコミットまたは別のブランチのファイルのコンテンツで置き換える/上書きする場合は、次のコマンドを使用して行うことができます。

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

また

git checkout mybranchname path/to/file.txt

次に、現在のブランチで有効にするために、これらの変更をコミットする必要があります。

于 2010-11-18T19:41:15.470 に答える
159

ファイルへのフル パスを指定する必要があります。

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt
于 2009-03-04T11:46:35.593 に答える
12

Windows では、Git Bash を使用して:

  • ワークスペースで、ファイルが存在するフォルダーに dir を変更します
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
于 2015-03-02T16:17:24.793 に答える
8

そして、それをファイルにうまくダンプするには(少なくともWindowsでは)-Git Bash:

$ echo "`git show 60d8bdfc:src/services/LocationMonitor.java`" >> LM_60d8bdfc.java

"改行を保持するため、引用符が必要です。

于 2014-01-01T16:56:44.750 に答える
5

これは、パスを指定せずにコミット間で削除されたすべてのファイルを取得するのに役立ちます。多くのファイルが削除されている場合に役立ちます。

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1
于 2014-07-24T02:34:05.370 に答える
0

以前のコミットをチェックアウトしてファイルをコピーすることにより、以前のコミットからファイルを取得します。

  • 現在のブランチに注意してください: git branch
  • 必要な以前のコミットをチェックアウトします。git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • 必要なファイルを一時的な場所にコピーします
  • 開始したブランチをチェックアウトします。 git checkout theBranchYouNoted
  • 一時的な場所に配置したファイルをコピーします
  • 変更を git にコミットします。git commit -m "added file ?? from previous commit"
于 2011-07-22T15:05:16.167 に答える