하나의 git 브랜치에서 다른 git 브랜치로 단일 파일의 버전을 어떻게 복사합니까?


944

완전히 합쳐진 두 개의 지점이 있습니다.

그러나 병합이 완료되면 하나의 파일이 병합에 의해 엉망이 된 것을 알고 (다른 사람은 자동 형식을 수행했습니다. gah) 다른 지점의 새 버전으로 변경하는 것이 더 쉬울 것입니다. 그런 다음 한 줄의 변경 사항을 지점으로 가져간 후 다시 삽입하십시오.

그래서 git에서 가장 쉬운 방법은 무엇입니까?


3
수락 된 답변에서 첫 번째 솔루션은 변경 단계를 수행하고 두 번째 솔루션은 변경하지 않습니다. stackoverflow.com/a/56045704/151841
user151841 17:01에

답변:


1674

파일을 끝내려는 지점에서 이것을 실행하십시오.

git checkout otherbranch myfile.txt

일반 식 :

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

몇 가지 메모 (의견) :

  • 커밋 해시를 사용하면 커밋에서 파일을 가져올 수 있습니다
  • 이것은 파일과 디렉토리에서 작동합니다
  • 파일을 덮어 쓰기 myfile.txtmydir
  • 와일드 카드는 작동하지 않지만 상대 경로는 작동합니다
  • 여러 경로를 지정할 수 있습니다

대안:

git show commit_id:path/to/file > path/to/file

13
그렇습니다. 그러나 그것은 질문의 의도였습니다.
Ikke

37
아마도 분명하지만 완전한 파일 이름을 사용해야합니다 ... 와일드 카드가 작동하지 않습니다!
Chris Hart

6
.. 그것은 또한 좋은 방법입니다 : git show commit_id : path / to / file> path / to / file
milushov

14
원격 : git checkout origin / otherbranch myfile.txt
Roman Rhrn Nesterov

6
와일드 카드를 사용하면 제대로 작동 ''하므로 셸에서 해석하지 않도록 랩핑하면됩니다 .
Wiktor Czajkowski

82

나는 비슷한 검색 에서이 질문에 도달했습니다. 필자의 경우 다른 지점에서 파일을 원래 작업 위치와 다른 현재 작업 디렉토리로 추출하려고했습니다. 답변 :

git show TREEISH:path/to/file >path/to/local/file

18
'git show'의 목적은 데이터를 읽을 수있는 형식으로 터미널에 출력하는 것이며 파일의 내용과 정확하게 일치하도록 보장되지는 않습니다. 단어 문서를 전체적으로 복사하고 내용을 다른 문서에 복사하여 붙여 넣으려고하지 않는 것이 좋습니다.
Gonen

방금 내용을 현재 분기와 비교할 수 있도록보고 싶었습니다 (일부 코드 확인). 구문 강조 등을 위해 vim을 사용하고 싶습니다.
isaaclw

3
결제하기 전에 내용을 비교하려면 git diff <other branch> <path to file>잘 작동합니다.
랜달

2
@Gonen : git 버전 2.21.0부터 "git show"매뉴얼 페이지에 "일반 얼룩의 경우 일반 내용이 표시됩니다." 이것이 우리가 항상 좋다는 것을 확신하지 못합니다. 나는 그런 식으로 이미지를 가져 오는 것이 좀 조심
스럽

52

Checkout 명령 사용은 어떻습니까?

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

8
note 참고 파일이 두 분기에 모두 존재하지 않으면 merge (두 번째 명령)가 작동하지 않습니다.
simpleuser

흠. 나는 diffstat가 없습니다. 내가 들어 본 적이 있기 때문에 DIFF 도구의 특정 버전 (그리고 나는 그것을 전환해야합니까?)한다는 것입니다 : D
dudewad

git diff--stat기본적으로 diffstat와 동일한 기능을하는 인수를 지원합니다 .
hlovdal

이 작업을 수행하려면 두 지점을 로컬로 체크 아웃해야했습니다.
UnitasBrooks

18

1) 파일 사본이 필요한 지점에 있는지 확인하십시오. 예를 들어 : 나는 마스터에 하위 분기 파일을 원하므로 체크 아웃해야하거나 마스터에 있어야합니다git checkout master

2) 이제 하위 브랜치에서 마스터로 원하는 특정 파일을 체크 아웃하십시오.

git checkout sub_branch file_path/my_file.ext

여기서 sub_branch파일이있는 위치와 복사해야하는 파일 이름이 있습니다.


매우 편리하고 잘 설명되어 있습니다.
Abk

15

madlep의 답변에 따라 디렉토리 blob을 사용하여 다른 지점에서 하나의 디렉토리를 복사 할 수도 있습니다.

git checkout other-branch app/**

op의 질문에 관해서는 파일을 하나만 변경하면 잘 작동합니다 ^ _ ^


1
두 가지를 모두 올바르게 잡아 당기거나 먼저 origin/other-branch리포지토리를 참조 할 때 사용해야 합니다. 기본 사항이지만 물었습니다. (답은 훌륭합니다-편집 할 필요가 없습니다)
akauppi

8

나는 git restore(git 2.23부터 사용 가능)

git restore --source otherbranch path/to/myfile.txt


다른 옵션보다 좋은 이유는 무엇입니까?

git checkout otherbranch -- path/to/myfile.txt-파일을 작업 디렉토리로 복사하지만 준비 영역으로 복사합니다 (이 파일을 수동으로 복사하여 실행 git add하는 것과 유사한 효과 ). 옵션으로 git restore지시하지 않는 한 준비 영역을 건드리지 않습니다 --staged.

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt표준 쉘 리디렉션을 사용합니다. Powershell을 사용하는 경우 텍스트 인코딩에 문제가 있거나 바이너리 파일 인 경우 파일이 손상 될 수 있습니다. 으로 git restore변경 파일이 모두 이루어집니다 git실행.

다른 장점은 다음을 사용하여 전체 폴더를 복원 할 수 있다는 것입니다.

git restore --source otherbranch path/to

또는 git restore --overlay --source otherbranch path/to파일 삭제를 피하려면을 사용하십시오. 예를 들어 otherbranch, 현재 작업중인 디렉토리보다 파일이 적고 옵션 이 없으면 이 파일이 추적 됩니다. 그러나 이것은 좋은 기본 바하 우어입니다. 디렉토리의 상태가 "같은 것이 아니라 현재의 분기에 추가 파일이있는" 과 같이 동일하기를 원할 것입니다--overlaygit restoreotherbranch


좋은 대답입니다. git restore소스 분기 에서 대상 분기 의 파일 로 파일을 복사 하는 방법이 있습니까? git show를 사용하면 쉘 리디렉션 ( git show otherbranch:path/to/file1.txt > path/to/file2.txt) 으로이 작업을 수행 할 수 있지만 언급 한 이유로 쉘 리디렉션을 피하고 싶습니다.
AdmiralAdama

1
@AdmiralAdama는 그렇지 않습니다. 그리고 나는 그것을 받아 들일 큰 기회가 없다고 생각합니다 git restore(그러나 누가 알겠습니까?). 이 리디렉션 문제는 기본적으로 Powershell 문제입니다. 문제가있는 다른 쉘이 있는지 확실하지 않습니다. 나는 보통 "git bash"나 심지어 "cmd"로 돌아가서 " git showredirection"명령 을 사용해야한다 . 또는 GitExtensions와 같은 GUI를 사용하여 커밋 파일 트리를 탐색하고 파일에서 "다른 이름으로 저장"을 클릭하십시오.
Mariusz Pawelski

아 알 겠어요 Powershell을 사용하지 않으므로 아마도 쉘 리디렉션이 np입니다. 정보에 대해서 감사드립니다.
AdmiralAdama

3

제발 허용 대답에, 첫 번째 옵션이 있습니다 스테이지 (같은 다른 지점에서 전체 파일을 git add ...수행했다), 그리고 당신이 가진 것처럼 파일을 복사 단지 결과 두 번째 옵션이 있지만 (변경 사항을 무대되지 않습니다 파일을 수동으로 편집했으며 눈에 띄는 차이가 있습니다).

준비하지 않고 다른 지점에서 Git 사본 파일

단계적 변경 (예 git add filename):

$ git checkout directory/somefile.php feature-B

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

미해결 변경 (스테이지 또는 커밋되지 않은) :

$ git show feature-B:directory/somefile.php > directory/somefile.php

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")

"feature-B는 파일이 아닙니다"라는 메시지가 표시됩니다. 분기 이름이 먼저 나옵니다.-> "> directory / somefile.php"파일의 인코딩이 변경 될 수 있습니까?
Tiago Oliveira de Freitas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.