Git의 파일에 대한 변경 사항을 선택적으로 되돌 리거나 체크 아웃 하시겠습니까?


88

작업 디렉토리의 파일 (또는 파일)에 대한 변경 사항을 부분적으로 취소 할 수있는 명령이 있습니까?

파일을 많이 편집했지만 일부 변경 사항을 커밋 된 상태로 되돌리고 다른 변경 사항은 실행 취소하려고한다는 것을 알고 있다고 가정합니다.

나는에 대한 옵션을 구상하고있어 git checkout그처럼 많이 작동 git add -p, 그것은 덩어리하여 파일 덩어리를 통과하고 당신이 그것을 유지 여부를할지 묻는 즉.

답변:


85

당신은 사용할 수 있습니다

git add -p <path>

특정 파일에 보관할 청크를 준비한 다음

git checkout -- <path>

파일의 준비된 버전을 확인하여 유지하지 않으려는 작업 트리 변경 사항을 삭제합니다.

마지막으로

git reset -- <path>

파일의 준비된 버전을 파일의 가장 최근 커밋 된 버전으로 되 돌리면 변경 내용이 준비되지 않은 상태로 유지됩니다.


다른 모든 버전 제어 시스템에서 "revert"라고 부르는이 간단한 사용 사례의 경우 Git 명령이 왜 그렇게 모호한 것일까 요?
Jan Hettich 2011 년

5
@Jan 다른 버전 제어 시스템의 revert명령을 사용하여 파일 내에서 되돌릴 변경 사항을 선택할 수 있습니까? CVS와 Git에 대한 경험이 있기 때문에 진심으로 묻습니다. Git에서는 git checkout -- path/to/file해당 파일의 모든 변경 사항을 되 돌리는 단일 명령이지만 위와 동일하지는 않습니다.
michiakig

3
도 있습니다 git checkout --patchgit reset --patch같은 작업을하는 git add --patch최신 자식에가.
Matt Connolly

2
@Rudie, --일반적으로 옵션 구문 분석의 끝을 나타내며 그 뒤에 오는 모든 인수는 문자 그대로 해석됩니다. 즉 ./, 파일 이름이 뒤에 오면 빼기 기호로 시작하는 파일 이름 앞에 추가 할 필요가 없습니다 --.
zrajm

내가 사용할 git checkout --patch때 diff가 거꾸로 보입니다. 마이너스 기호는 작업 복사본에 텍스트를 추가하고 더하기 기호는 작업 복사본에서 줄을 제거합니다.
Felipe Alvarez

115

git 버전> = 1.7.1을 사용하면

git checkout -p

이 기능이 언제 도입되었는지 잘 모르겠습니다.


11
git reset -p스테이징 영역 / 인덱스에서 변경 사항을 선택적으로 언 스테이징하기 위해 수행 할 수도 있다는 점을 언급 할 가치가 있습니다 . 나는 또한 이것이 어떤 버전의 Git에 도입되었는지 내 머리 꼭대기에서 알지 못합니다.

이것은 정답이며 왜 받아 들여지지 않았습니다.
wukong

1
이 답변은 질문 2 년 후 게시 되었기 때문에 @wukong. 이 순간 (2009) Charles의 대답이 최상의 솔루션이었습니다
pomeh

8

git checkout $file파일 상태를 $file마지막 커밋 된 상태로 되돌립니다. git checkout SHA-1 -- $file파일을 SHA-1로 식별 된 커밋으로 되 돌리는 데 사용할 수 있다고 생각합니다 .


1
예, 정확히 제가 원하는 것은 아닙니다. 파일에서 변경 한 일부를 유지하고 나머지는 되돌리고 싶기 때문입니다.
1800 INFORMATION

1

돌아가서 선택하려면 몇 개의 커밋이 필요합니까? 하나 인 경우에는 바로 전에 분기를 가져와 커밋 한 파일을 체크 아웃 한 다음 git add -p원하는 방식으로 추가하는 데 사용 합니다. 그런 다음 이전 위치로 돌아가 임시 브랜치에서 파일을 체크 아웃 할 수 있습니다.

그건:

git checkout -b temp troublesome-commit^
git checkout troublesome-commit -- path/to/file
git add -p path/to/file
git commit -c troublesome-commit
git checkout @{-1}
git checkout temp -- path/to/file
git commit path/to/file
git branch -D temp

다른 대안으로는 뒤로 돌아가서 커밋을 편집하는 것 (커밋을으로 git rebase -i표시 edit한 다음 a git reset HEAD^를 수행하고 셸로 다시 떨어질 때 커밋을 다시 실행)이 있습니다.

선택해야하는 변경 사항이 일련의 커밋에 분산되어있는 경우이를 패치 (또는 모두를 포함하는 패치)로 추출하고 패치를 직접 편집하여 유지하려는 변경 사항을 제거하는 것이 좋습니다. 및 잔여 물을 git apply --reverse.


실제로 커밋 된 내용을 되돌리고 싶지 않습니다. 작업 복사본에만있는 변경 내용을 취소하고 싶습니다.
1800 INFORMATION
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.