기타 메모

master에 merge한 수정사항을 다시 돌릴 때: revert

Jonchann 2021. 6. 4. 12:10

PR도 approve받아서 master에 merge 후 릴리스 했는데 에러가 나서 revert를 해야 했다.
revert는 딱 되돌리고 싶은 특정 commit만 들어낼 수 있다.

 

merge한 master의 log를 보면 아래와 같이 merge commit과 개발 branch에서 commit했던 기록들이 나온다.

$ cd /git_repositories/repository
$ git checkout master | git pull
$ git log
commit {revert target merge commit} (HEAD -> master, tag: {tag}, origin/master, origin/HEAD)
Merge: {직전 merge commit} {직전 commit}
Author: {author} <{}>
Date:   Thu Jun 3 09:59:44 2021 +0900

    Merge pull request #411 from {repository}/{feature/my_develop_branch}

    {comment}

commit {commit} (origin/{feature/develop_branch1})
Author: {author} <{}>
Date:   Wed Jun 2 16:25:45 2021 +0900

    {comment}

<중략>

commit {previous merge_commit} (tag: {tag})
Merge: {직전 merge commit} {직전 commit}
Author: {author} <{}>
Date:   Tue May 18 10:04:33 2021 +0900

    Merge pull request #408 from {repository}/{feature/other_develop_branch}

    {comment}

commit {commit}
Author: {author} <{}>
Date:   Thu May 13 15:50:47 2021 +0900

    {comment}

여기서 revert하고 싶은(merge 하지 않은 상태로 되돌리고 싶은) 것은 revert target merge commit이다.

$ git revert -m 1 {revert target merge commit}

-m 1은 정확히는 파악하고 있지 않지만 merge commit을 revert할 때 붙이는 옵션이다.

 

revert를 잘 모르고 처음 사용했을 때는 앞으로 돌려야 한다고 생각해서 내 수정사항을 merge 하기 전 상태인 previous merge commit을 revert 대상으로 적었다.
그러면 어떻게 되냐 하면,

$ git revert -m 1 {previous merge commit}

master에 적용된 수정사항 중에서 다른 사람이 merge한 previous merge commit이 master에서 사라진다.
이 때 log를 보면 아래처럼 되어있다.

$ git log
commit {revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:24:26 2021 +0900

    Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}"

    This reverts commit {previous merge commit}, reversing
    changes made to {previous previous merge commit}.

이 revert를 되돌려 원래 revert하고 싶었던 merge commit을 revert하기 위해선 위에서부터 차례로 commit을 revert하면 된다.
revert는 merge commit이 아니기 때문에 옵션은 붙이지 않아도 된다.

$ git revert {revert commit}
$ git log
commit {revert revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:50:01 2021 +0900

    Revert "Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}""

    This reverts commit {revert commit}.

commit {revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:24:26 2021 +0900

    Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}"

    This reverts commit {previous merge commit}, reversing
    changes made to {previous previous merge commit}.

commit {revert target merge commit} (tag: {tag})
Merge: {직전 merge commit} {직전 commit}
Author: {author} <{}>
Date:   Thu Jun 3 09:59:44 2021 +0900

    Merge pull request #411 from {repository}/{feature/my_develop_branch}

    {comment}

이러면 master와 diff가 없는 상태가 되었다(초기 상태로 돌아왔다).

 

이제 제대로 revert를 하면 아래처럼 된다.

$ git revert -m 1 {revert target merge commit}
$ git log
commit {revert commit} (origin/{feature/my_develop_branch}, {feature/revert_branch})
Author: {author} <{}>
Date:   Thu Jun 3 12:52:47 2021 +0900

    Revert "Merge pull request #411 from {repository}/{feature/my_develop_branch}"

    This reverts commit {revert target merge commit}, reversing
    changes made to {previous merge commit}.

commit {revert revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:50:01 2021 +0900

    Revert "Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}""

    This reverts commit {revert commit}.

commit {revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:24:26 2021 +0900

    Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}"

    This reverts commit {previous merge commit}, reversing
    changes made to {previous previous merge commit}.

commit {revert target merge commit} (tag: {tag})
Merge: {직전 merge commit} {직전 commit}
Author: {author} <{}>
Date:   Thu Jun 3 09:59:44 2021 +0900

    Merge pull request #411 from {repository}/{feature/my_develop_branch}

    {comment}

그러면 정상적으로 revert가 되었기 때문에 이 작업을 한 branch를 master에 merge한다. 물론 merge 전에 push 했다.

$ git checkout master | git pull
$ git merge origin {feature/revert_branch}
$ git log
commit {merge commit} (HEAD -> master, tag: {tag}, origin/master, origin/HEAD)
Merge: {직전 merge commit} {직전 commit}
Author: {author} <{}>
Date:   Thu Jun 3 13:03:34 2021 +0900

    Merge pull request #412 from {repository}/{feature/revert_branch}

    {comment}

commit {revert commit} (origin/{feature/my_develop_branch}, {feature/revert_branch})
Author: {author} <{}>
Date:   Thu Jun 3 12:52:47 2021 +0900

    Revert "Merge pull request #411 from {repository}/{feature/my_develop_branch}"

    This reverts commit {revert target merge commit}, reversing
    changes made to {previous merge commit}.

commit {revert revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:50:01 2021 +0900

    Revert "Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}""

    This reverts commit {revert commit}.

commit {revert commit}
Author: {author} <{}>
Date:   Thu Jun 3 12:24:26 2021 +0900

    Revert "Merge pull request #408 from {repository}/{feature/other_develop_branch}"

    This reverts commit {previous merge commit}, reversing
    changes made to {previous previous merge commit}.

commit {revert target merge commit} (tag: {tag})
Merge: {직전 merge commit} {직전 commit}
Author: {author} <{}>
Date:   Thu Jun 3 09:59:44 2021 +0900

    Merge pull request #411 from {repository}/{feature/my_develop_branch}

    {comment}

어쨌든 revert할 때는 당황하지 말고 위에서부터 하면 된다.