단일 파일의 하드 리셋


1004

현재 작업 디렉토리에 3 개의 수정 된 파일이 있습니다. 그러나 나는 그들 중 하나가 HEAD 상태로 재설정되기를 원합니다.

SVN에서는 svn revert <filename>( svn update <filename>필요한 경우 뒤에 따라) 사용하지만 Git에서는을 사용해야합니다 git reset --hard. 그러나이 명령은 단일 파일에서 작동 할 수 없습니다.

Git에서 단일 파일에 대한 변경 사항을 버리고 새로운 HEAD 사본으로 덮어 쓰는 방법이 있습니까?


3
git checkout아래는 답변입니다. git에서 "revert"는 커밋에 수행하는 작업입니다. "되돌리기"는 작업 커밋에 대한 기록 커밋의 역수를 재생하므로 되 돌린 커밋을 "취소"하는 새 커밋을 만들 수 있습니다. 나는 이것이 svn에서 git에 오는 사람들에게 종종 혼란의 지점이라는 것을 알았습니다.
Dan Ray


경로를 사용하여 하드 리셋을 수행 할 수없는 이유에 관심이있는 경우 여기 에서 내 답변을 확인하십시오 .
사용자

이 질문은 하드 리셋이 무엇인지 알고 있다고 가정합니다.

답변:


1807

다음 명령을 사용할 수 있습니다 :

git checkout HEAD -- my-file.txt

... 이것은 my-file.txtHEAD 의 작업 사본 과 색인의 상태를 모두 업데이트합니다 .

--기본적 으로이 시점 이후의 모든 인수를 파일 이름으로 취급합니다 . 이 답변에 대한 자세한 내용 . 이것을 지적 해준 VonC 에게 감사합니다 .


58
더 완전한 답변. +1;) '-'에 대해서는 stackoverflow.com/questions/6561142/… (보다 일반적으로 stackoverflow.com/questions/1192180/… ) 참조
VonC

8
또한 이전 커밋을 참조 HEAD~1하여 두 번째 커밋을 나타냅니다.
Ryanmt

14
당신은 HEAD현재 지점의 머리에 있다면 떠날 수 있습니다 -norbauer.com/rails-consulting/notes/…
cxw

4
reset명령이 "경로로 하드 리셋을 수행 할 수 없는지"그리고 왜 checkout전체 세트를 하드 리셋하는데 명령을 사용할 수 없는지에 대한 통찰력 이 있습니까? (왜 그렇게 설계되었는지를 의미합니다.)
Sz.

1
@cxw 불행히도, 이것은 사실이 아닙니다. 맨 페이지에서 git checkout: "인덱스 또는 <tree-ish>의 내용으로 바꾸어 작업 트리의 경로를 덮어 씁니다." 즉, <tree-ish>생략하면 작업 트리를 업데이트하는 데 색인의 모든 내용이 사용됩니다. HEAD와 다를 수도 있고 다를 수도 있습니다.
tuntap dec

136

머리로 재설정 :

단일 파일을 HEAD로 하드 리셋하려면 :

git checkout @ -- myfile.ext

@약자입니다 HEAD. 이전 버전의 git은 짧은 형식을 지원하지 않을 수 있습니다.

색인으로 재설정 :

인덱스가 비어 있지 않다고 가정하면 단일 파일을 인덱스로 하드 리셋하려면 그렇지 않으면 HEAD로 :

git checkout -- myfile.ext

요점은 안전을 위해 특별히 인덱스 로만 재설정하려는 경우가 아니면 명령을 빠지 @거나 HEAD명령에서 제외 하고 싶지 않다는 것입니다.


1
myfile.ext 앞의 "-"는 무엇입니까?
랜스 종류

3
@LanceKind 내가 이해하는 것처럼, 그것은 뒤에 오는 파일 이름 목록을 구분하는 데 사용됩니다. 그것이 없으면 git이 인수를 잘못 해석하는 경우가 있습니다.
Acumenus

2
파일명 만이 아닙니다. 널리 사용되는 규칙은 많은 유틸리티에서 옵션을 위치 인수와 분리합니다. man bash페이지를 참조 하십시오. 이 답변에서도 언급했습니다 : unix.stackexchange.com/a/187548/142855
boweeb

1
일반적으로 --는 프로그램에 알리는 데 사용됩니다 I've finished specifying "options", and from here on, everything will be a positional argument.. 일반적으로 "옵션"은와 같은 토큰 --recursive을 어떤 순서 로나 표시하거나 짧은 형식으로 결합 할 수도 있습니다 rm -rf. 반대로, "위치 인수"는 프로그래밍 언어의 함수에 전달되는 인수와 훨씬 비슷합니다. 토큰 목록에서의 위치 는 프로그램이 그들과 관련하여 수행 할 작업을 정의합니다 (이는 종종 파일 이름 임). --어느 것이 어느 것인지 모호성을 제거합니다.
iono

42

업스트림 / 마스터로 되돌리려면 다음을 수행하십시오.

git checkout upstream/master -- myfile.txt

18

Git 2.23 (2019 년 8 월) 부터는 restore( 추가 정보 )를 사용할 수 있습니다 .

git restore pathTo/MyFile

위는 현재 브랜치 MyFile에서 HEAD(마지막 커밋)을 복원 합니다 .

다른 커밋에서 변경 사항을 가져 오려면 커밋 기록에서 뒤로 이동할 수 있습니다. 아래 명령은 MyFile마지막 것보다 두 개의 커밋 을 얻습니다 . 이제 소스를 복원 할 때 (기본값)이 아닌 (기본값) 을 사용하므로 이제 -s( --source) 옵션 이 필요 합니다.master~2master

git restore -s master~2 pathTo/MyFile

다른 지점에서 파일을 얻을 수도 있습니다!

git restore -s my-feature-branch pathTo/MyFile

1
지금까지 가장 쉬운 방법입니다. 불행히도이 답변은 충분히주의를 기울이지 않고 있습니다.
singrium


4

단일 파일을 재설정하기 위해 아래 명령을 사용할 수 있습니다

git checkout HEAD -- path_to_file/file_name

path_to_file/filename아래 명령 으로 가져올 변경된 파일을 모두 나열하십시오.

git status

1

다음 명령을 사용할 수 있습니다 :

git reset -- my-file.txt

my-file.txt추가되면 작업 복사본을 모두 업데이트합니다 .


요청한대로 수정 된 파일의 내용을 변경하지 않습니다.
Rafael

숨김에 추가 할 때 파일을 편집 했습니까?
ADDYQU

1
그것은 구체적으로 요점 @ADDQU가 아닙니다. 문제는 파일을 준비된 목록에서 제거하지 않고 파일을 "하드 리셋"하는 방법입니다.
Rafael

@ Rafael 당신은 정확하지만 방법이 있음을 알려 드리고자합니다.
ADDYQU

0

다음 명령을 사용할 수 있습니다 :

git checkout filename

파일 이름이 같은 분기가있는 경우이 명령을 사용해야합니다.

git checkout -- filename

1
이것은 파일을 "하드 리셋"하지 않으며 인덱스 상태 만 작업 트리에 복사합니다. "하드 리셋"은 먼저 인덱스를 리셋합니다.
AH

-21

특히 git에 익숙하지 않은 경우 간단하고 쉽고 실용적인 방법으로 뜨거운 물에서 빠져 나갈 수 있습니다.

  1. 파일의 로그를 봅니다.

    자식 로그 myFile.js

    커밋 1023057173029091u23f01w276931f7f42595f84f 저자 : kmiklas 날짜 : 화요일 8 월 7 일 09:29:34 2018-0400

    JIRA-12345-새로운 아키텍처로 리팩터링.

  2. 파일 해시 참고 :

    1023057173029091u23f01w276931f7f42595f84f

  3. 해시를 사용하여 파일을 표시하십시오. 원하는 것이 맞는지 확인하십시오.

    git show 1023057173029091u23f01w276931f7f42595f84f : ./ myFile.js

  4. 파일을 로컬 복사본으로 리디렉션

    git show 1023057173029091u23f01w276931f7f42595f84f : ./ myFile.js> myFile.07aug2018.js

  5. 현재 파일을 백업하십시오.

    cp myFile.js myFile.bak.js

  6. 자주 사용하는 텍스트 편집기에서 두 파일을 모두 엽니 다.

    vim myFile.js
    vim myFile.07aug2018.js

  7. 붙여 넣기 코드를 myFile.07aug2018.js에서 myFile.js로 복사하여 저장하십시오.

  8. myFile.js를 커밋하고 푸시

  9. 다시 로그를보고 파일이 제대로 있는지 확인하십시오.

  10. 고객에게 최신 버전을 가져 오라고 말하고 이전 버전과 함께 작동하는 것을 행복하게 지켜보십시오.

가장 섹시하거나 가장 git-centric 솔루션이 아니며 확실히 "수동"재설정 / 복귀이지만 작동합니다. git에 대한 최소한의 지식이 필요하며 커밋 기록을 방해하지 않습니다.


2
이 답변은 수년 전의 솔루션보다 훨씬 복잡하고 오류가 발생하기 쉽습니다.
Artif3x

2
왜이 솔루션을 사용해야합니까!? 진정한 대답은 간단한 명령 일뿐입니다.
Milad Rahimi

1
특정 상황에 가장 적합한 솔루션입니다. 바인드, git이 오작동하는 사람들 및 해결 방법이 필요한 사람들에게 장점이 있습니다.
kmiklas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.