이번 시간에는 이 각각의 버전에 대해서 "과거로 돌아가는 방법"을 알아보자.
먼저 Git에서 프로젝트를 과거 버전으로 되돌리는 매카니즘은 2가지가 존재한다.
( 버전1 -> 버전2 -> 버전3 -> 버전4 -> 버전5 로 커밋되어있다고 가정하자)
1) reset
: 진짜 특정 과거로 돌아간 후, 그 이후 커밋들을 다 삭제하는 방법
- 현재 최신 버전이 버전5 일 때, 버전4로 reset 한다면
- 버전4가 최신 버전이 되고, 버전 5는 히스토리에서 지워진다.
- 단 github을 이용해서 협업을 할 경우, 이 reset방식으로 한번 올라간 버전을 지워버리면 - 협업시 문제가 된다
-> 예를 들어 버전 5를 기반으로 팀원1, 팀원2, 팀원3이 개발을 각각 하고 있었는데
-> 팀원 3이 버전5를 reset 시켜버리면, 팀원 1과 팀원2가 작업하고 있는 버전5의 내역과 충돌이 나기 때문이다.
* 따라서 한번 공유가 된 커밋들은 (협업시) reset으로 지우면 안되고, revert를 써서 공유가 된 사항들을 유지한 채 되돌아가야 함.
2) revert
: 돌아간 과거 이후를 삭제하는게 아니라, 특정 커밋의 변화를 거꾸로 적용하는 새로운 버전을 만듦으로써, 과거로 돌아가는 방법 (정확히는 특정 시점의 변화를 원복)
- 현재 최신 버전이 5일때, 버전 5에 대해 revert한다면
- 버전 5에서 적용된 변화를 거꾸로 적용시킨 버전 5' 가 새로 생긴다
(그렇게 생긴 버전5'는 결국 버전5의 변화가 적용되기 전인 버전4와 동일하다)
*버전1-> 버전2-> 버전3-> 버전4-> 버전5-> 버전5'- 이를 이용하면 버전3, 버전4, 버전5의 내역들은 유지한 채, 버전2에 적용된 변화들만 reverse 시킬 수 있다! (이것이 revert 방식의 유용함)
-> 즉 특정 버전의 변경사항만을 되돌릴 수 있음
이제 본격적으로 reset과 revert를 사용한 명령어를 알아보자
<reset을 사용하여 특정 커밋으로 시간 되돌아가기>
14_1. [특정 커밋으로 reset]
git reset --hard (돌아갈 커밋 해시값)
- 이때 돌아갈 커밋의 해시값은 , git log를 통해 확인할 수 있다.
- 이때 해시값은 전체 값이 아닌, 일부 값이여도 된다.(6~7자리까지만!)
- 이때 돌아간 커밋 이후의 커밋들이 모두 삭제된다는 점을 기억하자!
14_2. [바로 직전 커밋으로 reset]
git reset --hard
- 이렇게 돌아갈 커밋 해시값을 명시하지 않으면, 현재 시점 기준 바로 직전 커밋으로 reset 하게 된다.
<revert를 사용하여 특정 커밋의 변화를 반대로 적용하기>
: 이때 언급한 것처럼 revert의 유용함은 , 버전2를 revert하면 이후 버전3,4,5의 변화는 그대로 유지한 채, 버전 2의 변화 사항만 되돌린다는 점이다!
15_1. [특정 커밋을 revert]
git revert (되돌릴 해시 커밋)
-> 이러면 커밋 메세지가 작성되어 있는 vim화면으로 넘어가는데, 그냥 wq로 저장하면 됨 (아니면 그 커밋 메세지를 수정한 후 wq로 저장하던가)
- 이렇게 하면 , 해당 해시커밋 이외의 변화들은 그대로 유지한 채
- 해당 해시의 커밋 변화만 반대로 적용된 버전이 가장최신 커밋으로 생긴다.
- 협업시 시간을 되돌릴 경우는, 이렇게 이전 변화사항을 그대로 유지시키는 revert를 사용해야 함O
- reset을 사용해서 이전 커밋을 다 날려버리면 안됨!!
15_2. [revert를 했는데 충돌이 나는 경우]
- 예를 들어 버전 2를 revert시켜서 파일2가 사라져야 하는데
- 이후 버전 4에서 다시 파일2를 수정하고 있다면
- 시간 순서상 버전2 -> 버전3 -> 버전4 -> 버전2' 가 되고
이 버전2' 에서는 버전4에서 수정한 파일 2를 그대로 남겨둘 지
OR revert 내용대로 파일 2를 아예 지울지
를 선택해야 한다
- 이때 파일 2를 지우는 선택을 한다면
git rm 파일2 -> 로써 파일 2를 지우고
git revert --continue -> 로써 revert를 계속한 후 (주의)
commit 메세지가 작성된 vim 창에서 wq로 저장을 해야
비로소 충돌이 난 revert가 완료된다
15_3. [revert를 하되, 커밋은 하지 않는 경우]
git revert --no-commit (revert시킬 커밋의 해시값)
- 이 경우 해당 커밋을 revert시키는 새로운 커밋이 생기지만
- 커밋은 따로 되지 않는다.
- 따라서 이때는 다른 변경 사항도 함께 적용하여, 함께 커밋 시킬 수 있다!