Git

[Git] Branch에 관한 내용

sueeee-e 2024. 11. 4. 13:01

 

git과 github 

 

git은 모든 파일의 변화를 기록하고 있고 같은 파일의 다른 버전까지 보관할 수 있다.

github는 클라우드에 있는 깃 제공자라고 볼 수 있는데 내 컴퓨터에 있는 파일을 깃허브를 통해 공유할 수 있다.

 

git-flow 전략으로 관리해보기 위해 브랜치를 처음 만들게 되었는데 그 과정에서 발생한 문제와 해결방안을 공유하고

 

브랜치 생성, 구현 후 브랜치 커밋, 병합, 삭제 명령어를 정리하고자 기록함 


문제 1. git에서 만든 브랜치와 github에서 만든 브랜치는 자동으로 반영되지 않음

그래서 둘 사이에 어떻게 브랜치를 관리하는지 알아보자

원격에서 브랜치 만들 때

1. 원격에서 만든 브랜치 -> 로컬에 연결 !!

내가 원격에서  New branch를 통해서 브랜치 생성 new-branch 

로컬에서 git switch -t origin/new-branch를 통해서 같은 이름의 브랜치를 로컬에도 만들어주고 그 브랜치로 이동함

 

2. 로컬에서 만든 브랜치 -> 원격에 연결!!

그리고 로컬에서 만든 브랜치 git branch new-branch 를 원격으로 연결해주려면?

git push -u origin new-branch 를 해주면 원하는 원격 공간에 같은 브랜치가 생성됨

 

+브랜치를 삭제하고 싶다면?

1. 로컬에 그냥 있던 브랜치는 git branch -d new-branch 로 삭제해주면 되고

2. 원격에 연결해준 브랜치는 git push origin --delete new-branch 로 삭제해주면 됨

 

이 방법으로 로컬과 원격에서의 브랜치를 연결시켜줘야 한다.

 


문제 2. 로컬 브랜치와 원격 브랜치가 잘못 연결이 되어 있다면 ?

현재 -- 로컬에 있는 main이랑 원격에 있는 main이랑 내용이 다른 것이 문제

(로컬에서 a브랜치의 내용을 바꾸어 줬는데 원격의 a 브랜치에는 반영이 되어 있지 않다 .  -> git push

이때는 로컬과 원격의 브랜치를 git puch -u origin main 로 연결해놓았다면 git push만 하면 됨)

 

문제는 지금 로컬 main과 원격 main이 다른 브랜치

 

원격에 origin , team 두 개가 있는데 저는 원격team과 로컬이 연결을 하고 싶은데 잘못 연결된 상황,

로컬 브랜치와 원격 브랜치가 연결되어있는지 확인 먼저 해보면,

git branch -vv

다른 브랜치는 잘 연결이 되어 있지만 main이 team/main이 아닌 origin/master이랑 연결이 되어 있는 것으로 보임

 

<해결방법>

1. (main) git fetch team        //team 원격에서 최신 브랜치 가져오기

2. (main) git branch --set-upstream-to=team/main main         

//*로컬 main 브랜치와 원격 team/main 브랜치 연결하기: 로컬 main 브랜치가 원격 team/main 브랜치를 트래킹하도록 설정합니다. 이 설정을 통해 로컬 main에서 git push나 git pull 명령을 사용할 때 team/main 브랜치를 대상으로 하게 된다.

3. (main) git branch -vv  //다시 확인

보면 main과 team/main이 연결되어 있는 것을 확인할 수 있고 여기서 ahead는 최신 커밋이 1개 남았다는 뜻으로 push 해주면 된다.

 

해결~

 


👾 Branch (브랜치) 관련 명령어

 

브랜치 생성

git branch develop

 

브랜치 확인

git branch 

 

브랜치 이동

git switch develop

(checkout -> switch, restore 로 분리함)

 

브랜치 동시에 생성, 이동

git switch -c newbranch

 

브랜치 삭제 (대문자 D로 하면 강제 삭제)

git branch -d 브랜치이름

 

브랜치 이름 바꾸기

git branch -m 기존브랜치 새브랜치

 

브랜치 내역 조회

git log

git log --all  등등

 

 

 

👾 브랜치 합치는 방법 1. merge 2. rebase

 

1.

merge : 병합 -> 브랜치의 흔적을 남김

현재 위치한 브랜치(main)에다가 합칠 브랜치(develop)

(main) git merge develop

:wq 으로 메세지 작성가능

 

 

2.

rebase: 옮겨 붙이기  -> 흔적이 안남음 (히스토리가 한 줄)

main 브랜치에다가 develop 브랜치를 합치고 싶다!

(develop) git rebase main  ->브랜치 바꿈

(develop) git switch main 

(main) git merge develop 


*병합해서 더이상 필요없어진 브랜치는 삭제해도 됨

 

 

보통 이 작업은 깃허브에서 해주는데,

 

커밋을 해주고나면 Compare & pull request 를 해주라고 깃허브에서 먼저 뜨게 된다. -> 병합 제안

*이때 어느 브랜치에 머지 해줄지 잘 확인해야 한다

이미지 출처 : https://wayhome25.github.io/git/2017/07/08/git-first-pull-request-story/

 

이를 눌러주면 코멘트를 적을 수 있는데 여기에 작업 내용을 공유하고 팀원들이 볼 수 있게 해준다. -> create pull request

 

그 다음 팀 규칙에 따라 다른 사람이 merge를 진행해도 되고 내가 merge를 해줘도 된다. 

이미지 출처 : https://abled.tistory.com/36

 

이렇게 하면 병합이 완료되었다!


보통 main, develop, fea 브랜치가 있는데 fea 브랜치에서 기능을 구현하고 develop 브랜치에 병합한 뒤에는 삭제해준다. 

*fea 는 기능 구현 브랜치로 원하는 이름으로 수정 후 사용

이 과정의 명령어를 정리해보자.

 

1. 브랜치 생성 

로컬에서 develop 브랜치에서 fea 브랜치를 하나 만들어주고 이를 원격에도 연결시켜주자

 git checkout -b fea
 git push -u origin fea

 

2. 기능 구현 

 

3. 커밋 

git add .
git status #생략가능
git commit -m "커밋내용"
git push origin fea

 

원격에 잘 올라갔는지 확인, 병합 진행

 

4. 삭제 ( 다른 브랜치로 이동 후)

 git branch -d fea
 git push origin —delete fea

 

 

주로 develop 브랜치에 merge를 하기 때문에 다시 코드 작업을 할 때는 업데이트된 develop 를 가져온다

git pull origin develop

 

이제 반복해서 개발하면 된다!!


👾 브랜치 충돌 

 

브랜치 간 충돌 : 같은 파일의 같은 위치의 다른 내용이 입력된 상황

-> 어떤 것이 맞는 건지 선택할 수 있게 함

 

기존의 main에서 a파일의 b내용을 c라고 커밋하고 , 다른 브랜치를 생성해서 a파일에서 b내용을 v라고 또 커밋을 해준다. 

 

 

1. 

merge 충돌 해결

 

현재 브랜치에서는 (초록) 

merge한 브랜치에서는 (파랑) 내용으로 충돌한다. 

그 부분을 새로운 내용을 입력해도 되고 둘 중에 하나를 선택해도 된다. (커서 위치 참고) 

선택은 Current Change 부분 클릭하거나 Incoming Change , 또는 둘 다 반영할 수 도 있다. 

 

하지만 충돌부분이 너무 많을 경우 merge를 중단할 수도 있다. git merge --abort

 

이렇게 충돌을 해결할 수 있어서 충돌 부분을 수정했을 경우 ,

git add .  

git commit 으로 병합을 마저 해주면 된다. 

 

 

2.

rebase 충돌 해결 

 

이 과정에서도 충돌이 나면 초록/파랑 나타나면서 충돌을 해결할 기회가 주어진다. 

이 때도 마찬가지로 충돌 해결한 뒤 

git add .  여기까진 똑같고

git rebase --continue  한번에 해결안될 수 있기 때문에 해결한 부분은 커밋을 하고 다음 충돌을 해결한 뒤에 

git add . 

git rebase --continue 를 반복하면 성공이라는 답이 나온다. 

이후 똑같이 

git switch main 

git merge main 

해주면 된다.