git 강제 pull 방법 완전 정리 | 로컬 변경사항 날리고 원격으로 맞추기

로컬 변경사항을 깔끔하게 버리고 원격 기준으로 다시 맞추고 싶을 때가 있습니다. merge 하다가 꼬여서 git conflict가 나거나, rebase를 잘못했거나 등 git 강제 pull(로컬 초기화 후 원격 동기화)을 하면 됩니다.

저도 실무에서 가장 자주 쓰는 Git 명령어 인데 까먹을때가 있어서 블로그에 정리해놓고자 합니다.

이 글에서는 강제 pull 3단계 명령어를 중심으로, fetch / pull / rebase가 각각 어떻게 다른지, 그리고 상황에 따라 어떤 명령어를 선택해야 하는지까지 정리했습니다.

📌 git 강제 pull, 한눈에 정리

git 강제 pull은 fetch --all로 원격 정보 수신 → reset --hard로 로컬 초기화 → pull로 최종 동기화 순서로 진행합니다. 로컬의 모든 커밋과 변경사항이 삭제되므로 반드시 필요한 작업만 stash 또는 백업 후 실행해야 합니다.

git fetch --all
git reset --hard origin/master
git pull origin master

📋 이 글의 핵심 요약

  1. 강제 pull 3단계 — fetch --all → reset --hard → pull 순서
  2. fetch — 원격 정보만 가져옴, 로컬 파일 변경 없음
  3. pull — fetch + merge 자동 실행, 충돌 발생 가능
  4. rebase — 히스토리를 선형으로 정리하며 병합
  5. reset --hard — 되돌릴 수 없음, 실행 전 반드시 확인

강제 pull이 필요한 상황 — 언제 쓰는 명령어인가

일반적인 git pull은 원격 변경사항을 로컬에 머지합니다. 충돌이 없으면 깔끔하게 처리되지만, 아래 상황에서는 그냥 pull이 막히거나 엉킵니다.

  • 팀원이 git push --force를 해서 원격 히스토리가 바뀐 경우
  • 로컬에서 이것저것 실험하다가 커밋이 꼬인 경우
  • 로컬 변경사항을 전부 버리고 원격 기준으로 완전히 초기화하고 싶은 경우
  • 머지 충돌이 너무 복잡해서 그냥 원격 것으로 덮어쓰고 싶은 경우

이럴 때 가장 확실한 방법이 아래 3줄입니다.

# 원격 저장소의 최신 정보를 모두 가져온다 (파일 변경 없음)
git fetch --all

# 로컬 브랜치를 원격 기준으로 강제 초기화 (로컬 변경사항 전부 삭제)
git reset --hard origin/master

# 최신 커밋을 로컬에 반영
git pull origin master

⚠️ 실행 전 반드시 확인

git reset --hard되돌릴 수 없습니다. 로컬의 커밋되지 않은 변경사항과 스테이징된 파일이 모두 삭제됩니다. 필요한 작업이 있다면 먼저 git stash로 임시 저장하거나 별도 브랜치로 백업하세요.

3단계 명령어, 각각 무슨 일을 하나

① git fetch --all

원격 저장소(origin)의 모든 브랜치 최신 정보를 로컬로 가져옵니다. 중요한 점은 로컬 파일을 건드리지 않는다는 것입니다. 원격에 어떤 변경이 있었는지 “정보만” 받아오는 단계입니다.

--all 옵션은 origin 외에 여러 remote가 등록되어 있을 때 전부 fetch합니다. remote가 origin 하나뿐이라면 git fetch origin과 결과가 같습니다.

② git reset --hard origin/master

현재 로컬 브랜치를 origin/master가 가리키는 커밋으로 강제로 맞춥니다. 이 과정에서 로컬의 커밋되지 않은 변경사항, 스테이징된 파일이 전부 사라집니다.

--hard 외에도 --soft, --mixed 옵션이 있습니다.

옵션 커밋 히스토리 스테이징 영역 작업 파일
--soft 되돌림 유지 유지
--mixed (기본) 되돌림 초기화 유지
--hard 되돌림 초기화 삭제

③ git pull origin master

reset 후에도 pull을 한 번 더 실행하는 이유는, fetch와 reset 사이에 원격에 새 커밋이 추가됐을 가능성을 대비하기 위해서입니다. 대부분의 경우엔 이미 최신 상태라 “Already up to date.” 메시지가 뜨지만, 습관적으로 붙여두는 것이 안전합니다.

fetch / pull / rebase — 헷갈리는 세 명령어 차이

📌 세 명령어 한줄 정의

원격과 로컬을 동기화하는 방식이 각각 다릅니다. fetch → 정보만 수신, pull → fetch + merge 자동 실행, rebase → 히스토리 재정렬 후 병합 순으로 이해하면 됩니다.

git fetch — 확인만 하고 싶을 때

원격의 변경사항을 로컬에 다운로드하지만 현재 작업 브랜치에는 적용하지 않습니다. 원격에 어떤 커밋이 추가됐는지 먼저 확인하고 싶을 때 유용합니다.

git fetch origin
# 이후 원격과 로컬 차이 확인
git log HEAD..origin/master --oneline

fetch 후 git log HEAD..origin/master를 실행하면 원격에는 있고 로컬에는 없는 커밋 목록을 볼 수 있습니다. 머지 전에 뭐가 들어왔는지 미리 검토할 수 있는 것이 장점입니다.

git pull — 가장 흔히 쓰는 방식

git pullfetch + merge를 한 번에 실행합니다. 로컬과 원격에 각각 커밋이 있으면 자동으로 머지 커밋을 생성합니다. 충돌이 없으면 깔끔하지만, 충돌이 생기면 직접 해결해야 합니다.

git pull origin master
# 내부적으로 아래 두 명령어와 동일
git fetch origin
git merge origin/master

git pull --rebase — 히스토리를 깔끔하게 유지하고 싶을 때

git pull --rebase는 fetch 후 merge 대신 rebase를 실행합니다. 머지 커밋이 생기지 않아서 히스토리가 선형으로 유지됩니다. 팀에서 “불필요한 머지 커밋을 줄이자”는 규칙이 있다면 이 방식을 기본으로 쓰기도 합니다.

git pull --rebase origin master
# 내부적으로 아래 두 명령어와 동일
git fetch origin
git rebase origin/master

개인적으로는 혼자 작업하는 feature 브랜치에서는 --rebase를 선호합니다. 로그를 봤을 때 “내가 한 작업”과 “원격에서 받은 작업”이 섞이지 않고 보기 좋거든요. 다만 이미 공유된 브랜치에서 rebase를 하면 다른 팀원의 히스토리가 꼬일 수 있으니 주의가 필요합니다.

상황별로 어떤 명령어를 써야 하나

상황 권장 명령어 이유
로컬을 원격으로 완전 초기화 fetch --all + reset --hard 가장 확실하게 원격 기준으로 맞춤
일반적인 최신화 (충돌 없음) git pull 빠르고 간단
머지 커밋 없이 히스토리 유지 git pull --rebase 선형 히스토리 유지
원격 변경사항 먼저 확인 git fetchgit log 적용 전 내용 검토 가능
팀원이 force push한 브랜치 받기 fetch --all + reset --hard 일반 pull로는 히스토리 충돌 발생

실수로 reset --hard 했을 때 — 복구 방법

reset --hard를 실행했는데 필요한 작업이 날아갔다면, Git의 reflog로 복구할 수 있는 경우가 있습니다. Git은 HEAD가 이동한 모든 기록을 일정 기간 보관합니다.

# HEAD 이동 히스토리 확인
git reflog

# 출력 예시
a1b2c3d HEAD@{0}: reset: moving to origin/master
e4f5g6h HEAD@{1}: commit: 작업 내용

# 되돌리고 싶은 커밋으로 reset
git reset --hard e4f5g6h

단, 커밋 자체를 하지 않은 변경사항(untracked files, unstaged changes)은 reflog로도 복구할 수 없습니다. reset --hard 전에 git stash로 임시 저장하는 습관이 중요한 이유입니다.

reset --hard 전 안전하게 백업하는 방법

# 방법 1: stash로 임시 저장
git stash
# reset 후 필요하면 꺼내기
git stash pop

# 방법 2: 백업 브랜치 생성
git checkout -b backup/before-reset
git checkout master
# 이후 강제 pull 진행

💬 실무에서 이 3단계 명령어를 가장 많이 쓰는 시점은 월요일 아침입니다. 금요일 퇴근 후 팀원들이 작업을 머지하고, 월요일에 출근해서 로컬을 최신화할 때 로컬에 미완성 작업이 남아있으면 그냥 fetch + reset으로 깔끔하게 시작합니다. 다만 stash를 먼저 하는 것은 습관이 됐고, 실제로 reset 후 꺼내 쓴 적도 두어 번 있습니다.

📊 어떤 명령어를 써야 할지 모르겠다면?

로컬 변경사항을 전부 버리고 원격으로 완전히 맞추고 싶다면 fetch --all + reset --hard가 가장 확실합니다. 단, 실행 전 stash 백업은 필수입니다.

로컬 작업을 유지하면서 원격 최신화만 하고 싶다면 git pull 또는 git pull --rebase를 쓰세요.

다만 공유 브랜치에서 rebase는 주의가 필요합니다. 다른 팀원의 히스토리가 꼬일 수 있으므로 개인 feature 브랜치에서만 사용하는 것이 안전합니다.

✅ 정리 — 세 줄 명령어, 상황 파악이 먼저입니다

git 강제 pull은 강력한 만큼 되돌릴 수 없는 명령어입니다. 상황에 맞게 선택하는 것이 중요합니다.

  • 완전 초기화fetch --all + reset --hard origin/master + pull
  • 일반 최신화git pull origin master
  • 히스토리 정리git pull --rebase origin master
  • reset 전 백업git stash 또는 백업 브랜치 생성
  • 실수 후 복구git reflog로 이전 커밋 확인 후 reset

자주 묻는 질문 (FAQ)

Q. git reset --hard 후 커밋하지 않은 파일을 복구할 수 있나요?
커밋된 파일은 git reflog로 복구가 가능합니다. 하지만 커밋하지 않은 변경사항(unstaged, untracked)은 복구할 수 없습니다. 실행 전 git stash로 반드시 임시 저장하세요.
Q. git fetch와 git pull의 차이가 무엇인가요?
fetch는 원격 정보를 가져오기만 하고 로컬 파일을 변경하지 않습니다. pull은 fetch 후 merge까지 자동으로 실행합니다. 원격에 어떤 변경이 있었는지 먼저 확인하고 싶다면 fetch를 먼저 실행하세요.
Q. origin/master 대신 origin/main을 써야 하는 경우는?
GitHub는 2020년 이후 기본 브랜치 이름을 master에서 main으로 변경했습니다. 저장소의 기본 브랜치가 main이라면 origin/main으로 바꿔 쓰면 됩니다. git branch -r로 원격 브랜치 목록을 확인할 수 있습니다.
Q. git pull --rebase는 언제 쓰면 안 되나요?
이미 원격에 push된 공유 브랜치에서는 rebase를 피해야 합니다. rebase는 커밋 해시를 새로 만들기 때문에, 같은 브랜치를 쓰는 팀원의 히스토리와 충돌이 생깁니다. 개인 feature 브랜치처럼 혼자만 쓰는 브랜치에서만 사용하는 것이 안전합니다.
Q. git fetch --all에서 --all 옵션은 무슨 의미인가요?
등록된 모든 remote를 fetch한다는 의미입니다. 일반적으로 remote가 origin 하나뿐이라면 git fetch origin과 결과가 동일합니다. upstream 등 여러 remote를 등록해서 쓰는 경우에 --all이 유용합니다.
Q. reset --hard 후 git pull을 한 번 더 하는 이유가 있나요?
fetch와 reset 사이에 원격에 새 커밋이 추가될 가능성을 대비하기 위해서입니다. 대부분은 “Already up to date.”로 끝나지만, 완전한 동기화를 보장하는 습관으로 붙여두는 것이 안전합니다.
Q. git stash와 git stash pop은 어떻게 쓰나요?
git stash는 현재 변경사항을 임시 저장하고 워킹 디렉토리를 깨끗한 상태로 만듭니다. git stash pop은 가장 최근 stash를 꺼내 적용합니다. reset --hard 전에 stash로 저장해두면 이후 필요할 때 꺼낼 수 있습니다.

💬 댓글은 모두 직접 확인하고 답변드립니다. 궁금한 점, 추가 정보 요청, 경험 공유 모두 환영합니다 🙂
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments