reset
`reset` 명령어로 특정 커밋 지점으로 되돌아가고, 이력을 정리하며 원격 저장소에 변경사항을 반영할 수 있다.
참고글 :
1. 커밋 이력 조회
git log --oneline
위와 같이 한 줄로 로그를 조회하라는 명령어를 입력하면 아래와 같이 터미널에 각 커밋에 대한 일곱자리 해시값과 커밋 메시지가 표시된다.
abcd123 (HEAD -> main, origin/main, origin/HEAD) Add feature XYZ
efgh456 Fix bug in login functionality
ijkl789 Update documentation
mnop012 Refactor code for better performance
- HEAD : 현재 작업중인 브랜치를 가리키며, 브랜치 이름과 함께 가장 최근의 commit 메시지가 표시된다.
2. 원하는 시점으로 되돌리기
Git reset을 사용하면 특정 커밋 지점으로 되돌아갈 수 있다. 다음 명령어를 사용하여 이전 커밋으로 이동한다.
git reset --hard "해당commit의해시값"
- reset hard : 돌아갈 시점 이후의 모든 이력을 삭제하는 옵션. 이전에 커밋한 파일의 이력이 모두 사라진다.
- reset soft : 이력을 남겨두는 옵션. 즉 이전에 커밋했던 파일들은 스테이징 상태로 남겨진다.
예를 들어 해시값으로 `efgh456` 을 입력하고` --hard` 옵션을 사용했다고 가정했을 때, `git log --oneline` 을 입력하면 아래와 같이 터미널에 출력된다. 즉, 해당 커밋 이후의 이력만 남게되는 것이다.
efgh456 (HEAD -> main) Fix bug in login functionality
ijkl789 Update documentation
mnop012 Refactor code for better performance
이 상태에서 `git status` 로 조회하면 아래와 같은 메시지가 출력된다.
$ git status
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
- "Your branch is behind 'origin/main' by 1 commit": 로컬 브랜치(main)가 원격 브랜치(origin/main)보다 1개의 커밋만큼 이전 상태에 있다는 뜻임을 나타내는 메시지.
- "and can be fast-forwarded": 이전 커밋이 없거나 다른 커밋들이 없어서 브랜치를 간단히 병합/업데이트할 수 있다는 뜻.
- "(use "git pull" to update your local branch)": git pull 명령어를 사용하여 로컬 브랜치를 업데이트할 수 있다는 뜻. `git pull`은 `git fetch`와 `git merge`를 합쳐놓은 명령어로, 원격 저장소로부터 최신 변경 사항을 가져와 로컬 브랜치를 업데이트한다.
그러나 여기에서 우리는 원격 저장소의 상태를 pull하고 싶은 게 아니라, 로컬의 상태를 원격 저장소에 반영하고 싶은 것이기에 pull이 아니라 push를 해줘야 한다.
3. 원격 저장소에 변경사항 반영하기
원격저장소를 내가 되돌린 상태(현재)와 같게 만들려면 아래 명령어를 사용하여야 한다.
git push -f origin 브랜치명
`-f` 옵션을 사용하여 강제로 푸시(push)하면 원격 저장소에 현재 로컬 저장소의 상태를 강제로 덮어씌울 수 있다. 따라서 이 명령어를 사용할 때에는 주의가 필요하다.
Reference