인프라

git 롤백 방법

소행성왕자 2022. 1. 18. 17:25
Git으로 형상관리를 하다보면 특정 커밋까지 롤백해야 하는 경우가 빈번하다.
 
Git의 Reset과 Revert 명령어에 대한 정확한 이해를 돕기 위해 설명해본다.
 

reset VS revert

  • reset 커밋 이력(history) 남기지 않고 특정 커밋까지 되돌린다.
  • revert 커밋 이력을 남기고 특정 커밋까지 되돌린다.

 

reset

 
롤백 히스토리를 남기지 않고 커밋을 삭제한다.
 
이 경우는 혼자만 사용하는 리포지토리이거나 또는 팀 작업을 할 경우 다른 팀원이 롤백할 커밋을 pull로 당겨가지 않았다는 것을 확인한 경
 
우에만 사용 한다.
  • --hard 옵션을 사용하면 돌아간 커밋 이후의 변경 이력은 모두 삭제합니다.
$ git log  --abbrev-commit

commit 95b3fcdf3ee1b245d7b1bc0ffea904d27179970d (HEAD -> develop, origin/develop)
Author: naya <kerias@naver.com>
Date:   Tue Jan 18 16:31:19 2022 +0900

    dev-2.txt

commit 0940b73618337fa5052bfc999c7a2c1de1bd5b54
Author: naya <kerias@naver.com>
Date:   Tue Jan 18 16:30:53 2022 +0900

    dev-1.txt add

commit de5c78e9a083c1e316e51320a1ddaf7f57cccc6b
Author: naya <kerias@naver.com>
Date:   Tue Jan 18 16:30:22 2022 +0900

    정리2

commit eba87339a01da3e7ceb6ba45ff3c77d1f7c493cf
Merge: e9d7d13 e2e63ea
Author: naya <kerias@naver.com>
Date:   Tue Jan 18 16:29:53 2022 +0900


dev-1.txt add 까지 되돌릴려면

$ git reset --hard {해시값}
$ git reset --hard 0940b73618337fa5052bfc999c7a2c1de1bd5b54
$ git push -f origin develop

또한 되돌린후 remote 에 push 할때 오류 발생하면

 ! [remote rejected] develop -> develop (pre-receive hook declined)
error: failed to push some refs to

브랜치 생성 시 main 브랜치가 Protected branches로 설정되어 Developer는 push를 할 수 없었습니다.

중요도에 따라서 Maintainer가 처리하거나, Developer가 직접 할 수 있도록 권한 설정을 할 수 있습니다. 저는 혼자 사용하는 git이기 때문에 Protected branch를 사용하지 않도록 변경하였습니다.

GitLab의 Project에서 Settings -> Protected branches로 들어가시면 다음과 같이 권한을 변경하거나 사용하지 않도록 변경할 수 있습니다.

 

 

revert

 

로그 확인

$ git log  --abbrev-commit

commit b5b6da9 (HEAD -> develop, origin/develop)
Author: kilkil <aa@aa.com>
Date:   Mon Jan 24 14:04:13 2022 +0900

    6.txt add

commit 196940d
Author: kilkil <aa@aa.com>
Date:   Mon Jan 24 14:02:11 2022 +0900

    5.txt add

commit 0e0d10f
Author: kilkil <aa@aa.com>
Date:   Mon Jan 24 14:01:51 2022 +0900

    4.txt add

commit dc8b3c5
Author: kilkil <aa@aa.com>
Date:   Mon Jan 24 13:55:52 2022 +0900

    3.txt add

commit 4ef6017
Author: kilkil <aa@aa.com>
Date:   Mon Jan 24 13:44:28 2022 +0900

    Revert "4.txt add"

    This reverts commit ed4a6bd4b85261e4e1335836cc1c30f4b0411943.

commit 35ec412
Author: kilkil <aa@aa.com>
  6.txt add
  5.txt add
  4.txt add 

  위 커밋 되돌리기 

  dc8b3c5 : 3.txt add
  b5b6da9 : 가장최근 6.txt add

$ git revert --no-commit  dc8b3c5..b5b6da9
  6.txt 5.txt 4.txt 삭제됨

$ ls -al

$ git commit -m "6,5,4 revert"

$ git push

 

 

 

merge 되돌리는 방법
 

git log 에서 머지 부분을 찾는다.

$ git log --abbrev-commit
...
...
commit 972660ba12cdd5d4031a0c9246f8c90eac82c4ab
Merge: f013a88 54bf62e
Author:
Date: Tue Jan 18 16:48:28 2022 +0900

Merge branch 'master' into develop

...


$ git show 972660ba12cdd5d4031a0c9246f8c90eac82c4ab

commit 972660ba12cdd5d4031a0c9246f8c90eac82c4ab
Merge: f013a88 54bf62e
Author:
Date: Tue Jan 18 16:48:28 2022 +0900

Merge branch 'master' into develop
 


Merge 두개가 보인다.
Merge: f013a88 54bf62e

972660ba12cdd5d4031a0c9246f8c90eac82c4ab 커밋은 f013a88 커밋과 54bf62e 커밋을 머지한 커밋입니다.
이러한 커밋을 머지(Merge) 커밋이라고 부르는데, 이런 커밋을 되돌릴 때는 어느 쪽 커밋으로 되돌릴 지 지정해주어야합니다.
이 때 사용하는 옵션이 바로 m 옵션입니다.

git revert -m 1 972660ba12cdd5d4031a0c9246f8c90eac82c4ab
git revert -m 2 972660ba12cdd5d4031a0c9246f8c90eac82c4ab


예를 들어 f013a88 커밋으로 되돌리려면 -m 1, 54bf62e 커밋으로 되돌리려면 -m 2를 지정해주면 됩니다
(git show에서 보여지는 Merge: 뒤의 값들에 차례대로 번호가 부여됩니다).