Git 협업

2024. 7. 11. 16:13
반응형

Branch

협업 환경에서는 여러 개발자가 동일한 소스 코드를 공유하고 작업하는 것이 일반적이다. 일부 개발자는 버그를 수정하고 다른 개발자는 새로운 기능을 구현한다. 많은 일이 진행됨에 따라 동일한 코드 베이스의 여러 버전을 관리하기 위한 시스템이 필요하다.

 

브랜치를 통해 개발자는 원래 코드 기반에서 브랜치를 하고 작업을 다른사람과 분리할 수 있다. 또한 Git이 나중에 버전을 쉽게 병합하는데 도움이 된다.

 

Git 브랜치란?

Git 브랜치는 본질적으로 독립적인 개발 라인이다. 새 기능이나 버그 수정 작업을 할 때 브랜치를 사용하여 다른 팀 구성원의 작업과 분리할 수 있다.

 

별도의 브랜치를 하나의 브랜치로 병합할 수 있다. 아래 다이어 그램은 브랜치를 사용하여 개발이 병렬로 수행되는 방법을 보여준다.

기본 또는 기타 브랜치의 변경 사항은 해당 브랜치에서 최신 변경 사항을 가져오지 않는 한 해당 브랜치에 영향을 미치지 않는다.

 

각 작업(예시: 버그수정, 새로운 기능 등)에 대해 새 브랜치를 만드는 것이 일반적이다. 이 방법을 사용하면 다른 사람들이 예상되는 변경 사항을 쉽게 식별하고 역추적을 간소화 할 수 있다.

 

 

Branch 만들기

새 Branch를 생성해도 저장소는 변경되지 않는데. 단순히 커밋을 가리킬 뿐이다.

예를 들어, git branch 명령을 사용하여 issue1 이라는 Branch를 생성하면, 저장소는 동일하게 유지되지만 현재 커밋에 대한 새 포인터를 추가할 뿐인 것이다. 아래 그림은 이 Branch를 만들 때 발생하는 상황을 보여준다.

원격 브랜치 Pull

Git pull 명령을 사용하여 원격 저장소의 최신 변경 사항을 로컬 저장소에 적용할 수 있다. Pull한다고 말한다.(가져오는 것)

 

예를 들어 원격 브랜치가 로컬 브랜치의 업스트림이라고 가정하면, 원격 브랜치에는 아래와 같이 로컬 브랜치의 모든 변경 사항이 포함된다.

 

이 경우 원격 브랜치(origin/main)에서 로컬 브랜치(main)로 병합한다면 fast-forward 병합이 된다. 

 

하지만 로컬 메인 브랜치의 변경 사항이 원격 (origin/main)에 없는 경우 pull 명령은 병합을 실행하고 이러한 변경 사항을 함께 묶는 병합 커밋을 생성한다.

 

Pull을 실행할 때 로컬 저장소에 병합 커밋이 자동으로 생성되고, 충돌이 있는 경우 충돌을 해결하고 수동으로 커밋해야한다.

 

충돌이 없는 경우엔 커밋이 자동으로 병합된다.

 

 

원격 브랜치 가져오기

원격 브랜치의 변경 사항은 충돌이 없는한 Pull할 때 현재 로컬 브랜치에 자동으로 병합된다. 하지만 원격 변경 사항을 얻고 싶지만 현재 로컬 브랜치에 병합하지 않으려면 git fetch 명령을 실행하면 된다.

 

fetch는 로컬 브랜치에 아직 존재하지 않는 변경 사항을 원격에서 다운로드한다. FETCH_HEAD는 원격 저장소에서 가져온 변경사항을 추적한다.

 

원격 및 로컬 브랜치에서 서로 다른 하위 항목이 포함된 경우 개정 기록은 다음과 같다.

원격 및 로컬 브랜치에 다른 메인이 있는 경우 개정 기록

 

변경 사항을 가져오면 FETCH_HEAD에서 병합하거나 Pull을 실행하여 해당 변경 사항을 로컬 저장소에 적용할 수 있다.

 

 

병합 후 변경 사항은 로컬 저장소에 적용된다.

 

FETCH_HEAD가 병합되면 개정 기록은 git pull을 한 것과 동일한 결과를 생성한다. Pull은 가져오기 및 병합 작업을 동시에 실행하는 것이다.

 

 

브랜치를 원격으로 푸시

로컬 브랜치를 원격 저장소로 푸시할 때까지 모든 커밋을 사용할 수 있다. 즉, 다른 구성원에게 영향을 주지 않고 원하는 속도로 로컬 브랜치에서 작업할 수 있다는 뜻이다.

 

로컬 브랜치를 원격으로 Push하면 Git은 대상 저장소에 빨리 병합한다.

 

그러나 Push로 인해 non-fast-forward 병합이 발생하면 Git은 이전 커밋을 덮어쓰는 것을 방지하기 위해 Push를 거부한다. 이 경우 최신 원격 변경 사항을 Pull하고 다시 Push해야한다. 

 

주의할 점으로는 원격 저장소에 이미 커밋된 커밋을 덮어쓰거나 변경해서는 안된다. 그렇게 하면 다른 팀원의 로컬 저장소가 원격 저장소와 갈라지게 된다.

 


PR 부터 Merge까지

1. Fork

  • 프로젝트 레퍼지토리에서 Fork버튼을 눌러 자신의 레퍼지토리로 가져온다.

 

2. Clone 및 Remote

  • 자신의 레퍼지토리에 Fork된 레퍼지토리에서 URL을 복사한다.

 

  • 그리고 터미널을 키고 사용할 폴더를 만들고 로컬 저장소에서 clone한다.

 

3. Branch 생성

  • 자신의 로컬 컴퓨터에서 코드를 추가하는 작업은 branch를 만들어 진행한다.
더보기

원격 저장소에 있는 코드를 로컬 저장소로 가져옴으로써, 원격 저장소(Git)의 코드는 건드리지 않는다.

로컬에서 코드를 작성한 뒤 원격 저장소의 코드와 merge하면 된다.

// test라는 이름의 branch를 만들고, checkout까지 동시에 한다.

$ git checkout - b test

// test라는 이름의 브랜치를 생성만 하고 싶을 경우

$ git checkout test

// 브랜치 목록 조회

$ git branch

 

  • 실행 결과
    • 브랜치 이름이 main 에서 test 로 바뀐 것을 볼 수 있다.

 

 

4. 수정 후 add - commit - push

  • 각자 코드를 수정하고 작업이 완료되면 add - commit - push 를 통해 자신의 Github repository에 반영한다.
    • 이때, push과정에서 branch명을 반드시 아래와 같이 명시해주어야 한다.
// branch 이름이 main/master 가 아닌 test(자신이 만든 작업용 브랜치)로 할 것!

$ git push origin test

 

 

5. Pull Request (PR)

  • 4번까지 작업이 끝났다면, 자신의 Github 레퍼지토리로 들어간다
  • 아래 사진과 같이 Compare & pull request 버튼이 활성화되어 있다.
  • 해당 버튼을 선택하여 메시지를 작성하고 PR을 보낸다

 

6. 코드 리뷰 및 Merge PR

  • 원본 저장소 관리자는 PR을 받으면 변경내용을 확인하고 Merge 여부를 결정한다

 

7. Merge 이후 동기화 및 branch 삭제

  • 원본 저장소에 Merge가 완료되면 로컬 main 브랜치와 원본 저장소의 코드를 동기화 해야한다.
    • 현재 변경내용은 test 브랜치에서 작성하여 적용되었으니, main 브랜치도 내용을 동기화 해야한다
    • 자신의 Git repository에 들어가 브랜치가 main임을 확인하고, Sync fork를 눌러 Update branch 버튼을 누른다.

 

  • 이후, 로컬에 있는 main 브랜치와도 동기화를 시키기 위해 아래 명령어를 실행한다
  • 작업용으로 만들었던 로컬 branch를 삭제한다.
// 코드 동기화
$ git checkout main
$ git pull origin main

// 로컬 브랜치 강제 삭제
$ git branch -D test

// 원격 브랜치 삭제
$ git push origin --delete test

 

출처 : https://nulab.com/ko/learn/software-development/git-tutorial/git-collaboration/remote-branches/pushing-branches-to-remote/

출처 : https://velog.io/@dongvelop/Github-협업하기-PR부터-merge까지

반응형

'Git' 카테고리의 다른 글

Git 이란?  (0) 2024.07.11
Git 기초  (0) 2024.07.11

BELATED ARTICLES

more