Pink Spider/git history 전부 없애고 reset 하는 방법

Created Mon, 24 Mar 2025 20:18:45 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
2899 Words 13 min

git history 전부 없애고 reset 하는 방법

  • git history 를 왜 없애야 할까?
    • 자주있는 일은 아니지만, git history를 전부 날리고 reset 해야 할 때가 있습니다..
    • 예를 들어, 서버의 비밀번호나 암복호화 key, 개인정보 등 노출되면 민감정보나 파일등이 git에 올라가 버렸다면?
    • 해당 내용을 지우고 다시 commit & push를 했지만, history를 보고 이전 commit을 불러오면 그만이므로, 해결책이 될 수 없지요.
    • 아예 history까지 날려버려서 이전의 실수(꼭 실수했을때만 reset 한다고 할 수는 없지만)를 이력까지 지웁시다.

main 혹은 develop등 남겨놓을 브랜치에서 (여기선 main)

  • –orphan 은 기존커밋 이력없이…의 의미입니다. 즉, 기존 이력없이 시작하는 브랜치를 하나 만듭니다.
    git checkout --orphan latest_branch
    

새로 커밋

git add .
git commit -m "initial commit after reset"

기존 브랜치 날리고 새로 만듦

git branch -D main
git branch -m main

main에 force push하고 불필요한 내용 정리해서 repo 최적화

git push -f origin main
git gc --aggressive --prune=all

image

잠깐만요. 걍 history만 날리면 끝이 아니죠.

이게 어떤 영향을 미치는 지 알아봅시다

이렇게 하면, 기존에 main에서 새로 딴 branch는 어떻게 되는가에 대한 gpt 답

  • 말씀하신 작업 흐름은 main 브랜치를 완전히 리셋하고 새로 만든 뒤 강제로 푸시하는 절차인데, 이 경우 main 브랜치 기반으로 분기된 다른 브랜치들에 어떤 영향을 주는가는 꽤 중요한 문제죠.

🔧 다시 한 번 요약: 이 명령어들의 의미

# 기존 커밋 이력 없는 새 브랜치 생성
git checkout --orphan latest_branch

# 모든 파일 스테이징 & 커밋
git add .
git commit -m "initial commit after reset"

# 기존 main 브랜치 삭제
git branch -D main

# 새 orphan 브랜치를 main으로 리네임
git branch -m main

# 원격 main을 강제 푸시 (히스토리 덮어쓰기)
git push -f origin main

# 정리: 쓰이지 않는 객체 제거
git gc --aggressive --prune=all

🧨 핵심 질문: 기존 main에서 분기한 브랜치들은 어떻게 되는가?

로컬 분기(branch)

  • 기존 main에서 분기한 **로컬 브랜치들(dev, feature/xxx 등)**은 여전히 존재하고, 기존 커밋 히스토리를 그대로 유지합니다.
  • 단, main 브랜치가 새 히스토리로 덮여서 과거의 main과 연결이 끊깁니다.
  • 이로 인해 main에 rebase하거나 merge하려고 하면 충돌 또는 연결 오류가 날 수 있습니다.

📌 예시 상황

# 기존 dev 브랜치: main에서 분기됨 → 커밋 A-B-C
# 새 main: 커밋 X (완전 다른 히스토리)

# dev에서 merge main 하려 하면?
git checkout dev
git merge main

결과: 충돌 발생 가능성 높음 또는 “공통 조상 없음” 에러!


🌐 원격 저장소의 브랜치들

  • 원격에 푸시된 feature/*, dev 등은 그대로 유지됨.
  • 다만 main이 강제로 덮여쓰였기 때문에, GitHub나 GitLab 같은 곳에서 PR 기록이나 브랜치 그래프가 엉켜 보일 수 있음.

🧩 시각화 (전후 비교)

[기존 상태]

main:      A---B---C
             \
dev:          D---E
feature:      F

[orphan 리셋 후]

main:      X   ← 완전 새 커밋
             \
dev:          D---E   ← 여전히 존재하지만 연결은 끊김

⚠️ 정리하자면

항목 영향
로컬 분기 브랜치 남아 있지만 main과 연결 끊김
원격 브랜치 삭제 안 됨. 여전히 존재
병합/rebase 시도 히스토리 불일치로 충돌 위험
협업자에게 영향 협업자들이 main을 기준으로 작업 중이었다면 충격 큼
git gc 영향 삭제된 커밋이 완전히 제거되며 복구 어려움

✅ 대안 (만약 협업 중이라면)

  • 완전히 덮기 전에 기존 mainbackup-main 같은 이름으로 남겨두기:
git branch backup-main
  • 또는 mainreset-main으로 새로 만들고 default 브랜치를 바꾸는 방식도 고려할 수 있어요.

여러명이 협업중인 repository 에서 브랜치 충돌없이 안정되게 초기화하려면?


🎯 목표

  • main 브랜치 히스토리를 깨끗이 리셋 (예: 민감한 파일 제거, 초기화 등)
  • 기존 브랜치(dev, feature/* 등)는 그대로 유지
  • 협업자들과 충돌 없이 진행

🛡️ 안전한 전략 요약

  1. ✅ 기존 main을 백업 브랜치로 남김
  2. 🆕 새로운 orphan 브랜치 생성 (이력 없는 새 시작)
  3. 🔁 새 커밋 생성 후, main에 강제 푸시
  4. 📢 팀원들에게 공지 (강제 리베이스 or 주의 필요)
  5. 🧹 (선택) 나중에 git gc로 정리

🛠️ 추천 스크립트 (협업 안전 버전)

# 1. 현재 브랜치가 main인지 확인
git checkout main

# 2. main 백업 브랜치 생성
git checkout -b backup-main-$(date +%Y%m%d)

# 3. orphan 브랜치로 새 시작
git checkout --orphan reset-main

# 4. 기존 트래킹 파일 제거
git rm -rf .

# 5. 필요한 파일 추가
echo "# 프로젝트 초기화" > README.md
git add .
git commit -m "초기화된 main 커밋"

# 6. main 이름으로 변경
git branch -D main
git branch -m main

# 7. 강제 푸시 (주의!)
git push -f origin main

💡 강제 푸시 전, GitHub의 기본 브랜치가 main인지 확인하고, 혹시 모를 문제에 대비해 백업 브랜치를 origin에도 푸시해두세요:

git push origin backup-main-$(date +%Y%m%d)

📣 팀원에게 꼭 공지할 사항

⚠️ [중요] main 브랜치 히스토리가 초기화되었습니다.

- 기존 main에서 작업하던 feature 브랜치들은 main과 연결이 끊겼습니다.
- 새로운 main을 기준으로 작업하려면 다음 중 하나를 선택하세요:

1. 새 main에서 브랜치를 새로 만들고 코드 복사
2. 기존 브랜치 유지 시, rebase 시도 시 충돌 주의
3. 필요한 경우 backup-main-YYYYMMDD 브랜치 참고

문의사항은 <당신 이름>에게 DM 주세요 🙏

📦 기타 팁

🔐 민감한 파일이 있어서 초기화한 경우라면?

👥 GitHub Actions, PR 기록 등도 리셋됨

  • CI 연동은 다시 설정 필요할 수 있음
  • PR들은 main 기준이 바뀌면 혼란스러울 수 있음

📌 정리

작업 설명
main 백업 히스토리 복구용 안전장치
--orphan 브랜치 이력 없는 새 시작
git push -f 기존 히스토리 덮기
팀원 공지 가장 중요한 부분 (충돌 방지!)

팀원들이 충돌 없이 새 main에 맞추는 방법 (rebase, cherry-pick, patch 적용 등)

main 브랜치를 리셋하고 나면, 기존 브랜치들 (dev, feature/xxx 등)이 이전 main을 기반으로 만들어졌기 때문에, 새로 리셋된 main과는 히스토리상 연결 고리가 끊기게 됩니다. 이때 충돌 없이 팀원들이 새 main에 맞추는 방법을 아래 3가지 전략으로 정리해드릴게요.


✅ 상황 요약

  • 기존 브랜치: main의 과거 이력을 기준으로 분기
  • 현재 main: orphan으로 만든 완전 새로운 히스토리
  • 문제: git rebase main 또는 git merge main공통 조상이 없어 충돌

🔧 선택지 1: 안전하고 깔끔한 방식 – 새 브랜치 만들고 코드 복사 (추천)

절차

# 최신 main 기준으로 새 브랜치 생성
git checkout main
git pull
git checkout -b feature/xxx-reset

# 예전 브랜치에서 작업한 커밋 확인
git log feature/xxx --oneline

# 필요한 커밋만 cherry-pick 또는 수동으로 복사
git cherry-pick <커밋 해시>
# 또는
# 옛 브랜치 체크아웃해서 코드 복사 후 커밋

장점

  • 히스토리 충돌 없음
  • 새로운 main과 완전 정리된 형태로 재작업 가능

🔧 선택지 2: cherry-pick 으로 원하는 커밋만 골라오기

# main 기반 새 브랜치
git checkout main
git pull
git checkout -b new-feature

# 기존 브랜치 커밋 로그 확인
git log old-feature --oneline

# 필요한 커밋만 가져오기
git cherry-pick <커밋해시1> <커밋해시2> ...

cherry-pick 시 충돌이 생기면 수동으로 해결 후 git cherry-pick --continue 하시면 됩니다.


🔧 선택지 3: 패치 방식으로 적용 (format-patch + am)

1. 기존 브랜치의 커밋을 패치로 저장

git checkout feature/old
git format-patch main  # main과의 차이만 저장 (기존 main 기준)

→ 이러면 0001-some-change.patch 파일들이 생성돼요.

2. 새로운 main 브랜치에 패치 적용

git checkout main
git pull
git checkout -b new-feature
git am 000*.patch

충돌 시 git am --abort로 취소 가능.


📘 예시 시나리오

팀원 Alice의 기존 브랜치 feature/login

# Alice가 새 main 기준 브랜치 생성
git checkout main
git checkout -b feature/login-reset

# 옛 브랜치에서 코드 복사 또는 cherry-pick
git cherry-pick a1b2c3d4

또는

# 코드만 복사해서 수동 커밋
cp -r ../old-repo/feature/login/* .
git add .
git commit -m "Re-applied login feature after main reset"

📣 팀원 공지 예시

🛠 [Git 브랜치 초기화 안내]

main 브랜치가 완전히 새로 초기화되었습니다 (히스토리 리셋).

기존 브랜치에서 작업하던 분들은 아래 중 하나로 옮겨주세요:

1️⃣ 새로운 main 기준으로 브랜치 생성
2️⃣ 필요한 커밋은 cherry-pick 하거나 수동 복사
3️⃣ 이전 브랜치는 삭제하지 마세요! 참고용으로 사용합니다.

문의: <담당자>

💬 요약

방법 설명 안정성 추천
새 브랜치 & 코드 복사 충돌 없음, 깔끔 ★★★★★ ✅ ✅ ✅
cherry-pick 원하는 커밋만 골라 적용 ★★★★☆
patch 대량 커밋도 가능 ★★★☆☆ 고급 사용 시