[GIT] git reset과 git revert
GIT을 사용하다 보면 이전 커밋으로 돌아가야 할 경우가 종종 생깁니다.
그럴 경우 사용할 수 있는 reset과 revert에 대하여 포스팅을 시작합니다.
1. reset과 revert의 개념과 차이점
reset : 과거의 특정 커밋으로 되돌린다.
revert : 현재에 있으면서 과거의 특정 커밋들만 없앤다.
둘의 공통점은 과거의 커밋으로 되돌린다는 점이지만, 가장 큰 차이점은 과거로 되돌리겠다는 내용도 기록이 되는가? 즉, 커밋 이력에 남는가? 입니다.
reset은 아예 현재가 없었던 것처럼 원하는 과거로 돌아갈 수 있습니다. 말 그대로 '리셋'입니다. reset은 이력을 남기지 않습니다. 따라서 현재까지의 커밋 이력을 남기지 않고 원하는 시점으로 완전히 되돌아가고 싶을 때 사용합니다.
revert는 과거로 돌아가겠다는 이력을 남기고 원하는 시점의 커밋으로 돌아갑니다. 즉, 이전의 커밋 내역을 남겨두고 새로운 커밋을 생성하면서 과거로 돌아갑니다.
Reset은 그림과 같이 4번째 커밋에서 3번째 커밋으로 돌아갈 경우, 4번째 커밋은 완전히 사라지게 됩니다.
Revert의 경우 위 그림상 3번째 위치의 커밋에서 2번째 커밋 내용으로 돌아갈 경우 4번째 위치에 2번째 내용의 커밋이 위치하게 됩니다.(현재 위치 3번째, 이동할 커밋이 2번째 위치, 그렇다면 2번째 커밋의 내역이 현재 위치한 3번째 커밋 다음인 4번째에 위치하게 된다.)
즉, git revert 명령은 브랜치의 커밋 히스토리를 수정하지 않으면서 특정 커밋의 변경사항을 되돌리는 작업에 유용합니다.
2. Reset, Revert를 사용해야 하는 경우
Reset 명령은 커밋 히스토리를 깔끔하게 유지할 수 있고, 혼자 작업 시 편하게 되돌아갈 수 있다는 장점이 있습니다.
그러나, 다른 이들과 같은 브랜치에서 함께 작업할 때 커밋이 뒤섞여버릴 수 있다는 단점도 존재합니다.
Revert 명령은 히스토리에 남게 되어 왜 돌아갔는지 등의 기록을 남길 수 있습니다. 또한 다른 이들과 협업 시 코드 충돌을 최소화할 수 있습니다.
3. Reset, Revert 사용 방법
Reset
git reset --soft [commit ID]
git reset --mixed [commit ID]
git reset --hard [commit ID]
git reset HEAD~10
git reset HEAD^
soft
- commit 된 파일들을 staging area로 되돌려 놓는 옵션(commit 하기 전 상태로)
mixed
- 옵션을 붙이지 않는다면 기본으로 설정됩니다. commit 된 파일들을 working directory로 돌려놓는 옵션(add 하기 전 상태로)
hard
- commit 된 파일들 중 tracked 파일들을 working directory에서 삭제(untracked 파일은 계속해서 untracked 상태로 남음)
HEAD_취소할 커밋의 개수
- 현재로부터 원하는 만큼의 commit이 취소
HEAD^
- 가장 최근의 commit이 취소(기본 옵션 mixed)
Revert
git revert [commit ID]
돌아가고자 하는 commit ID를 적어 사용합니다.