본문 바로가기

스터디/Victor

[ Git ] 깃 브랜치 전략 세우기 ( + git 명령어 )

 

 

 

 

깃 브랜치를 운영하는 방법론

- gitflow : master, develop, feature, release, hotfix 브랜치를 설정하고 운영하는 방식 ( 규모가 크면 )

- github flow : main(master), feature 브랜치만으로 운영하는 방식 ( 소규모 )

 

  1. Master 브랜치:
    • 제품 배포가 완료된 안정된 코드가 위치하는 브랜치입니다.
    • 이 브랜치의 각 커밋은 하나의 배포 가능한 버전을 의미합니다.
  2. Develop 브랜치:
    • 개발 중인 코드가 모이는 브랜치입니다.
    • 새로운 기능 개발이 완료되면 이 브랜치로 병합됩니다.
    • 다음 배포 버전을 준비하는 브랜치입니다.
  3. Feature 브랜치:
    • 새로운 기능이나 개선사항을 개발하는 브랜치입니다.
    • Develop 브랜치에서 분기되며, 개발이 완료되면 Develop 브랜치로 병합됩니다.
    • 브랜치 이름은 보통 feature/기능-이름 형식을 사용합니다.
  4. Release 브랜치:
    • 배포 준비를 위한 브랜치입니다.
    • Develop 브랜치에서 분기되며, 최종 배포 전의 버그 수정과 QA가 이뤄집니다.
    • 배포가 완료되면 Master 브랜치와 Develop 브랜치로 병합됩니다.
    • 브랜치 이름은 보통 release/버전-번호 형식을 사용합니다.
  5. Hotfix 브랜치:
    • 배포된 제품에서 발생한 긴급한 버그를 수정하는 브랜치입니다.
    • Master 브랜치에서 분기되며, 수정이 완료되면 Master 브랜치와 Develop 브랜치로 병합됩니다.
    • 브랜치 이름은 보통 hotfix/버전-번호 형식을 사용합니다.

Feature 생성 Tip)

1 ) issue 생성하기

 

2) 브랜치 생성하기

git branch feature/도메인 설계하기 #1
git checkout feature/도메인 설계하기 #1

 

-> 기능과 issue 관리하기가 쉽다.😃

 

Commit 생성 Tip)

- GitHub의 자동 링크 (Auto-Link) 브랜치, 커밋, 이슈 등을 서로 연결하여 추적성과 연관성을 쉽게 파악할 수 있도록 돕는 기능입니다. 이는 프로젝트 관리와 협업을 효율적으로 만드는 중요한 기능 중 하나입니다. 자동 링크는 주로 이슈 번호, 풀 리퀘스트(PR) 번호, 커밋 해시 등을 사용하여 자동으로 관련 항목에 링크를 생성합니다.

 

1 ) Commit 하기

git commit -m "[docs] 도메인 설계 하기 #1"

 

 

다음은 일반적으로 사용되는 커밋 메시지 태그입니다:

  • feat: 새로운 기능 추가
  • fix: 버그 수정
  • docs: 문서 수정
  • style: 코드 포맷팅, 세미콜론 누락 등 코드 변경이 없는 경우
  • refactor: 코드 리팩토링 (기능 변화 없음)
  • test: 테스트 추가 또는 수정
  • chore: 빌드 작업이나 패키지 관리자 설정 등 수정

Commit 메세지 Tip)

- 무엇과 어떻게는 중요하기는 하지만 add 하게 되면 무엇을, 변경사항은 어떻게 알 수 있다. 친절한 문서는 좋으나 장황하지는 말자!

- 가장 중요한 문서는 왜를 적는 거다. 

 

깃 브랜치 전략을 세우는 이유와 요령

- 하나의 프로젝트 소스코드를 여러 개발자가 다루면서 발생하는 각종 부작용을 해결하자

- 개발 협업을 원활하게 하기 위한 약속

- 전략을 세울 때 고려할 수 있는 요소들

1) 이 브랜치는 제품으로 내보낼 수 있는가?

2) 이 브랜치는 빌드 실패를 허용하는가?

3) 이 브랜치는 테스트 실패를 허용하는가?

4) 이 브랜치는 임시로 운영하는가? 유지하지 않고 수시로 삭제하는가?

 

Git 명령어

1 ) git add 

- git add 명령은 변경된 파일을 스테이징 영역에 추가합니다. 이는 커밋할 변경 사항을 준비하는 단계입니다.

git add <file>       # 특정 파일 추가
git add .            # 현재 디렉토리의 모든 변경 사항 추가
git add *            # 현재 디렉토리의 모든 파일 추가

 

2) git commit -m 

- git commit -m 명령은 스테이징된 변경 사항을 로컬 저장소에 커밋합니다. -m 옵션을 사용하여 커밋 메시지를 지정할 수 있습니다.

git commit -m "커밋 메시지"    # 스테이징된 변경 사항을 커밋하고 메시지 추가

 

3) git push origin main

- git push 명령은 로컬 저장소의 커밋을 원격 저장소로 푸시합니다. origin은 원격 저장소의 이름이며, main은 브랜치의 이름입니다.

git push origin main         # 로컬 main 브랜치의 커밋을 원격 main 브랜치로 푸시

 

4) git status

- git status 명령은 현재 작업 디렉토리의 상태를 확인합니다. 변경된 파일, 스테이징된 파일, 트랙되지 않은 파일 등을 보여줍니다.

git status                   # 현재 작업 디렉토리의 상태를 확인

 

5) git log

- git log 명령은 커밋 히스토리를 보여줍니다.

git log                      # 커밋 히스토리 출력

 

6) git branch

- git branch 명령은 로컬 브랜치 목록을 보여줍니다. -r 옵션을 사용하면 원격 브랜치 목록을 볼 수 있습니다.

git branch                   # 로컬 브랜치 목록 출력
git branch -r                # 원격 브랜치 목록 출력

 

7) git checkout

- git checkout 명령은 브랜치를 전환하거나 특정 커밋으로 작업 디렉토리를 업데이트합니다.

git checkout <branch>        # 특정 브랜치로 전환
git checkout -b <new-branch> # 새로운 브랜치를 생성하고 전환

 

8) git fetch

- git fetch 명령은 원격 저장소의 최신 변경 사항을 가져오지만, 로컬 브랜치에 병합하지는 않습니다.

git fetch                    # 원격 저장소의 최신 변경 사항을 가져옴

 

9) git pull

- git pull 명령은 원격 저장소의 변경 사항을 가져와서 현재 브랜치에 병합합니다. git fetch와 git merge를 결합한 명령입니다.

git pull origin main         # 원격 main 브랜치의 변경 사항을 가져와 현재 브랜치에 병합
 

10) git reset

- git reset 명령은 커밋을 되돌리거나 스테이징 영역의 변경 사항을 취소합니다.

git reset HEAD~1             # 가장 최근의 커밋을 취소 (로컬 저장소와 스테이징 영역에서)
git reset --soft HEAD~1      # 가장 최근의 커밋을 취소하지만, 변경 사항을 스테이징 상태로 유지
git reset --hard HEAD~1      # 가장 최근의 커밋을 취소하고, 모든 변경 사항을 삭제

 

11) git revert

- git revert 명령은 지정된 커밋을 되돌리는 새로운 커밋을 만듭니다. 이는 안전한 되돌리기 방법으로, 커밋 히스토리를 유지합니다.

git revert <commit-hash>     # 지정된 커밋을 되돌리는 새로운 커밋 생성

 

 

 

중요) 로컬과 원격 저장소

- 개발 입문자들이 이 부분에 대해서 많이 몰라 도르마무처럼 결국 다시 만들게 되는거 같다. 꼭 읽어봐요!!!

 

Git은 로컬 저장소와 원격 저장소가 따로 존재합니다. 각 저장소는 독립적으로 관리되며, 로컬 저장소에서 작업한 내용이 원격 저장소에 자동으로 반영되지 않습니다. 따라서 로컬과 원격 저장소를 동기화할 때 주의해야 할 몇 가지 중요한 사항이 있습니다.

로컬 저장소와 원격 저장소의 차이

  1. 로컬 저장소:
    • 개발자가 자신의 컴퓨터에서 작업하는 저장소입니다.
    • 로컬 저장소에는 전체 프로젝트 히스토리와 현재 작업 디렉토리가 포함됩니다.
    • 커밋, 브랜치 생성, 체크아웃 등의 작업을 로컬에서 수행합니다.
  2. 원격 저장소:
    • 프로젝트 팀이 공유하는 중앙 저장소입니다.
    • GitHub, GitLab, Bitbucket 등과 같은 서비스에서 호스팅됩니다.
    • 팀원 간에 변경 사항을 공유하고 협업하기 위해 사용됩니다.

로컬과 원격 저장소 동기화

로컬과 원격 저장소를 동기화하는 주요 명령어는 다음과 같습니다:

1. git fetch

  • 원격 저장소에서 최신 변경 사항을 가져오지만, 로컬 브랜치에는 병합하지 않습니다.
  • 원격 브랜치의 최신 상태를 로컬 저장소에 업데이트합니다.
git fetch

 

2. git pull

  • 원격 저장소에서 최신 변경 사항을 가져오고, 현재 체크아웃된 브랜치에 병합합니다.
  • git fetch와 git merge를 결합한 명령입니다.
git pull origin <branch-name>

3. git push

  • 로컬 저장소의 변경 사항을 원격 저장소로 푸시합니다.
  • 원격 저장소에 없는 새로운 커밋이나 브랜치를 원격 저장소에 반영합니다.
git push origin <branch-name>

 

 

  • 동기화하기 전에 변경 사항 커밋:
    • 로컬에서 작업한 변경 사항은 반드시 커밋해야 합니다. 그렇지 않으면, git pull 명령을 사용할 때 충돌이 발생할 수 있습니다.
    • 커밋되지 않은 변경 사항이 있을 경우, git stash를 사용하여 임시로 저장할 수 있습니다.
  • 충돌 해결:
    • 원격 저장소와 로컬 저장소에서 동일한 파일을 수정했을 때 충돌이 발생할 수 있습니다. 충돌이 발생하면 수동으로 해결하고 커밋해야 합니다.
    • 충돌 해결 후, 변경 사항을 다시 원격 저장소로 푸시해야 합니다.
  • 브랜치 관리:
    • 원격 저장소와 로컬 저장소에서 브랜치를 관리할 때, 일관된 네이밍 규칙과 브랜치 전략을 사용하는 것이 좋습니다.
    • 불필요한 브랜치는 정리하여 관리의 복잡성을 줄입니다.
  • 업스트림 브랜치 설정:
    • 새로운 브랜치를 원격 저장소에 처음 푸시할 때는 -u 옵션을 사용하여 추적 정보를 설정합니다. 이후에는 git push 명령만으로도 푸시할 수 있습니다.
git push -u origin <new-branch-name>