데브코스

[2주차 - DAY1] Git 고급

미안하다 강림이 좀 늦었다 2024. 3. 4. 14:57

 

 

branch 이름 규칙

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

 

 

branch 삭제

git branch -d 브랜치이름

 

 

branch에 커밋 반영하기

아래와 같이 두 개의 브랜치를 생성했다.

feature/login, feature/select-product 브랜치 생성

feature/login 브랜치로 이동한 후 test2.txt 파일을 아래와 같이 수정한다.

line2가 추가되었다.

이 상태에서 feature/select-product 브랜치로 이동하면 커밋을 하지 않았기 때문에 수정된 파일이 똑같이 보인다. feature/login 브랜치에서 커밋을 해주고, feature/select-product 브랜치로 이동하면 아래와 같이 line2가 없는 것을 확인할 수 있다.

 

 

원격 branch 실습

현재 git에는 아래와 같이 세 개의 브랜치가 있다.

아래는 원격 저장소에 있는 브랜치 목록이다. 원격저장소별칭/브랜치이름 형태다.

git에 만들어둔 브랜치를 원격 저장소로 복제해야 한다. 아래 명령어를 입력하면 깃허브에 브랜치가 복제된 것을 확인할 수 있다.

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

git push origin feature/login

 

 

Git branch 전략

fast forward

  1. main branch에서 feature/login branch 생성
  2. main branch에서는 추가 구현X, feature/login branch에서만 추가 구현
  3. main branch에 feature/login branch를 붙임, feature/login branch 삭제

 

3-way

  1. main branch에서 feature/login branch 생성
  2. main branch, feature/login branch에서 추가 구현
  3. 서로 비교하여 바뀐 것을 정리하여 병합

 

fast forward + 3-way

 

Merge

  1. main branch 보호
  2. 추가 브랜치를 메인 브랜치로 병합(Pull Request, PR이라고 함)
  3. 깃허브가 자동으로 충돌 확인 (PR 메시지 신경 써서 작성할 것)
  4. merge (merge도 commit이다.)
  5. branch 삭제

feature/login 브랜치를 main 브랜치에 병합시켜 보자.

Compare & pull request 클릭
밑줄 부분 꼭 확인할 것, Create pull request 클릭

클릭 후 레포지토리로 돌아가면 아래와 같이 메인 브랜치가 보호되고 있지 않다는 메시지가 뜬다.

Protect this branch 클릭
필요한 것 설정하고 아래로 내려서 Create 클릭하고 비밀번호 입력
밑줄 클릭
Merge pull request 클릭, Confirm merge 클릭
Delete branch 클릭
문제 생기면 다 복구할 수 있으니 걱정하지 말자
feature/login branch 삭제됨

 

병합도 정상적으로 이루어짐

 

 

GitHub를 Git에 동기화

  1. 깃허브의 브랜치 목록을 깃에 동기화 (git fetch -p)
  2. 메인 브랜치로 이동 (git checkout main)
  3. 메인 브랜치 업데이트 (git pull origin main)
  4. 병합된 브랜치 삭제 (git branch -d 브랜치이름)

아래는 깃허브 브랜치 목록을 동기화하는 명령어이다.

git fetch -p

동기화 전 깃허브의 브랜치 목록
깃허브의 브랜치 목록 동기화
동기화 후 깃허브의 브랜치 목록

로컬에 있는 브랜치는 내가 직접 삭제해줘야 한다. feature/login 브랜치를 삭제해 보자.

병합되지 않았다는 에러가 발생한다. 커밋 로그를 보면 merge commit이 없다. 깃허브에서만 병합된 상태이기 때문이다.

깃의 메인 브랜치를 업데이트하고 커밋 로그를 보자. 꼭 메인 브랜치에 위치한 상태로 실행해야 한다.

업데이트
이제 병합 커밋 기록도 확인할 수 있다.

다시 브랜치를 삭제하면 문제가 발생하지 않는다.

feature/login 브랜치 삭제

 

 

충돌

충돌 상황 만들기

두 명 이상의 사용자가 동일한 파일을 수정하면 충돌이 발생한다. 컴퓨터1이 feature/1에서, 컴퓨터2가 feature/2에서 작업하려 하는 상황이다.

  1. 깃허브에서 feature/1 feature/2 브랜치 생성
  2. 깃허브의 브랜치 목록을 깃에 동기화 (git fetch -p)
  3. 컴퓨터1: 원격저장소의 feature/1 브랜치를 가져온다. (git checkout -t origin/feature/1)
  4. 컴퓨터2: 원격저장소의 feature/2 브랜치를 가져온다. (git checkout -t origin/feature/2)
  5. 두 컴퓨터 모두 해당하는 브랜치로 이동하 test.txt 파일을 켜고, 컴퓨터1은 내용을 feature1로, 컴퓨터2는 내용을 feature2로 수정한다.
  6. 두 컴퓨터 모두 add, commit, push 한다.
  7. feature1 브랜치를 main 브랜치로 병합한다.
  8. 컴퓨터1을 동기화한다.

충돌 해결하기

feature2 브랜치를 병합하려고 하면 자동으로 병합할 수 없다는 메시지가 보인다. 일단 PR 메시지를 쓰고 Create pull request 버튼을 누른다.

Create pull request 클릭
Resolve conflicts 클릭
살릴 내용만 남기고 나머지는지운 후 Mark as resolved 클릭하고 commit merge 클릭
정상적으로 병합을 수행할 수 있다.

컴퓨터2에서도 동기화 과정을 수행하고, 컴퓨터1에서 main 브랜치를 업데이트하면 (git pull origin main) 내용이 feature2로 바뀐 것을 확인할 수 있다.

컴퓨터1