A successful Git branching model

 

backlog.com/git-tutorial/kr/stepup/stepup1_5.html

이 운용 모델에서는 크게 나눠 4가지 종류의 브랜치를 이용하여 개발을 진행합니다.

  • 메인 브랜치(Main branch)
  • 피처 브랜치(Feature branch) 또는 토픽 브랜치(Topic branch)
  • 릴리스 브랜치(Release branch)
  • 핫픽스 브랜치(Hotfix branch)

 

일단,

git pull = git fetch + git merge 이다.

 

git merge를 하는 과정을 살펴보자>

브랜치가 나뉘어지고 feature 브랜치에서 master에 업데이트된 내용을 받기 위해선 두가지 옵션이 있다.

1) merging or

2) rebasing.

 

1) merging 방법:

$git checkout feature (Feature 브랜치로 이동)

$git merge master (Feature에서 master를 가져와서 병합하는 것이다)

또는, 한 명령어 라인으로,

$git merge feature master (컴공에서는 항상 A <- B  이런식이다) 즉, feature에 master를 갖다붙임

git merge가 git rebase에 비해 non-destructive method이라 여겨지는데, 왜냐하면 기존의 브랜치들이 영향을 받아서 바뀌지 않기 때문이다.

하지만, 이 방법은 master가 만약 active하게 계속 업데이트가 되는 상황이라면, 계속 feature브랜치가 새로운 커밋을 git merge해야하기 때문에 나중에 브랜치 히스토리를 복잡하게 만들 수 있다. git log 명령어로 조금 덜 복잡하게 만들 순 있지만 다른 개발자들에게 직관적인 브랜치 히스토리를 주지 못한다. (리뷰할때)

 

Rebasing

Merging의 대안으로 rebasing 명령을 사용하여 feature 브랜치를 master브랜치로 리베이스 할 수 있습니다 .

git rebase를 하면 마치 순차적으로 master를 업데이트 하고 있던 것 처럼 보이게 만들 수 있습니다.

아래 그림과 같이 feature를 master 뒤에 연결함으로써 마치 처음부터 순차적으로(sequentially)하게 작업한 것과 같은 타임라인을 지니게 할 수 있습니다. 대신 commit history가 하나로 묶여지게 되죠. (마스터로 ) 

아래 그림(learngitbranching.js.org/?locale=en_US) (rebase편) 에서의 설명:

$git rebase main(rebase를 c3에서 한 경우) 

c3' 라는 복사본이 main의 위에 (main의 tip) 연결이 되고 c3는 희미하게 트리에 기록이 남아있습니다. 하지만 이 작업은 내 로컬 PC에만 작용이 된 것이기 때문에 remote에도 반영을 해줘야 합니다.

이렇게 main으로 checkout한 뒤에 rebase를 진행해줍니다.

그럼 아래 그럼과 같이 main과 bugFix가 같은 마지막 커밋 위치(HEAD)로 이동함을 알 수 있습니다. 

즉, main이 앞으로 fast-forward되었습니다. (fast-forward는 아래 참조)

 

fast-forward란?

bugFix 브랜치를 만들고 작업하면서 그동안 master에 아무런 변화가 없었다면 master 브랜치의 HEAD를 bugFix 브랜치에 간단히 옮기기만(2가지 방법이 있음: git merge or git rebase) 해도 아무런 충돌없이 진행이 가능합니다. 그저 master 브랜치를 이동시키기만 해도 된다고 하여 fast-forward라고 부릅니다. 이동시키는 방법은 bugFix에서 $git rebase master 또는, $git merge master 를 하면 됩니다. 그럼 알아서 master의 HEAD를 옮기기만 합니다. 

 

여기서는 내 정리)

하지만, 만약 master 브랜치가 계속 업데이트가 되어 바뀌었다면 fast-forward가 되지를 않습니다. 그래서 merge나 git rebase를 하게 되면 commit이 발생하게 되어 commit message를 입력하여야 합니다. 밑에 글 (스크롤 내려서) 참조: 서로 다른 브랜치 병합하기 부제목

backlog.com/git-tutorial/kr/stepup/stepup1_4.html

서로 다른 branch 병합하기 (merge)

yuja-kong.tistory.com/51

commit 5는 원래 마스터가 가지고 있는 내용. 3,4가 exp꺼였는데 master에 병합된 내용

 

 

하지만, 만약 master 브랜치가 계속 업데이트가 되어 바뀌었다면 fast-forward가 되지를 않습니다. 그래서 merge나 git rebase를 하게 되면 commit이 발생하게 되어 commit message를 입력하여야 합니다. 

 

다시 정리하자면 merge commit은 서로 다른 상태의 브랜치를 병합해서 새로운 commit을 만드는 경우이고

fast forward는 동일 내용이 포함되는 브랜치일 경우 브랜치 이동만으로 병합해서 따로 commit을 생성하지 않는 경우입니다.

Github pull error

Pull 을 해도 충돌 에러가 발생하면 아래와 같이 Synchronize 탭을 열어서 수동으로 코드를 병합해주고 (오른쪽이 remote에서 받아온 코드인데 이걸 왼쪽에 복붙해서 합쳐주고 저장) 이제 add to index -> commit (commit message 입력) -> pull 받으면 정상으로 해결이 된다.

아래 링크를 참조하길...

 

m.blog.naver.com/PostView.nhn?blogId=lge920904&logNo=220274506449&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

'Github' 카테고리의 다른 글

[git 공부] 이상적인 git branching model  (0) 2021.03.01
[Git공부] git pull vs git rebase  (0) 2021.03.01

+ Recent posts