🔥 git pull

743자
9분

Git은 여러 명이 협업하며 프로젝트를 진행할 때 매우 유용한 도구입니다. 팀원들과 함께 작업하다 보면 원격 저장소에 변경 사항이 생기기 마련인데요. 이때 git pull 명령어를 사용하면 원격 저장소의 최신 변경 사항을 로컬 저장소로 가져올 수 있습니다.

git pull 명령어는 다음과 같이 사용합니다.

git pull <remote> <branch>
shell
  • <remote>는 원격 저장소의 이름입니다. 보통 origin을 많이 사용하죠.
  • <branch>는 가져오고자 하는 브랜치의 이름입니다. 예를 들어 main 브랜치의 변경 사항을 가져오고 싶다면 git pull origin main과 같이 사용하면 됩니다.

git pull 명령어를 실행하면 Git은 다음 작업을 수행합니다.

  1. 원격 저장소에서 변경 사항을 가져옵니다.
  2. 현재 브랜치에 원격 저장소의 변경 사항을 병합(merge)합니다.

만약 로컬 저장소에 커밋되지 않은 변경 사항이 있다면 git pull을 실행할 수 없습니다. 이런 경우에는 먼저 변경 사항을 커밋하거나 스태시(stash)한 후에 git pull을 실행해야 합니다.

다음은 git pull을 사용하는 예제 코드입니다.

# 원격 저장소의 변경 사항을 가져와 현재 브랜치에 병합합니다.
git pull origin main
shell

git pull을 실행했는데 충돌(conflict)이 발생한다면 어떻게 해야 할까요? 충돌이 발생하면 Git은 자동으로 병합을 중단하고 충돌이 발생한 파일을 알려줍니다.

$ git pull origin main
 
From github.com:codingmax-tube/git-commands-cookbook
 * branch            main       -> FETCH_HEAD
Auto-merging hello.txt
CONFLICT (content): Merge conflict in hello.txt
error: could not apply e83fd3a... Update hello.txt
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply e83fd3a... Update hello.txt
shell

이때는 해당 파일을 열어 충돌이 발생한 지점을 확인합니다.

# 충돌이 발생한 경우 해당 파일을 수정합니다.
$ code hello.txt
text

그러면 아래와 같이 충돌 부분이 표시되어 있습니다.

<<<<<<< HEAD (Current Change)
Goodbye, world!
=======
H1e2l3l4o5, world
>>>>>>> e83fd3a (Update hello.txt) (Incoming Change)
text

위 충돌 파일에서 사용된 기호들의 의미는 다음과 같습니다:

  1. <<<<<<< HEAD (Current Change): 이 기호는 현재 브랜치(HEAD)에서의 변경 사항 시작을 나타냅니다. 이 기호 아래에는 현재 브랜치에서 변경된 내용이 표시됩니다.
  2. =======: 이 기호는 현재 브랜치의 변경 사항과 Pull하려는 브랜치의 변경 사항 사이의 구분자 역할을 합니다. 이 기호를 기준으로 위쪽은 현재 브랜치의 변경 사항, 아래쪽은 Pull하려는 브랜치의 변경 사항을 나타냅니다.
  3. >>>>>>> e83fd3a (Update hello.txt) (Incoming Change): 이 기호는 Pull하려는 브랜치의 변경 사항 끝을 나타냅니다. 이 기호 위에는 Pull하려는 브랜치에서 변경된 내용이 표시됩니다. 또한, 해당 변경 사항이 어떤 커밋(commit)에 해당하는지 커밋 해시(예: e83fd3a)와 커밋 메시지(예: Update hello.txt)가 함께 표시됩니다.

충돌이 발생한 파일에서는 이러한 기호를 사용하여 현재 브랜치와 풀하려는 브랜치 간의 충돌 부분을 명확히 구분합니다. 개발자는 이 충돌 부분을 수동으로 해결하고, 필요한 변경 사항을 선택하거나 수정한 후 파일을 저장해야 합니다.

저는 hello.txt파일 내용이 Goodbye, world! 이길 원하므로 아래와 같이 충돌을 해결합니다.

Goodbye, world!
text

이렇게 충돌을 해결(resolved)한 후 다시 git addgit commit을 실행하면 됩니다.

# 충돌을 해결했다면 파일을 추가하고 커밋합니다.
$ git add hello.txt
$ git commit -m "Resolve conflicts"
 
[detached HEAD a13c962] Resolve conflicts
 1 file changed, 1 insertion(+), 1 deletion(-)
shell

위 예제 코드를 보면 git pull origin main을 실행하여 origin 원격 저장소의 main 브랜치에서 변경 사항을 가져와 현재 브랜치에 병합하는 것을 볼 수 있습니다. 병합 과정에서 hello.txt 파일에서 충돌이 발생했기 때문에 hello.txt 파일을 열어 충돌을 해결한 후 git addgit commit을 실행하여 충돌을 해결하였습니다.

git pull은 협업 과정에서 매우 자주 사용되는 명령어입니다. 팀원들과 함께 프로젝트를 진행할 때는 git pull을 사용하여 원격 저장소의 최신 변경 사항을 자주 가져오는 것이 좋습니다. 이렇게 하면 충돌을 미리 방지하고 프로젝트를 원활하게 진행할 수 있습니다. 그리고 병합 과정에서 충돌은 자주 발생하기 때문에 해결(resolve)하는 과정에 익숙해질 필요가 있습니다. 그래야 협업 시 충돌이 발생했을 때 당황하지 않거든요.

좀 더 나아가 git pull을 사용할 때는 다음 사항을 고려해 보세요.

  • git pull 명령어를 실행하기 전에 항상 git status를 사용하여 로컬 저장소의 상태를 확인하세요. 커밋되지 않은 변경 사항이 있다면 git pull을 실행할 수 없습니다.
  • git pull 명령어를 실행할 때는 항상 -rebase 옵션을 사용하는 것이 좋습니다. git pull --rebase를 사용하면 로컬 브랜치의 커밋들이 원격 저장소의 커밋들 위에 재정렬되어 깔끔한 히스토리를 유지할 수 있습니다.
# --rebase 옵션을 사용하여 git pull을 실행합니다.
$ git pull --rebase origin main
 
shell
  • 충돌이 발생했을 때는 당황하지 말고 차분히 충돌을 해결하세요. 충돌이 발생한 파일을 열어 충돌 마커(<<<<<<<, =======, >>>>>>>)를 찾아 충돌을 해결합니다.

lecture image

위 다이어그램은 git pull을 실행하는 과정을 나타낸 것입니다. 로컬 저장소에 변경 사항이 있는지 확인한 후, 변경 사항이 있다면 git addgit commit을 실행합니다. 그리고 git pull을 실행하여 원격 저장소의 변경 사항을 가져옵니다.

git pull을 실행했을 때 충돌이 발생하면 충돌을 해결한 후 다시 git addgit commit을 실행합니다. 충돌이 발생하지 않았다면 병합이 완료됩니다.

이렇게 git pull 명령어에 대해 자세히 알아보았습니다. git pull은 협업 과정에서 없어서는 안 될 명령어이므로 꼭 숙지하시기 바랍니다.