[git 교과서] 9장. 복귀(2)

Jiseon·2021년 10월 21일
0

9.3 리버트

리버트와 리셋 차이점은 커밋 정보 삭제 여부이다.

9.3.1 취소 커밋

리셋은 기존 커밋 정보를 삭제하는 반면, 리버트는 기존 커밋을 남겨두고 취소에 대한 새로운 커밋을 생성한다.
취소 커밋을 생성할 때는 revert명령어를 사용한다.
취소커밋은 지정한 커밋을 삭제하지 않는 대신 삭제를 위한 새로운 커밋을 생성한다.

<실습 준비>
menu.html 파일에 menu5 ~ menu7 을 차례로 입력한 후 커밋한다.

<실습>
이 코드는 공개되어있다고 가정한다.
직전 커밋인 menu7을 취소하고 싶다면 공개된 커밋은 삭제하지 않으므로 취소하고자 하는 커밋을 리버트 해야한다.

리셋으로 커밋을 삭제하지 않고 리버트로 취소 커밋을 생성한다.

마지막에 있던 menu7태그가 삭제되었다.

menu7 커밋 위에 새로운 리버트 커밋이 하나 생성되어 있다.

9.3.2 리버트 지정

리버트는 한번에 커밋 하나만 취소할 수 있다.
여러 커밋을 리버트하려면 최신 커밋부터 순차적으로 취소해야 한다.
직전 커밋이 아닐 경우 커밋 해시 값을 이용한다
$ git revert 커밋ID
또는 깃의 범위 지정 연산자를 이용해 여러 커밋을 리버트 할 수 도 있다.
$ git revert 커밋ID .. 커밋ID

9.3.3 소스트리에서 리버트


커밋을 되돌릴지 물으면 예를 누르면 된다.

9.3.4 병합 취소

리버트를 이용하여 병합한 커밋을 취소할 수 있다.
리셋은 방금 전 실행한 병합만 삭제하지만 리버트는 시간이 지난 후에도 과거의 병합을 선택하여 취소할 수 있다.

menu 브랜치와 병합을 해준 후 <li>menu7</li>을 추가해준 후 커밋한다

리버트로 병합을 취소 할때는 --mainline옵션을 같이 사용한다.
$ git revert --mainline 숫자 병합커밋ID
병합은 두 브랜치가 결합된 형태이고 리버트로 병합이 취소 상태가 되면 둘중 한 브랜치로 체크아웃을 해야한다.
--mainline 옵션은 병합을 취소한 후 체크아웃되는 브랜치를 표시한다.(체크아웃으로 되돌아가는 커밋번호)

출력결과에서 7d9d4ae는 병합 시점의 커밋ID이고 이 시점을 기준으로 리버트를 한다.


확인해보면 잘 리버트되었다.
+) 리베이스된 병합은 리버트하기 어렵다.(리베이스로 병합된 공통 조상 커밋을 찾기 어렵기 때문)

9.3.5 리버트 히스토리

리버트를 실행하면 새 커밋이 추가되기 때문에 커밋 이력이 복잡해진다.
리셋을 이용하는게 더 간편해 보일 수 있다.
하지만 저장소를 공개했다면 리셋으로 커밋을 삭제하는 것은 협업차원에서 위험한 행동이므로 이때는 리버트가 유용하다.

9.4 정리

리셋과 리버트는 버전관리의 특성을 그대로 보여주는 기능이다.
리셋과 리버트는 동작을 취소하고 과거로 돌아간다는 면에서 비슷하다.
하지만 두 명령어로 분리하여 사용하는 것은 저장소를 원격 저장소로 공유했는지 여부와 관련있다.
외부로 공개한 저장소라면 리버트를, 자신의 저장소가 컴퓨터에만 있다면 리셋을 사용하면 된다.

0개의 댓글