Git 저장소와 원격 저장소 동기화 확인 방법

GitBeginner
지금 연습하기

소개

이 랩에서는 로컬 Git 저장소가 원격 저장소와 동기화되었는지 확인하는 방법을 배우게 됩니다. 로컬 브랜치가 최신 상태인지, 뒤쳐져 있는지, 또는 원격 브랜치보다 앞서 있는지 판단하는 실용적인 방법을 탐구할 것입니다.

이 랩은 원격 저장소에서 변경 사항을 가져오고 git status를 사용하여 동기화 상태를 평가하는 과정을 안내합니다. 또한 git log를 사용하여 로컬 HEAD 와 원격 추적 브랜치 (@{u}) 를 비교하여 커밋 기록의 차이점을 식별하는 방법도 배우게 됩니다. 마지막으로, 분기된 저장소의 상태를 시뮬레이션하고 검토하여 Git 에서 동기화 문제를 식별하고 관리하는 방법에 대한 포괄적인 이해를 제공합니다.

Fetch 및 git status 확인

이 단계에서는 원격 저장소에서 변경 사항을 가져오고 로컬 저장소의 상태를 확인하는 방법을 배우겠습니다.

다른 사람들과 함께 프로젝트를 진행한다고 상상해 보세요. 그들은 프로젝트를 변경하고 중앙 위치 (원격 저장소) 에 저장할 수 있습니다. 이러한 변경 사항을 자신의 프로젝트 복사본 (로컬 저장소) 으로 가져오는 방법이 필요합니다. 이때 git fetch가 사용됩니다.

먼저, 프로젝트 디렉토리에 있는지 확인해 보겠습니다. 터미널을 열고 다음을 입력합니다.

cd ~/project/my-time-machine

이제 원격 저장소를 시뮬레이션해 보겠습니다. 실제 시나리오에서는 GitHub 또는 GitLab 과 같은 플랫폼에 있을 것입니다. 이 랩에서는 로컬 디렉토리를 "원격"으로 사용합니다.

git remote add origin ../my-time-machine-remote

이 명령어는 현재 프로젝트 외부의 디렉토리를 가리키는 origin이라는 "원격"을 추가합니다.

이제 git fetch를 사용하여 이 시뮬레이션된 원격에서 변경 사항을 가져오겠습니다.

git fetch origin

새로운 변경 사항이 없으면 출력이 많이 보이지 않을 수 있지만, 이 명령어는 원격 저장소에 연결하여 커밋 및 브랜치와 같은 새로운 정보를 현재 브랜치에 병합하지 않고 다운로드했습니다.

fetch 후에는 아직 통합하지 않은 원격의 변경 사항이 있는지 확인하기 위해 항상 로컬 저장소의 상태를 확인하는 것이 좋습니다.

git status

git status의 출력은 이제 로컬 브랜치가 원격 브랜치와 "최신 상태"인지, 또는 가져올 수 있는 변경 사항이 있는지 알려줍니다. 예를 들어 다음과 같은 내용을 볼 수 있습니다.

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

또는 원격에 변경 사항이 있는 경우:

On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

git fetchgit status의 출력을 이해하는 것은 매우 중요합니다. 이는 로컬 브랜치와 원격 저장소의 해당 브랜치 간의 관계를 알려줍니다. 이를 통해 변경 사항을 가져와야 하는지 또는 로컬 복사본이 이미 최신 상태인지 결정할 수 있습니다.

git log 를 사용하여 HEAD 와 @{u} 비교

이 단계에서는 git log 명령을 사용하여 로컬 브랜치 (HEAD) 의 상태를 업스트림 브랜치 (@{u}) 와 비교합니다. 이는 변경 사항을 가져온 후 차이점을 시각화하는 강력한 방법입니다.

먼저, 프로젝트 디렉토리에 있는지 확인합니다.

cd ~/project/my-time-machine

Git 에서 HEAD는 현재 브랜치가 가리키는 커밋을 나타냅니다. 현재 작업의 최신 버전을 나타냅니다. @{u} (또는 @\{upstream\}) 는 현재 로컬 브랜치가 추적하는 업스트림 브랜치를 나타냅니다. 이는 일반적으로 가져온 원격 저장소의 해당 브랜치입니다.

로컬 브랜치 (HEAD) 에는 있지만 업스트림 브랜치 (@{u}) 에는 없는 커밋을 보려면 다음 명령을 사용할 수 있습니다.

git log HEAD..@{u}

이 명령은 @{u}에서 도달할 수 있지만 HEAD에서는 도달할 수 없는 커밋을 표시합니다. 즉, 원격 브랜치에 있지만 아직 로컬 브랜치에 없는 커밋을 표시합니다. 이러한 커밋이 없으면 (즉, 로컬 브랜치가 최신 상태이거나 앞서 있는 경우) 이 명령은 출력을 생성하지 않습니다.

이제 업스트림 브랜치 (@{u}) 에는 있지만 로컬 브랜치 (HEAD) 에는 없는 커밋을 살펴보겠습니다. 이는 로컬 브랜치에 있지만 아직 원격으로 푸시되지 않은 커밋을 표시합니다.

git log @{u}..HEAD

이 명령은 HEAD에서 도달할 수 있지만 @{u}에서는 도달할 수 없는 커밋을 표시합니다. 이러한 커밋이 없으면 (즉, 로컬 브랜치가 최신 상태이거나 뒤쳐져 있는 경우) 이 명령은 출력을 생성하지 않습니다.

.. 표기법과 함께 git log를 사용하면 로컬 브랜치와 해당 업스트림 브랜치와 같이 저장소의 두 다른 지점의 기록을 쉽게 비교할 수 있습니다. 이는 원격 저장소에 대한 저장소의 상태를 이해하고 변경 사항을 가져오거나 푸시할 준비를 하는 데 매우 유용합니다.

분기된 Repository 테스트

이 단계에서는 로컬 저장소와 원격 저장소 모두 다른 저장소에 없는 새로운 커밋을 갖는 시나리오를 시뮬레이션합니다. 이를 "분기된 (diverged)" 상태라고 합니다.

먼저, 프로젝트 디렉토리에 있는지 확인합니다.

cd ~/project/my-time-machine

로컬 저장소에 새로운 커밋을 생성해 보겠습니다.

echo "Adding a local change" > local_change.txt
git add local_change.txt
git commit -m "Add a local change"

이제 "원격" 저장소에서 직접 커밋이 이루어지는 것을 시뮬레이션해 보겠습니다. 원격 디렉토리로 전환하여 커밋을 만들고 다시 전환합니다.

cd ../my-time-machine-remote
echo "Adding a remote change" > remote_change.txt
git add remote_change.txt
git commit -m "Add a remote change"
cd ../my-time-machine

이제 로컬 저장소에 커밋을 생성하고 시뮬레이션된 원격 저장소에 별도의 커밋을 생성했습니다. 이제 저장소가 분기되었습니다.

git fetch를 다시 사용하여 원격 저장소에 대한 정보를 업데이트해 보겠습니다.

git fetch origin

이제 로컬 저장소의 상태를 확인합니다.

git status

브랜치가 분기되었음을 나타내는 출력을 볼 수 있습니다. 다음과 같은 내용입니다.

On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

이 상태 메시지는 로컬 브랜치 (master) 와 원격 추적 브랜치 (origin/master) 가 마지막 동기화 이후 새로운 커밋으로 모두 진행되었음을 알려줍니다. 또한 원격 변경 사항을 병합하기 위해 git pull을 사용할 것을 제안합니다.

분기된 상태를 이해하는 것은 다른 사람들과 협업할 때 일반적인 시나리오이므로 중요합니다. 즉, 자신의 변경 사항을 푸시하기 전에 원격 변경 사항을 로컬 브랜치에 통합해야 합니다.

요약

이 랩에서는 로컬 Git 저장소가 원격 저장소와 동기화되었는지 확인하는 방법을 배웠습니다. git remote add를 사용하여 원격 저장소를 시뮬레이션하고 로컬 프로젝트에 추가하는 것으로 시작했습니다. 병합하지 않고 원격에서 변경 사항을 가져오는 중요한 단계는 git fetch origin을 사용하여 수행되었습니다. fetch 후, git status를 사용하여 로컬 브랜치의 동기화 상태를 원격 브랜치와 비교하여 브랜치가 최신 상태인지 또는 뒤쳐져 있는지 나타내는 출력을 관찰했습니다.

git log를 사용하여 로컬 HEAD 와 원격 추적 브랜치를 비교하는 방법을 더 자세히 살펴보고, 저장소 동기화에 대한 포괄적인 이해를 얻기 위해 분기된 저장소를 포함하는 시나리오를 검토할 것입니다.