pull 명령을 사용하여 협업

완료됨

새 작업 외의 가동 중지 시간에는 고양이 사진을 호스트하는 웹 사이트에서 작업하고 있습니다. 버전 제어에 Git를 사용하고 있으며, 협력자를 프로젝트에 초대해야 합니다. 집에서 피자 파티를 하는 동안 친구이자 동료인 고양이 애호가 Alice가 비전 실현을 돕는다고 제안하고 이에 적극 동의합니다.

Alice는 먼저 Git 프로젝트의 복사본을 만들어야 합니다. 그런 다음에 다른 사용자가 변경할 때 변경 내용을 받아보려고 합니다. 여기에서 Git의 ‘분산’ 특성이 빛을 발합니다. Git을 사용하면 두 명 이상의 사용자가 서로의 작업을 덮어쓸 걱정 없이 프로젝트에서 함께 작업할 수 있습니다. 더욱이 Alice의 작업을 내 작업과 병합하기 전에 확인할 수 있습니다. (Alice는 재능이 있지만 완벽한 개발자는 없습니다. 신뢰하지만 확인합니다. 신뢰하지만 확인합니다.)

이 단원에서는 다른 사용자가 사용할 수 있도록 리포지토리(repo라고도 함)를 복제하는 방법을 알아봅니다. Git의 가장 중요한 기능 중 하나인 끌어오기 요청의 사용 방법도 알아봅니다.

리포지토리 복제(git clone)

Git에서 git clone 명령으로 리포지토리를 ‘복제’하여 복사합니다. 리포지토리를 가리키는 URL 또는 경로만 있으면 저장된 위치에 관계없이 리포지토리를 복제할 수 있습니다.

git clone은 파일 시스템 경로인 SSH 경로(예: git@example.com:alice/Cats - Rsync 또는 SCP를 사용한 경우 이 형식에 익숙할 것임) 또는 일반적으로 file:, git: 또는 ssh로 시작하는 URL을 수락합니다. git clone 설명서에 다양한 양식이 설명되어 있습니다. Unix 및 Linux에서 복제 작업은 하드 링크를 사용하므로 파일이 아닌 디렉터리 항목만 복사하면 되기 때문에 빠르고 최소한의 공간을 사용합니다.

원격 리포지토리(git pull)

Git은 리포지토리를 복제할 때 이름 origin을 사용하여 ‘원격’이라는 원본 리포지토리 참조를 만듭니다. 복제된 리포지토리가 원격 리포지토리에서 데이터를 ‘끌어오’거나 검색하도록 복제된 리포지토리를 설정합니다. (Git은 푸시할 수도 있습니다. Git에서 밀어 넣는 방법은 이 모듈의 뒷부분에서 알아보겠습니다.) origin은 Git에서 변경 내용을 끌어오고 밀어 넣는 기본 위치입니다. git pull은 원격 리포지토리의 변경 내용을 로컬 리포지토리에 복사합니다. git pull 명령은 ‘새’ 커밋과 개체만 복사한 후 작업 트리로 체크 인하므로 매우 효율적입니다.

git pull 명령을 사용하여 origin에서 끌어옵니다. git pull을 다른 파일 복사 방법과 비교하는 것은 유용합니다. scp 명령은 모든 항목을 복사합니다. scp는 복사되는 파일이 같은 컴퓨터에 있을 필요가 없다는 점을 제외하고 Unix cp 명령과 유사합니다. 원격 디렉터리에 10,000개 파일이 있으면 scp는 파일을 모두 복사합니다. Rsync라는 보다 효율적인 프로그램은 로컬 및 원격 디렉터리의 모든 파일을 확인하고 다른 파일만 복사합니다. Rsync는 백업을 만드는 데 많이 사용되지만 파일 크기나 만든 날짜가 다른 경우를 제외하고 모든 파일을 해시해야 합니다.

Git은 커밋만 확인합니다. 커밋 목록을 저장했기 때문에 원격 리포지토리에서 가져온 마지막 커밋을 이미 알고 있습니다. 그런 다음, Git은 복사되는 원본 컴퓨터에 새 커밋과 커밋이 가리키는 개체를 포함하여 변경된 모든 항목을 보내도록 알립니다. 커밋과 개체는 ‘팩’이라는 파일에 번들되고 일괄 처리로 전송됩니다. 마지막으로, Git은 변경된 모든 개체의 압축을 풀고 필요한 경우 작업 트리의 커밋 및 개체와 병합하여 작업 트리를 업데이트합니다.

Git은 지시된 경우에만 끌어오거나 밀어 넣습니다. Git은 Dropbox와는 다릅니다. Dropbox의 경우, 폴더에서 사용자가 변경한 내용을 Dropbox에 알리도록 운영 체제에 요청해야 하고 때때로 다른 사용자가 변경했는지도 서버에 확인해야 합니다.

끌어오기 요청 만들기(git request-pull)

Alice 같은 다른 개발자는 리포지토리를 복제하고 로컬에서 일부 내용을 변경한 후 변경 내용을 원본 리포지토리에 다시 통합하고 싶을 것입니다. 변경 내용을 원본 리포지토리에 밀어 넣는 것이 적절한 방법처럼 보일 수도 있습니다. 그러나 다른 사용자는 리포지토리를 변경할 수 있는 권한이 없으므로 원본 리포지토리에 밀어 넣지 못합니다. 이것은 당연한 것입니다. 지금은 들어오는 변경 내용을 기본 코드베이스로 병합하기 전에 검토하려고 합니다.

이제 Alice는 ‘끌어오기 요청’을 제출하여 변경 내용을 기본 코드베이스로 끌어오도록 요청해야 합니다. 이 작업은 다음 예제와 같이 git request-pull을 사용하여 수행할 수 있습니다.

git request-pull -p origin/main .

Alice는 origin 원격의 main 분기를 origin/main으로 참조합니다.

이 끌어오기 요청은 기본적으로 이 모듈에 다루지 않는 코드 저장 위치인 GitHub의 끌어오기 요청과 동일합니다. 끌어오기 요청을 통해 웹 사이트에서 수행 중인 작업에 다른 협력자의 작업을 통합하기 전에 협력자의 변경 내용을 검토할 수 있습니다. 코드 검토는 협업 프로그래밍의 중요한 부분으로, 가장 중요하다고 말하는 사람도 있습니다.

원격 만들기(git remote) 및 끌어오기 요청 완료(git pull)

프로젝트 소유자는 끌어오기 요청을 병합하는 방법을 알고 있어야 합니다. 먼저 git remote 명령을 사용하여 다른 개발자의 리포지토리를 ‘원격’으로 설정합니다. 그런 다음 git pull 명령을 사용하여 끌어오기 및 끌어오기 요청에 해당 원격을 사용합니다.

내부적으로 git pull은 두 가지 더 간단한 작업인 git fetch(변경 내용 가져오기) 및 git merge(해당 변경 내용을 리포지토리에 병합)의 조합입니다. 예제에서 병합은 ‘빨리 감기’였습니다. 즉, Alice는 리포지토리에 사용자의 최신 커밋이 있었으므로 수정 없이 사용자 기록 앞에 커밋을 추가할 수 있었습니다.