-
[Git] 여러 커밋 revert 하기저장소/git 2022. 2. 5. 17:59
1개의 브랜치에서 여러 커밋을 진행한 후, master에 머지를 했다가 해당 작업물에 문제가 생겼다면 머지 이전으로 되돌아가야 합니다. 하지만 이 때, 커밋 내용이 여러개이므로 squash를 진행하지 않았다면 당황하게 됩니다.
여기서는 여러 커밋 내용을 1번에 revert 하는 방법을 설명하겠습니다.
merge가 완료된 상태에서 revert 하기
먼저 아래와 같은 형태로 브랜치 그래프가 있다고 가정합니다.
* commit 9aed3a99358ccc5bbfd2dd99d29a82273115801a (HEAD -> master) |\ Merge: ccdd474 9796ce6 | | Author: brownbear <@gmail.com> | | Date: Sat Feb 5 16:13:16 2022 +0900 | | | | Merge pull request #1 from brownbear/develop | | | | Develop | | | * commit 9796ce6a4f430df90c9bb038810c5981acf7f02b (origin/develop, develop) | | Author: brownbear <@gmail.co.kr> | | Date: Sat Feb 5 16:11:58 2022 +0900 | | | | 커밋2 | | | * commit 6e04a4404f40e72b81ca93e8d36f8a4ce6728d30 |/ Author: brownbear <@gamil.co.kr> | Date: Sat Feb 5 16:09:11 2022 +0900 | | 커밋1 | * commit ccdd474c9fa68823c3c31a2b4c1fc88ba345c501 | Author: brownbear <@brownbear.co.kr> | Date: Sun Jan 23 00:55:23 2022 +0900 | | 오류 수정
master에서 develop 브랜치가 분기된 후, develop 브랜치에 커밋이 [커밋1, 커밋2]로 총 2개가 반영된 다음, 다시 master로 머지가 된 케이스입니다.
여기서 develop 브랜치의 작업물에 이상이 있어 머지된 내용을 전부 되돌리려고 합니다.
즉, 현재
9aed3a99358ccc5bbfd2dd99d29a82273115801a
에서ccdd474c9fa68823c3c31a2b4c1fc88ba345c501
로 옮겨야 되는 상황입니다.git revert {현재 커밋 해시} -m {되돌릴 부모 번호}
를 입력하면 merge한 내용을 revert할 수 있습니다.* commit 9aed3a99358ccc5bbfd2dd99d29a82273115801a (HEAD -> master) |\ Merge: ccdd474 9796ce6 | | Author: brownbear <@gmail.com> | | Date: Sat Feb 5 16:13:16 2022 +0900 | | | | Merge pull request #1 from brownbear/develop | | | | Develop
를 보면
Merge: ccdd474 9796ce6
로 되어 있는데ccdd474
가 parent number 1이고9796ce6
가 2입니다.이러한 로그는 아래 명령어로 확인할 수 있습니다.
# git log {확인할 커밋 해시} -n {출력할 커밋 개수} git log 9aed3a99358ccc5bbfd2dd99d29a82273115801a -n 1 commit 9aed3a99358ccc5bbfd2dd99d29a82273115801a Merge: ccdd474 9796ce6 Author: brownbear <@gmail.com> Date: Sat Feb 5 16:13:16 2022 +0900 Merge pull request #1 from brownbear/develop Develop (END)
이제 부모 번호를 알았으니 아래와 같이 명령어로 merge 내용을 revert 해봅니다.
git revert 9aed3a99358ccc5bbfd2dd99d29a82273115801a -m 1 git log --graph * commit 0e0f7a32d6f6078e5aca9d0bb1c7a6c3ed22b4f5 (HEAD -> master) | Author: brownbear <@gamil.co.kr> | Date: Sat Feb 5 16:52:51 2022 +0900 | | Revert "Merge pull request #1 from brownbear/develop" | | This reverts commit 9aed3a99358ccc5bbfd2dd99d29a82273115801a, reversing | changes made to ccdd474c9fa68823c3c31a2b4c1fc88ba345c501. | * commit 9aed3a99358ccc5bbfd2dd99d29a82273115801a |\ Merge: ccdd474 9796ce6 | | Author: brownbear <@gmail.com> | | Date: Sat Feb 5 16:13:16 2022 +0900 | | | | Merge pull request #1 from brownbear/develop | | | | Develop | | | * commit 9796ce6a4f430df90c9bb038810c5981acf7f02b (origin/develop, develop) | | Author: brownbear <@brownbear.co.kr> | | Date: Sat Feb 5 16:11:58 2022 +0900 | | | | 커밋2 | | | * commit 6e04a4404f40e72b81ca93e8d36f8a4ce6728d30 |/ Author: brownbear <@gamil.co.kr> | Date: Sat Feb 5 16:09:11 2022 +0900 | | 커밋1 | * commit ccdd474c9fa68823c3c31a2b4c1fc88ba345c501 | Author: brownbear <@gmail.co.kr> | Date: Sun Jan 23 00:55:23 2022 +0900 | | 오류 수정 |
원하던대로 develop 브랜치의 커밋 내용이 전부 revert 된 것을 볼 수 있습니다.
만약 revert한 브랜치를 다시 돌리려면 기존 방식처럼
git revert 해당 커밋 해시
를 진행하면 됩니다.여러 커밋 일괄 revert
merge가 아닌 여러 커밋을 한번에 revert 하는 방법은
git revert 되돌아갈 커밋 해시..되돌리기 시작할 커밋 해시
로 가능합니다.아래와 같은 커밋 내용이 있다고 가정합니다.
commit b028478c25f5e85d8ca4015223161bece00a40a7 (HEAD -> develop, origin/develop) Author: brownbear <@gmail.co.kr> Date: Sat Feb 5 17:43:48 2022 +0900 커밋3 commit 1d42496f5dba4b7122efbec8da79de82af216acc Author: brownbear <@gmail.co.kr> Date: Sat Feb 5 17:43:35 2022 +0900 커밋2 commit cf9e99587e77228e652109113d2bff5cc6d2aa6f Author: brownbear <@gmail.co.kr> Date: Sat Feb 5 17:43:15 2022 +0900 커밋1 commit 9796ce6a4f430df90c9bb038810c5981acf7f02b Author: brownbear <@gamil.co.kr> Date: Sat Feb 5 16:11:58 2022 +0900 커밋2 commit 6e04a4404f40e72b81ca93e8d36f8a4ce6728d30 Author: brownbear <@gamil.co.kr> Date: Sat Feb 5 16:09:11 2022 +0900 커밋1 commit ccdd474c9fa68823c3c31a2b4c1fc88ba345c501 Author: brownbear <@gamil.co.kr> Date: Sun Jan 23 00:55:23 2022 +0900 오류 수정
현재
b028478c25f5e85d8ca4015223161bece00a40a7
이 커밋에서ccdd474c9fa68823c3c31a2b4c1fc88ba345c501
커밋으로 돌리고 싶을 때, 아래와 같이 명령어를 입력합니다.git revert ccdd474c9fa68823c3c31a2b4c1fc88ba345c501..b028478c25f5e85d8ca4015223161bece00a40a7 * commit 06b107c3b45edc0baf5de5eebd16bf107a4e3ba3 (HEAD -> develop) | Author: brownbear <@gamil.co.kr> | Date: Sat Feb 5 17:54:06 2022 +0900 | | Revert "커밋1" | | This reverts commit 6e04a4404f40e72b81ca93e8d36f8a4ce6728d30. | * commit bb5ccaed368e7b36267ec8056bc54e67152a20ae | Author: brownbear <@gmail.co.kr> | Date: Sat Feb 5 17:54:04 2022 +0900 | | Revert "커밋2" | | This reverts commit 9796ce6a4f430df90c9bb038810c5981acf7f02b. | * commit d820e298adb75cb740e484cb5c329b8a71da3b0a | Author: brownbear <@gmail.co.kr> | Date: Sat Feb 5 17:53:59 2022 +0900 | | Revert "커밋1" | | This reverts commit cf9e99587e77228e652109113d2bff5cc6d2aa6f. | * commit ecdfbdb1d5075a9ff9330f7e2cbc6728cc96bcda | Author: brownbear <@gmail.co.kr> | Date: Sat Feb 5 17:53:50 2022 +0900 | | Revert "커밋2" | | This reverts commit 1d42496f5dba4b7122efbec8da79de82af216acc. | * commit 474039c2de798bc3330e81cd4eba4e0450505058 | Author: brownbear <@gmail.co.kr> | Date: Sat Feb 5 17:53:41 2022 +0900 | | Revert "커밋3" | | This reverts commit b028478c25f5e85d8ca4015223161bece00a40a7. |
커밋된 역순으로 revert 커밋이 자동으로 생성되는 것을 볼 수 있습니다.
만약 자동 commit을 사용하지 않으려면
-n
옵션을 추가해주면 됩니다. (stage까지 올라가기 때문에 commit만 수동으로 해주면 됨)