답변:
당신이 사용할 수있는
git checkout -- file
--
(nimrodm에서 제안한대로) 없이 수행 할 수 있지만 파일 이름이 분기 또는 태그 (또는 다른 개정 식별자)처럼 보이는 경우 혼동 될 수 있으므로 사용하는 --
것이 가장 좋습니다.
특정 버전의 파일을 확인할 수도 있습니다.
git checkout v1.2.3 -- file # tag v1.2.3
git checkout stable -- file # stable branch
git checkout origin/master -- file # upstream master
git checkout HEAD -- file # the version from the most recent commit
git checkout HEAD^ -- file # the version before the most recent commit
git reset HEAD <filename> ; git checkout -- <filename>
HEAD^^
가장 최근의 커밋 2 개 또는 HEAD^^^
다시 커밋 3 개 를 수행 할 수 있습니다 . 또는을 사용할 수도 있습니다 HEAD~2
. HEAD~3
더 많은 커밋을 되돌리려면 HEAD^2
"이 커밋의 두 번째 부모" 를 의미합니다. 병합 커밋으로 인해 커밋에 둘 이상의 이전 커밋이 HEAD^
있을 수 있으므로 숫자를 사용하면 해당 부모 중 하나를 선택하고 숫자를 사용 HEAD~
하면 항상 첫 번째 부모를 선택하지만 해당 커밋 수는 다시 선택합니다. 자세한 내용 git help rev-parse
은 참조하십시오.
그냥 사용
git checkout filename
이것은 파일 이름을 현재 브랜치의 최신 버전으로 바꿉니다.
경고 : 변경 사항이 삭제되며 백업이 유지되지 않습니다.
git checkout x
x는 분기 이름뿐만 아니라 파일 이름이 될 일이, 내가하지 않도록 기본 동작이 무엇이야하지만 난 자식이 당신이 지점 X로 전환한다고 가정 것이라 생각합니다. 당신이 사용할 때 --
뒤에 오는 것은 파일 이름입니다.
--
것 같습니다. @hasen이 지적한 것처럼 여전히 정확하지만 파일 이름과 지점 이름 사이에 모호성이있는 경우 여기에서 원하지 않는 동작이 발생할 수 있습니다!
--
좋고 좋고 쉬운 방법을 좋아합니다 . 파일 이름을 사용하여 분기 이름을 지정할 때는 어딘가에 나쁜 생각이 있어야합니다.
git checkout <commit> <filename>
드루팔 6.10으로 업그레이드했을 때 파비콘이 몇 커밋 전에 덮어 쓰여졌 기 때문에 오늘 이것을 사용했습니다. 그래서 다시 가져와야했습니다. 여기 내가 한 일이 있습니다.
git checkout 088ecd favicon.ico
git log --oneline <filename>
더 작은 로그를 제공하고 특정 파일에 대한 변경 사항 만 포함합니다
git reflog <filename>
파일이 이미 준비된 경우 (파일을 편집 한 후 git add 등을 수행하면 발생할 수 있음) 변경 내용을 준비 해제합니다.
사용하다
git reset HEAD <file>
그때
git checkout <file>
아직 준비되지 않은 경우
git checkout <file>
하나의 파일에 대한 이전 커밋의 변경 사항을 취소하려면 다음을 시도하십시오.
git checkout branchname^ filename
마지막 커밋 이전의 파일을 체크 아웃합니다. 커밋을 몇 번 더 되돌리려면 branchname~n
표기법을 사용하십시오 .
branchname^
나는 항상 이것과 혼동되기 때문에 미리 알림 테스트 사례가 있습니다. bash
테스트 할 스크립트 가 있다고 가정 해 봅시다 git
.
set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt
이 시점에서 변경 사항이 캐시에 스테이징되지 않으므로 다음 git status
과 같습니다.
$ git status
On branch master
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: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
이 시점에서 우리는 그렇게 git checkout
하면 결과는 다음과 같습니다.
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
대신 우리가 할 git reset
경우 결과는 다음과 같습니다.
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
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: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
따라서이 경우 변경 사항을 준비하지 않으면 변경 사항 git reset
을 git checkout
덮어 쓰면서 변경 사항을 적용하지 않습니다 .
이제 위의 스크립트에서 마지막 변경 사항이 준비 / 캐시되었다고 가정 해 봅시다 git add b.txt
.
이 git status
경우이 시점에서
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: b.txt
이 시점에서 우리는 그렇게 git checkout
하면 결과는 다음과 같습니다.
$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean
대신 우리가 할 git reset
경우 결과는 다음과 같습니다.
$ git reset HEAD -- b.txt
Unstaged changes after reset:
M b.txt
$ git status
On branch master
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: b.txt
no changes added to commit (use "git add" and/or "git commit -a")
따라서이 경우 변경 사항이 준비 git reset
되면 기본적으로 준비되지 않은 변경 사항을 단계별로 변경하는 반면 git checkout
변경 사항을 완전히 덮어 씁니다.
이 답변은 동일한 또는 여러 폴더 (또는 디렉토리)의 여러 특정 파일에있는 로컬 변경 사항을 취소하는 데 필요한 명령입니다. 이 답변은 특히 사용자가 둘 이상의 파일을 가지고 있지만 모든 로컬 변경 사항을 취소하지 않으려는 질문을 해결합니다.
하나 이상의 파일이있는 경우 다음과
git checkout -- file
같이 공백으로 구분 된 각 위치를 나열하여 각 파일에 동일한 명령 ( )을 적용 할 수 있습니다 .
git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext
name1 / name2 / fileOne.ext 사이의 공백을 기억하십시오. nameA / subFolder / fileTwo.ext
같은 폴더에있는 여러 파일의 경우 :
특정 디렉토리의 모든 파일에 대한 변경 사항을 폐기 해야하는 경우 다음과 같이 git checkout을 사용하십시오.
git checkout -- name1/name2/*
위의 별표는 name1 / name2 아래의 해당 위치에서 모든 파일을 실행 취소하는 트릭을 수행합니다.
마찬가지로 다음과 같이 여러 폴더의 모든 파일에서 변경 사항을 취소 할 수 있습니다.
git checkout -- name1/name2/* nameA/subFolder/*
위의 name1 / name2 / * nameA / subFolder / * 사이의 공백을 다시 염두에 두십시오.
참고 : name1, name2, nameA, subFolder-이 예제 폴더 이름은 모두 해당 파일이 상주 할 수있는 폴더 또는 패키지를 나타냅니다.