2025. 4. 30. 15:28ㆍ카테고리 없음
git revert 기능은 제대로 써본 적이 없다가 이번에 써본 후 정리한다
사진 1은 revert 후 최종적으로 git 그래프 상태다
그래프를 통해 과정 순서를 나열
- 워프(마차부)-시스템 브렌치 생성 후 4번의 커밋을 했다
- 펫 슬롯 확장 패킷 slotNum 삭제
- WarpType에 WAGON(마차부) 항목 추가
- 침대 관련 필드 및 패킷(침대 구매, 침대 선택) 추가
- 캐릭터 옵션 데이터 변경, 펫 탐색 결과 값에 아이템 인자 삭제
- proto 브렌치를 워프(마차부) 시스템 브렌치 내용을 merge(병합) 했다
여기까지 했다는 과정하에 proto 브렌치를 원복 시켜야 되는 상황이 발생했다
git revert 명령어는 지정한 커밋만을 취소하는 새로운 커밋을 생성합니다. 만약 여러 개의 이전 커밋을 한꺼번에 되돌리고 싶다면, 해당 커밋들을 하나씩 되돌리거나 범위를 지정하여 되돌릴 수 있습니다.
하나씩 되돌리기: 각 커밋을 개별적으로 revert 해야 합니다. 예를 들어:
git revert HEAD # 5번 커밋 revert
git revert HEAD~1 # 4번 커밋 revert
git revert HEAD~2 # 3번 커밋 revert
git revert HEAD~3 # 2번 커밋 revert
git revert HEAD~4 # 1번 커밋 revert
커밋 범위를 지정하여 되돌리기: 여러 커밋을 동시에 revert 하고 싶다면, -n 또는 --no-commit 옵션을 사용하여 임시 스테이징 후 커밋할 수 있습니다.
예를 들어:
git revert --no-commit HEAD~4..HEAD
git commit -m "Revert commits 1 to 5"
위의 명령은 1번부터 5번 커밋까지를 한꺼번에 revert하며, 결과를 새로운 커밋으로 저장할 수 있습니다.
위 내용은 chatGPT 내용이다
주의할 점은 가장 최신의 커밋부터 역순으로 되돌려야 충돌이 나지 않습니다.
- 예를 들어, 커밋 해시가 각각 a1b2c3, d4e5f6, g7h8i9, j1k2l3, m4n5o6 라고 한다면, 다음 명령을 사용하여 5번 커밋부터 1번 커밋까지를 순서대로 되돌립니다
-
git revert m4n5o6 j1k2l3 g7h8i9 d4e5f6 a1b2c3
- 만약 모든 것을 한꺼번에 하나의 커밋으로 합치고 싶다면, --no-commit 옵션을 사용하여 마지막에 한 번에 커밋할 수도 있습니다.
-
하지만 나는 해쉬 방법이 아니라 HEAD 방법으로 revert 해봤다
해쉬 방법을 설명한 이유는 "역순으로 되돌려야 충돌이 나지 않는다"는걸 알려주기 위해 설명했고 다음에는 저렇게도 해봐야지 해서 적었다
하나씩 되돌리기(git revert HEAD)를 사용하는 방식으로 과정 순서를 나열
1. git revert HEAD 입력
- 이전 커밋으로 되돌아 감
- 여기서 git 그래프의 HEAD 상황을 잘 봐야 한다
- 예시
- a1b2c3: 1번 커밋
- d4e5f6: 2번 커밋
- g7h8i9: 3번 커밋
- j1k2l3: 4번 커밋
- m4n5o6: 5번 커밋 (HEAD)
- 첫 번째 git revert HEAD:
- git revert m4n5o6 명령을 실행하면, 5번 커밋의 변경 사항을 취소하는 새로운 커밋이 생성됩니다. 새로운 커밋의 해시는 예를 들어 n7o8p9라고 가정하겠습니다.
- 커밋 로그는 이제 다음과 같이 됩니다:
- a1b2c3: 1번 커밋
- d4e5f6: 2번 커밋
- g7h8i9: 3번 커밋
- j1k2l3: 4번 커밋
- m4n5o6: 5번 커밋
- n7o8p9: 5번 커밋을 되돌리는 커밋
- 위와 같이 있을 경우
- git revert HEAD 다시 할 경우
- 두 번째 git revert HEAD:
- 이제 HEAD는 n7o8p9입니다. 이 상태에서 다시 git revert HEAD를 실행하면, n7o8p9 커밋의 변경 사항을 다시 되돌리는 새로운 커밋이 생성됩니다. 이 커밋의 해시는 예를 들어 o8p9q0라고 가정하겠습니다.
- 최종 커밋 로그는 다음과 같습니다:
- a1b2c3: 1번 커밋
- d4e5f6: 2번 커밋
- g7h8i9: 3번 커밋
- j1k2l3: 4번 커밋
- m4n5o6: 5번 커밋
- n7o8p9: 5번 커밋을 되돌리는 커밋
- o8p9q0: 되돌린 revert 커밋
- 결과적으로, 최종 상태는 원래의 코드 상태로 돌아가지만, 커밋 로그에는 두 개의 추가 커밋이 생긴 것입니다. 첫 번째는 되돌린 커밋을 생성하고, 두 번째는 그 되돌림을 다시 되돌리는 커밋입니다.
- 두 번째 git revert HEAD:
- git revert HEAD 다시 할 경우
- 예시
- git revert HEAD~1 입력
- 두 번째 git revert HEAD~1:
- 현재 HEAD는 n7o8p9입니다. 여기서 HEAD~1은 "HEAD의 이전 커밋", 즉 m4n5o6이 됩니다.
- git revert HEAD~1을 실행하면, 5번 커밋(m4n5o6)의 변경 사항을 취소하는 새로운 커밋이 생성됩니다. 이 새로운 커밋의 해시는 o8p9q0이라고 가정합시다.
- 최종 커밋 로그는 다음과 같습니다:
- a1b2c3: 1번 커밋
- d4e5f6: 2번 커밋
- g7h8i9: 3번 커밋
- j1k2l3: 4번 커밋
- m4n5o6: 5번 커밋
- n7o8p9: 5번 커밋을 되돌리는 커밋
- o8p9q0: 다시 되돌린 커밋 (5번 커밋을 되돌리는 커밋)
- 결론적으로, 최종 결과는 다음과 같이 됩니다:
- n7o8p9는 5번 커밋을 되돌리는 커밋입니다.
- o8p9q0는 5번 커밋을 다시 되돌리는 커밋입니다.
- 두 번째 git revert HEAD~1:
나는 위 내용을 모르고 처음에 git revert HEAD를 하고 다시 git revert HEAD를 하면서 커밋 내용이 꼬이기 시작했다..
나중에 잘못됨을 알고 git revert HEAD~1.. git revert HEAD~n을 반복해서 수습하려 했지만 한번 꼬인 내용을 다시 꼬면서 새로운 문제가 발생했다
결국, git revert HEAD로 revert 할 경우 정말 간단한 이전 커밋만 revert 하고 싶을 경우 사용하고 3개 이상 commit 기록이 있다면 HEAD로 revert 하지 말고 해쉬로 revert 하는 게 좋다
그럼, 처음 목적대로 revert로 이전 내용으로 복원 한 다음 이후 시간이 흘러 다시 작업한걸 merge 해야 될 상황이 오면 어떻게 해야 할까?
사진 1에서 워프(마차부) 시스템 브렌치에서 변경된 파일중(A 파일과 B 파일이라고 한다면) A파일에 임시로 파일 안에 띄어쓰기를 한다음 커밋했다
이후 proto 브렌치로 체크아웃 한다음 워프(마차부)시스템 브렌치를 merge 할 경우 A파일이 충돌이 난다(이게 정상이다)
이유는 워프(마차부)시스템 브렌치 기준으로 다시 이전 파일 내용이 수정된 상태로 커밋이 됐고 proto 브렌치 기준으로는 revert 한 A 파일을 merge 하면서 두 브렌치가 동시에 A 파일이 수정된 상태이기 때문에 충돌이 나는 거다
proto 브렌치에서 A 파일에 대한 충돌을 해결하고 push 하면 A 파일은 수정이 되었지만 B 파일은 워프(마차부) 시스템 브렌치에 내용이 반영 안 된 상태로 끝난다.
그렇기 때문에 사진 1에서 누락된 부분 push 커밋 내용은 B 파일을 워프(마차부) 시스템 브렌치의 B 파일과 비교해서 일일이 수동으로 다시 입력했다..

revert 된 브렌치를 다시 merge 하려면 proto 브렌치에서 revert 한 파일들을 다 찾은 다음 워프(마차부) 시스템 브렌치에서 A 파일처럼 띄어쓰기를 한 다음 커밋 후 proto 브렌치로 돌아와 충돌을 해결하는 방식으로 해야 제대로 merge 한다