실무에서는 브랜치 전체를 머지하지 않고 "다른 브랜치의 특정 커밋 딱 1개만 내 브랜치로 가져오고 싶은 순간"이 생깁니다. 또한 로컬에서 커밋을 정리한 뒤 원격에 푸시할 때 "동료의 코드를 덮어쓰지 않고 안전하게 강제 푸시하는 방법"을 알아야 대형 참사를 막을 수 있습니다.
1. Cherry-pick: 맛있는 체리만 쏙 골라 담기
동료가 feature/experimental 브랜치에서 15개의 커밋을 작업 중인데, 그중 "DB 연결 헬퍼 함수 버그 수정" 커밋(7a8b9c1) 딱 하나가 지금 당장 내 브랜치에도 필요합니다.
# 1. 내 작업 브랜치로 이동
(develop) $ git switch feature/order-api
Switched to branch 'feature/order-api'
# 2. 해당 커밋 1개만 내 브랜치에 쏙 복사해오기
(feature/order-api) $ git cherry-pick 7a8b9c1
[feature/order-api 9d8e7f6] fix: DB 커넥션 풀 누수 버그 수정
1 file changed, 4 insertions(+), 1 deletion(-)체리픽 도중 충돌(Conflict)이 났을 때
# 1. 충돌 파일 수정 후 스테이징
(feature/order-api|CHERRY-PICKING) $ git add app/Helpers/Database.php
# 2. 체리픽 계속 진행
(feature/order-api|CHERRY-PICKING) $ git cherry-pick --continue
(feature/order-api) $
# 또는 체리픽 취소하고 원래 상태로 복귀
(feature/order-api|CHERRY-PICKING) $ git cherry-pick --abort
(feature/order-api) $ 2. 안전한 강제 푸시: --force-with-lease
로컬에서 rebase나 amend를 수행하면 커밋 해시가 바뀌기 때문에 일반 git push는 거절당합니다. 이때 일반 -f 대신 반드시 --force-with-lease를 사용합니다.
# 실무 필수: 동료의 최신 커밋 유실을 방지하는 안전한 강제 푸시
(feature/order-api) $ git push --force-with-lease origin feature/order-api
To https://github.com/my-org/project.git
+ 3a1f9b2...9d8e7f6 feature/order-api -> feature/order-api (forced update)