티스토리 뷰

반응형

git release를 사용하다가 뭔가 이상한걸 발견했다

 

우선 터미널에서는

$brew install git-flow-avh

명령어로 설치해서 사용하고 있고

소스트리에서는 내장된 git-flow를, git kraken도 아마 내장된 git-flow를 사용하는듯 하다

 

각각의 툴에서 release finish를 할 때 조금씩 다른 것을 발견했다

내가 공부한 release finish는 release branch를 devleop에 merge하고 master(main)에 merge하는 것이었는데

git kraken은 내가 생각한대로 동작하였고

terminal이랑 sourcetree에서는 release branch를 mater branch에 merge한 후 mater branch를 develop에 다시 merge하는 모습을 보였다 진짜 왜 이러지?

 

commit message랑 git kraken과 source tree에서 그래프를 비교해보았다

  terminal에서 git flow release finish [RELEASE] (옵션x) 실행 sourcetree gitkraken
message master : Merge branch 'release/RELEASE'
develop : Merge tag 'RELEASE' into develop
master : Merge branch 'release/RELEASE5'
develop : Merge tag 'RELEASE5' into develop
master : Merge branch 'release/kraken1'
develop : Merge branch 'release/kraken1' into develop
gitkraken으로 본 graph

release finish를 하는 방식이 세가지가 달라서!왜 다를까!를 찾아보았다

 

일단 내가 brew로 설치한 git-flow-avh를 찾아봤는데 이 branching model에 대한 연산을 제공한다고 한다

이 branching model의 release finish 방식을 보니,,,아래의 순서로 finish를 하고 있었다

$ git checkout master
$ git merge --no-ff release-1.2
$ git tag -a 1.2

$ git checkout develop
$ git merge --no-ff release-1.2

$ git branch -d release-1.2

여기서 merge할 때 --no-ff라는 옵션이 생소해서 찾아보았다

merge시 --ff가 기본 옵션이었고 ff는 fast-foward를 의미하였다

--ff로 merge하면 merge할 commit이 fast-foward 관계면 따로 merge commit을 만들지 않고

--no-ff로 merge하면 무조건 merge commit을 만들고 merge한다

말로 하는 것보다 그림이 이해가 빠르다

이러하다

 

암튼 잠시 다른길로 샜는데 위의 branching model로 release finish를 한다면

이런 그림이 될 것이다

근데 왜 terminal이랑 sourcetree에서 release finish를 할 때 master 브랜치에 붙인 tag가 develop으로 merge되는 것일까?

 

 

github에서 release 쪽 소스 코드를 까보다가 wiki 참고해서 여러 옵션들을 주면서 실험해봤다

 

- 우선 그냥 하던거처럼 option 따로 주지 않았을 때

(--showcommands는 그냥 뭐 실행했는지 보여달라는 option)

$ git flow release finish RELEASE --showcommands

git checkout master
git merge --no-ff release/releaseA
git checkout master
git tag -a RELEASE
git checkout develop
git merge --no-ff RELEASE
git branch -d releae/RELEASE

Summary of actions:
- Release branch 'release/releaseA' has been merged into 'master'
- The release was tagged 'releaseA'
- Release tag 'releaseA' has been back-merged into 'develop'
- Release branch 'release/releaseA' has been locally deleted
- You are now on branch 'develop'

 

- -b 옵션을 주었을 때

-b 옵션은 nobackmerge를 뜻한다. ~ don't back-merge master, or tag if applicable, in develop

(back-merge에 대한건 이 글을 참고) (+ 따로 살짝 정리해 봤다 링크 2022.04.11 추가)

이 option을 주면 master나 master의 tag를 develop에 merge하지 말라는 것 같다(이게 디폴트가 아냐?!)

어쨌든 위 옵션을 줘서 첨부터 착착 실행해보았다

$ git flow feature start B --showcommands
git config --local gitflow.branch.feature/B.base develop
git checkout -b feature/b develop

Summary of actions:
- A new branch 'feature/B' was created, based on 'develop'
- You are now on branch 'feature/B'

~~~ 작업 ~~~

$ git flow release start releaseB --showcommands
git config --local gitflow.branch.release/releaseB.base develop
git checkout -b release/releaseB develop

Summary of actions:
- A new branch 'release/releaseB' was created, based on 'develop'
- You are now on branch 'release/releaseB'

~~~ feature 브랜치를 release 브랜치에 merge ~~~

$ git flow release finish releaseB -b --showcommands
git checkout 'master'
git merge --no-ff release/releaseB
git checkout 'master'
git tag -a releaseB
git branch -d release/releaseB
git checkout develop
git merge --no-ff 'release/releaseB'
git branch -d release/releaseB

Summary of actions:
- Release branch 'release/releaseC' has been merged into 'master'
- The release was tagged 'releaseC'
- Release branch 'release/releaseC' has been merged into 'develop'
- Release branch 'release/releaseC' has been locally deleted
- You are now on branch 'develop'

그러고나서 develop 브랜치의 commit message를 확인했다

오오오!!!!!!!!!!!!!!!

그러고 나서 git kraken에서 그래프도 확인해봤다

 

오!!!!!!!!!!!!!!

그렇다 -b 옵션을 주면 develop 브랜치에 master의 tag가 아닌!release 브랜치가 바로 merge된다

내가 원한(그리고 공부한) git release finish는 바로 이거였다

내 생각이지만 git kraken은 release finish 칠 때 자동으로 -b 옵션을 넣어주나 보다

 

이걸 찾아보면서 헷갈렸던 점은 소스트리에서 release finish를 할 때

 

밑에 preview를 저런식으로 넣어줘서 헷갈렸다ㅠ

develop branch에는 'Merge release/RELEASE3 into d~~' 이렇게 적혀있어서 당연히! release branch가 develop에 merge될줄 알았지만!

실제로 OK 버튼 누르고 실행하면

이런식이다(와 오늘 첨으로 소스트리에서 실행한 명령어 보는 방법 알았다..인생)

-f 옵션만 주는데 이건 messagefile과 관련된 옵션이다(브랜치 merge에는 영향을 미치지 않는다는 소리!)

 

git kraken은 어떻게 실행했는지 알고 싶어서 찾아봤는데

ㅠ이런 로그 밖에 없었다 궁금한데!!

-b 옵션 줘서 실행하지 않나 생각중이다(commit message 등을 보았을 때)

 

이제까지 공부한 git flow를 보면 마지막에 merge할 때 releae를 develop에 merge하는게 default여야될거 같은데 어째서 tag를 develop에 merge하는게 default인지 모르겠다,,,

git의 세계는 심오하고 어려운 것이다,,,

 

+) 이것저것 찾아보다가 google에 git flow nobackmerge에 대해서 검색해봤는데

ㅋㅋㅋㅋㅋㅋㅋ

2011년에도 해당 문제를 제기한 사람이 있는듯한데 그냥 변경해줄 생각이 없는거 같당ㅇㅅㅇ

해당 문제에 대해 정리해준 포스트를 찾았는데 한번씩 읽어보면 좋을듯 하다(링크)

해당글에서 git config를 변경하는 것을 제안해줬는데 나도 좀 해봐야겠다ㅠㅡㅠ

이거 때문에 부서에서 이슈 생긴적이 있는데 정리해서 공유 좀 해야될듯

개인 적으로 feature 병합할 때 ff가 default 된건 별로인거 같다 그래프 해석하기 복잡쓰

 

 

+) commit 메세지 해석하기

Merge bracn 'release/A' : master 브랜치에 release/A 브랜치를 병합
Merge branch 'release/A' into develop : develop 브랜치에 release/A 브랜치를 병합
Merge tag 'A' into develop : develop 브랜치에 A태그를 병합

 

 

* 참고

- git flow 종류 : ujuc.github.io/2015/12/16/git-flow-github-flow-gitlab-flow/

- git branching model : nvie.com/posts/a-successful-git-branching-model/

- git-flow-avh : github.com/petervanderdoes/gitflow-avh

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함