Git을 사용하는 도중 commit을 해버렸는데 이전 상태로 돌아가고 싶을 때는 어떻게 할까요?
참 난처하죠..? 이럴 때 revert와 reset 명령어를 사용해준답니다.
Revert ?
현재에 있으면서 특정 사건을 없었던 일로 만드는 행위라 볼 수 있습니다.
이거는 바로 예시로 알아보겠습니다. vscode 확장프로그램에서 git graph를 설치해주세요 그럼 아래처럼 그래프로 history를 확인할 수 있습니다.
ex) commit 1, commit 2, commit 3을 순서대로 하였을 때
저는 현재 commit을 총 3번을 한 상태입니다. 여기서 저는 두번째 파일 commit을 지우고 싶어졌어요. 그럴 때 revert를 사용합니다.
git revert 커밋아이디
# 바로 전으로 되돌아가고 싶다면
git revert HEAD
위 사진에서의 커밋 아이디는 108a7d6f가 되겠죠?
자 두번째 커밋을 했을때 작성한 4.txt가 삭제되었고 Revert "두번째"라는 이름으로 스테이지에 추가되어있습니다.
여기서 스테이지란 추가(add)상태입니다.
그리고 작업 항목을 가보면 4.txt도 없어졌어요!
위 사진에서 왼쪽에 커밋 버튼을 눌러주면 변경된 내용이 commit 되었습니다!
push를 해주니 깃허브에도 잘 바꿔져있습니다.
Reset ?
리셋은 특정 시간으로 되돌아가는 행위입니다.
예시로 들어볼게요
저는 새로운 깃 리포지토리를 생성하여 3번의 커밋을 해줬습니다.
second 커밋을 해준 위치로 돌아가볼게요.
# git reset --reset명 커밋아이디
# 예시에서는 --hard를 사용하겠습니다.
git reset --hard 커밋 아이디
커밋 아이디는 399030ef입니다.
실행해주면 3.txt 파일이 아에 없어져있는 커밋된 상태로 존재합니다. 삭제된 상태로 깃허브에 올리고싶다면 git push를 해줍니다.
하지만 오류가 non-fast-forward라는 오류가 나오면서 push가 실패했다 나오므로 branch앞에 +를 붙여줍니다.
git push origin +main
💡reset에는 3가지 종류가 있습니다.
- hard → 돌아가려는 이력 이후 모든 내용을 지워버린다.
- soft → 돌아가려 했던 이력으로 가지만, 이후 내용을 지우기 않고 스테이지안에 담아둔다(git add상태) , 커밋할 수 있는 상태
- mixed(default) → 돌아가려 했던 이력으로 가지만, 이후 내용은 스테이지 안에 없다. 커밋하려면 add하고 커밋한다.
soft와 mixed는 다른 예제로 살펴볼게요
soft
a,b,c를 순서대로 커밋을 한 후 soft 명령어로 b를 커밋한 시점으로 리셋을 하게되면 a,b,c파일이 모두 존재하지만 c 파일은 스테이징한 상태(git add)인 상태로 존재합니다. 저는 파일을 확인한 후 commit을 하고 push를 하면 됩니다.
mixed
같은 예제로 mixed 명령어로 b를 커밋한 시점으로 리셋을 한다면, 역시 a,b,c 파일 모두 존재하지만 c 파일은 스테이징 되어있지 않은 (git add) 아닌 상태로 존재합니다. 수정 및 확인 후 add 및 commit, push해주면 됩니다.
사실 soft로 리셋을 해주고 스테이징한 상태인 파일을 수정한다면 다시 add를 해줘야하기 때문에 개인적으로는 mixed와 다를게 별로 없다는 생각입니다.
자 이제, revert와 reset의 차이점을 아시겠나요?
reset는 커밋 히스토리까지 삭제하면서 시간을 되돌리기 때문에 장점은 histroy가 깔끔해보인다지만 나중에 리셋한 행위를 되돌릴 수 없으므로 협업 시에는 매우 치명적입니다.
revert는 커밋 히스토리에 새로운 커밋을 생성하면서 삭제하기 때문에 나중에 행위를 되돌릴 수 있습니다. 고로 어디로든 되돌릴 수 있다는 장점이 있지만 단점은 히스토리가 복잡해질 수 있으며, 충돌 시 일일히 고쳐야한다는 점입니다.
단, 원격 리포지토리에 push를 해준 경우라면 무조건 revert만 써야합니다. 이미 개발자에게 배포가된 커밋 메세지를 리셋을 이용해 삭제한다면 리셋 전으로 다시 가지 않은이상 push도 안되며 협업 시 매우 복잡해집니다.
⭐️고로 협업 프로젝트라면 속편하게 revert를 사용합시다.
마지막으로 커밋 아이디를 터미널에서 확인하고 싶다라는 분들은 아래 명령어를 써주세요.
git log --oneline
참고용 사이트
[초보용] Git 되돌리기( Reset, Revert )
개발바보들 1화 git “back to the future”에서 설명한 Reset / Revert에 대한 글입니다. Git을 익히면서 헷갈렸던 것들 중의 하나가 이력을 되돌리기 입니다. Git에서 이력을 되돌리는 방법은 여러가지
www.devpools.kr
reset으로 사라진 커밋 복구하기
git reflog
git rebase -i (대상 바로 이전 커밋)
'협업 > Git' 카테고리의 다른 글
git - 커밋 메세지, gitflow (0) | 2024.01.17 |
---|---|
Git - 협업 시작하는 법 (1) | 2022.10.08 |
Git - 서로 다른 branch에서 같은 파일 수정 시 충돌 오류 해결 방안 (0) | 2022.09.14 |
Git - 협업 시 오류 현상 해결 방안 (Pull) (0) | 2022.09.13 |
Git - 시작하기 (2) | 2022.09.12 |
댓글