2024년 8월 16일
✏️ 브랜치 이름 규칙
💡 커밋을 해야 그때부터 브랜치의 내용 적용됨
: commit을 해야 그때부터 브랜치가 만들어지는 것 잊지말 것!
*주의 : 아무리 작업을 A라는 브랜치에서 많이 한다 하더라도 B라는 브랜치에서 커밋하면 그 브랜치에 커밋해서 코드가 남으므로 좌측 하단의 브랜치위치를 잘 보고 커밋할것!!
- 메인 브랜치 : 사용자들이 사용하는 버전 ex) v1.2.0
- 상황에 따른 브랜치 이름 짓기
- 기능개발 : feature/login, feature/select-product
- 출시준비 : release-1.3, release-1.4
- 긴급수정 : hotfix-1.2.1
❗️ 브랜치 삭제 명령: git branch -d (브랜치명)
✏️ 브랜치 실습
- 깃허브 브랜치 목록 확인 : git branch -r
- 깃 브랜치 목록 확인 : git branch
- 깃허브 브랜치 생성&깃 브랜치 복제(깃에 만들어둔 브랜치를 원격브랜치로 복제 시키는 것) : git push (깃허브저장소별칭) (깃브랜치명)
ex) git push origin feature/origin
✏️ 브랜치 전략
: 깃 브랜치 전략 = 깃 플로우 -> 전략은 다양하게 짤 수 있음
💡 fast-forward
: A브랜치(메인브랜치)에서 B브랜치(서브브랜치)를 생성한 시점부터, A브랜치에는 아무것도 하지 않고 B브랜치에만 추가구현을 한 뒤 B와 A브랜치 합치면 A브랜치에 B브랜치가 그냥 합쳐지고 끝
💡 3 ways
: A브랜치(메인브랜치)에서 B브랜치(서브브랜치)를 생성한 시점부터 A브랜치에서도 작업을 하고, B브랜치에서도 작업을 해서 A와 B브랜치를 합치면 서로 비교해서 바뀐것을 정리해 합쳐짐
-
그렇다면 우리는 이 2가지 전략을 어떻게 주로 적용할까?
: 우리는 일반적으로 두개 다 씀
ex) main브랜치를 하나 만들어서 두고, 각 브랜치에서 개발하고 싶은 기능을 A브랜치, B브랜치를 만들어서 구현한다. 그리고 main브랜치와 A브랜치를 fastforward로 합치고, 다시 합친 브랜치와 B브랜치를 3ways로 합친다
그렇다면 같은 파일을 가지고 수정하면 어떻게 될까?
✏️ pull request & merge
: 병합과 충돌
💡pull request
- 깃에서 새롭게 생성한 로컬브랜치에서 코드를 작업한 후 git add, commit을 하고, push(git push origin feature/login)하면 compare&pull request 버튼이 생성 되는 것을 볼 수 있다
- base:main <-> compare:feature/login 메시지 참고
- main 브랜치를 보면 'Youre main branch isn't protected'라는 메시지를 볼 수 있다 (메시지가 없다면 settings -> Branches 접속)
- (Protect this branch 클릭)
- Branch protection rule 페이지 접속됨
- require a pull request before merging, require status checks to pass before merging, 등 원하는 것을 체크 -> password 입력
- 레포지토리의 메인페이지에서 contribute 클릭
- open pull request 클릭
- pull message에 들어갈 내용들 적기
- 내용들은 의도와 목적에 맞게 작성해야함!
ex) 주요구현내용(로그인, 계정정보:아이디/비밀번호, 아이디 알고리즘), 이슈(알고리즘 구현시~, ~에러가 있어서 ~알고리즘으로 대체)
- 마크다운 문법을 이용해서 정돈되게 적을 것
- 충돌시 메시지를 확인해서 해결해야하므로 자세히 적을 것
- create pull request 클릭
- this branch has no conflicts with base branch 확인
- merge pull request 클릭
- merge할 메시지 작성 (커밋내용)
- confirm merge 클릭 -> merge가 commit됨
- 브랜치를 merge했기 합치고 남아있는 브랜치 삭제 (delete)
*merge를 revert, 지운브랜치를 restore할 수도 있음!
💡 merge
: 브랜치를 생성한다는 것은 협업을 위한 것이고, 그렇기 때문에 우리는 주로 브랜치를 병합하는데, 이것을 '깃허브'에서 한다. 서브 브랜치를 만들어 메인 브랜치를 보호해주고, 추가 브랜치에서 작업한 것들을 나중에 메인 브랜치로 병합시켜 달라고 요구 한다.(=pull request) 그리고 충돌이 일어났는지 깃허브가 확인하고, 충돌이 없으면 merge된다.
✏️ merge된 깃허브 -> 깃에 동기화하기
: git push를 이용해 로컬에 있는 코드를 원격 브랜치에 pull request & merge 시키고 남은 브랜치를 삭제하면 깃허브에는 그 남은 브랜치는 없는 상태가 된다. 이 상태를 terminal에서 확인하면
- git branch -r : 삭제한 서브브랜치가 아직 남아 있는 것이 확인된다.
- 삭제 했는데 왜 남아있지? 그럼 pull해서 이 상태를 업데이트 해봐야겠다.
- git pull origin feature/login (지금 내가 가져올 브랜치명 입력해야함)
- 결과는 이 서브 브랜치는 없다고 나온다.
why?
: 말 그대로 이 서브브랜치는 삭제 되었고, 이 삭제된 커밋을 로컬로 가져와야 깃허브 브랜치 목록에서도 삭제된다.
어떻게 가져올까?
구글링 하면 pull을 하라고 많이 검색되어진다고 한다. 하지만 서브브랜치가 이미 삭제 되었기 때문에 pull 할 수 없어서 동기화해야한다.
💡 깃허브 브랜치 목록 동기화
: git fetch -p = 깃허브 브랜치 목록 동기화 명령
*(p: prune=잘라내다, 없애다 라는 뜻. remote에 존재하지 않는 브랜치들을 local에 반영해 가지치기 하듯 삭제를 진행함)
- 동기화 명령 후, 깃허브브랜치 목록을 다시 살펴보면
- git branch -r : 서브브랜치가 없어진 것이 확인된다.
깃허브 브랜치 목록도 업데이트 했고,
❗️ 이제 깃에서도 서브브랜치를 삭제하려면?
- git branch : 깃 브랜치 목록 확인
- 서브브랜치가 있는 것을 확인했으니까 삭제해야겠다
- 브랜치를 삭제하려면 삭제 브랜치에서 일단 나와야한다 : git checkout main
- main브랜치에서 삭제하고 싶은 브랜치 삭제 : git branch -d feature/login
- error : fully merged 안됐다는 에러 발생
- 왜냐하면 merge commit을 받아오지 않았기 때문임!!!
- 그래서 main브랜치도 동기화 시켜줘야 한다: git pull origin main
- git log : merge commit이 있는것 확인
- origin에 merge된 내용들이 main에도 동기화됨
- 이제 feature/login 브랜치 삭제 가능 : git branch -d feature/login
- 서브브랜치 삭제됨
🔍 요로코럼 로컬브랜치 main에서 가지치기를 해서 뻗어나온 feature/login브랜치를 원격 브랜치 origin에 push해서 다시 가지치기 하고 merge까지 했다. 그리고 merge한 내용까지 다시 로컬브랜치에 전해주고 가지치기 한 feature/login 서브브랜치는 생성 후 삭제까지 완료!
👋 정리
: mere된 깃허브와 merge 하기전 깃 동기화
=> git fetch -p -> 깃 브랜치 삭제 => git checkout main -> git pull origin main -> git branch -d feautre/login
✏️ 깃허브의 브랜치 받아오기
: git checkout -t 받아올브랜치명
*(t: tracking = 트랙킹하겠다는 뜻. 로컬에서 원격 브랜치를 tracking함으로써 원격 브랜치를 로컬로 가져옴)
ex) git branch -t orign/feature/1
그리고나서 git branch : 받아온 브랜치 확인
✏️ 깃 충돌
: 예를 들면, feature/1 브랜치와 feature/2 브랜치를 깃허브에서 생성 후, A프로젝트와 B프로젝트에서 각각 원격 브랜치를 동기화 시키고, 각각의 브랜치 내용을 가져온다.
(각각의 프로젝트에서
-
git fetch -p
-
A프로젝트: git checkout -t feature/1
-
B프로젝트: git checkout -t feature/2
이렇게 각각의 프로젝트에서 원격브랜치 목록과 원하는 브랜치의 내용을 가져온다.
그리고나서,
- A프로젝트에서 파일을수정 -> git add, git commit
- 깃허브에 업로드 : git push origin feature/1
- pull request & merge
그리고 다시 B프로젝트에서도 같은 작업
- B프로젝트에서 같은 파일 수정 -> git add, git commit
- 깃허브에 업로드 : git push origin feature/2
- 하지만, feature/2에서도 같은 파일을 작업하고 git push 및 pr하면 같은 파일을 수정했기때문에 코드가 충돌해서 merge할 수 없다는 메시지가 나온다.
이럴때는
- reslove conflict를 눌러서 원하는 코드만 남기고 다 지우고 commiting merge를 해주고 다시 merge함
- B프로젝트로 돌아와서 깃허브 레퍼지토리 동기화 : git fetch -p
- 깃허브에 conflict를 해결한 merge commit 작업을 가져오기 위해서 일단,
- 메인으로이동 : git checkout main
- 작업 가져오기 : git pull origin main
- 그리고 남아 있는 로컬 브랜치도 삭제 : git branch -d feature/2
그리고 다시 A프로젝트도 conflict를 해결한 commit까지 업데이트 해줘야 하기때문에
- A프로젝트로 돌아와서: git pull origin main 하면
모두 업데이트 완료!!
🍎🍏 오늘의 공부 실습
-
브랜치 생성하기

-
pull request & message 작성해보기

-
실습한 커밋 히스토리

-
push & merge & pull 왔다갔다하면서 협업하는 것처럼 다른 프로젝트 만들어서 연습 커밋 히스토리 (충돌과정 해결)

링크: https://github.com/HongbiKo/hongbiRepo/commits/main/