순간을 기록으로

[Problem] 원격저장소에 올라간 커밋을 되돌리고 싶을 때 본문

Error

[Problem] 원격저장소에 올라간 커밋을 되돌리고 싶을 때

luminous13 2022. 6. 1. 23:41

 

상황

이미 원격저장소로 올라간 1개의 Commit을 되돌리고 싶었다. 왜냐면 오리지널 원격저장소에 PR을 한 커밋만 보내고 싶은데 한 커밋만 선택할 수 없었다. 그래서 이미 올라간 2개 커밋 중 한 커밋을 로컬로 되돌리고 싶었다.

 

사실 1장 commit하고 PR을 날렸고, 그 이후에 2장을 커밋했다. 그리고  2장 PR을 날리려고 해보니 안되었다. 그래서 확인해보니깐 첫 PR에 두 개의 커밋이 모두 포함되어있었다. 일단 1장씩 PR을 날리기로 약속했어서 잘못된 PR을 Closed했다.

 

따로했는데 첫 PR에 두 Commit이 들어가있었다..

해결

방법1 - git reset: 로컬에서 커밋을 되돌린 후 강제 푸시하기(비추천)

Local에서 `git reset` 명령어를 사용하면 된다.

$git reset --hard HEAD~3

위 명령어를 사용하고 git push -f origin main을 하면 로컬 최신 커밋 3개를 되돌린 후 올린다.

로컬 저장소 커밋 히스토리가 원격 저장소 커밋 히스토리보다 뒤처져 있기 때문에 -f (force) 옵션을 입력해주지 않으면 에러가 발생한다.

 

하지만 위 방법은 협업할 때 비추천한다. 만약 내가 올리고 나서 다른 팀원분이 pull을 했다면 잘못된 나의 커밋이 팀원분의 local 커밋 히스토리에 남게 된다. 그리고 팀원분이 다시 올릴 때 올리고 싶지 않았던 커밋이 다시 올라가게 된다.

 

따라서 이 방법은 다른 팀원이 내가 지우고 싶은 커밋들을 pull로 당기지 않았을 때 사용해야 한다. 

 

방법 2- git revert: 되돌리는 작업도 커밋으로 만들기

git revert는 되돌리고 싶은 커밋을 지우는 것이 아니다. 되돌리고 싶은 커밋 위에다가 되돌리는 작업도 커밋으로 올린다. 따라서 방법 1에서 발생한 문제도 해결할 수 있다.

 

$git revert [되돌리고 싶은 커밋의 hash] --no-edit

 

결과

 

되돌리는 작업도 커밋으로 쌓인다

3개의 커밋에 한 PR에 있지만 두 번째 커밋을 세 번째 커밋이 되돌려주니 첫 커밋의 내용만 반영할 수 있었다!


참고

https://www.lainyzine.com/ko/article/git-revert-reverting-commit-in-git-repository/ 

 

git revert 사용법: 이미 커밋한 내용을 되돌리는 방법

Git 저장소의 특정 커밋을 되돌릴 때는 revert 서브 커맨드를 이용하빈다. reset과 달리 revert 명령을 사용하면 특정 커밋을 되돌리는 커밋을 만들어주기 때문에 안전하게 커밋 내용을 되돌릴 수 있

www.lainyzine.com

 

Comments