[GitHub 100일 챌린지] Day 33 - git pull로 다운로드
[GitHub 100일 챌린지] Day 33 - git pull로 다운로드
100일 챌린지 Day 33 - GitHub의 최신 변경사항을 로컬로 가져옵니다
배울 내용
- git pull 기본 개념
- pull 충돌 해결
- 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 라이센스를 따릅니다.
