댓글에 쓴 내용 확장
일반적인 규칙은 누군가가 자신의 작업을 기반으로 할 수 있기 때문에 게시 한 기록을 다시 쓰지 않아야한다는 것입니다. 기록을 다시 작성 (변경)하면 변경 내용을 병합하고 업데이트하는 데 문제가 있습니다.
이 솔루션은 만드는 것입니다 그래서 새로운 커밋 하는 되돌립니다 변경 은 없애 싶어. git revert 명령을 사용 하여이 작업을 수행 할 수 있습니다 .
다음과 같은 상황이 있습니다.
A <-B <-C <-D <-마스터 <-머리
(여기에서 화살표는 포인터의 방향을 나타냅니다. 커밋의 경우 "상위"참조, 분기 헤드의 경우 상위 커밋 (분기 참조) 및 HEAD 참조의 경우 분기 이름).
작성해야 할 것은 다음과 같습니다.
A <-B <-C <-D <-[(BCD) ^-1] <-마스터 <-헤드
여기서 "[(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"
다른 해결책은 커밋 A의 내용 을 체크 아웃 하고이 상태를 커밋하는 것입니다.
$ git checkout -f A -- .
$ git commit -a
그러면 다음과 같은 상황이 발생합니다.
A <-B <-C <-D <-A '<-마스터 <-머리
커밋 A '는 커밋 A와 동일한 내용을 갖지만 다른 커밋 (커밋 메시지, 부모, 커밋 날짜)입니다.
Charles Bailey가 수정 한 Jeff Ferland 의 솔루션 은 동일한 아이디어를 기반으로하지만 git reset을 사용합니다 .
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(원격 지사가 마스터라고 가정). 예, 그런 커밋을 푸시 할 수 있습니다.