Close

Git 포크 및 업스트림: 사용 방법 및 유용한 팁

Nicola Paolucci 얼굴 사진
Nicola Paolucci

개발자 애드보케이트


프로젝트를 포크하여 직접 변경하면 기여한 내용을 쉽게 통합할 수 있습니다. 하지만 변경 사항을 업스트림으로 다시 보내지 않으면(즉 상위 리포지토리로 다시 보내는 것) 변경 사항을 추적하지 못할 위험이 있으며 리포지토리에 다양한 라인이 발생하는 결과로 이어질 수 있습니다. 기여자가 모두 같은 곳에서 작업 내용을 얻도록 하려면 git 포킹이 git 업스트림과 상호 작용하는 방식에 대한 몇 가지 원칙을 알아야 합니다. 이 블로그에서는 기본적인 내용과 주의 사항을 비롯해 학습 곡선에서 앞서나갈 수 있는 유용한 팁을 살펴보겠습니다.

Git 업스트림: 최신 상태 유지 및 기여


upstream 리포지토리와 상호 작용하는 일반적인 설정과 가장 기본적인 워크플로부터 자세히 설명해 드리겠습니다.

표준 설정에는 보통 origin, upstream, remote이 있습니다. 후자는 기여하려는 프로젝트의 게이트키퍼 또는 정보 출처입니다.

먼저 upstream 리포지토리에 대해 원격을 이미 설정했는지, 그리고 origin도 설정했는지 확인합니다.

git remote -v

origin  git@bitbucket.org:my-user/some-project.git (fetch)
origin  git@bitbucket.org:my-user/some-project.git (push)

upstream이 없는 경우 remote 명령으로 쉽게 추가할 수 있습니다.

git remote add upstream git@bitbucket.org:some-gatekeeper-maintainer/some-project.git
데이터베이스
관련 자료

전체 Git 리포지토리를 이동하는 방법

Bitbucket 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

원격이 제대로 추가되었는지 확인합니다.

git remote -v

origin    git@bitbucket.org:my-user/some-project.git (fetch)
origin    git@bitbucket.org:my-user/some-project.git (push)
upstream  git@bitbucket.org:some-gatekeeper-maintainer/some-project.git (fetch)
upstream  git@bitbucket.org:some-gatekeeper-maintainer/some-project.git (push)

이제 fetch를 사용하여 upstream 리포지토리의 최근 변경 사항을 수집할 수 있습니다. 업데이트를 받고 싶을 때마다 이 과정을 반복합니다.

(프로젝트에 메인에 병합되지 않은 태그가 있는 경우 git fetch upstream --tags도 수행해야 함)

git fetch upstream

보통 로컬 main 브랜치를 upstream main과 비슷하게 반영되도록 하고 어떤 작업이든 나중에 풀리퀘스트가 될 수도 있기 때문에 기능 브랜치에서 실행하는 것이 좋습니다.

이때 merge 또는 rebase를 사용해도 보통 결과가 같으므로 상관없습니다. 이 경우 merge를 사용해 보겠습니다.

git checkout main
git merge upstream/main

upstream 관리자와 작업을 공유하고 싶은 경우 main을 브랜치하고 기능 브랜치를 만드세요. 만족스러우면 원격 리포지토리로 푸시합니다.

또한 rebase를 사용한 다음 merge하여 upstream에 평가할 깔끔한 커밋 집합(이상적으로는 하나)이 있는지 확인할 수도 있습니다.

git checkout -b feature-x

#some work and some commits happen
#some time passes

git fetch upstream
git rebase upstream/main

git 포크로 게시


위의 단계를 완료한 후 간단한 push로 원격 포크에 작업을 게시합니다.

git push origin feature-x
git push -f origin feature-x

개인적으로 저는 기록을 최대한 깔끔하게 유지하는 것을 선호하여 3번 옵션을 선택하지만 팀마다 워크플로는 다를 것입니다. 참고: 자체 포크로 작업할 때만 이렇게 해야 합니다. 공유 리포지토리와 브랜치의 기록을 다시 쓰면 절대 안 됩니다.

오늘의 팁: 프롬프트에 표시되는 앞/뒤의 개수


fetchgit status는 동기화된 remote 브랜치보다 몇 개의 커밋을 앞서거나 뒤처지는지 보여줍니다. 신뢰할 수 있는 명령 프롬프트에서 이러한 정보를 볼 수 있다면 좋지 않을까요? 저도 그렇게 생각해서 bash를 활용하기 시작했습니다.

구성을 완료하면 프롬프트에 다음과 같이 표시됩니다.

nick-macbook-air:~/dev/projects/stash[1|94]$

그리고 다음을 .bashrc 또는 이에 상응하는 단일 함수에 추가해야 합니다.

function ahead_behind {
    curr_branch=$(git rev-parse --abbrev-ref HEAD);
    curr_remote=$(git config branch.$curr_branch.remote);
    curr_merge_branch=$(git config branch.$curr_branch.merge | cut -d / -f 3);
    git rev-list --left-right --count $curr_branch...$curr_remote/$curr_merge_branch | tr -s '\t' '|';
}
export PS1="\h:\w[\$(ahead_behind)]$"

내부 작업

세부 사항과 설명을 좋아하는 분이라면 작동 방식은 다음과 같습니다.

현재 HEAD의 상징적 이름, 즉 현재 브랜치를 가져옵니다.

curr_branch=$(git rev-parse --abbrev-ref HEAD);

현재 브랜치가 가리키는 원격을 가져옵니다.

curr_remote=$(git config branch.$curr_branch.remote);

이 원격을 병합할 브랜치를 가져옵니다(마지막 슬래시[/]를 포함하여 모든 것을 버리는 Unix 속임수 사용).

curr_merge_branch=$(git config branch.$curr_branch.merge | cut -d / -f 3);

앞서거나 뒤처진 커밋 수를 수집하는 데 필요한 것을 얻었습니다.

git rev-list --left-right --count $curr_branch...$curr_remote/$curr_merge_branch | tr -s '\t' '|';

오래된 Unix tr을 사용하여 TAB을 구분 기호 |로 변환합니다.

git 업스트림 시작하기


git upstream에 대한 기본적인 설명과 함께 git 업스트림 설정, 새 브랜치 만들기, 변경 사항 수집, git 포크를 통한 게시 방법을 비롯해 원격 브랜치보다 몇 개의 커밋을 앞서거나 뒤처지는지 확인하는 유용한 팁을 알아보겠습니다.

Bitbucket Server에는 포크 동기화가 포함되어 있으므로 개발자가 포크를 최신 상태로 유지해야 하는 부담을 덜어줍니다. 또한 Bitbucket Cloud에는 하나의 단계로 이루어진 간편한 동기화 기능도 있으니 확인해 보세요!

DVCS에 대해 더 자세히 알아보려면 제 계정인 @durdn@Bitbucket 팀을 팔로우하세요.

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up