Git School · FluxGit

잘못된 Git 브랜치에 커밋했을 때 안전하게 이동하기

FluxGit ·

각 블록은 다른 경우이며 하나의 실행 스크립트가 아닙니다. 저장소에 맞는 경우를 선택하고 브랜치 이름, 경로와 VERIFIED_COMMIT을 바꾸세요. 중단 명령은 해당 작업이 진행 중일 때만 사용하며 두 대안을 모두 실행하지 마세요.

핵심 답변

잘못된 브랜치에 커밋했다면 먼저 구조 브랜치로 원본을 참조하세요. 올바른 브랜치에 cherry-pick하고 결과를 검토한 다음 원래 브랜치를 수정합니다. 공유하지 않은 끝 커밋에는 reset이 맞을 수 있지만 공유한 브랜치에는 보통 revert를 씁니다. 대상 적용과 원본 수정은 별개의 판단입니다.

예시와 전제 조건

예시는 깨끗한 작업 트리에서 main 끝의 일반 커밋 하나를 기존 feature/fix로 옮깁니다. 병합 커밋은 아닙니다. 이름은 실제 브랜치로 바꾸세요. 여러 커밋, 병합 또는 이후 작업이 있다면 마지막 reset을 그대로 복사하지 말고 정확한 범위를 먼저 확인합니다.

변경 전에 상태 확인

상태, 현재 브랜치와 최근 그래프를 읽습니다. 제목만 보지 말고 파일과 패치를 확인하세요. 여러 작업이 섞일 수 있습니다. 전체 ID를 SCHOOL_MISTAKE에 저장하면 브랜치를 바꾼 후에도 원본을 식별합니다. main을 수정하기 전에 다른 사람이 그 이력을 받았는지 확인합니다.

git status --short
git branch --show-current
git log -5 --oneline --decorate
git show --stat HEAD
SCHOOL_MISTAKE=$(git rev-parse HEAD)

참조나 별도 체크아웃 보존

구조 브랜치는 커밋 객체를 접근 가능하게 유지할 뿐 미커밋 변경을 복사하지 않습니다. 로컬 편집은 의도한 커밋, 검토한 stash나 외부 복사로 따로 저장하고 확인하세요. -u stash는 추적하지 않는 파일을 포함하지만 무시된 파일은 제외합니다. reflog가 이런 저장되지 않은 내용을 자동 보관하지는 않습니다.

git branch rescue/wrong-branch "$SCHOOL_MISTAKE"
git show --stat rescue/wrong-branch

첫 번째 절차

대상 브랜치로 전환해 저장한 ID를 cherry-pick합니다. 부모가 달라져 보통 다른 ID의 새 커밋이 생깁니다. 패치와 프로젝트의 관련 검사를 확인하세요. 대상에 원하는 변경이 있고 원본 구조 참조가 남아 있음을 확인하기 전에는 원래 브랜치를 reset하지 않습니다.

git switch feature/fix
git cherry-pick "$SCHOOL_MISTAKE"
git show --stat HEAD

다른 결과를 의도적으로 선택

비공유 끝 커밋인 경우에만 main으로 돌아가 HEAD가 여전히 SCHOOL_MISTAKE인지 확인합니다. 깨끗한 트리와 구조 참조를 보존한 상태에서 부모로 reset하면 main에서 해당 커밋을 제거합니다. hard reset은 추적 파일도 바꿉니다. main이 진행했거나 커밋을 공유했다면 이 절차의 조건에 맞지 않습니다.

git switch main
git status --short
git rev-parse HEAD
git reset --hard "${SCHOOL_MISTAKE}^"

제한과 예외

공유한 브랜치에서는 일반 revert를 우선합니다. 다른 사람이 받은 이력을 지우지 않고 반대 변경을 새 커밋으로 추가합니다. 대상 cherry-pick과 원본 revert를 각각 검토하세요. 다른 곳에 병합했다면 협업자와 조정합니다. 이 문서는 자동 force push 절차가 아닙니다.

git switch main
git revert "$SCHOOL_MISTAKE"

충돌과 정리

cherry-pick은 충돌로 멈출 수 있습니다. status를 읽고 해당 파일을 해결해 스테이지한 뒤 계속합니다. 변경이나 대상이 잘못됐다면 cherry-pick --abort를 사용합니다. revert에는 별도 계속·중단 명령이 있습니다. 진행 중인 작업을 중단하는 것은 그 밖의 편집까지 보관하는 일반 백업이 아닙니다.

git status
git cherry-pick --abort
git revert --abort

결과 확인

최종 그래프에서 feature/fix의 변경과 main의 선택한 수정을 확인합니다. 두 패치와 각 체크아웃 상태를 비교하세요. 검토가 끝날 때까지 rescue/wrong-branch를 유지합니다. 상태가 깨끗하다는 것만으로 애플리케이션이 올바르지는 않으므로 영향받는 동작도 검사합니다.

git log -6 --oneline --decorate --all
git show --stat feature/fix
git status --short

자주 묻는 질문

여러 커밋이라면 순서, 의존성과 범위를 확인합니다. reset --soft는 참조를 옮기고 인덱스·파일을 유지하지만 자체로 다른 브랜치에 커밋을 전달하지 않습니다. 이미 push했다면 공유 이력의 revert부터 검토하고 예외적인 재작성은 명시적으로 합의합니다.

FluxGit에서 작업 검토

FluxGit의 시각적 이력과 변경 보기로 작업과 관련 커밋을 검토하세요. 이 예시의 브랜치, 공유 여부와 로컬 파일 검사를 유지합니다. 다운로드 페이지에서 현재 제공되는 빌드와 플랫폼을 확인할 수 있습니다.

Git 공식 문서

관련 절차

FluxGit 다운로드