JB`s 개발이야기

Git - reset, revert 본문

Git

Git - reset, revert

A.K.A.캐로 2019. 5. 13. 16:52
이런 경우가 있습니다. git local에서 코드를 수정하고 테스트 한 후에 commit를 해 버린후 였는데 어라 수정할 코드가 또 발견 됐다!!!! 이러면 보통은 다시 코드를 수정하고 commit을 해버리면 불필요한 commit이 늘어나고 지저분해 집니다. 그러면 내가 바로 직전이나 전에 commit한 내용을 취소 하고 다시 코드를 고친후 commit 하면 commit story가 깔끔하겠죠?

보통 commit을 취소하는 방법에는 resetrevert가 있습니다.

1.revert

-revert는 내가 commit한 내용은 남아있지만 소스상태는 되돌리는 것을 말합니다. 말로는 설명이 좀 이해하기 어려우니 직접 보시죠

①아래는 지금 예시 코드입니다. 다음과 같은 코드와 git log가 있다고 가정해보죠

git log
source

②그런데 지금 소스코드에 "라" 라는 코드를 잘못 적었습니다. 그럼 저걸 지우고 싶다. 

->git revert 해당로그해쉬값(위 git log 사진의 노란색 박스친부분입니다.)

->git bash에서 git log 명령어를 치시면 저 빨간네모박스 처럼 commit 해쉬값이 나옵니다. 다 입력 할 필요 없이 앞에서 일곱자리까지만 입력하셔도 됩니다.

 

③그럼 revert 메세지를 입력하고 아래와 같이 git log에 남게됩니다.

-소스코드는 그 commit에 해당되는 부분이 사라집니다.

 

 

2.reset

-reset은 commit한 내용 소스내용 둘다 싹 지워버립니다. 그리고 옵션이 세가지가 있습니다. hard, soft, mixed입니다.

예시를 보시죠.

 

(1)hard

돌아가려는 이력 이후에 모든 내용(commit내용, 바뀐 내용들)을 지워 버리는 것입니다. 저위에 캡쳐한 커밋 스토리에 방금 커밋한 라 라는 내용을 지우고 싶다

그러면

git reset --hard <지우고싶은 커밋의 밑에 커밋의 해쉬값을 적어줌>

reset 실행전
reset 실행후
"라" 라는 소스코드도 사라집니다.

②이처럼 commit한 소스코드와 add 명령어로 staging에 올린 파일들도 사라집니다.

 

(2)soft

①이 옵션은 해당 커밋으로 돌아가지만 코드상에 내가 바꾼 내용은 그대로 남아있습니다. 그리고 파일상태는 스테이지에 올라가 있는 상태입니다. 실제적으로 이 옵션을 많이 쓸꺼 같습니다.

실험을 하기 위해서 다시 아까와 같은 환경으로 만들었습니다.

soft 전

 

soft전 코드

저 상황에서 다 하는 커밋으로 soft옵션을 써서 돌아가 보도록 하겠습니다.

git reset --soft <지우고싶은 커밋의 밑에 커밋의 해쉬값을 적어줌>

soft 후
soft 후

③위에 사진처럼 commit 은 지워졌지만 그commit에 해당 되는 소스코드는 그대로 있습니다.

④그럼 여기서 수정 못했던 코드들을 다시 수정 한 후에 다시 커밋해 주면 되겠지요?

 

(3)mixed

-이 옵션은 소프트와 거의 같습니다. 다른점은 스테이지에 파일 조차 안올라간 상태인거죠.


3. 언제 reset을 하고 언제 revert를 해야하나?

단순하게 생각하면 reset을 하는 것이 revert를 하는 것보다 이력을 더 단순하게 만들어주기 때문에 revert의 장점이 많지 않아 보입니다.
하지만 이력 중간에 로그 출력하도록 한 커밋이 있고 그 커밋만을 취소하려고 한다면 reset을 사용하여 이후의 이력을 모두 제거하는 것은 이후 이력을 모두 날려버리는 결과를 나을 것입니다.
이런 때 revert를 사용하여 해당 커밋의 내용만 되돌릴 수 있습니다. 또한 이미 원격 리파지토리에 push 를 한 상태라면 reset을 사용하면 reset 하기 이전으로 되돌리기 전까지는 push 할 수 없게됩니다. (물론 force라는 무시무시한 옵션이 있기는 합니다. ) 그래서 이미 push 한 코드라면 미련을 버리고 revert를 하셔야 합니다.
다른사람과 로그과 엉망이 될수 있다.
Comments