code

Git의 특정 리비전에서 단일 파일을 가져오려면 어떻게 해야 합니까?

starcafe 2023. 4. 13. 20:59
반응형

Git의 특정 리비전에서 단일 파일을 가져오려면 어떻게 해야 합니까?

Git 저장소를 가지고 있는데 몇 달 전 파일이 어떻게 생겼는지 보고 싶습니다.그 날짜에 개정판을 찾았어요.27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 생겼는지 (' 해야 합니다. 하나의 파일이 어떻게 생겼는지 확인하고 ('새') 파일로 저장해야 합니다.

이 파일을 볼 수 있었습니다.gitk수 가 없어요.명령줄 툴을 사용해 시험해 봤는데, 가장 가까운 것은 다음과 같습니다.

git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt

이 는 파일합니다.에 쓸 수 것 요.PAGER=cat출력을 파일로 리다이렉트 합니다만, 실제의 파일 컨텐츠에 액세스 하는 방법을 모릅니다.

기본적으로 svn cat 같은 것을 찾고 있습니다.

「」를 사용합니다.git show

자신의 답변을 완성하기 위해 구문은 다음과 같습니다.

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

이 명령어는 일반적인 리비전스타일을 사용합니다.즉, 다음 중 하나를 사용할 수 있습니다.

  1. 지점명(에서 암시되는)
  2. HEADx수 + 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월)에서는 혼란스러운 명령어를 대체할 수도 있습니다.

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

그러면 "소스"()-s에 있는 파일만 작업 트리에 복원됩니다.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>
에서 하나

git cat-file blob <file-SHA1>
고양이와 고양이git ls-tree

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

git-ls-tree, 「ID」의 를 .$file$REVgit-cat-file ' 잘하다'라고 git-cat-object그 에 덤프합니다.stdout.


2.부터 Git 2.11 (2016년 4분기)에 할 수 .git cat-file★★★★★★★★★★★★★★★★★★.

3214594, 7bcf341(2016년 9월 9일), 7bcf341(2016년 9월 9일) 및 b9e62f6, 16dcc29(2016년 8월 24일) by 요하네스 쉰델린()dscho커밋을 참조하십시오.
(2016년 9월 21일 Junio C Hamano에 의해 병합됨----commit 7889ed2, )

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

" 주 : "git cat-file --textconv최근 4분기) 2.2017년 4분기)에서를 시작했습니다.

Jeff peffKing의 commit cc0ea7c(2017년 9월 21일)를 참조하십시오().
(2017년 9월 28일, Junio C Hamano에 의해 합병 ----commit bbc2fc에서)

현재 분기의 파일 내용을 이전 커밋 또는 다른 분기의 파일 내용으로 대체/덮어쓰기를 원하는 경우 다음 명령을 사용합니다.

git checkout 08618129e66127921fbfcbc205a06153c92622fe path/to/file.txt

또는

git checkout mybranchname path/to/file.txt

그 후, 현재의 브랜치로부터 유효하게 하려면 , 이러한 변경을 커밋할 필요가 있습니다.

파일에 대한 전체 경로를 제공해야 합니다.

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:full/repo/path/to/my_file.txt

가장 쉬운 방법은 다음과 같습니다.

git show HASH:file/path/name.ext > some_new_name.ext

여기서:

  • HASH는 Git 리비전 SHA-1 해시 번호입니다.
  • file/path/name.ext는 찾고 있는 파일 이름입니다.
  • some_new_name.ext는 오래된 파일을 저장하는 경로 및 이름입니다.

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8:my_file.txt > my_file.txt.OLD

my_file이 저장됩니다.txt my_file.txt라는 이름의 새 파일로 지정합니다.구식

그것은 Git 2.4.5로 테스트되었다.

삭제된 파일을 가져오려면 다음을 사용할 수 있습니다.HASH~1해시 ). ('1')

예:

git show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8~1:deleted_file.txt > deleted_file.txt
git checkout {SHA1} -- filename

이 명령어는 복사된 파일을 특정 커밋에서 가져옵니다.

Windows, Git Bash 사용 시:

  • 작업영역에서 dir를 파일이 있는 폴더로 변경합니다.
  • git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext

되어 있는 하실 수 .git reset 오브젝트, Git 오해해해(해시, 브랜치, Git)),HEAD~x ...) 및 , " , ... ) 。

git reset <hash> /path/to/file

이 예에서는 다음과 같습니다.

git reset 27cf8e8 my_file.txt

대로 돌아가게 .my_file.txt으로 합니다.27cf8e8작업 디렉토리에서 변경되지 않은 상태로 둡니다(현재 버전).

여기서부터는 모든 것이 매우 쉬워집니다.

  • 의 두 할 수 .git diff --cached my_file.txt
  • 버전의 .git restore --staged file.txtGit )git reset file.txt들지
  • 수 요.git commit -m "Restore version of file.txt from 27cf8e8" ★★★★★★★★★★★★★★★★★」git restore file.txtGit )git checkout -- file.txt)
  • 에서 새 할 수 것은 일부 만입니다.git add -p file.txt)git commit ★★★★★★★★★★★★★★★★★」git restore file.txt를 참조해 주세요.

마지막으로 다음을 실행하는 경우 첫 번째 단계에서 대화식으로 리셋할 행크를 선택하고 선택할 수도 있습니다.

git reset -p 27cf8e8 my_file.txt

★★★★★★★★★★★★★★★★★.git reset경로를 사용하면 현재 체크 아웃된 버전과 비교할 특정 버전의 파일을 검색할 수 있으며, 검색하려면 해당 버전으로 완전히 되돌리거나 일부 HUNK에 대해서만 되돌릴 수 있습니다.


편집: 당신이 원하는 것은 이전 버전의 일부 또는 전부를 검색하는 다른 방법이나 쉬운 방법이 아니었기 때문에 나는 당신의 질문에 대답하지 않고 있다는 것을 깨달았습니다.cat그 버전입니다.

물론, 다음과 같이 파일을 리셋 한 후에도 이 작업을 수행할 수 있습니다.

git show :file.txt

표준 출력으로 출력하거나

git show :file.txt > file_at_27cf8e8.txt

이것이 , "이것"을 하세요.git showgit show 27cf8e8:file.txt물론 다른 사람들이 제안했듯이 훨씬 더 직접적이다.

이요.왜냐하면 '달리기'를 하고 있기 입니다.git show이전 버전을 즉시 가져올 수 있지만, 인덱스에서 이전 버전을 재설정하는 것보다 더 편리하지는 않습니다.

(최소한 Windows 상에서) 파일에 잘 덤프하려면 - Git Bash:

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

"따옴표는 새 줄을 보존하기 위해 필요합니다.

이렇게 하면 경로를 지정하지 않고 커밋 간에 삭제된 모든 파일을 가져올 수 있습니다. 삭제된 파일이 많을 때 유용합니다.

git diff --name-only --diff-filter=D $commit~1 $commit | xargs git checkout $commit~1

「」를 사용합니다.git show $REV:$FILE이미 다른 사람들이 지적한 것처럼 아마 정답일 것이다.git에서 과 같은 .

fatal: path 'link/foo' exists on disk, but not in 'HEAD'

이 문제는 파일 경로의 일부가 심볼릭 링크일 때 발생합니다. 「 」는,git show $REV:$FILE메서드는 동작하지 않습니다.재현 순서:

$ git init .
$ mkdir test
$ echo hello > test/foo
$ ln -s test link
$ git add .
$ git commit -m "initial commit"
$ cat link/foo
hello
$ git show HEAD:link/foo
fatal: path 'link/foo' exists on disk, but not in 'HEAD'

는 ★★★★★★★★★★★★★★★★★★★★★★★★ 등의 유틸리티가realpath심볼링크가 현재 커밋에 더 이상 존재하지 않을 수 있습니다.나는 좋은 일반적인 해결책에 대해 모른다.의 첫 할 수 있었기 에 이 를 했습니다.git show $REV:$FILE메서드를 두 번 사용합니다..왜냐하면git show $REV:$FILEsymblink에서 사용되면 타겟이 다음과 같이 인쇄됩니다.

$ git show HEAD:link
test

디렉토리에서는, 커맨드에 의해서 헤더가 출력되고, 그 다음에 디렉토리 컨텐츠가 출력됩니다.

$ git show HEAD:test
tree HEAD:test

foo

저에는 첫 했습니다.git show $REV:$FILE그리고 만약 그것이 단 한 줄이라면, 나는 내 경로의 첫 번째 구성요소를 git을 통해 심볼링크를 해결하기 위한 결과로 대체했다.

이전 커밋 체크 아웃 및 파일 복사를 통해 이전 커밋에서 파일을 가져옵니다.

  • 어느 브랜치에 있는지 적어 둡니다.git branch
  • 합니다. 원 、 하 、 checkout 、 checkout checkout checkout checkout 。git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
  • 원하는 파일을 임시 위치에 복사합니다.
  • 아웃 합니다.git checkout theBranchYouNoted
  • 임시 위치에 배치한 파일을 복사합니다.
  • git 에 을 커밋합니다.git commit -m "added file ?? from previous commit"

이를 위해 GUI를 사용하는 경우 파일이 대략 언제 변경되었는지 알 수 있는 경우 다음이 작동합니다.

Git Extension이 설치된 Visual Studio의 경우:

  1. Git -> 브랜치 이력 표시
  2. 파일이 변경된 커밋을 오른쪽 클릭하여 [View Commit Details]를 선택합니다.
  3. 오른쪽 변경 목록에서 관심 파일을 클릭합니다.변경 전후에 전체 파일 내용을 나란히 비교할 수 있습니다.모두 선택하고 파일 내용을 복사하여 원하는 위치에 붙여넣기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/610208/how-to-retrieve-a-single-file-from-a-specific-revision-in-git

반응형