github

실수를 해? 그럼 초기화(reset)해!

LSH2118 2025. 3. 4. 17:55

개요

평화로운 1학년 겨울방학....

동아리에서 내준 과제를 하던 중에 한 가지 문제가 발생했다

 

분명 브랜치 2개를 파서 main으로 PR을 올렸는데

1번째 브랜치에 올렸던 commit들이 2번째 브랜치에 중복되어 올라와 있었다...

 

내가 터미널에 git log를 실행한 결과 문제를 발견했다

2번째 브랜치를 팔때 main이 아니라 1번째 브랜치에서 팠던 것이다

 

이제 뭐가 문제인지 알았으니 이제 해결할 차례이지만

문제는 2번째 브렌치에서 행해졌던 변경사항들이 걸렸다

 

checkout으로 main으로 가서 새로운 브렌치를 만드니

이미 변경사항들이 사라진 상태로 브랜치가 만들어지고, 

 

cherry-pick이나 rebase 같은 방법을 사용해도 도통 해결될 조짐이 보이지 않았다

 

그냥 변경사항이 사라지더라도 메모장에다 옮기고 복사 붙여 넣기하고 싶은 마음은 굴뚝같았으나

배우는 입장이고 또 과제인데 꼭 해결해보고 싶었다

 

그러자 선배님이 이 현상을 듣고 git reset을 공부해보라고 조언해 주셨다


git reset

git reset은 처음 봤을때는 많이 복잡하지만

HEAD를 먼저 이해해야한다

HEAD

HEAD는 현재의 브랜치에서 마지막 commit을 가리키는 포인터다

USER@BOOK-3FKOAUHFMN MINGW64 ~/Desktop/today-i-recommanded (main)
$ git log
commit a639ac5649d879fb5b8987166101686e06d8878e (HEAD -> main, origin/main)
Author: LeeSangHyeok0731 <s24066@gsm.hs.kr>
Date:   Tue Mar 4 12:19:02 2025 +0900

    대충 init

commit 3ec34c3b4aeeb0e7f069968118256c0d8b50c80d
Author: LeeSangHyeok0731 <s24066@gsm.hs.kr>
Date:   Tue Mar 4 12:18:46 2025 +0900

    데이터 불러오기

commit a8df15651887803c8218d562c4e4855408be8d7a
Author: LeeSangHyeok0731 <s24066@gsm.hs.kr>
Date:   Tue Mar 4 12:18:34 2025 +0900

    init

commit 8607b3927dd13914fa04f9fbf243f073f31908ea
Author: LeeSangHyeok0731 <s24066@gsm.hs.kr>
Date:   Tue Mar 4 12:18:25 2025 +0900

    styled-components, axios, 설치

 

git log를 실행하면 보이는 (HEAD -> main, origin/main) 위에서 볼 수 있다

 

git reset은 저 HEAD의 포인터를 수정할 수 있다

 

지금은 HEAD의 포인터가 <대충 init>이라는 commit을 가리키고 있다

그런데 

git reset 3ec34c3b4aeeb0e7f069968118256c0d8b50c80d // <데이터 불러오기>commit의 해시값

이렇게 실행하면 <데이터 불러오기> commit으로 HEAD의 포인터가 이동한다

 

그러면 <대충 init>의 commit은 어떻게 될까?

 

git reset은 변경사항을 어떻게 남겨두나에 따라 3개의 옵션이 있다

 

1. git reset --mixed

git reset의 기본옵션이다

 

해시값 이전의 커밋은 변경사항은 그대로 있고 add는 되어있지 않은 상태로 돌아간다

 

2. git reset --soft

내가 위 현상을 해결할 때 사용했는데

 

변경내역은 그대로 있지만 --mixed와 다르게 add가 되어있는 상태로 돌아갑니다

 

3. git reset --hard

hard에서 유추할 수 있듯이 변경사항까지도 깡그리 이전의 상태로 되돌아간다


우선 git reset --soft를 사용해서 1번째 브랜치에 마지막 commit으로 HEAD의 포인터를 옮기고 나서

git stash로 변경사항을 임시로 저장했다

그다음 main으로 가서 2번째 브렌치를 삭제, 후 다시 생성했다

그리고 git stash pop을 사용해 변경사항을 불러오고 commit을 했다

 

이로써 위에 발생했던 문제를 해결했다

before
main
└── branch1
    └── branch2

after
main
├── branch1
└── branch2

이번 오류를 수정하면서 하나 확실한 것은 git에 commit과 브랜치에 관해서 조금 더 심도 있게 이해했다

오류 하나를 이렇게 쭉 잡고 고민해 본 것도 좋았고, 또 그 끝에 해결한 것도 굉장히 만족했다

 

하지만 아쉬운 점도 있다

 

애초에 이런 현상이 발생한 것 자체가 아쉽다

조금만 신경 써서 작업을 진행했더라면 이런 일도 없고,

 

팀에서 협업하는 상황에서 이러한 현상이 발생했고,

그대로 병합을 했다면 정말 아찔한 상황이 발생했을 것이다

 

앞으로는 조금 더 신경을 써서 작업을 진행해야겠다

'github' 카테고리의 다른 글

[github]웹페이지 베포하기  (1) 2024.09.25