깃의 코드를 되돌려줘…

Jihoon Yoo·2023년 5월 4일
0

목록 보기
8/8
post-thumbnail

😃 오늘 알아볼 내용


이전 내용은 브랜치를 통해서 따로 개발하던 코드들을 병합을 통해서 합치는 방법을 알아봤었다.

그러면 일단 우리가 알아본 것을 순서대로 생각해보면

  • 깃에 대해서 간략하게 알아보기
  • 깃이 파일을 관리하는 방법인 .git을 조금만 파해치자
  • 깃의 영역이란? 파일의 상태란?
  • 깃의 commit이란 무엇일까?
  • 흔히 말하는 GitHub란 어떻게? 왜? 사용할까?
  • 따로 개발하고 싶어요! 그럼 브랜치를 쓰거라
  • 브랜치로 따로 개발하던 부분을 합치는 병합

이렇게 알아보았다.

나름은 순서대로 잘 파해쳐보았다 생각한다. 그러면 이번에는 무엇을 공부해야 할까?

그래서 선택한건 코드 되돌리기 이다.

깃이 제공하는 것은 기능은 결국 코드 버전을 수정하고 관리하기 편하게 하는 기능이다. 이를 파해치려고 이 시리즈를 시작했다.

다른 부분들은 다 알아보았지만 코드를 아에 되돌리는 기능을 아직 못 알아보았다.

그리고 실제로 코드를 작성하면서 깃으로 코드를 되돌리는 명령어를 가끔 사용하게 되는데 매번 사용할 때 마다 어렵기도 했다.

따라서 이번에는 코드 되돌리기를 한번 알아보자!

🚧 깃의 되돌리기란?


우리는 깃을 학습하면서 이 깃이 버전을 관리하는 목적을 가지고 있다고 학습했다.

우리는 브랜치를 만들고 commit을 올리는 것으로 이때까지 버전을 관리했다.

하지만 우리가 개발을 하면서 실수를 안하는가? 우리는 실수로 commit을 올릴 수 있고 코드를 잘못 작성할 수 있다. 만약 아니라면 당신은 gpt?

따라서 실수를 했을 때 우리가 어떻게 처리해야 하는지 알아야 한다. 이를 위해서 깃이 되돌리는 기능 만들어두었다.

우리가 코드를 작성한다고 생각해보자.

만약 4-5줄을 잘못 작성하고 commit을 올렸다고 생각하면 해당 부분을 빠르게 수정하는 것이 쉬울 것이다.

하지만 어떠한 기능 단위로 commit을 올렸다고 해보자. 올리고 나서 ‘앗?! 이거 문제인데?’ 라는 생각이 들었다면 이거는 어찌해야 할까?

일단 지금까지 배웠던 것 중에서 방법을 살펴보면 checkout으로 이전 commit 위치로 이동한 이후 새로운 브랜치를 파서 해결 할 수 있을 것이다. 물론 찝찝하게 올린 commit이 남아있겠지만.

하지만 이게 master 브랜치였으면 어떨까? 결국 병합을 할 경우에 충돌을 다 해결해야 할 것이다.

이를 위해서 깃은 기롤된 commit을 기준으로 이전 상태로 되돌릴 수 있게 reset과 revert라는 것을 제공해준다.

각각이 어떻게 동작하는지 각각 알아보자.

한 번 사용을 해보면서 알아가려고 한다.

사용하기 전에 미리 아래와 같이 준비를 해주면 좋다. 코드를 동일하게 할 필요는 없지만 5-6개 정도의 commit이 있는 브랜치면 좋다. master일 필요도 없다.

🔧 reset


reset은 commit을 기준으로 이전 코드로 돌리는 방법으로 기록한 commit을 취소한다.

따라서 필요할 때 사용하면 좋지만 신중하게 사용하는게 중요하다.

위 그림처럼 reset은 특정 지점으로 돌아갈 수 있게 해준다.

따라서 reset을 할 때는 어떤 시점으로 돌아가야 하는지 정해주어야 하는데 이는 log 명령을 통해서 본인이 원하는 위치의 commit ID를 찾으면 된다.

다른 방법으로는 HEAD를 기준으로 상대적인 commit위치를 지정해줄 수 있다.

reset 명령어는 아래와 같이 사용할 수 있다.

git reset 옵션 commitID

reset의 경우에는 옵션을 함께 사용해줘야 하는데 총 3가지 옵션이 존재한다.

soft, mixed, hard 이렇게 3가지인데 지금 우리가 알아둬야 할 것은 옵션을 설정하지 않으면 기본적으로는 mixed를 디폴트로 해준다.

각각 한 번 알아보자

soft

soft 옵션은 가장 낮은 단계의 reset 동작이다.

일단 뭐든지 개발자는 해봐야 이해가 빠르기 때문에 직접 해보자

git reset --soft HEAD~

위 명령의 HEAD~ 는 현 HEAD를 기준으로 이전 commit을 말한다.

그러면 위 명령은 현 commit을 reset 시킨다고 생각하면 된다.

한 번 사용해보자.

결과는 위처럼 Uncommitted Change가 생긴 것을 볼 수 있고, HEAD가 4번째 commit으로 변경된 것을 확인할 수 있다.

그러면 우리의 파일은 어떨까? 한 번 우리의 파일의 상태를 살펴보자

내용은 그대로이다.

이게 어떻게 된 상황일까?

이는 soft 옵션의 특징 때문이다.

soft 옵션은 파일을 수정하고, add 명령어로 스테이지 영역에 올려 commit을 실행하기 직전의 단계로 되돌린다.

이처럼 soft 옵션은 단순하게 HEAD 위치를 이동시키는 역할만 하는 것이다.

지금 이 상황에서 commit을 다시 올린다면 이전과 동일한 그림처럼 상태가 될 것이다.

단 조심해야할 것이 있다. 소스 코드 내용이 변경되지 않더라도 새로 commit하게 된다면 변경된 시간 같은 부분을 추가해서 새로운 해시값이 부여된다.

mixed

mixed 옵션은 reset 명령어의 기본값으로 따로 옵션을 입력하지 않는다면 mixed로 실행된다.

이 또한 한 번 실제로 사용하면서 확인해보자

git reset HEAD~

기본 값이니 위 처럼 본인은 사용하였다.

이전과 크게는 다를 것이 없어 보인다.

다만 출력 문구에서도 알 수 있듯 reset을 한 이후에 stage에 올리지 않았다 라고 적혀있다.

mixed 옵션의 경우에는 soft 옵션과 달리 reset을 한 이후 stage 상태까지 복원하지 않는다.

따라서 본인이 다시 commit을 하기 위해서는 stage에 올리고 나서 해야한다는 부분을 제외하고는 soft와 유사하다.

hard

hard 옵션의 경우에는 이름 그대로 가장 강력한 옵션이다.

앞서 살펴본 soft와 mixed의 경우에는 이전 commit 위치로 돌아가는 효과는 있지만 실제로 마지막 commit 기준으로 삭제가된 내용은 없었다. 그러면 hard는 다르지 않을까?

git reset --hard HEAD~

앞에서 간단하게 추측한대로 commit 내용을 아에 날려버리는 것을 확인할 수 있다.

우선적으로 HEAD의 위치가 변경되었고 기존 파일에서 reset한 내용들이 사라진 것을 볼 수 있다.

이처럼 hard 옵션을 사용하면 워킹 디렉터리 내용도 삭제되는 완전한 reset이라는 것을 알 수 있다.

⛏ revert


앞서서 뒤로 되돌리는 방법으로 제공된 것이 reset, revert가 있다고 언급했다.

reset의 경우 어떻게 동작하는 것인지 알게 되었으니 이번에는 revert를 알아보려한다.

우선 reset과 revert의 차이는 크게 commit 정보 삭제 여부이다.

reset의 경우에는 기존 commit 정보를 제거하는 반면, revert는 기존 commit을 남겨두고 취소에 대한 새로운 commit을 생성한다.

이 또한 실습을 해보면서 알아보자

git revert commitID

사용하는 방식은 reset과 구조가 동일하다. commitID 부분에 취소하고자 하는 commit을 입력하면 된다.

한번 이번에도 HEAD 기준으로 사용을 해보자

실행을 하면 vi 에디터가 나올 것인데 이는 앞전에 간단하게 설명해뒀으니 이번에는 자연스럽게 넘어가면 된다.

실행을 하니 내가 넣어준 위치의 commit이 revert가 되었다고 commit이 새롭게 추가되고 해당 부분을 제거한 것 처럼 코드가 변경되었다.

이처럼 revert는 reset을 하는 것과 달리 commit 이 새롭게 생성된다는 것을 확인했다.

📕 정리


간단하게 이제 reset과 revert를 알아보았다.

둘 모두 동작을 취소하고 과거로 돌아간다는 점에서는 유사하다.

코드 변경 이력을 저장하고 필요한 시점에 해당 코드로 쉽게 이동할 수 있다는 것 또한 알 수 있었다.

하지만 이 두 명령어를 쓸 경우 고려해야 할 점은 원격 저장소로 공유를 했는지다.

자신의 저장소를 외부로 공유했다면 reset으로 commit을 삭제하는 것은 위험하다. 다수의 사용자와 저장소의 commit 기록이 깨질 수 있기 때문이다.

따라서 외부로 공개한 저장소라면 revert를 사용하는 편이 좋다는 점을 알려드리며 글을 마치려 한다.

🙇🏻‍♂️ 다음에는 무엇을?


깃의 기능적인 부분은 이제 다 다뤄본 것 같다.

이번 글의 경우는 쪼금 짧은 감이 없지 않아 있다.

왜냐하면 최근에 글을 쓸 시간이 약간 부족한 점도 있고 다른 작업들이 있었기 때문이다.

뭔가 더 알아보고 적는 것이 더 좋았지 않았을까 한다.

추가되는 내용이 있으면 추가할 예정이다.

다음에 알아볼 내용을 무엇으로 정할까 고민이 있는데 아마 서브모듈을 다뤄보지 않을까 한다.

해당 내용은 본인도 정말 잘 모르기 때문에 깊게 시간을 들여서 적을 것 같다.

부족한 글을 읽어주셔서 감사하다는 말을 남기고 떠나보도록 하겠다… 총총…

profile
기본은 하는 개발자로 성장하자 📖

0개의 댓글