개인 공부

Git 헷갈리는 명령어 (reset, revert, rebase)

호기심 많은 솔이 2025. 3. 29. 14:47

*본 게시물은 개인 공부를 기록하기 위해 작성하였으며, 내용에 오류가 있을 수 있음을 밝힙니다.

 

git reset

- git reset은 변경 사항을 취소하는 데 사용한다. 즉, 이전 커밋으로 되돌릴 수 있다.

- 사용 형식 : git reset --(모드) (돌아갈 커밋)

- 모드 인자로는 soft, mixed, hard를 사용한다. (디폴트로 mixed를 사용)

 

- 차이 :

--soft : 커밋은 취소되지만, 스테이징 상태는 유지한다.

--mixed : 커밋과 스테이징이 모두 취소되지만, 로컬 변경 상태는 유지한다.

--hard :  커밋, 스테이징, 로컬 변경 상태를 모두 취소한다.

 

- 사용 예시 :

git reset --hard HEAD~1 (최근 커밋 하나를 삭제하고 변경 내용도 함께 제거)

git reset --hard HEAD~2 (최근 커밋 2개를 삭제하고 변경 내용도 함께 제거)

 

 

 

 

git revert

- git revert도 변경을 되돌릴 때 사용한다. reset 명령어와의 차이점은 revert 명령어는 특정 커밋으로 돌아가는 역할을 수행한다는 것이다.

- 사용 형식 : git revert (돌아갈 커밋)

 

- 사용 예시 :

git revert HEAD (가장 최근 커밋을 무효화하는 새 커밋을 만든다. 원본 커밋은 그대로 남고, 변경사항만 되돌려진다.)

git revert a1b2c3d (a1b2c3d는 되돌리고 싶은 커밋의 해시값. 해당 커밋 내용만 취소하는 새 커밋이 만들어진다.)

git revert HEAD~3..HEAD (최근 3개의 커밋 HEAD~3부터 HEAD까지)을 한 번에 revert 하고 커밋마다 되돌리는 커밋이 따로 만들어진다. (reset 명령어와 달리 HEAD~2..HEAD처럼 범위 지정을 지원한다.)

 

 

 

 

git rebase

- 이 명령어는 단어 뜻 그대로 base를 재설정하는 명령어이다. 이 명령어는 이해하기 조금 어려웠기에 예시를 들어 충돌이 일어나는 경우까지 설명해보겠다.

예를 들어, sports라는 브랜치에서 s1, s2, s3이라는 커밋을 한 후, 이 s3 커밋을 base로 하여 football이라는 브랜치로 작업을 진행한다고 할 때, football 브랜치에서 f1, f2, f3 커밋을 하였고, sports 브랜치에서는 s3에 이어서 s4, s5, s6 커밋을 한 상황을 생각해 보자.

커밋 f1~f3은 커밋 s3을 base로 하여 자신의 브랜치에서만 작업을 한 것이므로 충돌이 일어나지 않지만, 만약 football 브랜치에서 rebase를 사용하여 커밋 s6을 base로 재설정하는 경우, 커밋 f1~f3과 s4~s6에서 같은 줄을 수정하면 충돌이 일어날 수 있다. 이 경우에는 우선 충돌 파일을 열고 원하는 코드로 수정하여 충돌을 해결한 후,

-> git add <해결한 파일>

-> git rebase --continue

이 두 명령어를 실행하면 football 브랜치의 커밋들이 s6 위에 재배치된다.

 

이해하기 쉽도록 모식도를 그려보면 다음과 같다.

 

<rebase 전>

 

 

 

 

<rebase 후>

 

 

rebase 실행 순서 및 명령어

<sports 브랜치에서 s1~s3커밋 작성>

<football 브랜치에서 s3 커밋을 base로 하여 f1~f3 커밋 작성>

<sports 브랜치에서는 s3에 이어서 s4~s6 커밋 작성>

-> git checkout sports (sports 브랜치로 이동)

-> git pull origin sports (최신 sports 받기)

-> git checkout football (football 브랜치로 이동)

-> git rebase sports (sports를 base로 rebase 명령어 실행)