2009-07-10 6 views
123

svn repo를 추적하는 나의 자식 repo에서 하나의 파일을 여러 번 편집했습니다.git 선택 파일에서 로컬 변경 사항을 되돌리기

이제는 (svn revert와 같은) 변경 사항을 되돌리려하고 파일의 일부만 되돌리고 싶습니다.

파일의 diff 파일을보고 싶지 않은 변경 사항을 취소 (되돌리기)하고 원하는 변경 사항을 유지하고 싶습니다.

git add -i 

명령은 해당 작업을 수행 할 수있는 옵션을 갖고있는 것 같아요하지만 난 아직이 무대 싶지 않아요.

답변

74

git checkout -p으로 직접 처리 할 수 ​​있습니다. 아래 Daniel Stutzbach's answer을 참조하십시오.


올드 대답 (checkout -p가 도입되기 전에) :

당신은 이런 식으로 작업을 수행 할 수 있습니다

git add -i 

git commit -m "tmp" 
(유지하려는 심술쟁이를 선택)

이제 변경 사항 만 커밋해야합니다. 지키고, 나머지는 무대 뒤집니다. 클린 작업 디렉토리를 그래서이 시점에서

git reset --hard HEAD 

는 커밋되지 않은 변경 사항은 상단에 최선을 다하고 유지하려는 변경, 폐기되었다.

git reset --mixed HEAD^ 

이것은 마지막 커밋 ('tmp')을 제거하지만 작업 디렉토리에서 수정 사항을 unstaged로 유지합니다.

EDIT : --soft--mixed으로 바꿔서 준비 영역을 정리하십시오.

+0

이것은 내가 유지하고 싶은 변경 사항을 저지르는 것입니까? 나는 그 변화를 아직 저지르고 싶지 않다. 아마도 커밋을 너무 진지하게 받아들이고 있습니다. 어쩌면 지금은 모두 지역의 레포에서 휴식을 취해야합니다. btw git 재설정은 무엇입니까? - soft HEAD^do? – Pradeep

+0

"git reset --soft HEAD ^"는 작업 디렉토리와 색인을 그대로 유지하고 현재 분기 중 하나의 커밋을 다시 이동한다는 의미에서 커밋을 취소합니다. –

+0

Thanks Jakub. 파올로가 왜 헤드 - 1로 소프트 리셋해야합니까? 부분적인 커밋과 하드 리셋은 충분해야합니다. 일부 변경 사항을 유지하고 다른 사람을 삭제하는 것이 아닙니까? – Pradeep

3

그런 다음 나머지 차이점을 취소 할 patch -R를 통해 실행, 당신은 저장하고자 할 변경 사항을 제거 편집, 결과 DIFF을 저장, 파일에 git diff을 실행할 수 있습니다.

git diff file.txt >patch.tmp 
# edit patch.tmp to remove the hunks you want to keep 
patch -R <patch.tmp
+0

나는 내 패치 파일에 2 개의 헌크가 있었고 하나를 제거했습니다. 그 이유는 확실하지 않지만 패치 -R은 계속해서 거부됩니다. – Pradeep

+2

다른 주석에서'git diff'는 전체 파일이 변경된 것을 보여줍니다. 이는 일반적으로 이전과 다른 줄 끝을 사용하여 파일을 저장 한 경우에 발생합니다. 이렇게하면'patch'가 패치 파일을 거부하게됩니다. 그런 일이 일어난 것처럼 들리니? –

+0

당신이 옳습니다. 패치 명령을 사용할 때마다 줄 끝이 전환됩니다. 나는 창문 위에 있고 크림/vim을 사용하고있다. 이것을 먼저 정렬해야합니다. – Pradeep

2

는 되돌리기 그냥 ㄱ 전달 방향으로 커밋입니다 당신이 (

git revert --no-commit $REVSISON 

그런 다음 커밋하기 전에 될 것입니다 어떤 변화를 볼 수

git diff --cached 

을 사용할 수 원하는 것 같은데 그 과거의 변화의 역을 복제 함)

만약 당신이 pur e Git 저장소를 사용하면 목표에 따라 대화 형 rebase (git rebase -i)를 사용하여 마음에 들지 않은 커밋으로 돌아가서 커밋을 소급 수정하여 원하지 않는 변경 사항이 발생하지 않았지만 일반적으로 발생하는 변경 사항은 KNOW의 경우에만 다시 볼 수 있습니다.

+0

이전 버전으로 언급 한대로 되돌 렸습니다 (맞습니까?) 이제는 git diff가 변경된 전체 파일을 보여줍니다. 내가 한 편집 내용을 보여줘야하니? – Pradeep

+0

그 변경 사항을 보여 주려고 "퇴짜 낸" –

1

질문을 다시 읽으면 작업 트리에있는 변경 사항을 되돌리고 이전에 커밋 된 변경 사항을 취소하려는 것처럼 들리지만 일부 다른 대답은 내 읽기가 잘못 될 수 있음을 나타냅니다. 당신은 명확히 할 수 있습니까? 그런 다음

git add -i <file> 

당신이 원하지 않는 변경을 던져 :

변경이 당신의 작업 복사본에 불과 경우는이 작업을 수행하는 가장 쉬운 방법은 당신이하는 유지하려는 변화를 준비하는 것입니다 인덱스 버전을 확인하여 유지 : 당신이 원하지 않는 경우 변경 unstage 그런

git checkout -- <file> 

그들을 아직 개최 :

git reset -- <file> 

이 제조법은 선택한 변경 사항을 파일 (또는 지정한 파일)로만 되돌리고 되돌리기가 필요한 임시 커밋을 생성하지 않습니다.

git reset <commit_before_first_unwanted_change> -- <file> 

는 그런 다음 무대 git add -i <file>의 이전 조리법을 따를 수 있습니다 : 당신만을 선택적으로 이전 커밋에서 변경의 일부는 다음 먼저 이전 커밋 상태로 파일을 재설정 할 수 있습니다 적용 할 경우

유지하려는 변경 사항 인 git checkout -- <file>은 원하지 않는 변경 사항을 버리고 git reset -- <file>은 변경 사항을 '언 스토 지'합니다. 파일이있는 경우

−p, −−patch 
     Interactively select hunks in the difference between the <tree−ish> 
     (or the index, if unspecified) and the working tree. The chosen 
     hunks are then applied in reverse to the working tree (and if a 
     <tree−ish> was specified, the index). 
 This means that you can use git checkout −p to selectively discard 
     edits from your current working tree. 
279

나는 당신이 가장 간단하게 할 수 있다고 생각 내가 SSH 터미널을 통해 접근하고있는 서버에서. 그러나 파일이 로컬 컴퓨터에 있으면 다음과 같은 방법으로 선호합니다.

netbeans 편집기 (git 지원과 함께 제공됨)에서 파일을 엽니 다. Netbeans은 물건이 삭제/추가/수정 된 곳을 나타 내기 위해 줄 번호에 빨간색/녹색/파란색 표시를 붙입니다.

이러한 기호 중 하나를 마우스 오른쪽 버튼으로 클릭하면 변경 사항을 실행 취소 할 수 있습니다. 또한 빨간색 및 파란색 표시를 마우스 오른쪽 버튼으로 클릭하여 팝업에서 이전 버전을 확인할 수 있습니다.

+35

이것은 실제로 받아 들여진 대답 일 것입니다, 정확하게 당신이 원하는 것을합니다. – vdboor

+1

또한 이것을 선택적으로 수행하지 않으려면 "git checkout - ..."을 사용하여 변경 사항을 취소 할 수 있습니다. – db42

+0

예, 실제로 답변이 변경되지 않은 이유는 무엇입니까? – lkraav

0

대답을 여기에 설명 된 명령 줄 옵션이 편리 : 맨 페이지에서

git checkout -p <optional filename(s)> 

:

관련 문제