포스트

[GitHub 100일 챌린지] Day 33 - git pull로 다운로드

[GitHub 100일 챌린지] Day 33 - git pull로 다운로드

100일 챌린지 Day 33 - GitHub의 최신 변경사항을 로컬로 가져옵니다

배울 내용

  1. git pull 기본 개념
  2. pull 충돌 해결
  3. pull 전략과 옵션

Topic1. git pull 기본 개념

git pull = Remote → 로컬 다운로드

GitHub의 최신 변경사항을 내 컴퓨터로 가져옵니다.

기본 문법

1
git pull <remote> <branch>

예시:

1
git pull origin main

의미:

1
2
3
origin(GitHub)의 main 브랜치에서
최신 변경사항을 다운로드하여
로컬 main 브랜치에 합침

pull은 2단계

git pull = fetch + merge:

1
2
3
# pull 한 번 = 아래 두 명령어
git fetch origin main
git merge origin/main

단계별 설명:

1
2
1. fetch: Remote 변경사항 다운로드
2. merge: 로컬 브랜치에 합치기

간단하게 pull

1
2
3
4
5
# upstream 설정되어 있으면
git pull

# 자동으로 해석됨
= git pull origin main

해보기: 기본 Pull 실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 시나리오: 팀원이 코드를 push했다고 가정

# 1. 현재 상태 확인
git log --oneline -3

# 2. Pull로 최신 변경사항 받기
git pull origin main

# 3. 변경사항 확인
git log --oneline -3
# 새로운 커밋들이 추가됨!

# 4. 파일 확인
ls
cat README.md
# 팀원이 수정한 내용이 반영됨

결과: GitHub의 최신 코드가 로컬에 반영되었습니다


Topic2. pull 충돌 해결

같은 파일을 동시에 수정하면 충돌이 발생합니다.

충돌이 발생하는 경우

상황:

1
2
3
4
1. 내가 index.html 수정
2. 팀원도 index.html 수정하고 push
3. 내가 pull 시도
→ 충돌 발생!

충돌 메시지:

1
2
3
4
5
6
git pull origin main

# 출력
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

충돌 파일 확인

1
2
3
4
5
6
# 1. 상태 확인
git status
# both modified: index.html

# 2. 충돌 파일 열기
cat index.html

충돌 표시:

1
2
3
4
5
6
7
<body>
<<<<<<< HEAD
  <h1>내가 수정한 내용</h1>
=======
  <h1>팀원이 수정한 내용</h1>
>>>>>>> origin/main
</body>

표시 의미:

1
2
3
<<<<<<< HEAD: 내 로컬 변경사항
=======: 구분선
>>>>>>> origin/main: Remote 변경사항

충돌 해결 3단계

1단계: 충돌 수정

1
2
3
4
<!-- 둘 중 하나 선택 또는 합치기 -->
<body>
  <h1>합친 내용</h1>
</body>

2단계: 스테이징

1
git add index.html

3단계: 커밋

1
git commit -m "Merge conflict resolved"

충돌 해결 전략

전략 1: 내 변경사항 우선

1
2
3
4
# Remote 변경사항 버리고 내 것 유지
git checkout --ours index.html
git add index.html
git commit

전략 2: Remote 변경사항 우선

1
2
3
4
# 내 변경사항 버리고 Remote 것 사용
git checkout --theirs index.html
git add index.html
git commit

전략 3: 수동으로 합치기

1
2
3
4
5
# 파일 열어서 직접 수정
vim index.html
# <<<, ===, >>> 표시 제거하고 내용 합치기
git add index.html
git commit

해보기: 충돌 해결 실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 시뮬레이션: 의도적으로 충돌 만들기

# 1. 파일 수정 (push 안 함)
echo "My change" > file.txt
git add file.txt
git commit -m "My change"

# 2. GitHub 웹에서 같은 파일 수정
# (웹 에디터에서 file.txt를 "Team change"로 수정)

# 3. Pull 시도
git pull origin main
# CONFLICT!

# 4. 충돌 파일 확인
cat file.txt
# <<<<<<< HEAD
# My change
# =======
# Team change
# >>>>>>> origin/main

# 5. 충돌 해결 (합치기)
echo "My change and Team change" > file.txt

# 6. 스테이징과 커밋
git add file.txt
git commit -m "Resolve merge conflict"

# 7. Push
git push origin main

결과: 충돌을 성공적으로 해결하고 합쳤습니다


Topic3. pull 전략과 옵션

상황에 맞는 pull 옵션을 사용합니다.

pull 전략 선택

기본 merge 방식:

1
git pull origin main

흐름:

1
2
3
4
5
A---B---C (로컬 main)
     \
      D---E (origin/main)
       \
        F (merge 커밋)

rebase 방식:

1
git pull --rebase origin main

흐름:

1
2
A---B---D---E---C' (로컬 main)
        (origin/main)

차이점:

1
2
merge: 병합 커밋 생성
rebase: 커밋을 재정렬 (깔끔한 히스토리)

자주 쓰는 옵션

–no-commit:

1
2
3
4
5
6
# merge하지만 자동 커밋 안 함
git pull --no-commit origin main

# 변경사항 확인 후 직접 커밋
git status
git commit -m "Merge from origin"

–no-ff:

1
2
# 항상 merge 커밋 생성
git pull --no-ff origin main

–ff-only:

1
2
3
# Fast-forward만 허용
git pull --ff-only origin main
# Fast-forward 불가능하면 실패

–autostash:

1
2
3
# 작업 중인 내용 자동 stash
git pull --autostash origin main
# pull 후 자동으로 stash pop

pull 전 확인

안전하게 pull하기:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 현재 변경사항 확인
git status

# 2. 변경사항 있으면 커밋 또는 stash
git stash

# 3. Remote 확인 (다운로드만)
git fetch origin

# 4. 차이 확인
git diff main origin/main

# 5. 문제없으면 merge
git merge origin/main

# 또는 한번에
git pull origin main

pull 실패 시 복구

pull 중단:

1
2
3
4
5
# merge 중단
git merge --abort

# 또는 pull 중단
git pull --abort

이전 상태로 되돌리기:

1
2
3
4
5
# pull 전 상태로
git reset --hard HEAD@{1}

# 또는 특정 커밋으로
git reset --hard <commit-hash>

해보기: 다양한 pull 전략 실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 시나리오 1: rebase로 pull

# 1. 로컬에서 작업
echo "Local work" >> work.txt
git add work.txt
git commit -m "Local work"

# 2. rebase pull
git pull --rebase origin main

# 3. 히스토리 확인
git log --oneline --graph
# 일직선으로 깔끔하게 정렬됨!


# 시나리오 2: autostash 사용

# 1. 작업 중 (커밋 안 함)
echo "WIP" >> temp.txt
git add temp.txt

# 2. pull 필요
git pull --autostash origin main
# 자동으로 stash → pull → stash pop

# 3. 작업 계속
cat temp.txt
# WIP 내용이 그대로 있음!

결과: 상황에 맞는 pull 전략을 사용했습니다


정리

완료 체크:

  • git pull의 기본 개념을 안다
  • pull 충돌을 해결할 수 있다
  • 상황에 맞는 pull 전략을 사용할 수 있다

핵심 명령어:

1
2
3
4
5
6
git pull origin main             # 기본 pull
git pull --rebase origin main    # rebase로 pull
git pull --no-commit             # 자동 커밋 안 함
git pull --autostash             # stash 자동 처리
git merge --abort                # merge 중단
git pull --abort                 # pull 중단

Pull 흐름:

1
2
3
Remote Repository (GitHub) → git pull → Local Repository
       |                                      |
    최신 커밋                               최신 커밋

충돌 해결:

1
2
3
4
1. 충돌 파일 확인 (<<<, ===, >>>)
2. 내용 수정 (충돌 해결)
3. git add (스테이징)
4. git commit (커밋)

다음: Day 34 - git fetch 활용


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.