Close

Git Fetch 풀리퀘스트: 숙련도 높이기

Nicola Paolucci 얼굴 사진
Nicola Paolucci

개발자 애드보케이트


오늘날 프로젝트에 수정 사항을 적용하는 것은 사용자가 수정하려는 프로젝트의 전체 원격 복사본을 불러오는 포크를 만드는 것만큼이나 쉽습니다. 변경하려는 파일을 선택하고 편집을 누르고 수정을 커밋하면 됩니다.

대신 풀리퀘스트(이하 PR로 약칭)를 받는 쪽이라면 어떨까요? 세련된 웹 UI를 사용하는 것은 훌륭하며 그것만 있으면 되는 경우가 많습니다. 버튼을 클릭하여 승인하고 병합하면 완료됩니다.

하지만 항상 그런 것은 아닙니다! PR(풀리퀘스트)에 포함된 변경 사항을 로컬로 다운로드하고, 몇 가지 테스트를 실행하고, IDE에서 변경 사항이 어떻게 표시되는지 확인해야 하는 경우가 많습니다.

동료 또는 기여자의 풀리퀘스트를 다운로드(더 명확하게는 fetchcheckout)하는 단계는 개념적으로는 간단하지만 몇 가지 중요한 세부 정보와 팁을 알면 훨씬 더 쉬워집니다.

명령줄에서 풀리퀘스트를 쉽게 처리할 수 있도록 git이 제공하는 명령줄 기능을 더 잘 이해할 수 있는 방법을 설명해 드리겠습니다.

시작 전: 브랜치 이름 및 상태로 셸 프롬프트 보강


자신이 사용하는 git 브랜치를 표시하지 않거나 작업 디렉터리에 수정한 파일 또는 커밋하지 않은 파일이 있는지 표시하지 않는 베어 명령 프롬프트를 가진 사용자들이 많아서 항상 놀라곤 합니다. '그게 바로 저예요!'라고 생각하셨다면 제가 도움을 드리는 동시에 감동을 전할 수 있도록 기회를 주세요!

git 작업 디렉터리 상태에 대한 훌륭한 주석을 제공하는 liquid prompt를 설치하세요(다른 VCS도 지원합니다).

(위의 스크린샷에는 제가 브랜치 newbranch에 있으며 작업 디렉터리에서 추적하는 파일에 5줄을 추가했고 0개의 줄을 제거했음을 알리는 메시지가 표시됩니다)

Git 로고
관련 자료

Git 설치

Bitbucket 로고
솔루션 보기

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

모두가 동일한 리포지토리에서 작업


팀과 동일한 리포지토리에서 작업하는 경우 풀리퀘스트를 체크아웃하는 과정은 매우 간단합니다. 풀리퀘스트가 만들어진 브랜치를 fetch해서 checkout하기만 하면 됩니다.

  • 공유 리포지토리에 게시된 모든 브랜치를 가져옵니다.
git fetch origin
  • 관심 있는 원격 브랜치를 추적하는 로컬 브랜치를 만듭니다.
git checkout -b PRJ-1234 origin/PRJ-1234
  • 이제 이 방법으로 diff, merge 및 테스트할 수 있습니다.
git diff main ./run-tests.sh
  • 결과가 만족스러우면 웹 UI로 돌아가서 피드백을 제공하거나 변경 사항을 바로 승인하면 됩니다.

자체 포크에서 작업하는 기여자


일부 기여자가 별도의 포크에서 작업하는 경우 프로세스가 약간 달라집니다. 이 경우에는 기여 또는 기능이 커밋된 원격 브랜치를 fetch할 수 있습니다.

  • 기여자의 원격을 먼저 추가합니다.
git remote add jsmith http://bitbucket.org/jsmith/coolproject.git
  • 메인 리포지토리인 origin에서 최신 업데이트를 모두 수집합니다.
git checkout main git fetch origin git merge main
  • 기여자의 포크에 게시된 모든 브랜치를 가져옵니다.
git fetch jsmith
  • 관심 있는 원격 브랜치를 추적하는 로컬 브랜치를 만듭니다.
git checkout -b jsmith-PRJ-1234 jsmith/PRJ-1234
  • 이제 이 방법으로 diff, merge 및 테스트할 수 있습니다.
git diff main ./run-tests.sh

풀리퀘스트 refs를 사용하여 작업 줄이기


위의 방법은 효과가 있지만 몇 가지 이유로 인해 작업이 더 복잡해질 수 있습니다.

  • 자체 포크를 가진 공동 작업자가 많으면 어떻게 합니까? 모든 포크를 취합하여 별도로 처리하는 것은 실용적이지 않습니다.
  • 일부 포크에 액세스할 수 없고 소스 브랜치를 체크아웃할 수 없다면 어떻게 합니까?

위의 두 가지 이슈에 대한 솔루션은 일부 git 서버에서 제공하는 풀리퀘스트 레퍼런스를 사용하는 것입니다. 보여드릴 프로세스는 일부 git 서버에서 지원되며 사용하는 서버에 따라 약간씩 다릅니다. 그런 다음 Stash(현재 Bitbucket Data Center라고 함) 및 GitHub에서 모든 풀리퀘스트를 fetch하는 방법에 대해 설명해드리겠습니다.

Refspecs를 두려워하지 않기

첫 번째 전제 조건은 Refspecs에 익숙해지는 것입니다. Refspecs는 매우 훌륭한 기능이므로 두려워할 필요가 없습니다. Refspecs는 원격 브랜치에서 로컬 참조로의 단순한 매핑입니다. 즉, "이 원격 브랜치(또는 이 원격 브랜치 세트)를 이 이름 공간에서 로컬로 이름에 매핑해야 한다"는 사실을 git에 알리는 간단한 방법입니다.

예를 들어, 다음과 같은 명령이 있습니다.

git fetch +refs/heads/main:refs/remotes/origin/main

origin 원격의 원격 브랜치 main을 로컬 origin/main에 매핑하여 다음과 같이 입력할 수 있도록 합니다.

git checkout origin/main

그리고 그 원격 브랜치를 계속 참조합니다. 정의에 있는 더하기 기호(+)는 git이 참조를 빨리 감지는 않더라도 업데이트하길 원한다는 것을 나타냅니다.

이 방법으로 모든 풀리퀘스트를 다운로드하는 방법은 원격 리포지토리에서 PR 헤드를 저장하는 방법을 매핑하고 쉽게 참조할 수 있도록 로컬 이름 공간에 매핑하는 것입니다.

origin(또는 upstream) 원격 리포지토리가 정의되어 있다면 수행할 작업은 다음과 같습니다.

참고: 여러 Stash(현재 Bitbucket Data Center라고 함) 개발자들이 언급한 것처럼 아래에서 설명할 레퍼런스는 undocumentedprivate으로 간주되며 언제든지 변경될 수 있습니다.

모든 풀리퀘스트 다운로드: Stash

  • 리포지토리를 포크합니다.
  • 포크를 로컬에서 복제합니다.
git clone git@stash.atlassian.com:durdn/tis.git
  • 업스트림 원본 리포지토리를 upstream으로 추가합니다.
git remote add upstream git@stash.atlassian.com:tpettersen/tis.git
  • 유지 장치 'upstream'에서 최신 헤드 가져오기
git fetch upstream
  • 원격 풀리퀘스트 헤드를 로컬 pr 이름 공간에 매핑하는 refspec을 추가합니다. config 명령으로 수행할 수 있습니다.
git config --add remote.origin.fetch '+refs/pull-requests/*/from:refs/remotes/origin/pr/*'
  • .git/config를 보면 fetch 항목은 다음과 같습니다.
[remote "upstream"]
    url = git@stash.atlassian.com:docker/libswarm.git
    fetch = +refs/heads/*:refs/remotes/upstream/*
    fetch = +refs/pull-requests/*/from:refs/remotes/upstream/pr/*
  • 이제 모든 풀리퀘스트 브랜치를 쉽게 fetch할 수 있습니다.
$ git fetch upstream

remote: Counting objects: 417, done.
remote: Compressing objects: 100% (274/274), done.
remote: Total 417 (delta 226), reused 277 (delta 128)
Receiving objects: 100% (417/417), 105.28 KiB | 0 bytes/s, done.
Resolving deltas: 100% (226/226), done.

From stash.atlassian.com:docker/libswarm
 * [new ref]         refs/pull-requests/10/from-> upstream/pr/10
 [...]
 * [new ref]         refs/pull-requests/100/from -> upstream/pr/100
 * [new ref]         refs/pull-requests/101/from -> upstream/pr/101
 [...]
 * [new ref]         refs/pull-requests/109/from -> upstream/pr/109
 * [new ref]         refs/pull-requests/110/from -> upstream/pr/110
 [...]
  • 이제 특정 풀리퀘스트로 전환하려면 다음을 수행합니다.
git checkout pr/102

모든 풀리퀘스트 다운로드: Github

포크 또는 업스트림이 Github에 있으면 위와 동일하게 작동하지만 config 명령은 다음과 같이 변경됩니다.

 git config --add remote.origin.fetch '+refs/pull//head:refs/remotes/origin/pr/'

.git/config의 원격은 PR 헤드를 pr이라는 로컬 이름 공간에 매핑하기 위한 추가 fetch 구성을 포함하도록 변경됩니다.

[remote "upstream"] url = git@github.com:docker/libswarm.git fetch = +refs/heads/*:refs/remotes/upstream/* fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*

refs를 사용하여 단일 풀리퀘스트 가져오기

fetch 항목을 .git/config에 설치하고 싶지 않고 빨리 풀리퀘스트로 이동하고 싶은 경우 하나의 명령으로 가능합니다.

  • Stash에서 단일 PR을 체크아웃합니다.
git fetch refs/pull-requests/your-pr-number/from:local-branch-name
  • Github에서 단일 PR을 체크아웃합니다.
git fetch refs/pull/your-pr-number/head:local-branch-name

또한 위의 방법을 많이 사용한다면 git 별칭을 만들어 프로세스를 간소화할 수 있습니다.

# For Stash
git config alias.spr '!sh -c "git fetch origin pull-requests/${1}/from:pr/${1}" -'

# For Github
git config alias.gpr '!sh -c "git fetch origin pull/${1}/head:pr/${1}" -'

별칭을 구성하면 간단하게 (inuit 덕분에) 풀리퀘스트를 가져올 수 있습니다.

결론


몇 가지 간단한 별칭을 만들거나 적절한 refspecs를 .git/config에 추가하면 동료나 기여자의 작업을 쉽게 확인할 수 있습니다.

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