프로그래밍/Git

[Git] 작업을 되돌리는 방법 (checkout, reset, revert)

협업에 있서 작업을 되돌리는 건 신중함을 필요로 합니다.

그래서 이 글을 통해 작업을 되돌리는 대표적인 방법들을 정리해보겠습니다.

 

아래 자료를 참고했습니다.

 


HEAD

HEAD는 현재 작업 중인 브랜치를 가리키는 일종의 포인터입니다.

 

HEAD

 

# .git/HEAD
ref: refs/heads/master

기본적으로 master 브랜치로 checkout 되어있습니다.

 


checkout

checkout은 두 가지 역할을 합니다.

(Git 2.23 이후 두 기능은 switch, restore의 개별 명령어로 분리)

  • 특정 브랜치 또는 커밋으로 이동 (= git switch)
  • 내용 되돌리기 (= git restore)

 

$ git checkout HEAD^       # 한 단계 과거 커밋으로 이동
$ git checkout HEAD~2      # 두 단계 과거 커밋으로 이동
$ git checkout 8325f2      # 특정 커밋으로 이동
$ git checkout feat/login  # 특정 브랜치로 이동

checkout은 HEAD를 특정 브랜치 또는 커밋으로 이동시킵니다.

덕분에 작업 내용은 사라지지 않고 언제든지 돌아올 수 있습니다.

 

만약 HEAD가 브랜치가 아닌 특정 커밋을 가리킨다면 이를 HEAD detached 상태라 합니다.

 

 


reset

reset은 HEAD가 가리키고 있는 브랜치를 특정 커밋으로 이동시킵니다.

 

$ git reset HEAD^     # 한 단계 과거 커밋으로 리셋
$ git reset HEAD~2    # 두 단계 과거 커밋으로 리셋
$ git reset 8325f2    # 특정 커밋으로 리셋

 

 

reset --option

git reset [--option] [commit-id]

 

reset 옵션

  • reset --soft : 이전 커밋으로 되돌림 + 이후 작업들은 stage 상태로 남음
  • reset --mixed : 이전 커밋으로 되돌림 + 이후 작업들은 unstage 상태로 남음 (default)
  • reset --hard : 이전 커밋으로 되돌림 + 이후 작업들은 전부 삭제

 

 

reset vs checkout

 

reset vs checkout

checkout은 HEAD를, reset은 브랜치를 이동시킵니다.

reset을 통해 사용하면 연결이 끊긴 커밋들은 사라집니다.

(삭제된 것처럼 보이는 것뿐, ORIG_HEAD를 통해 복구는 가능합니다.)

 

 


revert

revert는 특정 커밋의 변경 사항만 제거한 상태의 새로운 커밋을 만듭니다.

마치 해당 커밋의 작업을 정반대로 적용하는 것으로 볼 수 있습니다.

 

git revert

 

revert는 하나의 커밋에 대해서만 실행할 수 있습니다.

만약 B 커밋으로 되돌리려면 D, C 순서대로 revert를 해야 원하는 결과를 얻습니다.

그래서 오래전 커밋을 revert 하면 중간 커밋들의 변경 사항 때문에 충돌이 발생할 수 있습니다.

 

 

reset vs revert

reset

$ git reset --hard a0fvf8

 

 

revert

$ git revert 5lk4er  # D 커밋 revert
$ git revert 76sdeb  # C 커밋 revert

 

두 명령어 모두 결과적으로 작업을 되돌립니다.

하지만 revert는 히스토리가 보존되기 때문에 협업에서 보다 안전합니다.

또한 revert는 지울 커밋을 명시하고, reset은 돌아갈 커밋을 명시한다는 차이가 있습니다.

 

 


공부하며 초안을 잡다 보니 두서없는 글이 돼버렸네요 😂

꾸준히 Git을 공부하며 주기적으로 보완하겠습니다.