*본 게시물은 개인 공부를 기록하기 위해 작성하였으며, 내용에 오류가 있을 수 있음을 밝힙니다.
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 명령어 실행)