GIT에서 부분 복귀를 할 수 있습니까


156

다중 파일 커밋에서 단일 파일 또는 파일의 특정 변경 사항 만 되돌릴 수 있습니까?

전체 이야기 나는 많은 파일을 커밋했습니다. 나중에 많은 이름을 가진 사람 (JACK !!!)은 커밋을 저장소에 파일을 복사하고 여러 파일을 커밋하여 내가 한 변경 사항을 덮어 썼습니다. 클로버 또는 더 나은 파일 하나를 되돌리려면 해당 파일에서 두 가지 변경 사항을 되 돌리십시오. 이것은 끌어 당기고 나서 별도의 되돌리기 커밋이어야합니다.


브라이언은 나를 올바른 길로 안내했다. git add --patch를 사용하고 패치 내에서 편집 기능을 사용하여 원하는 것을 얻었습니다.
클러치

2
게임에 늦었지만 "올바른"답변을 찾았 습니다 .
ntc2

@ ntc2 이상하게도, 받아 들인 대답은 링크 된 것보다 훨씬 나에게 효과적이었습니다. 패치를 적용하지 않고 해결하기 위해 병합 충돌을 일으켰습니다.
Iiridayn

@liridayn 내 대답을 전부 읽었습니까? "variations"섹션 --3way에서 패치를 적용하지 않고 병합 충돌이 발생 한다고 주장합니다 .
ntc2

답변:


204

'--commit'옵션을 추가하여 새로운 커밋을 만들지 않고 커밋을 되돌릴 수 있습니다. 이렇게하면 되 돌린 모든 파일이 준비 영역에 남습니다. 거기에서 소프트 리셋을 수행하고 실제로 원하는 변경 사항을 추가합니다. 예제 워크 플로 :

git revert <sha-of-bad-commit> --no-commit
git reset   // This gets them out of the staging area
<edit bad file to look like it should, if necessary>
git add <bad-file>
git checkout . // This wipes all the undesired reverts still hanging around in the working copy
git commit

42
소프트 재설정 후 git add -p전체 파일 대신 선택적으로 파일 청크를 추가 할 수있는 대화식 세션을 시작할 수도 있습니다. ( git reset -p선택적으로 단계적 변경을 취소 할 수도 있습니다 . 알아두면 좋지만이 시나리오에서는 원하지 않을 것입니다.)
Stéphan Kochen

1
이것이 바로 내가 찾던 것입니다. 작업 사본으로 되돌리고 대화식으로 덩어리를 선택하고 커밋하십시오. 당신은 그에 대한 큰, 짠 사람-스모크 자격이 있습니다 : *
das_weezul

이것에 의해 영감을 또 다른 해결책은하는 것 revert, reset, stash -p, (마리화나는 "나는 actualy 만들고 싶어하지 않는 취소") add, 나머지commit
시릴 CHAPON

82

checkout명령을 사용하여 이전 버전의 파일을 대화식으로 적용 할 수 있습니다 .

예를 들어, COMMIT다시 추가 할 코드가 제거 된 위치 를 알고 있으면 다음 명령을 실행할 수 있습니다.

git checkout -p COMMIT^ -- FILE_TO_REVERT

Git은 파일의 현재 버전에서 누락 된 덩어리를 다시 추가하라는 메시지를 표시합니다. e다시 적용하기 전에 변경 패치를 작성하는 데 사용할 수 있습니다 .


파일의 일부만 되돌리려는 경우 매우 유용합니다! 기본적으로 머리에서 덩어리를 얻으려면git checkout -p path/to/file
falstaff

40

를 사용하여 되돌리려는 파일의 오래되고 좋은 내용을 수동으로 확인할 수 있습니다 git checkout. 예를 들어 my-important-file버전에 있던 버전 으로 되돌리려 abc123면 다음을 수행하십시오.

git checkout abc123 -- my-important-file

이제 당신은 오래된 내용을 가지고 있으며 my-important-file, 기분이 좋으면 편집하고 평소와 같이 커밋하여 변경 사항을 되돌릴 수 있습니다. 커밋의 일부만 되돌리려면 git add -p커밋 할 패치에서 몇 개의 덩어리 만 선택하십시오.


19
revert파일은 이전 버전의 파일을 다시 가져 오는 것입니다. 적절한 revert커밋은 잘못된 커밋 이후 여러 번 수정 된 경우에도 파일 내에서 잘못된 커밋 수정 사항을 제거하며 해당 수정 사항 을 잃고 싶지는 않습니다 .
Totor

2
토터, 내 대답을 참조하십시오. '-p'를 사용하여 수정 사항을 저장할 수 있습니다. 대답은 실제로 이것에 매우 가깝습니다.
cmcginty

1
또는 이것을로 결합 할 수 있습니다 git checkout -p.
Léo Lam

31

나는 Git 메일 링리스트에서 이것을하는 방법을 찾았다 :

git show <commit> -- <path> | git apply --reverse

출처 : http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406

변형

패치가 제대로 적용되지 않으면 명령이 실패하지만 변경 사항이 발생 --3way하면 충돌이 발생하여 수동으로 해결할 수 있습니다 (이 경우 Casey의 답변 이 더 실용적 일 수 있음).

git show <commit> -- <path> | git apply --reverse --3way

이것을 사용하여 여러 커밋을 부분적으로 되돌릴 수 있습니다.

git log -S<string> --patch | git apply --reverse

<string>커밋에서 변경 사항이 일치하는 파일을 되돌 립니다. 이것은 내 유스 케이스에 필요한 것입니다 (몇 가지 별도 커밋은 다른 파일과 비슷한 변경 사항을 가져 왔으며 다른 파일은 되돌리고 싶지 않은 관련없는 방식으로 변경했습니다).

diff.noprefix=true설정 ~/.gitconfig-p0경우 git apply명령 에 추가 해야합니다 . 예 :

git show <commit> -- <path> | git apply -p0 --reverse

이 대답은 받아 들여진 것보다 훨씬 낫습니다. "아직 더 들어가서 해당 파일의 두 가지 변경 사항을 되 돌리십시오".
재 작성

커밋의 내가했다, 그래서 나는 일부만을 되돌릴 원 : (1) git show ... > foo.txt (2) 편집 foo.txt내가 되돌릴 수없는 원한 차이점 제거 (3) git apply --reverse foo.txt 여전히에 나와있는 차이점을 되돌릴 foo.txt.
cxw

git show 부분에 --binary --full-index를 추가하면 유용한 변형이 될 수 있습니다
Laurynas Biveinis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.