힘내 : 원격 오리진 마스터에서 단일 파일을 업데이트 / 체크 아웃하는 방법은 무엇입니까?


362

시나리오 :

  1. 나는 로컬 하나의 파일에 약간 수정을 실행 git add, git commit그리고git push
  2. 파일이 원격 오리진 마스터 저장소로 푸시됩니다.
  3. 원격 저장소의 "remote_cache"메소드를 사용하여 Capistrano를 통해 배치 된 다른 로컬 저장소가 있습니다.
  4. 이제 전체 응용 프로그램을 배포하고 싶지 않고 단일 파일을 업데이트 / 체크 아웃합니다.

git에서 어떻게 든 가능합니까? 나는 효과가 있거나 알아낼 수없는 것을 찾을 수 없었습니다. SVN으로 방금 수행했습니다 svn up file.


19
수락 된 답변을 실제로 질문에 답변하는 답변으로 변경하는 것이 좋습니다. ;)
단계

6
6 년이 지난 후, 우리는 이것이 @steps에서 일어나지 않을 것이라고 안전하게 추측 할 수 있다고 믿습니다 ...
Félix Gagnon-Grenier

Git 2.23 (2019 년 8 월)에서는입니다 git restore -s origin/master -- path/to/file. 아래 내 답변을 참조하십시오 .
VonC

답변:


914

배포 된 저장소에서 수행 할 수 있습니다.

git fetch
git checkout origin/master -- path/to/file

가져 오기는 모든 최근 변경 사항을 다운로드하지만 현재 체크 아웃 된 코드 (작업 영역)에는 적용되지 않습니다.

체크 아웃하면 다운로드 한 변경 사항 ( origin/master) 에서 특정 파일로 작업 트리가 업데이트됩니다 .

적어도 이것은 작은 작은 오타 수정에 대해 효과적입니다. 파일에서 하나의 단어를 변경하는 것만으로 분기를 만드는 것이 이상하게 느껴집니다.


1
매우 편리합니다. 프로덕션 환경의 나머지 사이트를 업데이트하기 전에 composer.json 파일을 가져 와서 업데이트를 실행해야했습니다. composer.json / lock 파일을 수동으로 제 위치에 놓았다면, 풀을 할 때 파일이 이미 존재한다는 말이 충돌합니다. 이런 식으로 git은 불만없이 파일을 인식했습니다.
David

6
이것은 내가 찾고있는 대답입니다.
javadba

20
@Mymozaaa 이중 대시는 뒤에 오는 것이 파일 이름임을 나타냅니다. 불행히도 같은 이름을 가진 두 개가있는 git이 파일 이름을 브랜치로 해석하지 못하게합니다.
Joel Mellon

문제는 여전히 가져오고 있다는 것입니다. 큰 저장소 인 경우 비용이 많이 드는 작업입니다. 유일한 대안은 원격에 gitweb을 설치 한 다음 액세스하여 파일 등을 검색하는 것입니다.
Christian Goetze

작은 질문, 그 후에, 나는 다른 기계에 갈 것이고, 나는 위에 나열된 당신의 행동을하지만 , 나는 git status그것들을 Changes to be committed:의미 로 보았습니다 . 나는 그것을 다시 커밋해야합니까? (단지 손길이 닿지 않은 단일 파일을 새로 고치려고했지만 repo 자체가 다른 컴퓨터에서 터치 됨)
Ricky Levi

42

다음 코드가 나를 위해 일했습니다.

     git fetch
     git checkout <branch from which file needs to be fetched> <filepath> 

19
git archive --format=zip --remote=ssh://<user>@<host>/repos/<repo name> <tag or HEAD> <filename> > <output file name>.zip

1
이것은 ssh를 통해 복제 된 repos에 대한 좋은 솔루션이지만 https를 통해 지원되지 않는 것 같습니다. git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x 오류 메시지를 표시합니다.fatal: Operation not supported by protocol.
Alderath

1
좋은 결합했다 tar: S --to-stdout,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Puggan 괜찮다

18

Git 2.23 (2019 년 8 월) 및 새로운 (여전히 실험적인) 명령을 사용 git restore하면 " 스테이징 영역이 아닌 작업 디렉토리에서 모든 파일을 재설정하는 방법은 무엇입니까? "에 나와 있습니다.

git fetch
git restore -s origin/master -- path/to/file

아이디어는 git restore파일 브랜치가 아닌 파일 만 처리합니다 git checkout.
" 혼란스러워git checkout ": 참조 git switch)


codersam 은 주석에 다음을 추가합니다 .

필자의 경우 나는 업스트림에서 데이터가져 오고 싶었다 .
그래서 방금 변경했습니다 :

git restore -s upstream/master -- path/to/file

2
이 명령이 마침내 존재한다는 것이 얼마나 안도적인 일입니까? 나는 모든 것을 복원하고 필요한 개별 파일을 복사했지만 고통 스럽습니다.
Mike Wise

이것은 나를 위해 일했지만 내 경우에는 (내가 포크로 한) 업스트림에서 데이터를 가져오고 싶었습니다. 그래서 단지로 변경git restore -s upstream/master -- path/to/file
coderSam

이 의견에 감사드립니다. 더 많은 가시성을 제공하기 위해 귀하의 의견을 답변에 포함 시켰습니다.
VonC

8

당신이 할 수있는 일은 :

  1. 로컬 git repo를 업데이트하십시오.

    git fetch

  2. 로컬 브랜치를 빌드하고 체크 아웃하십시오.

    git branch pouet && git checkout pouet

  3. 이 브랜치에서 원하는 커밋을 적용하십시오.

    git cherry-pick abcdefabcdef

    (abcdefabcdef는 적용하려는 커밋의 sha1입니다)


4
따로, 두 번째 단계는로 하나의 명령으로 수행 할 수도 있습니다 git checkout -b pouet.
Greg Hewgill

4
'pouet'은이 예제에서 가장 좋은 분기 이름입니다.
Hussard

2

또는 현재 브랜치에서 git stash (변경 사항이있는 경우), checkout master, 최신 변경 사항을 가져 와서 해당 파일을 데스크탑 (또는 전체 앱)으로 가져갑니다. 당신이 있던 지점을 확인하십시오. 힘내 숨김은 원래 상태로 다시 적용한 다음 변경 사항을 수동으로 수정하거나 파일을 바꾸어 끕니다.

이 방법은 멋진 sooooo가 아니지만 여러분이 다른 것을 알아낼 수 없다면 데프가 작동합니다.


-10

나는 쉽게 해킹을 발견했다고 생각합니다.

로컬 저장소에있는 파일 (원격 서버의 최신 커밋에서 업데이트 할 파일)을 삭제하십시오.

그런 다음 git pull

파일이 삭제되었으므로 충돌이 없습니다.


그러면 해당 파일에 대한 모든 최종 변경 사항이 로컬로 제거되고 다른 모든 파일도 가져옵니다. 특히 OP가 원하지 않는 것입니다.
legrojan

원격 브랜치를 업데이트하는 대신 로컬을 제거하는 것은 매우 나쁜 생각입니다.
c0der512
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.