Git 원격 저장소 활용하기

로컬 저장소에서 버전 관리를 하는 것도 중요하지만, Git의 진정한 강력함은 원격 저장소(Remote Repository) 와 함께 사용할 때 발휘됩니다. 원격 저장소는 인터넷이나 네트워크 어딘가에 위치한 서버에 프로젝트의 복사본을 저장하는 공간으로, 이를 통해 여러 사람이 함께 작업(협업)하거나, 개인 프로젝트라도 여러 컴퓨터에서 작업을 동기화하거나, 안전하게 코드를 백업하는 등의 장점이 있습니다.

원격 저장소란? (GitHub, GitLab, Bitbucket 등)

원격 저장소는 간단히 말해 내 컴퓨터가 아닌 다른 곳(주로 서버)에 위치한 Git 저장소입니다. 여러 개발자가 함께 프로젝트를 진행하거나, 개인 프로젝트라도 집 컴퓨터와 회사 컴퓨터에서 동일한 코드로 작업하거나, 혹은 만일의 사태에 대비해 코드를 안전하게 백업하고 싶을 때 원격 저장소를 활용합니다.
가장 널리 사용되는 원격 저장소 호스팅 서비스로는 GitHubGitLabBitbucket 등이 있으며, 이러한 플랫폼들은 단순한 코드 저장 공간 제공을 넘어 이슈 트래킹, 코드 리뷰, CI/CD(지속적 통합/지속적 배포) 연동 등 다양한 부가 기능을 제공하여 개발 생산성을 크게 향상시켜 줍니다. 예를 들어, 팀 프로젝트를 GitHub에 생성해두면 각 팀원이 코드를 공유하고, 변경 사항을 검토(Pull Request/Merge Request)하며, 체계적으로 통합하는 협업 과정을 진행할 수 있습니다.

원격 저장소 관리 (git remote)

로컬 저장소는 하나 이상의 원격 저장소와 연결될 수 있으며, git remote 명령어는 이러한 연결을 관리하는 데 사용됩니다.

원격 저장소 연결 정보 조회 (git remote -v)

내 로컬 저장소가 현재 어떤 원격 저장소와 연결되어 있는지, 그리고 데이터를 가져올(fetch) URL과 보낼(push) URL이 무엇인지 확인하고 싶을 때 git remote -v 명령을 사용합니다. 보통 git clone 명령으로 원격 저장소를 복제하면, 기본적으로 origin이라는 이름으로 해당 원격 저장소 정보가 자동으로 등록됩니다.

# 현재 설정된 원격 저장소 목록과 각 URL을 자세히 보여줌
git remote -v
# 출력:
# origin  https://github.com/username/my-project.git (fetch)
# origin  https://github.com/username/my-project.git (push)

새로운 원격 저장소 추가 (git remote add {이름} {URL})

로컬에서 git init으로 시작한 프로젝트를 GitHub 등에 새로 만든 빈 저장소와 연결하고 싶을 때, 또는 이미 연결된 origin 외에 다른 원격 저장소(예: 백업용 서버)를 추가하고 싶을 때 git remote add 명령을 사용합니다. 이때 원격 저장소를 지칭할 별칭(보통 origin)과 URL을 지정합니다.

# 'origin'이라는 이름으로 GitHub 저장소 URL을 원격 저장소로 추가
git remote add origin https://github.com/your-username/your-repository-name.git

만약 오픈 소스 프로젝트를 포크(fork)하여 내 계정으로 가져온 후, 원본 프로젝트의 변경사항을 계속 추적하고 싶다면, 원본 저장소를 upstream이라는 이름으로 추가할 수 있습니다.

# 원본 프로젝트 저장소를 'upstream'이라는 이름으로 추가
git remote add upstream https://github.com/original-owner/original-project.git

원격 저장소 연결 이름 변경 (git remote rename {기존이름} {새이름})

기존에 설정된 원격 저장소의 별칭을 변경하고 싶을 때 git remote rename 명령을 사용합니다. 예를 들어, 기본 원격 저장소 이름인 origin을 github-main-repo와 같이 더 구체적인 이름으로 변경하고 싶다면 다음과 같이 실행합니다.

git remote rename origin github-main-repo

코드 예시:

원격 저장소 연결 제거 (git remote rm {이름} 또는 git remote remove {이름})

더 이상 사용하지 않거나 잘못 연결된 원격 저장소의 연결 정보를 로컬 저장소에서 삭제하고 싶을 때 git remote rm (또는 remove) 명령을 사용합니다. 예를 들어, backup-server라는 이름으로 추가했던 원격 저장소 연결을 제거하려면 다음과 같이 실행합니다.

git remote rm backup-server

이 명령어는 로컬 저장소의 연결 정보만 삭제할 뿐, 실제 원격 서버의 저장소를 삭제하지는 않습니다.

원격 저장소의 변경 사항 가져오기 (git fetch, git pull)

협업 시 다른 팀원이 원격 저장소에 새로운 변경 사항을 올렸다면, 내 로컬 저장소도 최신 상태로 업데이트해야 합니다.

git fetch {원격저장소이름} : 변경 사항 확인 후 수동 병합

git fetch 명령어는 원격 저장소의 최신 데이터를 로컬 저장소로 가져오지만, 현재 작업 중인 로컬 브랜치에 자동으로 병합(merge)하지는 않습니다. 대신, 원격 브랜치의 최신 커밋 정보를 로컬의 원격 추적 브랜치(remote-tracking branch) (예: origin/main, origin/develop)에 업데이트합니다. 이를 통해 다른 팀원이 원격 저장소 origin에 푸시한 변경 사항이 있는지 확인하고, 그 내용을 내 로컬 작업 브랜치에 바로 병합하기 전에 먼저 git log origin/main이나 git diff main origin/main 등으로 변경 내용을 살펴볼 수 있습니다.

# 'origin' 원격 저장소의 모든 브랜치에 대한 최신 정보를 가져옴
git fetch origin

# 특정 브랜치(예: origin/develop)의 변경 내용 확인 (현재 main 브랜치와 비교)
git diff main origin/develop

# 확인 후, 수동으로 병합 (현재 브랜치가 main이라고 가정)
git merge origin/develop

git pull <원격저장소이름> <원격브랜치이름> : 변경 사항 즉시 병합

git pull명령어는 원격 저장소의 변경 사항을 로컬로 가져와 현재 작업 중인 로컬 브랜치에 자동으로 병합까지 수행합니다. 내부적으로는 git fetch 명령 실행 후 git merge (기본 전략)를 실행하는 것과 유사합니다. 예를 들어, 내가 작업 중인 로컬 main 브랜치를 원격 저장소 origin의 main 브랜치의 최신 내용으로 바로 업데이트하고 싶을 때 git pull origin main을 사용합니다. 만약 현재 로컬 브랜치가 특정 원격 브랜치를 추적하도록 설정되어 있다면, 간단히 git pull만 실행해도 됩니다.

# 'origin' 원격 저장소의 'main' 브랜치 내용을 가져와 현재 로컬 브랜치에 병합
git pull origin main

# 현재 브랜치가 추적하는 원격 브랜치의 내용을 가져와 병합 (추적 설정이 되어있을 경우)
git pull

병합 과정에서 충돌이 발생하면, 앞서 배운 병합 충돌 해결 방법을 따라 직접 해결해야 합니다. git pull --rebase 옵션을 사용하면 merge 대신 rebase 방식으로 변경 사항을 통합할 수도 있는데, 이는 로컬 커밋 히스토리를 깔끔하게 유지하는 데 도움이 될 수 있지만, 공유된 커밋에 대해서는 신중히 사용해야 합니다.

로컬 변경 사항 원격 저장소에 반영하기 (git push)

로컬 저장소에서 새로운 기능을 개발하고 커밋을 완료했다면, 이 변경 사항들을 다른 팀원들과 공유하거나 백업하기 위해 원격 저장소에 업로드해야 합니다. 이때 git push 명령어를 사용합니다.
git push <원격저장소이름> <로컬브랜치이름>:<원격브랜치이름> 형태로 로컬 브랜치의 커밋들을 원격 저장소의 특정 브랜치로 업로드합니다. 예를 들어, 내가 로컬 feature-x 브랜치에서 새로운 기능을 개발 완료하고 커밋한 후, 이 변경사항들을 팀원들과 공유하기 위해 원격 저장소 origin의 feature-x 브랜치(없으면 새로 생성됨)에 업로드하고 싶을 때 git push origin feature-x를 사용합니다. 만약 로컬 브랜치 이름과 원격 브랜치 이름이 같다면 : 뒷부분을 생략할 수 있습니다 (git push origin feature-x).

# 로컬 'main' 브랜치의 변경 사항을 'origin' 원격 저장소의 'main' 브랜치로 푸시
git push origin main

# 로컬 'develop' 브랜치의 변경 사항을 'origin' 원격 저장소의 'develop' 브랜치로 푸시
git push origin develop

로컬에서 새로 만든 브랜치(예: my-new-feature)를 처음 원격 저장소에 푸시할 때는 -u 옵션 (또는 --set-upstream) 을 함께 사용하는 것이 좋습니다. 이렇게 하면 로컬 브랜치와 지정한 원격 브랜치 간의 추적 관계(tracking relationship) 가 설정되어, 이후 해당 브랜치에서 git pull이나 git push를 실행할 때 원격 저장소와 브랜치 이름을 반복해서 입력하지 않아도 됩니다.

# 'my-new-feature' 로컬 브랜치를 'origin' 원격 저장소에 같은 이름으로 푸시하고 업스트림 연결 설정
git push -u origin my-new-feature

만약 원격 저장소에 내가 모르는 변경 사항이 있는데 강제로 푸시하려고 하면 Git이 이를 거부합니다. 이때는 먼저 git pull 등으로 원격 변경 사항을 반영한 후 다시 푸시해야 합니다. git push --force 옵션은 이러한 검사를 무시하고 강제로 푸시하지만, 다른 사람의 작업을 덮어쓸 수 있는 매우 위험한 작업이므로 공유 브랜치에서는 절대 사용해서는 안 되며, 개인 브랜치에서 히스토리를 리베이스 등으로 변경했을 때만 극히 제한적으로 사용해야 합니다.

원격 브랜치 추적 (Tracking Branches)

원격 브랜치를 추적(Tracking) 한다는 것은 특정 로컬 브랜치가 특정 원격 브랜치와 연결되어 있음을 의미합니다. 이 연결 덕분에 git status를 통해 로컬 브랜치가 원격 브랜치에 비해 얼마나 앞서있는지(ahead) 또는 뒤처져있는지(behind) 확인할 수 있고, git pull 이나 git push 명령을 인자 없이 더 간결하게 사용할 수 있습니다.

추적 관계는 여러 방식으로 설정됩니다:

  • git clone 시: 기본적으로 원격 저장소의 기본 브랜치(예: main)를 추적하는 로컬 브랜치(예: main)가 생성됩니다.
  • git push -u <원격저장소> <로컬브랜치>: 처음 브랜치를 푸시할 때 -u 옵션을 사용하면 추적 관계가 설정됩니다.
  • 원격 브랜치를 기반으로 로컬 브랜치 생성 시: 예를 들어 원격에 origin/feature-A 브랜치가 있고 로컬에는 없다면, git switch -c feature-A origin/feature-A (또는 git checkout -b feature-A origin/feature-A) 명령으로 로컬 feature-A 브랜치를 생성하면서 origin/feature-A를 추적하도록 할 수 있습니다.
  • 수동 설정: git branch --set-upstream-to=<원격저장소>/<원격브랜치> <로컬브랜치> 명령으로 기존 로컬 브랜치에 추적 관계를 설정할 수 있습니다. 예를 들어, 로컬 dev 브랜치가 원격 origin의 develop 브랜치를 추적하게 하려면 git branch --set-upstream-to=origin/develop dev 와 같이 실행합니다.

이렇게 추적 관계가 설정되면, 예를 들어 dev 브랜치에서 작업 중일 때 git pull만 입력해도 Git은 자동으로 origin/develop 브랜치에서 변경 사항을 가져와 병합하려고 시도하며, git push만 입력해도 로컬 dev 브랜치의 변경 사항을 origin/develop으로 보내려고 시도합니다. 이는 원격 작업의 효율성을 크게 높여줍니다.

마무리

원격 저장소의 개념과 관련 명령어들을 잘 익혀두면, 개인 프로젝트의 백업 및 동기화는 물론, 팀원들과의 효과적인 협업을 통해 더 크고 복잡한 프로젝트도 성공적으로 관리할 수 있게 될 것입니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤