상세 컨텐츠

본문 제목

[git] 생존을 위한 Git : merge, rebase, cherry-pick, squash and merge

😎 지식/Git&Jira🛠️

by :Eundms 2024. 3. 15. 17:47

본문

이런 상황

과거의 나 : (무지성) commit, merge 

현재의 나 : (아! 생각보다 커밋 기록을 확인할 일이 있네.. 커밋 메시지랑 기록을 잘 남겨놔야 하는 것을 깨달은 상태)

그래서, merge, rebase, cherry-picksquash and merge 에 대해 정리를 진행해보려합니다 


rebase

- 커밋이 분기되는 base를 수정하는 작업

- 공통된 커밋으로부터 수정하려는 base 커밋까지의 차이점을

   1) 패치(patch)에 임시로 저장하고

   2) 참조 커밋을 수정한 후

   3) 패치(patch)를 순차적으로 적용한다 

- 새로운 commit을 만들지 않는다 

 

예) v 2.1.0 이후에 2가지 이슈가 발생하였다

issue1 : 함수 결함 수정

issue2 : 함수 추가

 

방법1) 작업용 브랜치끼리 병합을 마친 후, 배포용 브랜치에 병합하는 방법 

 

방법2) 작업 종류가 유사한 브랜치끼리 한줄기로 표시되도록 정리하는 방법

 

issue2의 base를 issue1로 재배치하고자한다

issue2 브랜치 :  git rebase issue1

rebase를 취소 : git rebase --abort

충돌 해결후 : git add . git rebase --continue

 

[rebase 사용 예시] https://jojoldu.tistory.com/120

 

이미 커밋된 내용에서 author(작성자) 수정하기

하나의 Source Tree로 github 계정 여러개를 사용할 경우 간혹 신규생성 or 새로 클론 받은 저장소 작성자가 원치않는 계정으로 등록되어 커밋될 경우가 있습니다. 이럴 경우 원하는 계정으로 커밋이

jojoldu.tistory.com


merge

Fast-Foward

브랜치를 생성하고 작업이 끝난 다음 master에 merge를 진행할 때까지 master에 어떠한 변경도 없는 경우 

master를 새로 생성한 브랜치와 동일한 커밋을 가르키도록 이동만 하면 된다

https://wikidocs.net/153693

 

 

3 Way Merge

base에서 commit을 진행해서 분기해 나간 상태

두 브랜치 중 어느 것도 base에 위치하지 않음

새로운 commit이 생성됨

 

 

--ff --no-ff --squash

fast-forward merge가 되면서 master에 dev1의 commit이 모두 합쳐짐

fast-forward merge 가 일어나야하지만, non fast-forward로 merge하고 싶은 경우

 

--ff 

현 브랜치와 merge 대상 브랜치가 fast-forward 관계에 있는 경우 새로운 commit을 생성하지 않고

브랜치의 참조 값만 변경되도록 함

fast-forward 관계가 아니면 merge commit을 생성함

 

--no-ff

merge 대상과 fast-forward 관계여도 강제로 merge commit을 생성하고 병합함

브랜치 관계에 상관없이 필요한 commit만 가져올 수 있음

어떤 브랜치에서 merge 했는지 기록을 남길 수 있음

 

--squash

commit 이력merge된 브랜치 이력도 남기지 않음

새로운 commit에 상대 브랜치의 내용을 모두 뭉쳐 놓음

 

 


cherry-pick

예) v2.2.0버전 개발 중, dev1, dev2 브랜치를 나눠서 작업을 진행했고,
dev2에서 dev1의 작업을 병합하려 한다

다만, dev1 브랜치의 한단계 이전 commit 을 병합하려 한다

회색 : dev1, 보라색 : dev2

 

방법1) dev1 브랜치를 원하는 commit까지 hard reset한 후 merging

- 기존의 이력을 삭제해버린다

 

방법2) git cherry-pick 명령 사용하기

- 과거 이력 중 필요한 부분만 가져온다

 

HEAD가 가리키는 현재 브랜치에 특정 commit 추가 : git cherry-pick [commit hash]

cherry-pick 작업 취소 : git cherry-pick --abort

충돌 해결후 : git add . git cherry-pick --continue

merge commit을 추가 : git cherry-pick –m [parent number] [merge commit ID]

merge commit의 경우 어떤 부분의 merge를 가져올지 알 수 없다. 그래서 parent number를 추가해야 한다.(1부터 시작하며 main line이 1)

 

cherry-pick이 사용될 수 있는 다른 예)

협업

A와 B가 분업 중, A가 본인이 작성한 부분을 테스트하기 위해서는 B가 구현한 부분이 필요함

B가 완성이 안된경우, B가 작성한 commit 하나만 찾아서 A의 브랜치에 가져와서 시험

 

버그 수정 

기능 1을 완성하고 기능2를 개발 중. 

나중에 알고보니 기능1에 버그가 있음

사람들이 버그로 인한 불편을 겪기 전에 버그 패치를 해서 배포용 브랜치에 cherry-pick

 

 

 

 

 

 

 

 

 


[ 출처 ]

https://wikidocs.net/153693

관련글 더보기

댓글 영역