ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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만 수동으로 해주면 됨)

    댓글