기타

[깃/git] 커밋 기록들을 다른 브랜치로 옮겨보자

F12:) 2023. 11. 8. 15:41

방금까지 너무 우울했다...

우테코 프리코스를 진행하는데 main에서 작업하지 말라는 피드백 사항이 있었음에도 나는 main에서 작업을 해버린 것...

(진짜 신경쓰는 버릇을 들여야하는데 여간 쉬운게 아니다...)

 

 

무튼 그래서 커밋 내역을 확인해보니 무려 23개나.. 사실 푸시하려다가 메인에 푸시해도 되나..? 라는 생각에 떠올라버린 것..

진짜 세상이 무너지는 줄..

 

23개를 손으로 일일이 옮길 수도 없는 노릇이고, 나는 다른 사람들처럼 깃에 대한 이해도가 높다고 생각하지 않아서 reset과 merge같은 것에 대한 숙련도가 부족해 그런 것도 할 수 없었다.

 

 

그래서 내가 가끔 애용하는 cherry-pick을 사용해보기로 했다.

 

보통 cherry-pick을 나는 unstaged에 있는 변경내역을 다른 브랜치로 옮길 때 사용했지만, 커밋한 것이라고 못하겠는가!! 싶었다. 그래서 찾아보니 있었고 이를 이용해보자.

 

   Cherry-pick으로 커밋 내역 옮기기

우선 cherry-pick은 쉽게 말하면 임시 저장소이다. 우리는 로컬 저장소와 원격 저장소로 크게 깃헙의 구조를 나눈다. 여기서 cherry-pick은 로컬 딴에 존재하는 임시 저장소이다.  이걸 이용해보자.

 

원래는 변경 내역을 임시 저장소에 저장하고 다른 브랜치로 옮겨 그 임시저장소에 있는 내역을 가져오는 형태로 보통 사용했지만, 이번에는 살짝 달랐다. 이미 커밋에 올라가있으니까, 커밋 내역을 임시저장소를 이용해서 다른 브랜치로 가져오는 듯 하였다.

 

cherry-pick

우선 커밋 내역을 그대로 가져오기 위해서는 git log 명령어로 통해서 우리가 가져오고 싶은 시작 커밋 번호와 끝 커밋 번호를 알아야한다.

 

그 후, 옮기길 원하는 브랜치로 이동한다. 이제 아래의 명령어를 통해 커밋 내역을 가져올 수 있다.

 git cherry-pick {oldest_commit}^..{latest_commit}

 

여기서 중괄호는 제외하고 oldest_commit과 latest_commit에 알아낸 커밋 번호를 쓰면 된다. 유의할 점은 oldest commit 뒤에 ^를 붙여줘야 한다.

 

그래야 oldest 까지 포함하여 가져올 수 있는 것이다.

 

아마 정상 실행되고 충돌이 없었다면, 잘 가져왔을 것이다. 이제 우리는 잘못 커밋한 브랜치에서 커밋을 삭제해야한다.

커밋 내역을 삭제하고 싶은 브랜치에 가서 다음과 같은 명령어를 수행해주자.

 

git reset {oldest_commit}^ --hard

 

이렇게 하면, oldest_commit까지 포함돼서 강제로 삭제되게 된다.

 

 

이제 완벽히 깔끔하게 옮겼다!! 노가다로 옮길 생각만 해도 엄청 우울했는데, 한번에 성공해서 기분이 좋아졌다