🔥 git pull
Git은 여러 명이 협업하며 프로젝트를 진행할 때 매우 유용한 도구입니다. 팀원들과 함께 작업하다 보면 원격 저장소에 변경 사항이 생기기 마련인데요. 이때 git pull
명령어를 사용하면 원격 저장소의 최신 변경 사항을 로컬 저장소로 가져올 수 있습니다.
git pull
명령어는 다음과 같이 사용합니다.
git pull <remote> <branch>
shell
<remote>
는 원격 저장소의 이름입니다. 보통origin
을 많이 사용하죠.<branch>
는 가져오고자 하는 브랜치의 이름입니다. 예를 들어main
브랜치의 변경 사항을 가져오고 싶다면git pull origin main
과 같이 사용하면 됩니다.
git pull
명령어를 실행하면 Git은 다음 작업을 수행합니다.
- 원격 저장소에서 변경 사항을 가져옵니다.
- 현재 브랜치에 원격 저장소의 변경 사항을 병합(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
위 충돌 파일에서 사용된 기호들의 의미는 다음과 같습니다:
<<<<<<< HEAD (Current Change)
: 이 기호는 현재 브랜치(HEAD)에서의 변경 사항 시작을 나타냅니다. 이 기호 아래에는 현재 브랜치에서 변경된 내용이 표시됩니다.=======
: 이 기호는 현재 브랜치의 변경 사항과 Pull하려는 브랜치의 변경 사항 사이의 구분자 역할을 합니다. 이 기호를 기준으로 위쪽은 현재 브랜치의 변경 사항, 아래쪽은 Pull하려는 브랜치의 변경 사항을 나타냅니다.>>>>>>> e83fd3a (Update hello.txt) (Incoming Change)
: 이 기호는 Pull하려는 브랜치의 변경 사항 끝을 나타냅니다. 이 기호 위에는 Pull하려는 브랜치에서 변경된 내용이 표시됩니다. 또한, 해당 변경 사항이 어떤 커밋(commit)에 해당하는지 커밋 해시(예: e83fd3a)와 커밋 메시지(예: Update hello.txt)가 함께 표시됩니다.
충돌이 발생한 파일에서는 이러한 기호를 사용하여 현재 브랜치와 풀하려는 브랜치 간의 충돌 부분을 명확히 구분합니다. 개발자는 이 충돌 부분을 수동으로 해결하고, 필요한 변경 사항을 선택하거나 수정한 후 파일을 저장해야 합니다.
저는 hello.txt
파일 내용이 Goodbye, world!
이길 원하므로 아래와 같이 충돌을 해결합니다.
Goodbye, world!
text
이렇게 충돌을 해결(resolved)한 후 다시 git add
와 git 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 add
와 git 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
- 충돌이 발생했을 때는 당황하지 말고 차분히 충돌을 해결하세요. 충돌이 발생한 파일을 열어 충돌 마커(
<<<<<<<
,=======
,>>>>>>>
)를 찾아 충돌을 해결합니다.
위 다이어그램은 git pull
을 실행하는 과정을 나타낸 것입니다. 로컬 저장소에 변경 사항이 있는지 확인한 후, 변경 사항이 있다면 git add
와 git commit
을 실행합니다. 그리고 git pull
을 실행하여 원격 저장소의 변경 사항을 가져옵니다.
git pull
을 실행했을 때 충돌이 발생하면 충돌을 해결한 후 다시 git add
와 git commit
을 실행합니다. 충돌이 발생하지 않았다면 병합이 완료됩니다.
이렇게 git pull
명령어에 대해 자세히 알아보았습니다. git pull
은 협업 과정에서 없어서는 안 될 명령어이므로 꼭 숙지하시기 바랍니다.