로컬 변경사항을 깔끔하게 버리고 원격 기준으로 다시 맞추고 싶을 때가 있습니다. merge 하다가 꼬여서 git conflict가 나거나, rebase를 잘못했거나 등 git 강제 pull(로컬 초기화 후 원격 동기화)을 하면 됩니다.
저도 실무에서 가장 자주 쓰는 Git 명령어 인데 까먹을때가 있어서 블로그에 정리해놓고자 합니다.
이 글에서는 강제 pull 3단계 명령어를 중심으로, fetch / pull / rebase가 각각 어떻게 다른지, 그리고 상황에 따라 어떤 명령어를 선택해야 하는지까지 정리했습니다.
📌 git 강제 pull, 한눈에 정리
git 강제 pull은 fetch --all로 원격 정보 수신 → reset --hard로 로컬 초기화 → pull로 최종 동기화 순서로 진행합니다. 로컬의 모든 커밋과 변경사항이 삭제되므로 반드시 필요한 작업만 stash 또는 백업 후 실행해야 합니다.
git reset --hard origin/master
git pull origin master
📋 이 글의 핵심 요약
- 강제 pull 3단계 — fetch --all → reset --hard → pull 순서
- fetch — 원격 정보만 가져옴, 로컬 파일 변경 없음
- pull — fetch + merge 자동 실행, 충돌 발생 가능
- rebase — 히스토리를 선형으로 정리하며 병합
- 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 log HEAD..origin/master --oneline
fetch 후 git log HEAD..origin/master를 실행하면 원격에는 있고 로컬에는 없는 커밋 목록을 볼 수 있습니다. 머지 전에 뭐가 들어왔는지 미리 검토할 수 있는 것이 장점입니다.
git pull — 가장 흔히 쓰는 방식
git pull은 fetch + merge를 한 번에 실행합니다. 로컬과 원격에 각각 커밋이 있으면 자동으로 머지 커밋을 생성합니다. 충돌이 없으면 깔끔하지만, 충돌이 생기면 직접 해결해야 합니다.
# 내부적으로 아래 두 명령어와 동일
git fetch origin
git merge origin/master
git pull --rebase — 히스토리를 깔끔하게 유지하고 싶을 때
git pull --rebase는 fetch 후 merge 대신 rebase를 실행합니다. 머지 커밋이 생기지 않아서 히스토리가 선형으로 유지됩니다. 팀에서 “불필요한 머지 커밋을 줄이자”는 규칙이 있다면 이 방식을 기본으로 쓰기도 합니다.
# 내부적으로 아래 두 명령어와 동일
git fetch origin
git rebase origin/master
개인적으로는 혼자 작업하는 feature 브랜치에서는 --rebase를 선호합니다. 로그를 봤을 때 “내가 한 작업”과 “원격에서 받은 작업”이 섞이지 않고 보기 좋거든요. 다만 이미 공유된 브랜치에서 rebase를 하면 다른 팀원의 히스토리가 꼬일 수 있으니 주의가 필요합니다.
상황별로 어떤 명령어를 써야 하나
| 상황 | 권장 명령어 | 이유 |
|---|---|---|
| 로컬을 원격으로 완전 초기화 | fetch --all + reset --hard |
가장 확실하게 원격 기준으로 맞춤 |
| 일반적인 최신화 (충돌 없음) | git pull |
빠르고 간단 |
| 머지 커밋 없이 히스토리 유지 | git pull --rebase |
선형 히스토리 유지 |
| 원격 변경사항 먼저 확인 | git fetch 후 git log |
적용 전 내용 검토 가능 |
| 팀원이 force push한 브랜치 받기 | fetch --all + reset --hard |
일반 pull로는 히스토리 충돌 발생 |
실수로 reset --hard 했을 때 — 복구 방법
reset --hard를 실행했는데 필요한 작업이 날아갔다면, Git의 reflog로 복구할 수 있는 경우가 있습니다. Git은 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 전 안전하게 백업하는 방법
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)
git reflog로 복구가 가능합니다. 하지만 커밋하지 않은 변경사항(unstaged, untracked)은 복구할 수 없습니다. 실행 전 git stash로 반드시 임시 저장하세요.origin/main으로 바꿔 쓰면 됩니다. git branch -r로 원격 브랜치 목록을 확인할 수 있습니다.git fetch origin과 결과가 동일합니다. upstream 등 여러 remote를 등록해서 쓰는 경우에 --all이 유용합니다.git stash는 현재 변경사항을 임시 저장하고 워킹 디렉토리를 깨끗한 상태로 만듭니다. git stash pop은 가장 최근 stash를 꺼내 적용합니다. reset --hard 전에 stash로 저장해두면 이후 필요할 때 꺼낼 수 있습니다.