개발환경
[개발환경] 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로 해야 함.