질문자 :Nick Vanderbilt
나는 Git을 사용하고 master
브랜치에서 작업하고 있습니다. 이 분기에는 app.js
라는 파일이 있습니다.
나는 많은 변경과 수많은 커밋을 한 experiment
experiment
에서 master
분기 app.js
에만 수행된 모든 변경 사항을 가져오고 싶습니다.
어떻게 해야 하나요?
다시 한번 나는 병합을 원하지 않습니다. experiment
브랜치에서 master
브랜치 app.js
모든 변경 사항을 가져오고 싶습니다.
git checkout master # first get back to master git checkout experiment -- app.js # then copy the version of app.js # from branch "experiment"
한 파일의 변경 사항을 취소하는 방법 git 도 참조하십시오.
2019년 8월 업데이트, Git 2.23
git switch
및 git restore
명령을 사용하면 다음과 같습니다.
git switch master git restore --source experiment -- app.js
기본적으로 작업 트리만 복원됩니다.
당신은뿐만 아니라 인덱스를 업데이트 할 경우 (파일 내용을 복원, 하나의 명령으로 인덱스에 추가 의미) :
git restore --source experiment --staged --worktree -- app.js # shorter: git restore -s experiment -SW -- app.js
Jakub Narębski 는 주석에서 다음과 같이 언급합니다.
git show experiment:path/to/app.js > path/to/app.js
SO 질문 " Git의 특정 개정에서 단일 파일을 검색하는 방법? "에 자세히 설명된 것처럼 리포지토리의 루트 디렉터리에서 전체 경로를 사용해야 한다는 점을 제외하고도 작동합니다.
따라서 Jakub이 예제에서 사용한 path/to/app.js입니다.
Frosty 는 주석에서 다음과 같이 언급합니다.
가장 최근의 app.js 상태만 얻을 수 있습니다.
그러나 git checkout
또는 git show
경우 SO 질문 " git checkout revision of file in git gui "에 설명된 대로 실제로 원하는 수정을 참조할 수 있습니다.
$ git show $REVISION:$FILENAME $ git checkout $REVISION -- $FILENAME
$FILENAME은 버전이 지정된 파일 의 전체 경로입니다.
$REVISION
git rev-parse
표시된 것과 같을 수 있습니다.
experiment@{yesterday}:app.js # app.js as it was yesterday experiment^:app.js # app.js on the first commit parent experiment@{2}:app.js # app.js two commits ago
등등.
schmijos 는 주석에 다음을 추가합니다.
당신은 또한 은닉에서 이것을 할 수 있습니다:
git checkout stash -- app.js
이것은 두 개의 브랜치에서 작업하고 커밋하고 싶지 않은 경우에 매우 유용합니다.
VonC모든 것이 훨씬 간단합니다. 이를 위해 git checkout을 사용하세요.
you're on master
브랜치에 있다고 가정 app.js from new-feature
브랜치에서 app.js를 가져오려면 다음을 수행하십시오.
git checkout new-feature path/to/app.js // note that there is no leading slash in the path!
그러면 원하는 파일의 내용이 표시됩니다. 항상 그렇듯이 새 기능 분기 이름 대신 sha1의 일부를 사용 하여 해당 특정 커밋에 있던 파일을 가져올 수 있습니다.
참고 : new-feature
은 원격 지점이 아니라 로컬 지점이어야 합니다.
Dmitry Avtonomovgit checkout branch_name file_name
예시:
git checkout master App.java
지점 이름에 마침표가 있으면 작동하지 않습니다.
git checkout "fix.june" alive.html error: pathspec 'fix.june' did not match any file(s) known to git.
SarathVonC 및 chhh의 답변을 보완합니다.
git show experiment:path/to/relative/app.js > app.js # If your current working directory is relative than just use git show experiment:app.js > app.js
또는
git checkout experiment -- app.js
AlexLordThorsengit
에서 파일 또는 디렉토리 체크아웃에 관한 모든 것
1. 다른 브랜치에서 하나 이상의 파일 이나 디렉토리 를 체크아웃하거나 현재 체크아웃된 브랜치에 해시를 커밋하는 방법:
# check out all files in <paths> from branch <branch_name> git checkout <branch_name> -- <paths>
출처: http://nicolasgallagher.com/git-checkout-specific-files-from-another-branch/ .
man git checkout
도 참조하십시오.
예:
# Check out "somefile.c" from branch `my_branch` git checkout my_branch -- somefile.c # Check out these 4 files from `my_branch` git checkout my_branch -- file1.h file1.cpp mydir/file2.h mydir/file2.cpp # Check out ALL files from my_branch which are in # directory "path/to/dir" git checkout my_branch -- path/to/dir
지정하지 않으면 현재 체크아웃된 분기의 가장 최근 커밋인 branch_name
이 자동으로 HEAD
따라서 "somefile.c"를 확인하고 커밋되지 않은 로컬 변경 사항을 덮어쓰도록 할 수도 있습니다.
# Check out "somefile.c" from `HEAD`, to overwrite any local, uncommitted # changes git checkout -- somefile.c # Or check out a whole folder from `HEAD`: git checkout -- some_directory
2. 더 나아가기: 모든 지점에서 파일을 체크아웃하거나 컴퓨터의 모든 위치에 해시를 커밋하는 방법(매우 유용합니다!):
# General form git show my_branch_or_commit_hash:my_file.cpp > any/path/my_file.cpp # Example: check out `main.cpp` from 3 commits ago in your currently-checked-out # branch (3 commits prior to `HEAD`, or `HEAD~3`) into a temporary directory mkdir ../temp git show HEAD~3:main.cpp > ../temp/main_old.cpp
내가 이것을 배운 출처 : @Jakub Narębski의 대답 : git-checkout 새 이름으로 파일의 이전 개정판
git merge
, git cherry-pick
, git rebase
또는 git revert
변경 사항을 해결하는 중이라면 어떻게 합니까?
글쎄, 그런 경우에는 다음을 수행하는 것이 좋습니다. 참고: 각 컨텍스트에 어떤 커밋 해시 또는 분기 --theirs
및 --ours
가 있는지 확인하려면 여기 내 답변을 참조하십시오. Git에 따르면 "us"는 누구고 "them"은 누구입니까? :
# Keep `--theirs` for all conflicts within this file git checkout --theirs -- path/to/some/file # OR: keep `--ours` for all conflicts within this file git checkout --ours -- path/to/some/file
또는:
# Keep `--theirs` for all conflicts within files inside this dir git checkout --theirs -- path/to/some/dir # OR: keep `--ours` for all conflicts within files inside this dir git checkout --ours -- path/to/some/dir
정말로 원하는 것이 아니라면 이 전에 이전 섹션의 정기 checkout
위에 언급된 내 답변의 "경고 경고" 섹션을 참조하십시오. Git에 따르면 "우리"는 누구고 "그들"은 누구입니까? .
DEALING WITH path does not have our version
없거나 path does not have their version
버전이 없습니다. 오류:
다음과 같은 오류가 표시되는 경우:
error: path 'path/to/some/dir/file1.cpp' does not have our version # OR error: path 'path/to/some/dir/file1.cpp' does not have their version
...위의 명령을 실행할 때 먼저 해당 파일 git rm
git checkout --ours
또는 git checkout --theirs
명령을 다시 시도하면 됩니다. 오류가 있는 파일을 자동으로 찾고 삭제하는 양식을 포함하여 이러한 명령에 대한 자세한 설명은 여기 내 답변을 참조하십시오. git checkout --ours when file spec included included file .
4. 다른 커밋이나 브랜치에서 해당 파일이나 디렉토리의 상태 와 정확히 일치하도록 특정 파일이나 디렉토리를 재설정하려면 어떻게 해야 합니까?
이 경우 git checkout my_branch -- some_file_or_dir
충분하지 않습니다. 지정된 디렉토리에 현재 체크아웃된 브랜치 또는 커밋에 존재하지만 my_branch
에는 존재하지 않는 파일이 있는 경우 해당 파일이 로컬에서 삭제되었지만 git checkout
은 로컬에 존재하지만 지정된 커밋에는 없는 파일을 삭제 하지 않고 지정된 커밋의 버전으로 로컬에 있는 파일 만 덮어씁니다. 따라서 로컬에 있어서는 안 되는 파일을 로컬로 삭제 하여 로컬로 끝나는 것이 my_branch
에 있는 것과 정확히 일치 하도록 하려면 다음을 수행해야 합니다.
git reset my_branch -- path/to/some/file_or_dir git checkout-index -fa git clean -fd git commit -m "hard reset path/to/some/file_or_dir to its state \ as it was at my_branch"
이에 대한 자세한 내용은 내 답변을 참조하십시오. git이 경로로 하드/소프트 리셋을 수행할 수 없는 이유는 무엇입니까? .
또한보십시오:
- 나는 여기 내 대답에서
git checkout
의 이러한 예를 더 보여줍니다. Git에 따르면 "우리"는 누구고 "그들"은 누구입니까? . - ["--soft 또는 --hard git reset by path" 에 대한 내 대답 ] git이 경로로 하드/소프트 리셋을 할 수 없는 이유는 무엇입니까?
- git-checkout 새 이름으로 파일의 이전 버전
- [내 대답] git checkout --ours 파일 사양에 삭제된 파일이 포함된 경우
- [내 답변] git을 사용하여 작업 트리(로컬 파일 시스템 상태)를 인덱스 상태("스테이징된" 파일)로 어떻게 재설정합니까?
Gabriel Staples다른 분기에서 파일을 복원하려면 작업 분기에서 다음 명령을 사용하기만 하면 됩니다.
git restore -s my-other-branch -- ./path/to/file
-s
플래그는 source
즉 파일을 가져오려는 지점의 약어입니다.
(선택한 답변은 매우 유익하지만 다소 압도적입니다.)
Conner Smith또는 다른 분기의 모든 파일을 원하는 경우:
git checkout <branch name> -- .
Jestergithub에서 파일을 검토하고 거기에서 가져옵니다.
이것은 OP에 직접 대답하지 않는 실용적인 접근 방식이지만 일부는 유용하다고 생각했습니다.
문제의 분기가 GitHub에 있는 경우 GitHub에서 제공하는 많은 도구 중 하나를 사용하여 원하는 분기 및 파일로 이동한 다음 '원시'를 클릭하여 일반 텍스트를 보고 (선택 사항) 다음과 같이 텍스트를 복사하여 붙여넣을 수 있습니다. 원하는.
이 접근 방식이 마음에 듭니다. 원격 파일을 로컬 시스템으로 가져오기 전에 전체를 볼 수 있기 때문입니다.
fearless_fool또 다른 방법은 차이점이 있는 패치를 만들어 마스터 브랜치에 적용하는 것입니다. app.js 작업을 시작하기 전 마지막 커밋이 00000aaaaa이고 원하는 버전이 포함된 커밋이 00000bbbbb라고 가정해 보겠습니다.
실험 분기에서 이것을 실행합니다.
git diff 00000aaaaa 00000bbbbb app.js > ~/app_changes.git
이렇게 하면 원하는 곳에 적용할 수 있는 app.js에 대한 두 커밋 간의 모든 차이점이 있는 파일이 생성됩니다. 해당 파일을 프로젝트 외부에 보관할 수 있습니다.
그런 다음 마스터에서 다음을 실행합니다.
git apply ~/app_changes.git
이제 수동으로 만든 것처럼 프로젝트의 변경 사항을 볼 수 있습니다.
Santi다른 브랜치에서 파일을 체크아웃하는 것은 간단한 한 줄 명령입니다:
git checkout branch C:\path\to\file.cs
여러 파일을 원하시면
git checkout branch C:\path\to\file1.cs C:\path\to\file2.cs
Kellen Stuart특정 커밋(모든 분기)의 파일을 원하면 06f8251f라고 말합니다.
자식 체크 아웃 06f8251f path_to_file
예를 들어, 창에서:
자식 체크 아웃 06f8251f C:\A\B\C\D\file.h
arupjbasugit checkout master -go to the master branch first git checkout <your-branch> -- <your-file> --copy your file data from your branch. git show <your-branch>:path/to/<your-file>
이것이 도움이 되기를 바랍니다. 질문이 있으면 알려주세요.
Rohit Saini출처 : http:www.stackoverflow.com/questions/2364147/how-to-get-just-one-file-from-another-branch