최근 코드스쿼드 미션을 하면서 Git 에 대한 무지함이 계속해서 발목을 잡는게 느껴졌다.
강의도 듣고 했지만 연습을 너무 안해서 그런 것 같기도 하고.. 해서 장난감 다루듯 터미널에서 이것저것 연습해봤던 것들을 기록해보자.
1. Cherry-pick 은 언제 사용할까 ?
A 브랜치에서 기능을 개발하고 있는데, 이 브랜치는 개발에 상당한 기간이 소요된다고 가정해보자. 이 때 B 브랜치에서 A 브랜치의 커밋 중
하나가 필요해서 그 커밋만 가져오고 싶은 상황이 있을 수 있다. 이럴 때 유용한 기능이 Cherry-pick 이다.
간단한 커밋 로그를 직접 만들어 보고 연습해보자 ~
2. 예시
마스터 브랜치 3 [14c8766] 커밋에서 feature-a, feature-b 브랜치가 파생되어 각각 커밋이 진행되고 있는 상태이다.
앞서 언급한 상황같이 B 브랜치에서 A 브랜치의 커밋 중 feat a 커밋 2 [e91094e] 가 필요하다고 할 때 cherry-pick 을 사용할 수 있다.
예상해보자면, HEAD 가 B 브랜치를 가리키고 있기 때문에 swith, checkout 명령어로 HEAD 를 옮길 필요는 없을 것 같고..
[e91094e] 커밋 해쉬를 복사해서 바로 cherry-pick 을 진행하면 될 것 같다 !
3. 결과
이미지에서 확인할 수 있듯, 원했던 커밋을 정상적으로 cherry-pick 한 것을 확인할 수 있다.
지금은 한 커밋만 cherry-pick 했지만, 여러 커밋을 한꺼번에 할 수도 있다 ㅎ_ㅎ
예) git cherry-pick [커밋 해쉬] [커밋 해쉬] [커밋 해쉬] ..
4. rebase 처럼 사용할 수도? 🧐
B 브랜치로 A 브랜치의 모든 커밋을 chrry-pick 한 상태를 만들었다. 이러면 A 브랜치의 변동사항을 히스토리에서 없애려면 어떻게 할까 ?
master 브랜치와 B 브랜치를 머지하고 A 브랜치를 지우면 된다.
A 브랜치가 따로 머지된 상태가 아니라면 에러가 날 수도 있는데, 그냥 -D 옵션을 사용해 브랜치를 지워줬다. 확실하지 않은데
master 브랜치가 B 브랜치에 머지가 된다면 어짜피 A 브랜치 내용도 함께 머지하는 것이라 지워도 상관 없지 않을까 ? (아마도...)
이 부분은 좀 더 자문을 구해봐야겠다 ㅎㅎ;;
아무튼 지우면 rebase 한 것처럼 이렇게 로그가 일 자로 예쁘게 정렬된 것을 확인할 수 있다.
5. 사용 시 주의 사항
결과 이미지를 보면 우리가 원했던 커밋은 [e91094e] 인데 잘 확인해본다면 feature-b 브랜치 최신 커밋은 [9b726bd] 으로 변경된 걸
확인할 수 있다 .. 이래서 rebase 도 그렇고 cherry-pick 사용할 때 원격에 이미 올라가있는 커밋은 건드리지 않는게 좋다.
잘못 건드리면 다른 개발자와 공동 개발을 하고 있는 상태에서 커밋 해쉬가 완전 달라지기 때문에 그 쪽에서 충돌이 날 수도 있고 ...
개발자 자신의 로컬에서 개발을 진행하거나 혼자 브랜치에서 작업을 하는 경우라면 언제든 사용해도 되지만 이런 경우를 주의하자 😀
6. 궁금증 ?
cherry-pick 으로 이것저것 시도하다보니 궁금한게 좀 생겨났다. 직접 몸으로 때워보는 시간
첫 번째 궁금증)
한 커밋을 cherry pick 했을 때, 그 파일에서 새로운 변동사항, 파일만을 옮길까 ?
feature-a 는 커밋을 진행하면서 feat a 1.txt 파일, feat a 2.txt 파일을 각각 커밋했다.
여기서 feat a 1.txt 파일을 커밋했던 [5a2cf64] feat a 커밋 1 을 cherry-pick 한다면 feat a 1.txt 파일만 가져올까 ?
내 생각대로라면 feat a 2.txt 파일은 [5a2cf64] 커밋에서 생겨난 파일이 아니므로 가져오면 안된다. 한번 시도해보자.
feat a 2.txt 파일은 따로 가지고오지 않는다는 것을 확인할 수 있다. (사실 당연한건가 ...? ㅋㅋㅋ😅)
두 번째 궁금증)
B 브랜치로 옮길 A 브랜치의 커밋이 이미 B 브랜치에 있는 파일일면 어떻게 될까 ?
테스트를 위해 각 브랜치에 내용도 파일 명도 똑같은 4.txt 파일을 만들고 커밋했다.
여기서 B 브랜치로 A 브랜치의 같은 파일이 있다면 충돌이 일어날까 ? [567cc55] 커밋을 한 번 cherry-pick 해보자.
오잉 메세지가 띄워지면서 cherry-pick 이 실행되지 않는다.. 완전 같은 내용에 파일명이 같아서 그런가 ? 4.txt 의 내용을 좀 바꿔보자.
A 브랜치의 4.txt 의 내용을 추가하고 아까와 똑같이 B 브랜치 위로 cherry-pick 을 시도하면 ?
오 덮어씌워질 줄 알았는데 충돌이 난다 !! 이럴 때 Git 에서 4 가지의 옵션을 선택할 수 있게 해준다.
1. git cherry-pick --continue : 충돌을 해결하고 cherry-pick 을 진행한다.
2. git cherry-pick --skip : 현재 커밋을 스킵하고 다음 커밋으로 넘어간다. 즉, 해당 커밋의 변경점이 반영되지 않는다.
4. git cherry-pick --quit : 현재 상태에서 롤백하지 않고 cherry-pick 을 멈춘다. 롤백하지 않아서 충돌은 그대로 남아있다.
3. git cherry-pick --abort : 현재 상태를 롤백하고 cherry-pick 을 멈춘다.
continue 옵션을 사용해서 충돌을 해결하고 진행해보자.
궁금증 해결 완료 ㅎ_ㅎ
'Git, Github' 카테고리의 다른 글
[Git, Github] 리베이스 rebase --onto 활용 연습 (0) | 2022.03.26 |
---|---|
[Git, Github] 리베이스 rebase 활용 연습 (0) | 2022.03.26 |