[Git] Git reset & revert

문지은·2023년 5월 1일

Git

목록 보기
6/6
post-thumbnail

Git reset

  • 시계를 마치 과거로 돌리는 듯한 행위로, 프로젝트를 특정 커밋(버전) 상태로 되돌림
  • 특정 커밋으로 되돌아 갔을 때, 해당 커밋 이후로 쌓았던 커밋들은 전부 사라짐
  • git reset [옵션] {커밋 ID}
    • 옵션은 soft, mixed, hard 중 하나를 작성
    • 커밋 ID는 되돌아가고 싶은 시점의 커밋 ID를 작성

Git reset의 세 가지 옵션

--soft

  • 해당 커밋으로 되돌아가고
  • 되돌아간 커밋 이후의 파일들은 Staging Area로 돌려 놓음

--mixed

  • 해당 커밋으로 되돌아가고
  • 되돌아간 커밋 이후의 파일들은 Working Directory로 돌려 놓음
  • git reset 옵션의 기본 값

--hard

  • 해당 커밋으로 되돌아가고
  • 되돌아간 커밋 이후의 파일들은 모두 Working Directory에서 삭제
    -> 따라서 사용시 주의할 것!
  • 기존의 Untracked 파일은 사라지지 않고 Untracked로 남아있음

연습하기

  • 파일 3개, commit 3개를 생성한 다음 git reset을 연습해보자.
$ git add test1.txt
$ git commit -m "first"

$ git add test2.txt
$ git commit -m "second"

$ git add test3.txt
$ git commit -m "third"
  • git log --oneline를 확인해보면 각 커밋의 commit ID(hash code)를 확인할 수 있다.

git reset --soft

  • git reset --soft {커밋 ID} 명령어를 통해 first 커밋으로 돌아가기
$ git reset --soft c896df4 
  • 해당 커밋으로 되돌아 가고 이후의 파일들은 Staging Area로 돌아감을 확인

git reset --mixed

  • git reset --mixed {커밋 ID} 명령어를 통해 first 커밋으로 돌아가기
$ git reset --mixed c896df4 
  • 해당 커밋으로 되돌아 가고 이후의 파일들은 Working Directory로 돌아감을 확인

git reset --hard

  • Untracked 파일은 어떻게 되는지 확인하기 위해 test4.txt 파일 생성

  • git reset --hard {커밋 ID} 명령어를 통해 first 커밋으로 돌아가기
$ git reset --hard c896df4 
  • 해당 커밋으로 되돌아가고 이후의 파일들은 Working Directory에서 삭제됨을 확인
    • Untracked 파일은 사라지지 않음

git reflog

  • git reset의 hard 옵션은 Working Directory 내용까지 삭제하므로 위험할 수 있음
  • git reflog 명령어를 사용하면 reset 하기 전의 과거 커밋 내용을 모두 조회 가능
  • 이후 해당 커밋으로 reset 하면 hard 옵션으로 삭제된 파일도 복구 가능
$ git reset --hard 6110f88

특정 커밋으로 reset 했을 때 특정 커밋 이후에 커밋되었던 파일들의 상태

옵션working directorystaging arearepository
--softVHEAD가 특정 커밋을 가리킴
--mixedVHEAD가 특정 커밋을 가리킴
--hardHEAD가 특정 커밋을 가리킴

git revert

  • 과거를 없었던 일로 만드는 행위로, 이전 커밋을 취소한 다음 새로운 커밋을 생성
  • git revert {커밋 ID}
    • 커밋 ID는 취소하고 싶은 커밋 ID를 작성

git reset과의 차이점

  • 개념적 차이
    • reset은 커밋 내역을 삭제하는 반면, revert는 새로운 커밋을 생성함
    • revert는 Github를 이용해 협업할 때, 커밋 내역의 차이로 인한 충돌 방지 가능
  • 문법적 차이
    • git reset 5sd2f42라고 작성하면 5sd2f42라는 커밋으로 되돌린다는 뜻
    • git revert 5sd2f42라고 작성하면 5sd2f42라는 커밋 한개를 취소한다는 뜻
      (5sd2f42라는 커밋이 취소되었다는 내용의 새로운 커밋을 생성함)

연습하기

  • git revert {커밋 ID} 명령어를 통해 세 번째 커밋 취소하기
$ git revert 6110f88
  • 커밋을 취소 했다는 커밋 메세지를 입력 할 수 있게 된다.
    - i 입력 후 입력 모드로 변경하여 메시지 입력하고
    - esc 입력 후 명령 모드로 변경하여 :wq+enter 눌러 메세지 저장 하고 vim 종료
  • 세 번째 커밋이 취소 되어 test3.txt 파일은 삭제되고, 커밋이 취소되었다는 새로운 커밋이 생성된다.
    • Untracked 파일은 삭제되지 않는다.

  • $ git reset --hard {커밋 ID} 명령어를 통해 삭제된 파일을 복구할 수 있다.
$ git reset --hard 6110f88

profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글