본문 바로가기

데브코스

깃 브랜치(branch)

깃 브랜치 이름 규칙

브랜치를 만드는 경우 =>기능 개발, 출시 준비, 긴급 수정 

  • 기능 개발: feature/login , feature/select-product
  • 출시 준비: release-1.3 , release-1.4
  • 긴급 수정: hotfix-1.2.1

브랜치 생성 후 확인 

 

브랜치 삭제

git branch -d 브랜치명

 


👩🏻‍💻 실습해보기

feature/login 브랜치에서 파일 내용 변경 후 commit 했을 때

test3.txt 파일 내용을 추가 후 commit 했다.
feature/login 브랜치 깃 히스토리 화면

: Login Branch Commit 이라는 메시지로 커밋이 된 것을 확인할 수 있다. 

feature/select-product 브랜치에서의 화면
feature/select-product 브랜치에서의 깃 히스토리

 

=> feature/select-product 브랜치에서의 test3.txt 파일은 변경되지 않았음을 확인할 수 있다. 깃 히스토리를 봐도 Login Branch Commit 이라는 커밋 메시지는 없다. 이와 같은 방식으로 브랜치를 통해 병렬로 개발이 가능함을 알 수 있다❗

 

⚠️ 주의할 점

 

브랜치는 commit 이후에 제대로 사용할 수 있다. 예를 들어 login 브랜치에서 파일 내용을 변경하고, select-product 브랜치로 이동해도 해당 파일 내용이 변경되어 있음을 확인할 수 있다. 하지만, commit 한 이후에 확인해보면 login 브랜치에서 commit 했을 경우 변경된 내용이 login 브랜치 파일에만 적용되어 있고 다른 브랜치에는 적용되어 있지 않음을 확인할 수 있다. commit 은 한 번 하고 나면 되돌릴 수 없기 때문에, 커밋하기 전에 내가 커밋하고자 하는 브랜치가 맞는지 꼭 확인해야 한다 !

 


깃허브에 브랜치 생성하고 깃 브랜치 복제하기

: 깃에 만들어 둔 브랜치를 원격 브랜치로 복제 

 

git push 깃허브저장소별칭 깃브랜치명

+) 반대로 깃허브에 브랜치를 먼저 생성하고 깃으로 받아오려면 깃브랜치명과 깃허브저장소별칭을 바꿔서 작성하면 된다. 

+) 깃허브에 현재 브랜치가 몇 개가 있는지 확인하는 명령어: git branch -r(remote)

: 깃허브에서 feature/login 브랜치가 생성된 것을 확인할 수 있다. 


깃 브랜치 전략 ( 깃 플로우 )

1. fast forward 전략 ( 현업에서 잘 사용 x )

: main branch 에서 feature/login branch 를 생성한 시점부터, 

- main branch 에는 아무런 추가 구현을 하지 않고

- feature/login branch만 추가 구현한 뒤 

  feature/login branch 와 main/branch 를 합치면 👉🏻 main/branch 에 그냥 feature/login branch 가 붙으면 끝남 

 

2. 3-way 전략 ( 일반적으로 가장 많이 사용 )

: main branch 에서 feature/login branch 를 생성한 시점부터, 

- main branch 도 추가 구현을 하고 

- feature/login branch도 추가 구현을 하고 

  feature/login branch 와 main/branch 를 합치면 👉🏻 main/branch 와 feature/login branch 가 서로 비교하여 바뀐 것을 정리하여 합치는 전략 

 

➡️ 보통 두 전략을 합쳐서 사용한다! 


병합(merge)

병합이란? 

 

: 브랜치를 생성한다는 건, "협업" 을 위한 것

: 그래서 우리는 주로 브랜치 병합(추가 가지 -> base 가지) 을 "깃허브"

: main 브랜치 보호 > 추가 브랜치에서 main 브랜치로 병합 시켜줘( Pull Request) > 충돌 확인 (자동으로 깃허브에서, *PR 메시지*) >  merge (*merge commit *) > branch 삭제 

 

1. 깃허브 레퍼지토리에서 Compare & pull request 클릭

 

2. 설명 작성 후 Create pull request 클릭 

: markdown 문법을 사용해서 작성하는 것이 좋음 

pull request 에 작성하는 내용 매우 중요 !!

 

3. 충돌이 없을 경우 아래와 같은 화면이 나온다. Merge pull request 클릭 

 

4. Confirm merge 클릭 

merge commit

5. merge(병합) 완료 

브랜치는 기능을 다 추가하고, merge 를 하고 난 이후에는 삭제해주는 것이 좋다. 

merge 가 끝나고 commit 히스토리를 확인하면 위와 같은 화면을 볼 수 있다. 

 

merge된 깃허브 -> 깃에 동기화하기

(해당 상황은 깃허브에서 feature/login 브랜치를 삭제하고, main 에 병합한 이후이다.)

git fetch -p : 깃허브 브랜치 목록 동기화 > (깃 브랜치 삭제) git checkout main > git pull origin main > git branch -d 브랜치이름

 

1. 깃허브의 브랜치 목록을 동기화한다.

 

git fetch -p

feature/login 브랜치를 삭제했으므로 깃허브 브랜치를 확인했을 때 main만 뜨는 것을 볼 수 있다.

하지만, 아직 로컬에서는 feature/login 브랜치를 삭제하지 않았으므로 남아있다. 

삭제하기 위해서는 우선 다른 브랜치로 이동해줘야한다.

 

삭제하려고 하니 merge가 되지 않았다고 경고창이 뜬다. 깃허브에서는 merge를 했지만, 아직 동기화하지 않아 발생하는 오류이다.

 

2. main 브랜치에서 동기화를 수행한다.

 

git pull origin main 

동기화 후 로그를 확인해보면, 깃허브에서 merge 할 때 적었던 커밋 메시지가 뜨는 것을 확인할 수 있다. => 동기화 완료

동기화가 완료되니, 깃에서 feature/login 브랜치가 제대로 삭제되는 것을 볼 수 있다. 


충돌(Conflict)

1. 깃허브에서 feature/1 과 feature/2 브랜치 생성하기

2. 같은 원격저장소를 사용하는 파일에서 하나의 파일은 브랜치 feature/1 에서 작업, 하나의 파일은 브랜치 feature/2 에서 작업하기

 

git checkout -t 원격저장소별칭/브랜치이름

첫번째 파일 ) feature/1 브랜치에서 작업
두 번째 파일) feature/2 브랜치에서 작업

 

3. 첫 번째 파일의 hyewon.txt 파일 수정 후 feature/1 브랜치에서 add, commit,push 까지 수행

 

4. 두 번째 파일의 hyewon.txt 파일 수정 후 feature/2 브랜치에서 add, commit,push 까지 수행

 

5. feature/1 브랜치에서 먼저 Compare & pull request 수행

feature/1 브랜치 merge까지 완료한 화면

 

6. feature/2 브랜치에서도 Compare & pull request 수행

 

7. 경고창 발생, 무시하고 merge 수행

8. 충돌 발생 ! (똑같은 hyewon.txt 파일을 수정했기 때문)

Resolve conflicts 버튼 클릭 후 화면

 

9. 원하는 내용 남겨두고 나머지 다 지우고 Mark as resolved  클릭 -> Commit merge 클릭

 

10. 이제 충돌이 일어나지 않음, Merge pull request 클릭

 

11. Merge 완료

main 브랜치의 hyewon.txt 파일이 feature2 로 내용이 변경되어 있는 것을 확인할 수 있다. 


🌟 배운 점 

오늘은 브랜치에서도 가장 중요한 병합과 충돌을 해결하는 법을 배웠다. 예전에 학교에서 잠깐 배웠을 때는 이해를 제대로 하지 못한 채 넘어갔었는데 오늘 강의를 들으면서 실습을 하니 이제서야 제대로 이해를 하게 됐다. 이론은 완벽하게 이해를 했으니, 이제 복습을 하면서 CLI 를 통해 git 을 다루고 많은 명령어들에 익숙해지는 것이 필요할 거 같다. 깃을 이렇게까지 자세히 배울 수 있는 기회를 얻어서 너무 좋다. 실수와 오류를 두려워하지 말고 연습을 많이 해야겠다. 

'데브코스' 카테고리의 다른 글

웹(Web)  (0) 2024.08.20
협업 Tool  (0) 2024.08.19
깃(git)에 대하여(2)  (1) 2024.08.14
깃(git) 에 대하여(1)  (0) 2024.08.13
프로젝트 관리 (Readme & 버전 관리)  (0) 2024.08.12