c1, c2, c3까지 커밋을 한후 main branch에서는 c3를 참조하는 상황을 가정해 보자.
나중에 확인해 보니 c3 이라는 커밋을 잘못한 상황이었다고 생각해 보자. 이 경우 어떻게 해야할까?!
git에서는 되돌릴 기능이 존재한다.
C2 이후 작성한 모든 내용이 잘못되었거나 필요 없는 경우, C2라는 커밋을 작성한 시간으로 시간을 되돌리면 된다!
🔔
git reset --hard c2
git에서 reset이라는 수단에 hard 옵션을 주어서 되돌릴 수 있다.
❗ hard 옵션의 경우, 날아가면 안되는 파일을 확인하지 못하고 hard reset하여 그 내용까지 날아가게 된다. 따라서 철저한 확인이 필요하다 ❗
c2 이후 작성한 내용은 틀리지 않았는데, c3 커밋에서 추가하면 안될 파일 혹은 내용이 있는 경우
이 작성된 내용을 유지하면서 c3 전으로 돌아가기 위해서는?!커밋 전의 상태임과 동시에 working directory에는 해당 내용이 작성되어 있어야 한다. 또한 커밋으로 추가한 스냅샷에도 수정이 필요하므로 Staging area는 c3에 추가한 내용이 없어야 한다 !
🔔
git reset --mixed c2
🔔git reset c2
git에선 reset 수단에 --mixed 옵션으로 위 동작을 실행할 수 있다.(mixed 생략 가능)
branch 흐름에서 뒤로 가지는 않았지만 현재 저장된 영역을 돌리는 것으로, c3 커밋 작성 전으로 돌아온 것이다.
(1) 상대 참조 캐럿
commit은 HEAD가 참조하고 있기 때문에 HEAD를 사용하여 상대적으로 커밋을 참조할수 있다.^ 을 사용하여 커밋 위로 움직일 수 있다 !
HEAD에 캐럿을 붙이면 HEAD가 참조하는 커밋의 부모 커밋을 참조하는 것이다.
(2) 상대 참조 틸트
캐럿을 너무 여러개 사용하면 가독성이 떨어지므로 틸트 ~ 를 사용한다.
reset을 사용하면 커밋을 되돌릴 수 있지만, 이미 push하여 remote에 올라간 내용을 reset하고 수정하면 reject 된다.
왜냐하면 깃은 변경점을 저장하고 허용하지 않기 때문이다.
그러면 어떻게 해야 할까 ..?!
remote로 이미 올라간 상황에서 어떻게 할까?!
c3에서 만들어진 변경사항을 없던 c2상황으로 되돌리고, revert했다는 기록을 남길 수 있다.
즉 c3에 만든 모든 변경사항을 없애는 새로운 변경사항을 만들 수 있다 !
reset을 하면 commit history에 남지 않지만 revert를 사용하면 history에 그 이유를 남길 수 있기 때문에 좋다.