상세 컨텐츠

본문 제목

Git 긴급(충돌)할때 사용하는 명령어

개발자를위한다양한이야기

by codeon 2025. 8. 20. 23:56

본문

반응형

처음 git 명령어를 접하게되면 흔히 발생되는 내용이 소스간에 충돌이 나는 것인데 이때 git이 소스를 관리하는 특성만 이해한다면 git을 사용함에 있어 어려움이 없을 것입니다. git은 기본적으로 로컬 저장소와, 원격 저장소 둘로 나뉘어 소스를 관리합니다. 그래서 보통 로컬에 내용을 업데이트 하는 명령어(pull)와 원격 저장소에 업데이트하는 명령어(push)로 구분되어 집니다. 프로젝트를 하다보면 특성상 같은 이름의 소스를 같이 수정하게되면 소스 충돌이 나게되면서 어떻게 해야하나 싶습니다. 대부분의 문제는 아래와 같은 명령어로 해결이 가능하니 사용해 보시기 바랍니다.

Git 이미지

 

로컬 소스 <-- 서버 소스 (강제 overwrite)
# 1. 로컬 main 브랜치로 이동
git checkout main

# 2. 원격 저장소의 최신 내역을 가져옵니다.
#    (아직 로컬 브랜치는 변경되지 않음)
git fetch origin

# 3. 로컬 main 브랜치를 원격 origin/main과 동일하게 만듭니다.
#    로컬 커밋과 변경사항이 모두 삭제됩니다.
git reset --hard origin/main

 

왜 git pull을 사용하지 않는가?

  • git pull은 git fetch + git merge의 조합입니다. 히스토리가 다른 경우 merge가 실패합니다.
  • git pull --rebase는 로컬 커밋을 원격 커밋 위에 다시 올리려고 시도하는데, 이 과정에서 충돌이 발생하거나 원하는 결과가 나오지 않을 수 있습니다.
  • git pull --force라는 명령어는 존재하지 않습니다. 일부 Git 버전이나 래퍼(wrapper)에서 git pull이 git fetch + git merge를 하면서 --force 옵션을 허용하는 경우가 있지만, 이는 git pull --rebase와는 다른 의미로, 사용이 권장되지 않습니다.

결론 및 권장사항

원격 저장소의 히스토리가 git push --force로 인해 변경되었다면, 로컬 저장소의 히스토리도 동일하게 맞춰야 합니다.

가장 안전하고 명확한 방법은 **git fetch**로 최신 상태를 확인한 후, **git reset --hard**로 강제 동기화하는 것입니다. 이 방법을 통해 의도치 않은 로컬 커밋 손실을 방지하고, "무엇을 하려는지"를 명확히 인지할 수 있습니다.

 

 

로컬 소스 --> 서버 소스 (강제 overwrite)
git push --force origin main

동작 원리 및 위험성:

  • 덮어쓰기: 원격 브랜치의 커밋 내역을 무시하고 로컬 브랜치의 커밋 내역으로 강제로 대체합니다.
  • 위험성: 만약 다른 팀원이 강제 푸시를 하기 전에 원격 저장소에 새로운 커밋을 푸시했다면, git push --force는 그 팀원의 커밋을 영구적으로 삭제하고 덮어씌웁니다. 이 때문에 협업 환경에서는 매우 위험한 명령어입니다.
  • 긴급한 상황에서 사용하기 적절합니다.
 
git push --force-with-lease origin main

동작 원리 및 장점:

  • 안전성: 원격 저장소의 HEAD 커밋이 로컬 저장소의 HEAD 커밋과 다를 경우(즉, 그 사이에 다른 팀원이 푸시한 커밋이 있는 경우), 푸시를 거부합니다.
  • 충돌 방지: 원격 저장소에 다른 사람의 작업물이 있는 것을 감지하면 푸시를 막아, 실수로 다른 사람의 커밋을 덮어쓰는 사고를 방지합니다.
  • 협업에 적합: 팀 프로젝트에서 강제 푸시가 필요한 경우, git push --force 대신 이 명령어를 사용하는 것이 권장됩니다.
Git을 처음 사용하기 전에 사용자 이름과 이메일을 설정합니다. 이 정보는 커밋(commit)에 기록됩니다.
# 사용자 이름 설정 (예시: Hong Gildong)
git config --global user.name "Your Name"

# 사용자 이메일 설정 (예시: your.email@example.com)
git config --global user.email "your.email@example.com"

 

 

기타 설명

핵심 Git 워크플로우 (Git 파일의 3가지 상태)

Git은 파일의 상태를 세 가지 영역으로 구분하여 관리합니다.

  1. Working Directory (작업 공간): 현재 작업 중인 파일들이 있는 공간.
  2. Staging Area (스테이징 영역): 커밋할 준비가 된 파일들이 모여 있는 공간.
  3. Git Repository (저장소): 커밋된 파일들이 히스토리로 기록되어 있는 공간.

기본적인 작업 흐름은 수정 -> 스테이징 -> 커밋 순서로 진행됩니다.

 

명령어 설명
git status
현재 파일들의 상태를 보여줍니다. (어떤 파일이 수정되었고, 어떤 파일이 스테이징 되었는지 등)
git add <파일이름>
작업 공간의 변경 내용을 스테이징 영역에 추가합니다.
git commit -m "커밋 메시지"
스테이징 영역에 있는 파일들을 Git 저장소에 확정하여 기록합니다. 커밋 메시지는 어떤 변경 사항인지 명확하게 작성합니다.
예시
# 1. 파일 수정 또는 새로 생성 (예: index.html)

# 2. 상태 확인 (untracked)
git status

# 3. index.html 파일을 스테이징 영역에 추가
git add index.html

# 4. 상태 확인 (Changes to be committed)
git status

# 5. 커밋 (버전 확정)
git commit -m "feat: 홈페이지 초기 레이아웃 추가"

 

모든 파일을 한 번에 스테이징하려면 git add . 를 사용합니다.

git add .

원격 저장소와 동기화

로컬에서 작업한 내용을 원격 저장소에 반영하거나, 원격 저장소의 최신 내용을 가져옵니다.

명령어 설명
git push 로컬 저장소의 커밋 내역을 원격 저장소에 업로드합니다.
git pull 원격 저장소의 최신 내역을 가져와서 로컬 저장소에 병합(merge)합니다.
예시
# 로컬의 변경 사항을 원격 저장소로 푸시
git push origin main

# 원격 저장소의 최신 내역을 가져와서 병합
git pull origin main

 

유용한 추가 명령어
  • git log: 커밋 히스토리를 확인합니다.
  • git branch: 모든 브랜치 목록을 확인합니다.
  • git checkout <브랜치명>: 다른 브랜치로 이동합니다.
  • git checkout -b <새로운_브랜치명>: 새로운 브랜치를 만들고 이동합니다.
  • git merge <병합할_브랜치명>: 다른 브랜치의 내용을 현재 브랜치에 병합합니다.
  • git diff: 수정된 내용을 자세히 보여줍니다.

이 명령어들만 숙지해도 대부분의 기본적인 Git 작업을 수행할 수 있습니다.

 

브랜치 & 병합 (Branching & Merging)

여러 사람이 협업하거나 기능을 분리해서 개발할 때 사용하는 명령어들입니다.

명령어 설명
git branch 저장소의 브랜치 목록을 확인합니다.
git branch [이름] 새로운 브랜치를 생성합니다.
git checkout [이름] 다른 브랜치로 이동합니다. (레거시 명령어)
git switch [이름] 다른 브랜치로 이동하는 최신 명령어입니다.
git checkout -b [이름] 새로운 브랜치를 만들고 바로 이동합니다.
git merge [이름] 지정된 브랜치의 내용을 현재 브랜치에 병합합니다.
git rebase [이름] 현재 브랜치의 커밋을 지정된 브랜치 위에 덮어씌워 깔끔한 히스토리를 만듭니다.

 

변경사항 되돌리기 & 기록 수정 (Undoing & Rewriting)

실수를 했을 때 변경사항을 되돌리거나 커밋 기록을 수정할 때 사용합니다.

명령어 설명
git restore [파일] 작업 디렉토리의 변경 내용을 되돌립니다. (git checkout [파일]의 최신 명령어)
git reset [커밋해시] HEAD를 특정 커밋으로 되돌립니다. (--soft, --hard 등 옵션 사용)
git revert [커밋해시] 특정 커밋의 변경 내용을 되돌리는 새로운 커밋을 생성합니다.
git commit --amend 가장 최근의 커밋 메시지나 내용을 수정합니다.
git stash 작업 중인 변경 내용을 임시로 저장하고 작업 디렉토리를 정리합니다.

 

기록 확인 및 비교 (Inspection & Comparison)

버전 기록을 확인하거나 변경된 내용을 비교할 때 사용합니다.

명령어 설명
git log 커밋 히스토리를 시간순으로 확인합니다. (--oneline, --graph 등 옵션이 유용)
git diff 두 커밋, 브랜치, 또는 작업 디렉토리와 스테이징 영역의 차이를 보여줍니다.
git show [커밋해시] 특정 커밋의 내용을 상세히 보여줍니다.

 

원격 저장소 관리 (Remote Management)

 

원격 저장소와의 연결을 관리하는 명령어입니다.

명령어 설명
git remote 연결된 원격 저장소 목록을 확인합니다.
git remote add [이름] [URL] 새로운 원격 저장소를 추가합니다.
git push --force 로컬 브랜치로 원격 브랜치를 강제로 덮어씁니다. (매우 위험!)
git push --force-with-lease 원격 브랜치가 최신 상태일 때만 강제로 덮어쓰는 안전한 명령어입니다.

 

기타 & 고급 명령어 (Advanced)

 

자주 사용되지는 않지만, 매우 유용한 고급 기능들입니다.

명령어 설명
git reflog HEAD가 이동한 모든 기록을 확인합니다. (잃어버린 커밋 복구에 유용)
git bisect 버그가 발생한 커밋을 이진 탐색으로 빠르게 찾습니다.
git tag [버전] 특정 커밋에 태그를 붙여 중요 버전을 표시합니다.
git blame [파일] 파일의 각 라인을 누가 언제 커밋했는지 보여줍니다.

 

반응형

관련글 더보기