Tany
백문이불어일Tany
Tany
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • JAVA TPC (1)
    • JAVA (10)
    • CS (3)
    • SPRING (5)
    • DFS BFS (12)
    • SQL (7)
    • 알고리즘 정리 (76)
    • Git, Github (3)
    • 학습 계획 (36)
    • 코드스쿼드 학습일지 (19)
    • Servlet (5)
    • VPC (2)
    • AWS (4)
    • JPA (5)
    • 취미생활 (2)
    • 프로젝트 기록 (7)
      • Issue Tracker 삽질 기록 (5)
      • 당근마켓 API 서버 기록 (2)
      • 나만의 블로그 제작 기록 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 주간 학습 계획
  • sql
  • 인프런
  • 자바
  • BFS
  • dfs
  • MVC
  • 재귀
  • 알고리즘
  • 자료구조
  • AWS
  • 완전탐색
  • MySQL
  • 정렬
  • 백준
  • 이분탐색
  • JPA
  • github
  • java
  • 파이썬
  • hash
  • 프로그래머스
  • Stack
  • 면접을 위한 CS 전공지식 노트
  • GIT
  • EC2
  • 이코테
  • JSP
  • 문자열
  • 해시

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Tany

백문이불어일Tany

[Git, Github] 체리픽 Cherry-Pick 활용 연습
Git, Github

[Git, Github] 체리픽 Cherry-Pick 활용 연습

2022. 3. 26. 16:55

최근 코드스쿼드 미션을 하면서 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. 결과

feat a 커밋 2 가 feature-b 브랜치의 최신 커밋으로 잘 올라왔다 !

이미지에서 확인할 수 있듯, 원했던 커밋을 정상적으로 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 했을 때, 그 파일에서 새로운 변동사항, 파일만을 옮길까 ?

cherry-pick 하기 전 히스토리 상태
feature-a 최신 커밋이 담고 있는 파일들
feature-b 최신 커밋이 담고 있는 파일들

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 mergetool 명령어로 충돌 해결
충돌 해결 후 git cherry-pick --continue
충돌 해결 후 히스토리 확인 !

궁금증 해결 완료 ㅎ_ㅎ

'Git, Github' 카테고리의 다른 글

[Git, Github] 리베이스 rebase --onto 활용 연습  (0) 2022.03.26
[Git, Github] 리베이스 rebase 활용 연습  (0) 2022.03.26
    'Git, Github' 카테고리의 다른 글
    • [Git, Github] 리베이스 rebase --onto 활용 연습
    • [Git, Github] 리베이스 rebase 활용 연습
    Tany
    Tany
    내가 보려고 만드는 백엔드 기록장 Github https://github.com/juni8453

    티스토리툴바