Git

[Git] 커밋 시점 돌아가기(checkout), 커밋 되돌리기(reset)

Eun 2021. 5. 19. 00:28

코딩을 하다가 가끔 과거 작업으로 돌아가고 싶을 때가 있다.

 

이때 사용하는 명령이 checkout 명령이다.

 

HEAD

HEAD는 현재 브랜치를 가리키는 포인터이며, 커밋 중 가장 마지막 커밋을 가리킨다. 즉, 가장 최근이라는 것!

따라서 아래 명령은 현재 위치(HEAD)에서 한 단계 과거로 가는 명령어이다.

git checkout HEAD~1

1은 한단계를 뜻하고 HEAD~10을 적으면 10단계 과거로 간다는 것이다.

 

Hash

HEAD말고 Hash를 사용할 수도 있다. 

Hash는 해당 커밋의 고유번호이다.

아래 명령은 커밋 고유번호를 명시해 이동하는 명령어이다.

git checkout 6f4d9505

 

 

다시 마스터 브랜치로 이동하고 싶을 때는 아래 명렁어를 실행하면 된다.

git checkout master

만약, 자신의 브랜치로 복귀하고 싶을때는 master 대신 자신의 브랜치명을 작성하면 된다.

 

위의 경우에는 HEAD를 이동해서 커밋 시점을 이동하는 것이다.

 

만약, 되돌린 후 원격 저장소에 반영하고 싶다면?

로컬 저장소에 커밋을 되돌린 후 이것을 원격 저장소에 반영하고 싶다면 방법이 있다.

1. git reset 

2. git puch -f origin master

위의 두 절차를 거쳐야한다.

Reset

reset은 위와 같은 checkout 명령어와 다르게 HEAD를 변경시키는 것이 아닌 브랜치가 가리키는 것 자체를 변경한다.

따라서 reset은 되돌린 커밋 이후의 내역은 날라간다. checkout 명령어가 좀 더 워킹 디렉토리를 안전하게 다룬다.

아래 그림을 보면 이해가 갈 것이다.

암튼 개념은 간단히 넘어가고..! 

 

첫번째로 git reset 명령어를 이용해서 커밋을 되돌린다.

git reset --hard HEAD~1

 

그 후에 push를 하는데, 로컬 저장소의 커밋위치와 원격 저장소의 커밋위치가 다르므로 강제로 덮어써야한다.

이때 사용하는 명령어가 -f 또는 --force 명령어이다.

git push -f origin master

 

위의 절차를 걸치면 원격 저장소에 커밋이 되돌려진다.

 

하지만 위의 방법은 팀원이랑 git으로 프로젝트를 공유하고 있을 때 주의해야한다.

커밋을 되돌리기 전에 다른 팀원이 이미 pull을 했다면 다른 팀원의 로컬 저장소에는 내가 되돌린 커밋의 흔적이 있을 것이다.

그리고 그 팀원이 push를 하게 된다면 다시 원격저장소에 내가 되돌릿 커밋이 추가될 것이다.

 

따라서 되돌리기 전에 pull을 한 팀원이 없을 경우에 사용해야한다.

 

 

참고

https://jupiny.com/2019/03/19/revert-commits-in-remote-repository/

https://jechue.tistory.com/55

https://git-scm.com/book/ko/v2/Git-도구-Reset-명확히-알고-가기