Git 포크 및 업스트림: 사용 방법 및 유용한 팁
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 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번 옵션을 선택하지만 팀마다 워크플로는 다를 것입니다. 참고: 자체 포크로 작업할 때만 이렇게 해야 합니다. 공유 리포지토리와 브랜치의 기록을 다시 쓰면 절대 안 됩니다.
오늘의 팁: 프롬프트에 표시되는 앞/뒤의 개수
fetch
후 git 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 Data Center에는 포크 동기화가 포함되어 있으므로 개발자가 포크를 최신 상태로 유지해야 하는 부담을 덜어줍니다. 또한 Bitbucket Cloud에는 하나의 단계로 이루어진 간편한 동기화 기능도 있으니 확인해 보세요!
이 문서 공유
다음 토픽
여러분께 도움을 드릴 자료를 추천합니다.
이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.