개발관련/Git

여러 git 커밋을 되돌리는 방법

Rateye 2021. 12. 9. 10:46
728x90
반응형
질문 : 여러 git 커밋을 되 돌리는 방법은 무엇입니까?

다음과 같은 git 저장소가 있습니다.

A <- B <- C <- D <- HEAD

나는 가지의 머리가 A를 가리 키기를 원합니다. 즉, B, C, D, HEAD가 사라지고 머리가 A와 동의어가되기를 원합니다.

리베이스를 시도하거나 (그 사이에 변경 사항을 적용했기 때문에 적용되지 않음) 되돌릴 수있는 것 같습니다. 하지만 여러 커밋을 되돌리려면 어떻게해야합니까? 한 번에 하나씩 되 돌리나요? 순서가 중요합니까?

답변

내가 댓글에 쓴 내용 확장

일반적인 규칙은 누군가가 자신의 작업을 기반으로 할 수 있으므로 게시 한 기록을 다시 작성 (변경)해서는 안된다는 것입니다. 기록을 다시 작성 (변경)하면 변경 사항을 병합하고 업데이트하는 데 문제가 발생합니다.

따라서 해결책은 제거하려는 변경 사항 을 되 돌리는 새 커밋을 만드는 것입니다. git revert 명령을 사용하여이 작업을 수행 할 수 있습니다.

다음과 같은 상황이 있습니다.

(여기에서 화살표는 포인터의 방향을 나타냅니다. 커밋의 경우 "부모"참조, 분기 헤드 (분기 참조)의 경우 최상위 커밋, HEAD 참조의 경우 분기 이름).

생성해야 할 것은 다음과 같습니다.

여기서 [(BCD)^-1] 은 커밋 B, C, D의 변경 사항을 되 돌리는 커밋을 의미합니다. 수학은 (BCD) -1 = D -1 C -1 B -1이라고 말 하므로 필요한 상황을 얻을 수 있습니다. 다음 명령을 사용하십시오.

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message for all of them"

병합 커밋을 제외한 모든 작업에서 작동합니다.

다른 해결책은 커밋 A의 내용 을 체크 아웃 하고이 상태를 커밋하는 것입니다. 병합 커밋에서도 작동합니다. 단, 추가 된 파일은 삭제되지 않습니다. 로컬 변경 사항이 있으면 먼저 git stash

$ git checkout -f A -- . # checkout that revision over the top of local files
$ git commit -a

그러면 다음과 같은 상황이 발생합니다.

커밋 A '는 커밋 A와 동일한 내용을 갖지만 다른 커밋 (커밋 메시지, 상위, 커밋 날짜)입니다.

Charles Bailey가 수정 한 Jeff Ferland의 대체 솔루션은 동일한 아이디어를 기반으로하지만 git reset을 사용합니다. 여기에서는 약간 수정되어 모든 작업에 적용됩니다.

$ git reset --hard A
$ git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D
$ git commit
출처 : https://stackoverflow.com/questions/1463340/how-to-revert-multiple-git-commits
728x90
반응형