커밋 아이디 확인
커밋을 제어하기 전에 먼저 커밋 아이디를 확인해야 한다. 커밋 아이디는 커밋을 생성할 때마다 자동으로 생성되는 고유 아이디를 의미한다. 터미널을 열고 프로젝트 루트 폴더로 이동 후 git log를 입력하면 최신 커밋과 같이 이전 커밋들도 시간 순서대로 보여준다.
git log
git revert, reset
revert, reset은 커밋을 되돌리기 위해 사용하는 명령어다. 둘 다 커밋을 되돌린다는 점에서는 동일하지만, reset은 커밋 history 자체를 뒤로 돌리고, revert는 커밋 history는 그대로 유지한 체 로컬 파일만 이전 커밋 상태로 되돌린다는 차이점이 있다.
git reset
# 커밋 history를 이전으로 되돌린다.
git revert
# 커밋 history를 유지한 체 로컬 파일만 이전 상태로 되돌린다.
reset
로컬에만 커밋이 머물러 있거나, 원격 저장소에 push를 했어도 나만 사용하는 게 확실한 브랜치라면 reset을 써도 상관없다. 하지만 다른 사람들과 공유하고 있는 브랜치라면 서로의 커밋 history가 달라지기 때문에 서로를 위해서도 하지 않는 게 좋다.
reset 옵션
--hard
되돌린 커밋 이후의 모든 커밋 history를 삭제한다.
git reset --hard HEAD^
# 바로 이전 커밋으로 되돌린다.
git reset --hard HEAD~3
# 3 커밋 전으로 되돌린다.
git reset --hard 커밋아이디
# 특정 커밋으로 되돌린다.
--soft
커밋 history는 삭제되지만 변경 사항은 stage에 올라간 상태로 남는다.
git reset --soft HEAD^
# 바로 이전 커밋으로 되돌린다.
git reset --soft HEAD~3
# 3 커밋 전으로 되돌린다.
git reset --soft 커밋아이디
# 특정 커밋으로 되돌린다.
--mixed
커밋 history는 삭제되지만 변경 사항은 stage에 올라가지 않은 상태로 남는다. add랑 commit을 하기 전 상태.
git reset --mixed HEAD^
# 바로 이전 커밋으로 되돌린다.
git reset --mixed HEAD~3
# 3 커밋 전으로 되돌린다.
git reset --mixed 커밋아이디
# 특정 커밋으로 되돌린다.
# 되돌린 이후 정상적으로 작동하면 변경 사항을 삭제하면 되고,
# 모종의 이유로 다시 원복하고 싶으면 아래 코드로 다시 커밋하면 된다.
git add .
# 모든 변경 사항을 stage에 올린다.
git commit -m "커밋 제목"
# stage에 올린 변경 사항 커밋
git push
# 원격 저장소에 push
원격 저장소에 올라간 커밋을 reset 하면?
원격 저장소에 올라간 커밋을 되돌리면 원격 저장소와 로컬 저장소의 커밋 history가 다르기 때문에 push 할 때 오류가 난다. 이 때는 --force 옵션을 줘서 강제로 원격 저장소의 커밋 history를 로컬 저장소의 커밋 history로 덮어씌워야 한다. 다른 사람들과 공유하고 있는 원격 저장소라면 공유중인 다른 사람들에게도 모두 오류가 발생하기 때문에 왠만하면 사용하지 않는 게 좋다. 부득이하게 사용한 경우라면 팀원들에게 상황을 공유하고 모두의 커밋 history를 강제로 맞추는 작업을 해야 한다.
git push 원격저장소 커밋 --force
# 강제로 원격 저장소에 push 한다.
git push origin HEAD --force
# 강제로 마지막 커밋을 원격 저장소(origin)에 push 한다.
reset을 사용하는 경우
- 커밋을 원격 저장소에 올리지 않고 로컬 저장소에만 올린 경우
- 원격 저장소에 올려도 나만 사용하는 브랜치인게 확실한 경우
- 치명적인 오류를 포함하고 있어 커밋 자체를 아예 삭제해야 하는 경우
revert
revert는 커밋을 삭제하는 게 아니라 이전의 변경 사항을 불러와서 새로운 커밋을 추가한다. reset이 타임 머신을 타고 과거로 돌아가는 거라면, revert는 내 시간은 그대로고 과거의 사람을 현재로 불러오는 느낌? reset처럼 history가 꼬일 일이 잘 없기 때문에 더 안전한 방법이라고 할 수 있다.
revert를 사용하게 되면 git log에 Revert "커밋메시지"가 추가된다.
revert 사용 예시
git revert HEAD
# 바로 이전 커밋으로 되돌린다.
git revert 커밋아이디
# 특정 커밋아이디로 되돌린다.
git revert -m 1 HEAD
# 마지막 커밋이 merge라면, 마지막 커밋으로 되돌린다.
git revert --no-commit 커밋아이디
# 특정 커밋아이디를 stage에는 올라가지만 commit하지는 않은 상태로 되돌린다.
Revert는 커밋 history가 삭제되지 않고 어떤 커밋이 Revert 됐는지도 기록에 남기 때문에 history 관리에도 유용하다. 결론은 깃 커밋을 롤백해야 된다면, revert를 사용하자!
참고
github - How can i rollback a git repository to a specific commit?
How can I rollback a git repository to a specific commit?
My repo has 100 commits in it right now. I need to rollback the repository to commit 80, and remove all the subsequent ones. Why? This repo is supposed to be for merging from miscellaneous users. A...
stackoverflow.com
git reset, revert로 이전 커밋으로 돌리기 | 기억보다 기록을
git reset, revert로 이전 커밋으로 돌리기
git reset, revert로 이전 커밋으로 돌리기, git, github, issue, projects, milestone
kyounghwan01.github.io
'DevOps > Git' 카테고리의 다른 글
[Git] .gitignore 사용법 (0) | 2023.03.16 |
---|---|
[Git] Git 개념 정리 (0) | 2023.03.10 |