포시코딩

Cherry-pick - 다른 브랜치에서 커밋 가져오기 본문

Git

Cherry-pick - 다른 브랜치에서 커밋 가져오기

포시 2022. 11. 27. 23:19
728x90

개요

최근 항상 하나의 브랜치로 충돌날 일 없이 1인 개발만 해오다가 

github에서 readme.md 파일 수정 후 pull 없이 내꺼에서 commit 후 push를 시도해버렸다..

 

크리티컬한 에러가 나진 않았지만 대충

'' 니 remote commit이랑 local commit이랑 이력이 다른데 push 못해준다. 어케 할거임? 해결하셈. ''이란 메시지를 받았다.

git은 쓰다 평소와 다른 결과가 나오면 식은땀이 나기 시작한다.

이전 마지막 커밋 이후 remote(github)에서와 local(내 컴퓨터)에서의 커밋이 각각 달라서 생기는 상황인데

git을 많이 안써본 사람이라면 여기서 별거 아니라 생각하고 멋대로 pull을 하다간 대형사고를 치기 마련이다.

 

나도 오랜만에 이런 상황이 생겨서 아무 생각없이 git pull을 쳤다가 순간 remote가 덮어씌워지면 

오늘 작업한 모든게 다 날아갈뻔한걸 깨닫고 식겁했다. 

 

해결방법

0. 준비

모든 과정은 local의 terminal에서 진행한다. 

큰 흐름을 먼저 설명하자면 다음과 같다. 

  1. local 진행상황 branch 만들어 백업
  2. 다시 main 브랜치로 (중요)
  3. main브랜치에 origin/main에서 hard하게 pull. (github에서의 진행상황 덮어씌우기)
    이 과정에서 main에서 작업했던 내 진행상황은 날아간다. 
  4. branch로 빼놓은 내가 작업한 commit을 현재 main 브랜치에 가져다 붙이기

1. 백업 - git branch

일단 딱 지금 에러를 접한 이 상황에서 그대로 branch를 새로 만들자. 

git branch temp		# temp 브랜치 생성 
git branch		# 브랜치 확인. *로 현재 위치를 나타낸다.
git checkout temp	# temp 브랜치로 이동
git branch		# temp 브랜치로 이동 됐는지 확인

temp라는 브랜치를 현재 commit한 local main 브랜치를 기준으로 만들었다. 

이제 이 브랜치를 혹시 모르는 상황을 대비해 remote에 push하자. (보험의 보험)

git push origin temp

이 상태로 github에 가서 보면 아래와 같이 temp 브랜치가 만들어진걸 확인할 수 있고, 

들어가보면 실제로 내가 마지막으로 작업한 commit이 서버로 잘 올라간걸 볼 수 있다. 

 

2. 최신화(덮어씌우기) - git fetch, git reset

이제 다시 terminal로 돌아와 main 브랜치로 가자

git branch main
git branch	# main 브랜치로 이동했는지 확인 또 확인

여기서 이제 remote(github)를 main에 덮어씌운다.

git fetch --all			# remote에 있는 내 최신화된 저장소 정보를 받아온다. 
git reset --hard origin/main	# origin/main의 commit 상황을 hard하게(강제로) 덮어씌운다.
git log --oneline		# 잘 덮어씌워졌는지 확인

 

3. 내 commit 적용 - git cherry-pick

여기서 이 포스팅의 주제인 cherry-pick이란 기술이 사용된다. 

먼저 가져올 commit의 주소? id? 라고 할 수 있는 부분이 필요하다. 

얻는 방법은 github와 terminal에서 두 방법이 있는데 아래와 같다. 

 

1. github commit 히스토리

commit 목록에서 가져올 commit의 넘버를 클립보드에 복사

2. terminal에서 git log 명령어

git log --branches --oneline

주르륵 나오는데 위 github에서 처럼 왼쪽에 노란글씨로 나와있는걸 볼 수 있다.

 

이걸 이제 cherry-pick 해보자

git cherry-pick a6a711ec6826831e23abe93db0141571640f0b13	
# github에 있는걸 복붙하면 이렇게 나오는데
git cherry-pick a6a711e	# 이런식으로 앞에 7글자만 적어줘도 알아서 적용된다. 즉, 둘 다 상관없다는 얘기

명령어를 입력하면 commit을 가져오면서 충돌이 있던 파일도 자동으로 병합해주는게 보일 것이다. 

(자동 병합이 안된다면 다시 수동 병합 후 저장 -> add -> commit 까지 평소처럼 진행하자)

 

4. 결과확인 - git log

성공적으로 잘 적용된걸 볼 수 있다. 

이제 git push를 해서 origin/main에도 올려주면 끝이다. 

 

후기

다행히 origin/temp로 업로드 해놓은 원격 브랜치는 안쓰고 끝났는데,

앞으로는 작업하면 습관처럼이라도 git pull을 한 후 작업 및 커밋을 해서 이처럼 귀찮은 일이 안생기게 해야겠다고 다짐했다.

 

그래도 오랜만에 나름 스릴있는 경험이었고

앞으로 있을 프로젝트에서도 이런 비슷한 상황이 많을 것 같은데

이 포스팅을 통해 cherry-pick 기능 사용법을 쉽게 잘 알려줄 수 있을 것 같아 벌써부터 뿌듯하다. 

728x90

'Git' 카테고리의 다른 글

git stash - 진행상황 임시저장  (0) 2023.01.02
게임처럼 Git 배우기  (0) 2022.12.12
Git Upgrade - Mac(맥), Homebrew  (0) 2022.07.18
Node.js express, React 환경에서 git 쓰기  (0) 2022.07.15
Eclipse Git(6) - Stash  (0) 2022.06.26