Git Fetch 풀리퀘스트: 숙련도 높이기
Nicola Paolucci
개발자 애드보케이트
오늘날 프로젝트에 수정 사항을 적용하는 것은 사용자가 수정하려는 프로젝트의 전체 원격 복사본을 불러오는 포크를 만드는 것만큼이나 쉽습니다. 변경하려는 파일을 선택하고 편집을 누르고 수정을 커밋하면 됩니다.
대신 풀리퀘스트(이하 PR로 약칭)를 받는 쪽이라면 어떨까요? 세련된 웹 UI를 사용하는 것은 훌륭하며 그것만 있으면 되는 경우가 많습니다. 버튼을 클릭하여 승인하고 병합하면 완료됩니다.
하지만 항상 그런 것은 아닙니다! PR(풀리퀘스트)에 포함된 변경 사항을 로컬로 다운로드하고, 몇 가지 테스트를 실행하고, IDE에서 변경 사항이 어떻게 표시되는지 확인해야 하는 경우가 많습니다.
동료 또는 기여자의 풀리퀘스트를 다운로드(더 명확하게는 fetch
및 checkout
)하는 단계는 개념적으로는 간단하지만 몇 가지 중요한 세부 정보와 팁을 알면 훨씬 더 쉬워집니다.
명령줄에서 풀리퀘스트를 쉽게 처리할 수 있도록 git
이 제공하는 명령줄 기능을 더 잘 이해할 수 있는 방법을 설명해 드리겠습니다.
시작 전: 브랜치 이름 및 상태로 셸 프롬프트 보강
자신이 사용하는 git
브랜치를 표시하지 않거나 작업 디렉터리에 수정한 파일 또는 커밋하지 않은 파일이 있는지 표시하지 않는 베어 명령 프롬프트를 가진 사용자들이 많아서 항상 놀라곤 합니다. '그게 바로 저예요!'라고 생각하셨다면 제가 도움을 드리는 동시에 감동을 전할 수 있도록 기회를 주세요!
git 작업 디렉터리 상태에 대한 훌륭한 주석을 제공하는 liquid prompt
를 설치하세요(다른 VCS도 지원합니다).
(위의 스크린샷에는 제가 브랜치 newbranch
에 있으며 작업 디렉터리에서 추적하는 파일에 5
줄을 추가했고 0
개의 줄을 제거했음을 알리는 메시지가 표시됩니다)
관련 자료
Git 설치
솔루션 보기
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라고 함) 개발자들이 언급한 것처럼 아래에서 설명할 레퍼런스는 undocumented
및 private
으로 간주되며 언제든지 변경될 수 있습니다.
모든 풀리퀘스트 다운로드: 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
에 추가하면 동료나 기여자의 작업을 쉽게 확인할 수 있습니다.
이 문서 공유
다음 토픽
여러분께 도움을 드릴 자료를 추천합니다.
이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.