[Git] Branch에 관한 내용
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 를 해주라고 깃허브에서 먼저 뜨게 된다. -> 병합 제안
*이때 어느 브랜치에 머지 해줄지 잘 확인해야 한다
이를 눌러주면 코멘트를 적을 수 있는데 여기에 작업 내용을 공유하고 팀원들이 볼 수 있게 해준다. -> create pull request
그 다음 팀 규칙에 따라 다른 사람이 merge를 진행해도 되고 내가 merge를 해줘도 된다.
이렇게 하면 병합이 완료되었다!
보통 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
해주면 된다.