본문 바로가기
도구/Git

Git Push 되돌리기 - reset, revert 비교

by 올럭Dev 2023. 10. 19.
728x90

대표이지미 하나 넣기

목차

  • reset, revert 소개
  • reset 사용해보기
  • revert 사용해보기

reset, revert 소개

  • reset 은 히스토리를 남기지 않고 되돌릴때 사용합니다. 팀원들에게 영향을 줄 수 있어 협의 후 진행해야 됩니다. 혼자 사용할 때 사용하는 것을 추천합니다.
  • revert 는 히스토리를 남기고 되돌립니다. 팀 프로젝트시 소스 관리가 가능합니다

reset/revert 사용해보기

reset/revert시 Commit ID가 필요하니 git log명령어로 Commit ID를 확인해보겠습니다.

우선 git log로 Commit ID 확인하기

  • Commit ID를 확인해 보겠습니다.
git log --oneline

Pasted image 20231004194244.png
가장 최근에 commit 한 부분을 날리고, 두번째 커밋을 기준으로 소스를 유지하고 하려고 합니다.
소스를 유지할 두번째 Commit ID3096f69를 확인하면 되겠죠!

(HEAD -> master, master/master) 의 의미가 멀까요??
git log 명령어에 대해서 알고 싶으면 아래 링크를 확인해보세요~
tistory 링크 - 깃 Git log 확인하기 - HEAD, origin, master
옵시디언 링크 - 깃 Git log 확인하기 - HEAD, origin, master

reset 사용해보기

  • Commit ID 넣어서 reset 해주겠습니다.
git reset --hard <Commit ID>

Pasted image 20231004194523.png
git reset --hard <Commit ID> : repository, staging area, working directory를지 되돌립니다
git reset [--mixed] <Commit Id> : repository, staging area를 되돌립니다
git reset --soft <Commit ID> : repository를 되돌립니다

hard, mixed, soft의 차이는 깃 로컬 저장소 중에서 어느 영역까지 되돌릴 것인지 지정하는 옵션입니다. 참고로 따로 입력하지 않으면 기본값은 --mixed 입니다.

repository, staging area, working directory의 차이가 몰까요?
tistory 링크 - 깃 Git 로컬 저장소 reset - repository, staging area, working directory
옵시디언 링크 - 깃 Git 로컬 저장소 reset - repository, staging area, working directory

  • 그리고 다시 로그를 확인해보면 reset한 Commit ID가 최종 커밋으로 되어 있습니다.
    Pasted image 20231004194746.png
  • 마지막으로 push 하여 동기화를 시켜줍니다.
git push -f origin master

Pasted image 20231004194910.png

push의 origin과 master가 몰까요??
git push -f <원격저장소명> <원격저장소 브랜치명>

push의 -f는 몰까요??
tistory 링크 - 깃 Git Push 알아보기
옵시디언 링크 - 깃 Git Push 알아보기

역시 원격저장소명원격저장소 브랜치명이 master로 동일하니까 헷갈리네요…
저장소 이름을 바꿔야겠습니다!
tistory 링크 - 깃 Git orgin 이름 변경하기 - git remote rename
옵시디언 링크 - 깃 Git orgin 이름 변경하기 - git remote rename

  • 최종 로그 확인해 보겠습니다.
    Pasted image 20231004195100.png

revert 사용해보기

commit 시점에 해당하는 파일만 되돌립니다.
reset처럼 commit 시점 이후의 파일을 모두 되돌리지 않습니다.

  • C에서 A로 revert한다고 가정해 보겠습니다.
    Pasted image 20231019221119.png
    이렇게 되면 B와 C의 변경내역이 사라지는게 아닙니다. 커밋 A에 해당하는 변경점만 되돌려 집니다.

  • B와 C의 변경내역을 되돌리고 A로 가고 싶으면 revert를 2번 해주어야합니다.
    Pasted image 20231019221729.png
    먼저 C에서 B로 되돌리고, 그 다음 B’에서 A로 되돌려야합니다.

  • 우선 테스트를 위해 파일을 생성하고 push, 파일을 수정하고 또 push해서 commit 히스토리를 2개 만들어 두겠습니다.( add new file, edit file)
    Pasted image 20231018235039.png

  • 이제 9c0e068 (Revert point)로 revert를 진행해보겠습니다.

git revert <commit id>

Pasted image 20231018235101.png
revert가 진행되면 커밋 메세지를 입력하고, revert change 리스트를 확인할 수 있도록 화면에 표시됩니다.
Pasted image 20231018234952.png
커밋 메세지를 입력 방법은 qw를 누르면 작성모드로 변경되어 commit 메세지 작성할 수 있습니다. 가장 첫번째 노란색에 커밋 메세지를 작성합니다. (“Revert Success”)
그리고 ESC 누른 후 :wq입력하여 빠져나오면 완료입니다.

  • revert 완료입니다.
    Pasted image 20231018235119.png

  • push를 하고 다시 로그를 보겠습니다.
    Pasted image 20231018235317.png

  • git commit 히스토리를 보겠습니다.
    Pasted image 20231019223105.png
    왼쪽은 파일 2개 수정, 파일 1개 삭제된 커밋 내용입니다.
    오른쪽은 revert로 왼쪽의 수정된 파일2개와 삭제된 파일1개를 되돌려 복구 시킨 것을 볼 수 있습니다.
    하지만 중간 Commit된 파일이 생성되고, 수정 내역은 그대로 유지 됩니다.

마치며

이번 포스팅에서는 reset과 revert에 대해 알아 보았습니다. 매번 reset과 revert에 명확히 인지 하지 못하고 있었는데 이번 기회에 좀 더 명확하게 이해하는 계기가 된 것 같습니다.
특히 몇 번을 테스트를 해봄으로써 예상했던 결과가 실제로 다르다는 걸 깨달았습니다.

revert가 그 경우인데 해당 Commit Id로 revert를 하면 그 사이에 있는 변경점(Commit)들도 히스토리를 남기고 되돌려 지는줄 알았는데, 알고 보니 해당 Commit Id의 변경만 되돌려지는 것이었습니다.

프로젝트 중에 팀원 중 한 분이 reset인가, revert를 한 적이 있습니다. 아마 reset인 것 같네요.
소스를 reset한지 모르고 작업해서 push를 했는데, 나중에 보니 제가 개발한 부분이 없어져서 당황한 기억이 있습니다.
아마 reset시점이 제가 pull받은 시점보다 이전이라서, reset하신 분이 push할 때 마다 제가 push한 부분이 없어졌던 것 같습니다.
결국엔 로컬 브랜치를 삭제 후, 새로 pull 받아서 작업했었는데, reset할 때는 팀원들과 공유해서 신중하게 진행해야 할 것 같아요!~

728x90