개발환경

[개발환경] Git cherry-pick & merge

mylee99 2023. 4. 6. 21:08

git cherry-pick : 다른 branch에 있는 commit을 선별적으로 현재 브랜치에 반영한다.

git merge : 다른 branch의 작업내용을 병합한다. commit 단위로 합치는 것이 불가능하다.

 

Case)

작업 후 master에 바로 push하는 게 아니라 장기적으로 작업해서 나중에 merge해야 하는 UI/UX 개편 건

gerrit에서 RENEW 브랜치를 따서, 첫 commit 후 commit --amend로 계속 작업함. (git push origin HEAD:refs/for/RENEW)

cherry-pick 하려다가 안돼서 merge로 해결한 상황

bash에서 로컬 브랜치를 따서 작업하다가 commit 및 gerrit 코드리뷰 완료, 근데 master에서 동시에 수정한 파일 존재

 

git cherry-pick
git checkout master

git pull

git cherry-pick RENEW

git status						
//그럼 이제 both modified 파일들이 뜰 거임. IntelliJ 가서 해당 파일들 conflict 풀어주기.

git diff src/resources/templates/test.HTML	
//master와 지금 branch에서 해당 파일이 어디서 conflict가 났는지 볼 수 있는 명령어

git status					
//소스 다 고쳤다는 가정 하에 다시 상태 확인, 그래도 both modified가 뜰 것이지만 다 고쳤으면 다음으로 넘어가도 됨.

git add .

git status					
//그럼 이제 both modified 사라지고 다 초록색 글씨로만 뜸.

git cherry-pick --continue			
//명령어 치는 곳 위에 (master|CHERRY-PICKING) 꼭 확인(cherry-picking 상태가 맞는지), create mode가 됨.

git status					
//다시 상태 확인. Your branch is ahead of 'origin/master' by 1 commit

git push origin HEAD:refs/for/master		
//근데 이번엔 master가 다른 곳을 향해 있어서 remote rejected
git merge
git branch -D master				
//master 브랜치가 이상해서 삭제하고 다시 만드는 거

git checkout master

git pull					
//master 브랜치 최신 업데이트 작업

git log						
//master가 최신 commit 건에 잘 바라보고 있는지 확인

git merge RENEW					
//이러면 또 conflict가 난다?

git status					
//both modified 확인해서 conflict난 파일들 해결

git add .

git merge --continue	
//와중에도 (master|MERGING) 이거 꼭 확인

git push origin HEAD:refs/for/master

 

참고)

  • cherry-pick은 gerrit에서 RENEW 브랜치에 커밋한 곳 들어가서 'Cherry Pick'버튼 누르고 branch 입력 부분에 master 넣어도 할 수 있음. 이번 경우엔 master와 RENEW 브랜치의 merge conflict로 인해 충돌을 풀어줘야 하기 때문에, bash에서 상황 보면서 진행
  • cherry-pick은 가장 마지막에 커밋된 것만 가져옴. 이번엔 commit --amend로 계속 작업했었기 때문에 커밋 건이 하나밖에 없어서 가능했지만, 커밋이 많으면 cherry-pick이 아니라 merge로 해야 함.